
Introducing ProtoPie
Auto Layout
Triggers & Responses
Interaction Libraries
ProtoPie Player
Connecting Devices
Voice Prototyping
ProtoPie Enterprise
메뉴
Introducing ProtoPie
Auto Layout
Triggers & Responses
Interaction Libraries
ProtoPie Player
Connecting Devices
Voice Prototyping
ProtoPie Enterprise
ProtoPie Connect에서 아두이노(Arduino) 사용하기
ProtoPie Connect의 기본 아두이노 플러그인을 활용하여 소프트웨어와 하드웨어를 아우르는 멀티 스크린 경험을 제작해 보세요.
ProtoPie Connect는 아두이노 보드와의 시리얼 통신을 지원합니다. 가장 일반적인 구성은 USB를 통해 아두이노 하드웨어를 ProtoPie Connect가 실행 중인 PC에 연결하는 것입니다.
아두이노 사용 방법에 대해 더 알아보기.
USB를 통해 아두이노를 ProtoPie Connect에 연결하기
ProtoPie Connect의 플러그인 목록에서 Arduino를 선택합니다.

원하는 Port 및 Baud Rate를 선택합니다.
Port: 아두이노 보드에 해당하는 포트를 선택합니다.

Baud Rate: 이 값은 시리얼 연결에서 업데이트를 얼마나 자주 확인하는지를 결정합니다. 기본값인 9600을 선택할 수 있습니다.

