ArduinoとProtoPie Connectの接続
Arduino pluginに搭載されたProtoPie Connectを使用することで、ソフトウェアとハードウェアの両方でマルチスクリーンを体験できます。
Arduino boardsによるserial communicationは、ProtoPie Connectのサポート対象となっており、最も代表的な設定では、USB経由でArduinoのハードウェアをProtoPie Connect作動中のデバイスと接続します。
Arduinoの使用法の詳細はこちら。
USB経由で作動中のProtoPie ConnectとArduinoを接続
1. ProtoPie Connectのプラグインリストにある[Arduino]を選択します。
2. ご希望のPortとBaud Rateを選択します。
- Port: お使いのArduino boardに対応するポートを選択します。
- Baud Rate: この変数は連続接続の更新確認頻度を設定するものです。デフォルトでは変数9600を選択することができます。
*Arduinoプラグインの作動にはシリアルポートで通信しているマイクロコントローラが必要です。例えば、ESP32マイクロコントローラを使用したい場合、ESP32を接続した後、適切なポートとボーレートを選択してESP32のシリアルポートを開き、ProtoPie Connectのデータを受信できます。
ArduinoとProtoPie Connectの接続
ProtoPie ConnectとArduinoはメッセージ・値形式で通信します。変数を設定せずにメッセージを送信したい場合は、Messageだけで十分です。
Arduinoからメッセージを送信
Serial.println()関数を使用してメッセージ(と変数)をProtoPie Connectへ送信すると、対応するすべてのプロトタイプへ伝達されます。
以下の例では、ArduinoによってメッセージROTATEと変数90が2秒ごとにProtoPie Connectへ送信されています。
void setup() {
Serial.begin(9600);
}
void loop() {
// Send "ROTATE" to ProtoPie
// message: ROTATE
// value: 90
Serial.println("ROTATE||90");
delay(2000);
}
Arduinoへメッセージを送信
Arduinoハードウェアでは、メッセージ・値形式の着信メッセージを解釈するために別のコードが必要です。
以下は、ProtoPie ConnectからのメッセージをArduinoが受信/解釈している例です。
#include <string.h>
// Declare struct
struct MessageValue {
String message;
String value;
};
// Declare function that parse message format
struct MessageValue getMessage(String inputtedStr) {
struct MessageValue result;
char charArr[50];
inputtedStr.toCharArray(charArr, 50);
char* ptr = strtok(charArr, "||");
result.message = String(ptr);
ptr = strtok(NULL, "||");
if (ptr == NULL) {
result.value = String("");
return result;
}
result.value = String(ptr);
return result;
}
// Declare MessageValue struct's instance
struct MessageValue receivedData;
void setup() {
Serial.begin(9600);
/*
if you want to make waiting time for reading serial data short,
set waiting time with `Serial.setTimeout` function.
*/
Serial.setTimeout(10);
}
void loop() {
// Take out strings until Serial buffer is empty
while (Serial.available() > 0) {
// From ProtoPie Connect 1.9.0, We can use '\0' as delimiter in Arduino Serial
String receivedString = Serial.readStringUntil('\0');
receivedData = getMessage(receivedString);
}
// Do something with received message
// if (receivedData.message.equals("FIRST")) {
// analogWrite(firstLED, receivedData.value.toInt());
// } else if (receivedData.message.equals("SECOND")) {
// analogWrite(secondLED, receivedData.value.toInt());
// } else {
// analogWrite(thirdLED, receivedData.value.toInt());
// }
}
使用例
ArduinoがProtoPie Connectと連携する仕組みをより理解するには、以下の使用例を作成して実際に試してみてください。
照明の操作
照明の電源を連続してオンオフします。ProtoPie Connectと接続したArduino boardを使用し、ご自身でテストしてみましょう。
1. このプロトタイプをProtoPie Connectへ追加します。1.
2. 回路図に従って、Arduino boardと照明操作を設定します。
3. Arduino boardとProtoPie Connectを接続します。
4. 例示しているコードを使用してArduinoからProtoPie Connectへメッセージを送信します。
#include <string.h>
struct MessageValue {
String message;
String value;
};
struct MessageValue getMessage(String inputtedStr) {
struct MessageValue result;
char charArr[50];
inputtedStr.toCharArray(charArr, 50);
char* ptr = strtok(charArr, "||");
result.message = String(ptr);
ptr = strtok(NULL, "||");
if (ptr == NULL) {
result.value = String("");
return result;
}
result.value = String(ptr);
return result;
}
int firstLED = 3;
int secondLED = 5;
int thirdLED = 6;
struct MessageValue receivedData;
void setup() {
pinMode(firstLED, OUTPUT);
pinMode(secondLED, OUTPUT);
pinMode(thirdLED, OUTPUT);
Serial.begin(9600);
Serial.setTimeout(10); // Set waiting time for serial data to 10 milliSeconds
}
void loop() {
while (Serial.available() > 0) { // Take out strings until Serial is empty
String receivedString = Serial.readStringUntil('\0'); // From 1.9.0 version, We can use '\0' as delimiter in Arduino Serial
receivedData = getMessage(receivedString);
}
if (receivedData.message.equals("FIRST")) {
analogWrite(firstLED, receivedData.value.toInt());
} else if (receivedData.message.equals("SECOND")) {
analogWrite(secondLED, receivedData.value.toInt());
} else {
analogWrite(thirdLED, receivedData.value.toInt());
}
}