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

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

ただいまの
回答率

90.51%

  • Arduino

    539questions

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

  • Processing

    258questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 131

iwi

score 0

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));
}

}

}

}

よろしくお願いします

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2018/07/27 16:40

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

    キャンセル

  • iwi

    2018/07/27 16:50

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

    キャンセル

回答 2

0

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

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

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


追記

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++) { // これは11ではダメ、led_pins は6個の要素しかない
        pinMode(led_pins[i], OUTPUT);
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/27 22: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));
    }
    }


    こういったことでしょうか?

    キャンセル

  • 2018/07/27 22:58

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

    キャンセル

  • 2018/07/27 23: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));
    }
    }

    こういったことでしょうか?すみません、あまり詳しくなくて、、

    キャンセル

0

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

// シリアル受信文字を返す
// 受信がない場合は-1を返す
int Serial_Getch(void)
{
    if (Serial.available() <=0 ) return -1; // シリアル通信でデータない場合
    return Serial.read() & 0xff; // 一文字分データを取り出す。 
}


// ゆっくり点滅、文字受信まで無限ループ
// 戻り値:受信文字
int Yukkuri(void)
{
    int res;
        int i,j;  // これ忘れた!

    while(1){
        for (j = 0; j < 6; j++) {
            for (i = 0; i < 256; i++) {
                analogWrite(led_pins[j], i);
                delay(5);

                res=Serial_Getch();
                if(res>0) return res;
            }
        }

        for (j = 0; j < 6; j++) {
            for (i = 255; i > -1; i--) {
                analogWrite(led_pins[j], i);
                delay(5);

                res=Serial_Getch();
                if(res>0) return res;
            }
        }
    }
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 00:32

    お答えいただきありがとうございます
    試してみたところ


    exit status 1
    redefinition of 'int Yukkuri()'

    このようなエラーが発生してしまいました

    キャンセル

  • 2018/07/28 00:36

    Yukkuri() という関数が他にあるんじゃ。
    名前を変えてください

    #そんで一部修正

    キャンセル

  • 2018/07/28 00:38

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

    キャンセル

  • 2018/07/28 00:40

    ollect2: error: ld returned 1 exit status
    exit status 1

    やはりエラーが出ます。。。

    キャンセル

  • 2018/07/28 00:41 編集

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Arduino

    539questions

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

  • Processing

    258questions

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