하고있는 프로젝트에서 아두이노를 사용하는데 다양한 센서나 기타 재료를 붙이려다 보니 라이브러리가 필요하고, 내부메모리를 할당해줘야했다. 그러나 소형컴퓨터답게 메모리는 턱없이 부족하였고, 하나에 여러개를 달 수 없다는 생각에 미쳤다. 해서 해결한 방법은 아두이노를 2개 사용하는 것이었다. 각각의 아두이노를 사용하되, Master와 Slave를 나누고 서로 통신하게 하는 방법이다.
인터넷에 아두이노 2대 연결이라고 검색해서 찾아보면 통신하는 방법이 여러가지가 있다. 그러나 특정 방식은 문제점이 있었다. UART방식이었는데, 데이터를 서로 주고받는것까진 괜찮았지만, 데이터가 온전하게 오진 않았다. 중간에 깨지는 현상이었는데 아마 블루투스도 이용하느라 2,3번 핀을 사용하는데 UART방식도 2,3번 핀을 같이 사용해서인것 같았다. 해서 다른 또다른 방식, I2C방식을 사용하기로 했다.
소스는 간단하다. (참조 링크 : 아두이노끼리 연결, 2대 연결방법)
아래는 회로연결부분을 정리한 것이다.
컴퓨터 |
아두이노 MASTER |
아두이노 SLAVE |
USB |
VCC |
VCC |
|
GND |
GND |
|
A4 |
A4 |
|
A5 |
A5 |
아두이노 2개야 빵판을 각각 연결했지만 전원은 컴퓨터에서 오는 1개의 USB를 사용했다. 즉, 빵판끼리 VCC와 GND를 연결했다. 본래 샘플은 한방향으로만 데이터 전송이 가능하지만, 조금 변형해서 쌍방향으로 데이터 통신이 가능하도록 했다.
마스터 부분 소스는 다음과 같이 했다.
#include <Wire.h>
void setup()
{
Wire.begin(4);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop()
{
String test = "master";
wireSend(test); // 1초마다 전송
delay(1000);
}
/************************************
* Wire 통신 관련 기능
*************************************/
// Wire 데이터 전송
void wireSend(String tmp){
Wire.beginTransmission(4);
Wire.write(tmp.c_str());
Wire.endTransmission();
}
// Wire 데이터를 받았을때
void receiveEvent(int howMany)
{
Serial.println("receive");
String tmpStr = "";
while(Wire.available()){
//Serial.println(Wire.read());
char c = Wire.read();
//Serial.print(c);
tmpStr = tmpStr + c;
}
Serial.println(tmpStr);
}
SLAVE 쪽은 다음과 같다.
#include <Wire.h>
void setup()
{
Wire.begin(4);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop()
{
String test = "slave";
wireSend(test); // 1초마다 전송
delay(1000);
}
/************************************
* Wire 통신 관련 기능
*************************************/
// Wire 데이터 전송
void wireSend(String tmp){
Wire.beginTransmission(4);
Wire.write(tmp.c_str());
Wire.endTransmission();
}
// 마스터 아두이노에서 받은 데이터 처리
void receiveEvent(int howMany)
{
Serial.println("receive Y");
String tmpStr = "";
while(Wire.available()){
//Serial.println(Wire.read());
char c = Wire.read();
//Serial.print(c);
tmpStr = tmpStr + c;
}
Serial.println(tmpStr);
}
사실상 두 소스가 동일하다고 봐도 된다. 쌍방향 통신이 가능하니 필요시 참조하면 된다.
'공부 > 프로그래밍' 카테고리의 다른 글
오라클 컬럼 & 설명 추가 (0) | 2015.10.16 |
---|---|
프로시저나 펑션내용 검색하기 (0) | 2015.10.14 |
빅데이터와 현실 (0) | 2015.10.01 |
안드로이드 카메라 소스 [펌] (2) | 2015.09.24 |
Mediaplayer 로 지정되어있는 벨소리 재생하기 (0) | 2015.09.22 |
댓글