MenuToggle Menu

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]を選択します。

[object Object]

2. ご希望のPortBaud Rateを選択します。

  • Port: お使いのArduino boardに対応するポートを選択します。
[object Object]
  • Baud Rate: この変数は連続接続の更新確認頻度を設定するものです。デフォルトでは変数9600を選択することができます。
[object Object]

*Arduinoプラグインの作動にはシリアルポートで通信しているマイクロコントローラが必要です。例えば、ESP32マイクロコントローラを使用したい場合、ESP32を接続した後、適切なポートとボーレートを選択してESP32のシリアルポートを開き、ProtoPie Connectのデータを受信できます。

ArduinoとProtoPie Connectの接続

ProtoPie ConnectとArduinoはメッセージ・値形式で通信します。変数を設定せずにメッセージを送信したい場合は、Messageだけで十分です。

Arduinoからメッセージを送信

Serial.println()関数を使用してメッセージ(と変数)をProtoPie Connectへ送信すると、対応するすべてのプロトタイプへ伝達されます。

以下の例では、ArduinoによってメッセージROTATEと変数902秒ごとに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と照明操作を設定します。

[object Object]

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());
  }
}
Back To Top