MenuToggle Menu

ProtoPie Connect에서 Arduino 사용하기

ProtoPie Connect의 내장 Arduino 플러그인을 사용해 소프트웨어와 하드웨어를 아우르는 멀티 스크린 경험을 제작해보세요.

ProtoPie Connect는 Arduino 보드와의 시리얼 통신을 지원합니다. 가장 일반적인 설정은 ProtoPie Connect가 USB를 통해 실행되는 장치에 Arduino 하드웨어를 연결하는 것입니다.

Arduino 사용법을 자세히 알아보세요.

Arduino를 USB로 ProtoPie Connect에 연결하기

1. ProtoPie Connect의 플러그인 목록에서 Arduino를 선택합니다.

[object Object]

2. 원하는 포트(Port) 및 보 레이트(Baud Rate)를 선택합니다.

  • 포트: Arduino 보드에 맞는 포트를 선택합니다.
[object Object]
  • 보 레이트: 이 값은 시리얼 통신을 확인하고 업데이트하는 빈도를 결정합니다. 기본값인 9600을 선택할 수 있습니다.
[object Object]

참고: Arduino 플러그인은 시리얼 통신을 사용하는 마이크로 컨트롤러(Micro Controller)와 함께 작동합니다.예를 들어 ESP32 마이크로 컨트롤러를 사용하고자 하는 경우, ESP32에 연결한 후 ProtoPie Connect에서 시리얼 포트 ESP32를 열고 데이터를 수신할 적절한 포트 및 보 레이트를 선택할 수 있습니다.

ProtoPie Connect에서 Arduino 사용하기

ProtoPie Connect와 Arduino는 Message||Value 형식을 사용해 커뮤니케이션합니다. 값을 제외하고 메시지만 보내고자 하는 경우 메시지로 충분합니다.

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 하드웨어는 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());
  // }
}

사용 사례

Arduino와 ProtoPie Connect가 함께 작동하는 원리를 더 자세히 이해하려면 다음 사용 사례를 재구현해 보세요.

집 조명 제어하기

조명을 연속적으로 켜고 끌 수 있습니다. 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