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