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

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

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

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

Processing

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

Q&A

2回答

796閲覧

processingとaruduinoのシリアル通信の切り替えがうまくいかない

iwi

総合スコア4

Arduino

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

Processing

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

0グッド

0クリップ

投稿2018/07/27 07:11

processingとarduinoをシリアル通信させたいです

メニュー画面で3回ほど選択したら映像が流れるのですが選択画面のときはゆっくり明滅
映像が再生されるときは激しく明滅をさせたいです。現在はこのようなコードになっています

//processing
import processing.video.;
import processing.serial.
;

final int SELECT=0;//本当はenumにしたいけど、Processingでenumを使うにはひと手間いるので
final int DIALY=1;
final int MOVIE=2;

int state=SELECT; //0=選択画面、1=日記記事、3=映像

int count=0;//日記ページから戻る回数
int article=0;//0は未選択状態

Serial myPort; // Create object from Serial class
int val; // Data received from the serial port

Movie Movie1;
long t0; //再生時間管理用

PImage selectPic;//選択画面背景
final int ARTICLE_NUM=9; //日記記事が3本
PImage[] img=new PImage[ARTICLE_NUM];
Serial ser;

void setup() {
size(800, 600);
frameRate(10);
background(30, 45, 90);

String portName = Serial.list()[1];
ser = new Serial(this, portName, 9600);

Movie1 = new Movie(this, "test.mov");
selectPic= loadImage("menu.png");
img[0] = loadImage("1.png");
img[1]= loadImage("2.png");
img[2] = loadImage("3.png");
img[3] = loadImage("4.png");
img[4]= loadImage("5.png");
img[5] = loadImage("6.png");
img[6] = loadImage("7.png");
img[7]= loadImage("8.png");
//img[8] = loadImage("9.png");
}

int mode = 0;
void draw() {
switch(state) {
case SELECT:
background(30, 45, 90);
image(selectPic, 0, 0, 800, 600);
ser.write("n");
if (keyPressed) {
/background(30, 45, 90);
image(selectPic, 0, 0, 640, 480);
char keys[]={key};
text(new String(keys), 567, 193);
/
if (key==ENTER) {
if (article>0) {
state=DIALY;
println("move to article "+article);
}
} else {
article=key-'0';
if (article<1 || ARTICLE_NUM<article) { //範囲外の数値だったら
article=0;//クリア
}
text(article, 670, 326);
println("article number set to "+article);
}
}
break;

case DIALY:
background(90, 45, 90);
image(img[article-1], 0, 0, 800, 600);
ser.write("n");
if (keyPressed) {
if (key=='b') {//'b'が押されたら
article=0;
if (++count>=random(2, 5)) {//3回'ほど'
count=0;//countのクリアを忘れずに
Movie1.loop();
t0=millis();
state=MOVIE;
ser.write("n");
} else {
state=SELECT;
}
}
}
break;

case MOVIE:
image(Movie1, 0, 0, 800, 600);
//ここにはキー処理ルーチンはない
ser.write("f");
if (millis()-t0>132*1000) {//3秒=3000ミリ秒経った?
Movie1.stop();
println("3秒たったよ");
state=SELECT;
}
break;
}
}

void movieEvent(Movie m) {
m.read();
}

//arduino

#define FADE_TIME 2

int led_pins[] = {3, 5, 6, 9, 10, 11};

void setup() {
Serial.begin(9600);
int i;

for (i = 0; i < 11; i++) {
pinMode(led_pins[i], OUTPUT);
}

}

void loop() {
int inputchar;

int i, j;
// シリアルポートより1文字読み込む

if (Serial.available() > 0) { // シリアル通信でデータが送られてくるまで待つ。

char c = Serial.read(); // 一文字分データを取り出す。 if (c == 'n') { // nが送られてきたらLEDを点灯させる。 for (j = 0; j < 11; j++) { for (i = 0; i < 256; i++) { analogWrite(led_pins[j], i); delay(5); } } for (j = 0; j < 11; j++) { for (i = 255; i > -1; i--) { analogWrite(led_pins[j], i); delay(5); } } } else if(c == 'f') { // fが送られてきたらLEDを消灯させる。 for (j = 0; j < 11; j++) { analogWrite(led_pins[j], HIGH); delay(random(10)); } for (j = 0; j < 11; j++) { analogWrite(led_pins[j], LOW); delay(random(10)); } }

}

}

よろしくお願いします

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

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

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

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

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

y_waiwai

2018/07/27 07:40

そのコードではどうなるんでしょうか。そして、それをどうしたいというはなしでしょうか?
iwi

2018/07/27 07:50

このコードでは映像は正常に再生されるのですが、ledが同期せず、映像の画面になってもゆっくり明滅してしまいます。
guest

回答2

0

コードを載せるために新規回答とします

C

1// シリアル受信文字を返す 2// 受信がない場合は-1を返す 3int Serial_Getch(void) 4{ 5 if (Serial.available() <=0 ) return -1; // シリアル通信でデータない場合 6 return Serial.read() & 0xff; // 一文字分データを取り出す。 7} 8 9 10// ゆっくり点滅、文字受信まで無限ループ 11// 戻り値:受信文字 12int Yukkuri(void) 13{ 14 int res; 15 int i,j; // これ忘れた! 16 17 while(1){ 18 for (j = 0; j < 6; j++) { 19 for (i = 0; i < 256; i++) { 20 analogWrite(led_pins[j], i); 21 delay(5); 22 23 res=Serial_Getch(); 24 if(res>0) return res; 25 } 26 } 27 28 for (j = 0; j < 6; j++) { 29 for (i = 255; i > -1; i--) { 30 analogWrite(led_pins[j], i); 31 delay(5); 32 33 res=Serial_Getch(); 34 if(res>0) return res; 35 } 36 } 37 } 38} 39

