★★★ ProcessingからArduinoへのシリアル通信 ★★★


浅田先生がPCからシリアル通信を使ってmicro:bitの出力を制御するアプリを作られました。
このことに刺激されてProcessingとArduinoの組み合わせで作ってみました。


 

「チャイム」ボタンを押すと、リレーに100ミリ秒間出力しラモスがしゃべります。
「扇風機」ボタンを押すと、リレーがオンとオフを繰り返し扇風機がオンオフします。

(使用したもの)

 Arduino:USBポートが着いているので使いました。
   スイッチサイエンスの正規品は3,000円以上しますが、アマゾンの中国製互換品なら安く手に入ります。
   micro:bitも早く中国で作って欲しいものです(笑)
   中国製互換Auduino UNO R3
   プログラムは浅田先生に教えていただいたArduino IDEで作りました。
   Arduino公式サイト

 リレー:これもアマゾンの中国製リレーモジュールを使いました。これも安い。
   3Vリレーモジュール

 Processing:PC側のアプリはProcessingで作りました。https://processing.org/
   Arduinoと同じsketchといわれるJava系の言語です。
   以下のサイトが非常に参考になりました。
   シリアル通信:Processing-Arduino間で文字列の送受信
   建築工作発明ゼミ2008
   Processing controlP5でGUIコントローラー
   Processing ControlP5 example 1: user interface)


(プログラム)
  Arduino側:
//  Arduino sketch
//    a_serial_sw
//    from processing to arduino    

int monitor_led = 13;
int relay_A = 6;
int relay_B = 10;
char val = 'n';  //Data received from the serial port

void setup() {                
  pinMode(monitor_led, OUTPUT);
  pinMode(relay_A, OUTPUT);
  pinMode(relay_B, OUTPUT);
  Serial.begin(9600);  
}

void loop() {
  while(Serial.available()){  // received from processing 
    val = Serial.read();      // data to val
  }
  if(val == 'b'){  // If 'b'is received, output pulse for 100msec.
    val = 'n';
    digitalWrite(monitor_led,HIGH);
    digitalWrite(relay_A,HIGH);
    delay(100);
    digitalWrite(monitor_led,LOW);
    digitalWrite(relay_A,LOW);
  }
  if(val == 't'){    // If 't'is received, output HIGH.
    digitalWrite(monitor_led,HIGH);
    digitalWrite(relay_B,HIGH);
  }
  if(val == 'm'){    // If 't'is received, output LOW.
    digitalWrite(monitor_led,LOW);
    digitalWrite(relay_B,LOW);
  }
}
  Processing側:
//  Processing
//    p_serial_sw
//    from processing to arduino    

import controlP5.*;
import processing.serial.*;

ControlP5 Button;
ControlP5 Toggle;
Serial myPort;  //Create object from serial class
int T = 1;      //state of Toggle

void setup() {
  size(190, 190);
  String portName = Serial.list()[0];
  myPort = new Serial(this, "COM11", 9600);

  Button = new ControlP5(this);
  Button.addButton("BUTTON")
    .setLabel("button")//テキスト
    .setPosition(20, 10)
    .setSize(180, 90)
    .setImages(loadImage("b-normal.jpg"), loadImage("b-normal.jpg"), loadImage("b-pressed.jpg"))
    .updateSize();

  Toggle = new ControlP5(this);
  Toggle.addToggle("TOGGLE")
    .setLabel("toggle")      //テキスト
    .setValue(false)
    .setPosition(20, 100)
    .setSize(180, 90)
    .setImages(loadImage("a-normal.jpg"), loadImage("a-pressed.jpg"))
    .updateSize();
}  

void draw() {
  background(255); // white background
}

void controlEvent(ControlEvent theEvent) {
  if (theEvent.getController().getName() == "BUTTON") {
    println("BUTTON!");
    myPort.write('b');
  } 
  if (theEvent.getController().getName() == "TOGGLE") {
    println("TOGGLE!");
    if ( T == 0 ) {
      myPort.write('t');
      T = 1;
    } else if ( T == 1 ) {
      myPort.write('m');
      T = 0;
    }
  }
}