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

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

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

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

2695閲覧

Processingで図形にカーソルが触れたらArduinoで音が鳴り、カーソルが触れなくなったら音が止まるプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2017/07/02 12:38

編集2017/07/03 06:23

###前提・実現したいこと
Processingで図形にカーソルが触れたらArduinoで音が鳴り、カーソルが触れなくなったら音が止まるプログラムを書いています。

###発生している問題・エラーメッセージ
Booleanでうまく条件分岐ができていないことが問題だと思います。現状では一度カーソルが触れたら音がずっと鳴りっぱなしで、止まりません。

###該当のソースコード

Processing

1import processing.serial.*; 2 3boolean didTouch = false; 4Serial serial; 5ArrayList<MyShape> shapes = new ArrayList<MyShape>(); 6 7void setup() { 8 size(500, 500); 9 serial = new Serial(this, Serial.list()[1], 9600); 10 noStroke(); 11 MyShape s; 12 s = new MyEllipse(30, 30, 50, 50); 13 shapes.add(s); 14} 15 16void draw() { 17 background(102); 18 for (MyShape s : shapes) { 19 if (s.contains(mouseX, mouseY)) { 20 fill(#CE2828); 21 didTouch = true; 22 serial.write('a'); 23 } else { 24 fill(204); 25 serial.write('b'); 26 didTouch = false; 27 } 28 s.draw(); 29 } 30} 31 32// 楕円を表すクラス 33class MyEllipse extends MyShape { 34 float x, y, w, h; 35 36 MyEllipse(float x, float y, float w, float h) { 37 this.x = x; 38 this.y = y; 39 this.w = w; 40 this.h = h; 41 } 42 43 void draw() { 44 ellipse(x, y, w, h); 45 } 46 47 boolean contains(float mx, float my) { 48 float dx = 2 * (mx - x) / w; 49 float dy = 2 * (my - y) / h; 50 return sqrt(dx * dx + dy * dy) <= 1.0; 51 } 52} 53 54// 任意の図形を表す抽象クラス 55abstract class MyShape { 56 // 画面上へこの図形を描画するメソッド 57 abstract void draw(); 58 59 // 指定位置がこの図形に含まれるかどうか判定するメソッド 60 abstract boolean contains(float x, float y); 61} 62

Arduino側のコードを書き足しました

Arduino

1int melo = 200; //音の長さを指定 2#define PIN 12 //ブザーを接続したピン番号 3 4void setup() { 5 Serial.begin(9600); 6 7} 8 9void loop() { 10 if (Serial.available() > 0) { 11 int data = Serial.read(); 12 if (data == 'a') { 13 //ド 14 tone(PIN, 262, 600); 15 delay(300); 16 //レ 17 tone(PIN, 294, 300); 18 delay(300); 19 //ミ 20 tone(PIN, 330, 300); 21 delay(300); 22 //ファ 23 tone(PIN, 344, 600); 24 delay(300); 25 //ソ 26 tone(PIN, 392, 300); 27 delay(300); 28 //ラ 29 tone(PIN, 440, 600); 30 delay(300); 31 //シ 32 tone(PIN, 494, 600); 33 delay(300); 34 35 } 36 else if (data == 'b') { 37 38 } 39 } 40}

###試したこと
boolean didTouchを加える

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

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

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

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

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

Bongo

2017/07/03 03:15

色は意図通りに変化しているのに、音だけが意図通りにならないということでしょうか?その場合、Arduino側のプログラムも関係してくるかもしれません。たとえば現状だと図形に触れている間は毎フレームaが、触れていなければ毎フレームbが送信されるかと思いますが、Arduino側のプログラムはそれで動作上問題ないでしょうか。
退会済みユーザー

退会済みユーザー

2017/07/03 06:25 編集

ご質問ありがとうございます。その通りです。色は意図通りにProcessingで変化します。 Processing側で色がつかなくなっても、Arduino側は音がなりっぱなしです。
guest

回答1

0

ベストアンサー

おそらく、Arduinoに大量の「a」が送りつけられて、図形からカーソルを外してもシリアルバッファに「a」が残っている限り、「a」を一つずつ取り出して演奏を行っているのではないでしょうか。
とりあえず、didTouchを見て、連続してserial.write('a');が実行されないようにしてみてはいかがでしょうか?

void draw() { background(102); for (MyShape s : shapes) { if (s.contains(mouseX, mouseY)) { if (!didTouch) { // カーソルの接触状態が変化した1フレームだけ実行 fill(#CE2828); didTouch = true; serial.write('a'); } } else { if (didTouch) { // カーソルの接触状態が変化した1フレームだけ実行 fill(204); serial.write('b'); didTouch = false; } } s.draw(); } }

上記には改善の余地がありまして、おそらくこのコードですと図形にカーソルを当てると1曲だけしか演奏が行われず、しかも演奏の途中でカーソルを外してもその1曲を演奏し終えるまで音が止まらないかと思います。

多分、上記コードに加えて、Arduino側のコードも改造する必要があるように思います。私は残念ながらArduinoを持っておらず、下記のコードがまともに動く保証はないのですが、あくまでも方針のご参考として提示させていただくと、こんな感じでしょうか?

// Arduino側抜粋 boolean isPlaying = false; // 変数を追加、再生中ならtrueをセット void loop() { if (Serial.available() > 0) { int data = Serial.read(); if (data == 'a') { isPlaying = true; } } // 1音鳴らすごとに「b」(中断メッセージ)が来ていないかチェック、来ていればそこでreturn if (isPlaying) { //ド tone(PIN, 262, 600); delay(300); if (checkAbortionMessage()) return; //レ tone(PIN, 294, 300); delay(300); if (checkAbortionMessage()) return; //ミ tone(PIN, 330, 300); delay(300); if (checkAbortionMessage()) return; //ファ tone(PIN, 344, 600); delay(300); if (checkAbortionMessage()) return; //ソ tone(PIN, 392, 300); delay(300); if (checkAbortionMessage()) return; //ラ tone(PIN, 440, 600); delay(300); if (checkAbortionMessage()) return; //シ tone(PIN, 494, 600); delay(300); if (checkAbortionMessage()) return; } } // Processing側から「b」(中断メッセージ)が来ていたら、isPlayingをfalseにした上でtrueを返す boolean checkAbortionMessage() { if ((Serial.available() > 0) && (Serial.read() == 'b')) { isPlaying = false; return true; } else { return false; } }

また、今は図形が1つしかないのでいいですが、複数の図形を配置したときにどうするかというのが考えどころかもしれません。図形同士が重ならないのなら現状のコードでも動くかもしれませんが、重なっている場合を考慮するとなると少々複雑になるでしょう。

投稿2017/07/03 13:13

Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2017/07/05 02:59

Processing側を変更するだけでやりたいことができました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問