ゆっくり点滅用の関数だけですが、これに合わせて激しく点滅用の関数も作ってみてください

投稿2018/07/27 15:00

編集2018/07/27 15:35
y_waiwai

総合スコア87715

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

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

iwi

2018/07/27 15:32

お答えいただきありがとうございます 試してみたところ exit status 1 redefinition of 'int Yukkuri()' このようなエラーが発生してしまいました
y_waiwai

2018/07/27 15:36

Yukkuri() という関数が他にあるんじゃ。 名前を変えてください #そんで一部修正
y_waiwai

2018/07/27 15:38

あ、ちがう、 Yokkuriを、Loop関数より前に持っていきましょう
iwi

2018/07/27 15:40

ollect2: error: ld returned 1 exit status exit status 1 やはりエラーが出ます。。。
y_waiwai

2018/07/27 15:45 編集

まー、なんのエラーか調べてみようw これも勉強です って、ソースを修正したんでコピペし直しては。
guest

0

まずは、Proccessing側の送信が正常に(意図通りに)なされているかをチェックしましょう
PC上でTeraTermなどでシリアルを受信して、意図通りの送信内容になってるかを確認してください。

Arduino側ですが、いまのコードではLEDの点滅に10秒以上かかってるようなので、その間に送信されたデータは点滅が終わるまで受信されません
なので、点滅中もシリアルの受信を行い、受信データがない場合は点滅の継続、
受信データが有り、他のモードに移行の必要がある場合はその点滅を中止するような処理が必要です。

ゆっくり点滅する関数、激しく点滅する関数、消灯する関数をそれぞれ作り、双方通信が入ったらリターンするようにしておけばいいかと思います


追記

C

1int led_pins[] = {3, 5, 6, 9, 10, 11}; 2 3int i, j; 4 5void setup() { 6 Serial.begin(9600); 7 int i; 8 9 for (i = 0; i < 11; i++) { // これは11ではダメ、led_pins は6個の要素しかない 10 pinMode(led_pins[i], OUTPUT); 11 }

投稿2018/07/27 09:12

編集2018/07/27 14:07
y_waiwai

総合スコア87715

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

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

iwi

2018/07/27 13:52

#define FADE_TIME 2 int led_pins[] = {3, 5, 6, 9, 10, 11}; int i, j; void setup() { Serial.begin(9600); int i; for (i = 0; i < 11; i++) { pinMode(led_pins[i], OUTPUT); } } void loop() { int inputchar; // シリアルポートより1文字読み込む if (Serial.available() > 0) { // シリアル通信でデータが送られてくるまで待つ。 char c = Serial.read(); // 一文字分データを取り出す。 if (c == 'n') { // nが送られてきたらLEDを点灯させる。 on_to_off(); return; } else if (c == 'f') { // fが送られてきたらLEDを消灯させる。 off_to_on(); return; } } } void off_to_on() { for (j = 0; j < 11; j++) { for (i = 0; i < 256; i++) { analogWrite(led_pins[j], i); delay(random(10)); } } for (j = 0; j < 11; j++) { for (i = 255; i > -1; i--) { analogWrite(led_pins[j], i); delay(random(10)); } } } void on_to_off() { for (j = 0; j < 11; j++) { analogWrite(led_pins[j], HIGH); delay(random(10)); } for (j = 0; j < 11; j++) { analogWrite(led_pins[j], LOW); delay(random(10)); } } こういったことでしょうか?
y_waiwai

2018/07/27 13:58

その点滅のループの中に、シリアル受信を入れましょう 受信データがあり、かつ現在の点滅モードではない文字が来たら中断するようにし、戻り値を受信文字を返すようにします それ以外は無限に点滅を継続します
iwi

2018/07/27 14:21

on_to_offとoff_to_onの繰り返しのところでしょうか? #define FADE_TIME 2 int led_pins[] = {3, 5, 6, 9, 10, 11}; int i, j; void setup() { Serial.begin(9600); int i; for (i = 0; i < 11; i++) { pinMode(led_pins[i], OUTPUT); } } void loop() { int inputchar; // シリアルポートより1文字読み込む if (Serial.available() > 0) { // シリアル通信でデータが送られてくるまで待つ。 char c = Serial.read(); // 一文字分データを取り出す。 if (c == 'n') { // nが送られてきたらLEDを点灯させる。 on_to_off(); // return; } else if (c == 'f') { // fが送られてきたらLEDを消灯させる。 off_to_on(); return; } } } void off_to_on() { for (j = 0; j < 11; j++) { for (i = 0; i < 256; i++) { analogWrite(led_pins[j], i); delay(random(10)); } } for (j = 0; j < 11; j++) { for (i = 255; i > -1; i--) { analogWrite(led_pins[j], i); delay(random(10)); } } } void on_to_off() { for (j = 0; j < 11; j++) { analogWrite(led_pins[j], HIGH); delay(random(10)); } for (j = 0; j < 11; j++) { analogWrite(led_pins[j], LOW); delay(random(10)); } } こういったことでしょうか?すみません、あまり詳しくなくて、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問