質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

8314閲覧

ARDUINO UNO シリアル通信を使わずにキーボードの入力から音を出したい

The_ren

総合スコア11

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/07/20 17:16

#初めに
こんにちは!
授業でARDUINOを触っているものです。現在、成果物として、パソコンのキーボードを入力するとピアノのように音楽が引けちゃうプログラムを作成中です。シリアル通信で対応したキーを入力するとドレミが出力するシステムが出来上がっているのですが、連続で鳴らしたいときにどうすれば良いのか分からずに困っています。

#プログラムコード
以下がプログラムコードになります。

// 12番ピンをスピーカーに接続する const int pin = 12; int melo =200; // 10番,8番ピンをLEDに接続する const int LED = 10; const int LGD = 8; // ここで初期化する void setup() { // スピーカーをつないだピンを出力に設定する pinMode(pin, OUTPUT); pinMode(LED, OUTPUT); // 9600bpsでシリアル通信を始めます Serial.begin(9600); } // ここからループに入る void loop() { // シリアル通信でパソコンから入力された文字を変数に保存する int sw = Serial.read(); // もしaという文字が送られてきたら if (sw == 'a') { // ドを鳴らす tone(pin,262,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); // もしsという文字が送られてきたら } else if (sw == 's') { // レを鳴らす tone(pin,294,melo); digitalWrite(LGD,HIGH); delay(500); digitalWrite(LGD,LOW); // dが送られたら } else if (sw == 'd') { //ミを鳴らす tone(pin,330,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); // もしfという文字が送られてきたら } else if (sw == 'f') { // ファを鳴らす tone(pin,349,melo); digitalWrite(LGD,HIGH); delay(500); digitalWrite(LGD,LOW); // gが送られたら } else if (sw == 'g') { //ソを鳴らす tone(pin,392,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); // もしhという文字が送られてきたら } else if (sw == 'h') { // ラを鳴らす tone(pin,440,melo); digitalWrite(LGD,HIGH); delay(500); digitalWrite(LGD,LOW); // jが送られたら } else if (sw == 'j') { //シを鳴らす tone(pin,494,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); } }

#このコードで実行したいこと
現在、シリアル通信を使っています。
パソコンのキーボードを入力し、対応したキーを押すとドレミファソラシドの内の一つを出力します。同時にキーを押すと同時に音だけでなくLEDが光るように設定されています。
しかし、シリアル通信だと、入力したキーを逐一送信してあげないと音が出力されません。そのため、ピアノのように連続した状態で鳴らすのが困難になっています。

#最終的に達成したいこと
現在はシリアル通信でキーボードの入力を音と光で出力するように設計していますが、最終的にはシリアル通信を使わずにキーボード入力でそのままピアノのように音楽を演奏できるプログラムを設計したいです。課題の提出が1週間程度しかないので焦っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/07/20 23:43

> ピアノのように連続した状態で鳴らすのが困難になっています。 現状ではどういう動作になってるんでしょうか
The_ren

2019/07/21 09:57

現状は、一つの入力に対して対応したドレミ音が返ってくる程度です。 シリアル通信のため、逐次エンターキーを押さないと出力が反映されません
coco_bauer

2019/07/24 00:58

「最終的にはシリアル通信を使わずにキーボード入力でそのままピアノのように」というのを実現する際、PCとArduinoの間で信号をやり取りする方法は、どうするのですか?
guest

回答2

0

「シリアル通信」(UART)がコトの本質なのでしょうか? そこをちゃんと見極めないと、見当違いの苦労をして結局何も得られない、なんてことになりかねません。

楽器やシーケンサなどを繋ぐために使われているMIDIインターフェース。これも言ってしまえばシリアル通信。'Arduino MIDI'でググってみれば作例がいくつも見つかると思いますが、ArduinoのUARTを使っているものがほとんどでしょう。楽器で「連続で音が鳴らせない」では話になりませんから、MIDIではそれが出来るはず。つまり、UARTを使っていることは「連続」を検出できないことの本質ではない、ということが推察出来るでしょう。

じゃあなんで「連続」音が出ないのでしょう?

そもそも「連続」って何? ということをちゃんと考えてみて下さい。音を出し始めて、任意の時間に止める。止めるためには何が必要か。キーを離した、という情報。

今のプログラムでは、キーが押されたら音を一定時間出しています。では、キーが離された情報は? 扱ってない、というよりそもそも送られて来ていないでしょう。送られてこないのは何故ですか? 経路がシリアル通信だからではなく、そもそもPCから送り出されていないから、では。

PC側をどうしているのか情報がありませんが、シリアルモニタとかあるいはターミナルプログラムを使っているのでしょう。そういったプログラムは、「キーが押された」ことさえ伝えられれば求められている機能を果たすので、そのように作られています。それを今回のような用途に流用したならば、機能が足りないのは当然です。目的が違うのですから。

さて、どうしましょう。とりあえず3つの選択肢があるかと思います。
0. Arduino用の'USBホストシールド'を使って、USBキーボードを直結して「押した」「離した」情報を取得して音を出すプログラムを作る
0. PC側でキーボードの「押した」「離した」情報を取得し、COMポート経由で送信する(PC側の)プログラムと、これを受けて音を出す/止める(Arduino側の)プログラムを作る
0. 課題の範囲外と諦める(どこまでが範囲なのか私は知りませんが)

投稿2019/07/21 00:03

編集2019/07/21 05:53
thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2019/07/21 06:50

1ですが、外部に別装置が必要なUSBキーボードよりArduino単体で読めるPS/2キーボードを使うのを私はお勧めしますね。 何にせよ現状から1週間でできるかというとそれなりに厳しい気がしますが。
thkana

2019/07/21 07:12

確かに選択肢としてはありですね。 しかし、古い人(?)ならPS/2キーボードの一つや二つ押し入れに転がってるでしょうが、この質問を発するような人がPS/2キーボードとそのコネクタをひょいと入手できるのかとか、この件が片付いたあとそのキーボードどうするの? とか思わないでも。 思いついたけど、課題の詳細によっては自分でキースイッチを6個並べてキーボード(鍵盤装置?)を作る、という手も許されるのかも。 3はともかくとして、質問のプログラムを理解して作れているのなら、1でも2でも、あるいはPS/2キーボードでもスイッチを並べても、楽とはいいませんが一週間(ってのは今度の金曜のことか?)頑張れば出来ると思いますよ。 追加ハードが要るものはモノの入手(とコスト)もちょっとネックになるかも知れません。
guest

0

どういうことをしたいのかイマイチ不明ですが、

おそらく、あなたの思うような動作にならない原因は、シリアル通信をしているからではありません。
他の方法にしたところで、同じ結果にしかなりませんよ。

投稿2019/07/20 23:59

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問