*아두이노 플러그인은 시리얼 통신을 지원하는 모든 마이크로컨트롤러에서 작동합니다. 예를 들어, ESP32 마이크로컨트롤러를 사용하려는 경우 ESP32를 연결한 후 적절한 포트와 보레이트(baud rate)를 선택해 ESP32 시리얼 포트를 열고 ProtoPie Connect에서 데이터를 수신할 수 있습니다.
ProtoPie Connect와 아두이노 함께 사용하기
ProtoPie Connect와 아두이노는 Message||Value 형식으로 통신합니다. 값 없이 메시지만 전송하려는 경우 Message만으로 충분합니다.
아두이노에서 메시지 전송하기
Serial.println() 함수를 사용해 ProtoPie Connect로 메시지(및 값)를 전송하면, 연결된 모든 프로토타입으로 전달됩니다.
다음 예제에서 아두이노는 ProtoPie Connect로 2초마다 메시지 ROTATE와 값 90을 전송합니다.
void setup() { Serial.begin(9600); } void loop() { // Send "ROTATE" to ProtoPie // message: ROTATE // value: 90 Serial.println("ROTATE||90"); delay(2000); }
void setup() { Serial.begin(9600); } void loop() { // Send "ROTATE" to ProtoPie // message: ROTATE // value: 90 Serial.println("ROTATE||90"); delay(2000); }
void setup() { Serial.begin(9600); } void loop() { // Send "ROTATE" to ProtoPie // message: ROTATE // value: 90 Serial.println("ROTATE||90"); delay(2000); }
void setup() { Serial.begin(9600); } void loop() { // Send "ROTATE" to ProtoPie // message: ROTATE // value: 90 Serial.println("ROTATE||90"); delay(2000); }
void setup() { Serial.begin(9600); } void loop() { // Send "ROTATE" to ProtoPie // message: ROTATE // value: 90 Serial.println("ROTATE||90"); delay(2000); }
아두이노로 메시지 전송하기
아두이노 하드웨어에서 수신하는 Message||Value 형식의 메시지를 해석하려면 별도의 코드가 필요합니다.
아래 예제에서 아두이노는 ProtoPie Connect로부터 받은 메시지를 수신하고 해석합니다.
#include <string.h> // Declare struct struct MessageValue { String message; String value; // Note that value is of String type }; // 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 from ProtoPie Connect if (receivedData.message.equals("FIRST")) { // If message from ProtoPie Connect equals "FIRST" do the following l1 = receivedData.value.toInt(); // receivedData.value.toInt() converts the value from ProtoPie Connect to integer type and assigns it to l1 analogWrite(firstLED, l1); } }
#include <string.h> // Declare struct struct MessageValue { String message; String value; // Note that value is of String type }; // 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 from ProtoPie Connect if (receivedData.message.equals("FIRST")) { // If message from ProtoPie Connect equals "FIRST" do the following l1 = receivedData.value.toInt(); // receivedData.value.toInt() converts the value from ProtoPie Connect to integer type and assigns it to l1 analogWrite(firstLED, l1); } }
#include <string.h> // Declare struct struct MessageValue { String message; String value; // Note that value is of String type }; // 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 from ProtoPie Connect if (receivedData.message.equals("FIRST")) { // If message from ProtoPie Connect equals "FIRST" do the following l1 = receivedData.value.toInt(); // receivedData.value.toInt() converts the value from ProtoPie Connect to integer type and assigns it to l1 analogWrite(firstLED, l1); } }
#include <string.h> // Declare struct struct MessageValue { String message; String value; // Note that value is of String type }; // 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 from ProtoPie Connect if (receivedData.message.equals("FIRST")) { // If message from ProtoPie Connect equals "FIRST" do the following l1 = receivedData.value.toInt(); // receivedData.value.toInt() converts the value from ProtoPie Connect to integer type and assigns it to l1 analogWrite(firstLED, l1); } }
#include <string.h> // Declare struct struct MessageValue { String message; String value; // Note that value is of String type }; // 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 from ProtoPie Connect if (receivedData.message.equals("FIRST")) { // If message from ProtoPie Connect equals "FIRST" do the following l1 = receivedData.value.toInt(); // receivedData.value.toInt() converts the value from ProtoPie Connect to integer type and assigns it to l1 analogWrite(firstLED, l1); } }
활용 사례(Use Cases)
아두이노가 ProtoPie Connect와 어떻게 연동되는지 더 잘 이해하기 위해 다음 사용 사례를 따라 구현해 보세요.
가정용 조명 제어하기
조명을 순서대로 켜고 끕니다. ProtoPie Connect에 연결된 아두이노 보드를 사용해 직접 테스트해 보세요.

이 프로토타입을 ProtoPie Connect에 추가합니다.
이 회로도를 따라 아두이노 보드와 조명 제어 장치를 구성합니다.

아두이노 보드를 ProtoPie Connect에 연결합니다.
이 예제 코드를 사용하여 아두이노에서 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()); delay(30); } else if (receivedData.message.equals("SECOND")) { analogWrite(secondLED, receivedData.value.toInt()); delay(30); } else { analogWrite(thirdLED, receivedData.value.toInt()); delay(30); } }
#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()); delay(30); } else if (receivedData.message.equals("SECOND")) { analogWrite(secondLED, receivedData.value.toInt()); delay(30); } else { analogWrite(thirdLED, receivedData.value.toInt()); delay(30); } }
#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()); delay(30); } else if (receivedData.message.equals("SECOND")) { analogWrite(secondLED, receivedData.value.toInt()); delay(30); } else { analogWrite(thirdLED, receivedData.value.toInt()); delay(30); } }
#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()); delay(30); } else if (receivedData.message.equals("SECOND")) { analogWrite(secondLED, receivedData.value.toInt()); delay(30); } else { analogWrite(thirdLED, receivedData.value.toInt()); delay(30); } }
#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()); delay(30); } else if (receivedData.message.equals("SECOND")) { analogWrite(secondLED, receivedData.value.toInt()); delay(30); } else { analogWrite(thirdLED, receivedData.value.toInt()); delay(30); } }
수술용 로봇 팔
무선 컨트롤러로 제어되는 로봇 팔(아두이노 브라치오(Braccio) 로봇 팔)의 프로토타입을 제작하는 방법을 알아보세요.
로보틱스 프로토타이핑에서 ProtoPie의 실질적인 활용 방안을 살펴보려면 이 아티클을 확인해 보세요.
아두이노에 사용된 코드입니다.