

Arduinoとprocessing間のシリアル通信を利用した作品を作っています。  
Arduinoに接続した2つのタクトスイッチから得たスイッチのON/OFFのデータをProcessingに送っています。2つのタクトスイッチをそれぞれ停止用、再開用として使いたいです。  
Processing側では画像を20枚読み込み、それを表示させています。

やりたいこととしては、Processing側の画像の読み込みを、Arduinoから送られてきたスイッチの値によって停止・再開することです。  
以下のコードでは、停止用スイッチを押すとsensors = 1
が送られ、if文の中のnoLoop()により画像の読み込みは停止します。しかし、もう片方の再開用スイッチを押した時に送られる値sensors = 2
で再開することができません。  
mousePressed()の中のloop()によって、マウスをクリックすれば再開は可能ですが、今回はArduinoからの値を使って再開させたいです。

回答よろしくお願いいたします。

[code]

    import processing.serial.*;
    Serial myPort;
    
    int numFrames = 20;
    int  sensors; //センサーの値を格納
    
    PImage[] images = new PImage[numFrames];
    
    void setup() {
      background(255);
      size(1280, 800);
      frameRate(40);
      imageMode(CENTER);
      //images.resize(1280,800);
      for (int i=0; i<images.length; i++) {
        images[i] = loadImage("animation-"+nf(i, 3)+".png");
        images[i].resize(1280, 800);
      }
    
      myPort = new Serial(this, "/dev/cu.usbmodem143401", 9600);
    }
    
    void draw() {
    
      int frame = frameCount % numFrames;
      if (sensors == 0) {
    
        image(images[frame], width/2, height/2);
      } 
      if (sensors == 1) {
        //image(images[frame], width/2, height/2);
        noLoop();
      } 
      if (sensors == 2) {
        image(images[frame], width/2, height/2);
      }
    }
    
    void serialEvent(Serial p) {
      sensors = p.read();
      println(sensors);
    }
    
    void mousePressed() {
      loop();
    }
    
[/code]


CC BY-SA 4.0
2019-11-22T18:22:36.883
60775
2022-09-23T03:04:15.363
36035
question
arduino processing
if文でループを停止、再開させるには


そもそもですが、なぜnoLoop()させる必要があるのでしょうか？。noLoop()はdraw()関数の呼び出しを停止する命令ですので、当然ですがそれ以降はloop()命令を発行するまで、draw()関数の中に記述された処理は動作しなくなります。  
int frame = frameCount % numFrames;  
と書かれた処理でフレーム数を20で割った余りを求めていますが、表示画像を一時停止（frame変数の更新を停止）したいのであれば、sensors ==
0かsensors == 2の時だけ、frameCount % numFramesの処理をすれば良いのではないでしょうか？  
つまり

[code]

    void draw() {
    
      int frame;
      if (sensors == 0) {
        frame = frameCount % numFrames;
        image(images[frame], width/2, height/2);
      } 
      if (sensors == 2) {
        frame = frameCount % numFrames;
        image(images[frame], width/2, height/2);
      }
    }
    
[/code]

です。勘違いしていたら申し訳ないです。


CC BY-SA 4.0
2020-09-13T11:10:48.550
70349
2020-09-13T11:19:19.810
2020-09-13T11:19:19.810
3060
41882
60775
answer