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

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

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

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

Processing

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

Q&A

解決済

2回答

2559閲覧

ArduinoとProcessingの通信について

rabitail

総合スコア13

Arduino

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

Processing

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

0グッド

0クリップ

投稿2019/02/03 14:22

前提・実現したいこと

Arduinoの2つのボタンを使ってProcessingを動かしたいです。 どこがいけないのでしょうか…?

発生している問題・エラーメッセージ

ボタンを押した時にiの値が変わるようにしたいのですが、0から変わりません。

該当のソースコード

//Arduino側 #include <Bounce.h> int buttonState1 = 0; int buttonState2 = 0; Bounce bouncer1 = Bounce(2, 5); Bounce bouncer2 = Bounce(3, 5); void setup() { Serial.begin(9600); Serial.println("program kaishi\n" ); } void loop() { bouncer1.update(); buttonState1 = bouncer1.read(); bouncer2.update(); buttonState2 = bouncer2.read(); if (buttonState1 > 0) { analogWrite(9, 255); Serial.println("right"); delay (30); } else { analogWrite(9, 0); } if (buttonState2 > 0) { analogWrite(10, 255); Serial.println("left"); delay (30); } else { analogWrite(10, 0); } } //Processing側 import processing.serial.Serial; Serial p; int lf = 10; int state_a; int i = 0; void setup() { delay (100); size(1000,800); p = new Serial(this, Serial.list()[3],9600); p.bufferUntil(lf); state_a = 0; }; void draw() { background(25, 40, 80); if (state_a == 1){ if( p.readString() == "right" ){ i++; }if( p.readString() == "left" ){ i--; }else{ i = 0; } textSize (50); text (i, 100, 400); state_a = 0; } } void serialEvent(Serial p){ print(p.readString()); if (state_a == 0) { state_a = 1; } else { state_a = 0; } }

試したこと

rightとleftを違う文字にしたり、数字にしたりしたのですが、なかなか上手くいきません…。

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

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

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

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

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

guest

回答2

0

ベストアンサー

println関数は文字列の後ろに改行コード(\n)が付加されて送信されます
受信側ではそれを考慮されてるでしょうか。

いちど、受信側で、受信した文字列をそのままコンソールに表示するなどして確認してみては。

投稿2019/02/03 14:32

y_waiwai

総合スコア87774

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

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

rabitail

2019/02/03 14:42

回答ありがとうございます。 今コンソールには、右のボタンを押すとright、左のボタンを押すとleftと一行ずつ表示されています。 これではいけないのでしょうか…?
y_waiwai

2019/02/03 14:45

一回のreadString()関数でどういう文字列が返ってるのかを見てみれ。 よくあるのは、文字列の途中までしか受信してなくてタコってるとか、 1行受信してるんだけど、行末の改行コードのせいで判定できないとか いろいろあります
rabitail

2019/02/03 15:06

一回のreadString()関数での文字列はどのように確認したら良いのですか? 申し訳ないのですが、具体的にどうしたら良いか教えてください。
y_waiwai

2019/02/04 00:11

Processingはやったことないのでコードは提示できませんが、 p.readString()の戻り値をコンソールに出すようにすればいいかと。 #serialEventなる関数がなにか知らないですが、そこで受信データを読み捨ててるようですが
rabitail

2019/02/04 23:59

別のやり方でやったら上手くいきました。 回答ありがとうございました!
guest

0

serial通信の通信量の単位は「バイト」です。"right\n"をいっぺんに送ったからといって、受けるときに"right\n"が一度に受信出来ると期待してはいけません。"r" "ri" "rig" "righ" ...どこまで受信できるかの保証はなにもありませんから、それに対応した受信の処理をしなければいけません。

この場合であれば、printlnで送信しているのですから、\nがデータの「区切り」として機能することが期待出来ます。ということで、ある特定の文字が出てくるまでを区切りとして受信する、ProcessingのSerialクラス、readStringUntil関数について調べてみるといいことがありそうな気がします。

投稿2019/02/04 15:04

thkana

総合スコア7639

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問