ArduinoをProtoPie Connectに接続する
Arduinoは通信にシリアルポート(USB)を使用し、Socket.IOまたはBridgeAppを使用せずにProtoPieConnectと直接通信できる唯一のハードウェアです。
ProtoPie Connectは、Arduinoボードとのシリアル通信をサポートしています。最も一般的なセットアップは、USB経由でArduinoハードウェアをProtoPie Connectを実行しているコンピューターまたはマシンに接続します。Arduinoハードウェアについての詳細はこちらをご参照ください。
USB経由でArduinoとProtoPie Connectを接続する
- メニューからArduinoを接続をクリックします
![[object Object]](https://cdn.sanity.io/images/vidqzkll/production/0a443a0b14dc3658382d3f3846d482d9d1e946de-2184x1374.png/connect-arduino-to-connect.png)
2. Arduinoのハードウェア情報に従ってPortとBaud Rateを設定します
![[object Object]](https://cdn.sanity.io/images/vidqzkll/production/529979b94f12933e7a8371382a84257259b11ab3-2184x1374.png/connect-arduino-port-baudrate.png)
ArduinoをProtoPie Connectに接する
ProtoPie ConnectとArduino間のシリアル通信は、メッセージ||値形式です。 値なしでメッセージを送信することも可能です。
Arduinoからメッセージを送信する
Serial.println() という関数を使用してメッセージ(および値)をProtoPie Connectに送信し、ProtoPie Connectはそれらのメッセージをプロトタイプに転送します。
次のサンプルコードでは、ArduinoはProtoPie ConnectにROTATEというメッセージと90という値を2秒ごとに送信します。
void setup() {
Serial.begin(9600);
}
void loop() {
// Send "ROTATE" to ProtoPie
// message: ROTATE
// value: 90
Serial.println("ROTATE||90");
delay(2000);
}
Arduinoにメッセージを送信
Arduinoハードウェアでは、受信したメッセージをメッセージ||値形式に解釈するための個別のコードが必要です。
次のサンプルコードでは、ArduinoはProtoPie Connectからメッセージを受信して理解するように設定しています。
#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ボードとライトコントロールをセットアップします
![[object Object]](https://cdn.sanity.io/images/vidqzkll/production/995439aa97f7ba1079e38b69ca48252e22270b3e-2110x1554.png/connect-arduino-usecase.png)
3. Arduinoを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());
}
}