MenuToggle Menu

Arduino with ProtoPie Connect

Arduino는 Socket.IO나 Bridge 앱을 사용하지 않고, 하드웨어가 ProtoPie Connect와 직접 통신할 수 있는 유일한 방법입니다. Arduino 하드웨어는 통신하기 위해 시리얼(USB) 연결을 사용합니다.

ProtoPie Connect는 Arduino 보드를 통해 시리얼 통신을 지원하고 있습니다. 가장 일반적인 설정은, ProtoPie Connect를 실행하고 있는 기기에 USB를 통해 Arduino 하드웨어를 연결하는 것입니다.

Arduino 하드웨어 사용과 관련한 자세한 사항은 다음 페이지를 참고해주십시오.

Connecting Arduino to ProtoPie Connect via USB

  1. 우측 상단 메뉴에서 Connect Arduino를 클릭하십시오.
[object Object]

2. Arduino 하드웨어의 정보대로 Port와 Baud Rate를 설정합니다.

[object Object]

Using Arduino with ProtoPie Connect

ProtoPie Connect와 Arduino 간의 시리얼 통신은 Message||Value 형식으로 이루어집니다. 단, Value를 입력하는 것은 선택 사항이며 Message만 전송할 수도 있습니다.

Sending messages from Arduino

Serial.printIn() 함수를 사용하여, 메시지(및 값)을 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);
}

Sending messages to Arduino

Arduino 하드웨어는 수신된 메시지를 Message||Value 형식으로 인식하기 위해 별도의 코드가 필요합니다.

아래 예제에서, 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());
  // }
}

Use Cases

다음의 예제에서, 실제로 Arduino가 ProtoPie Connect와 어떻게 작동하는지 확인하실 수 있습니다.

Control Your Home Lights

여러 개의 조명을 각각 켜고 끌 수 있습니다. ProtoPie Connect에 연결된 Arduino 보드를 사용하여 직접 테스트해보십시오.

1. 프로토타입을 ProtoPie Connect에 추가합니다.

2. 다음 회로도처럼 Arduino 보드와 조명 컨트롤을 설정합니다.

[object Object]

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