본문 바로가기
공부/프로그래밍

아두이노에서 메모리 부족으로 2대사용하고 서로 데이터 통신하기

by demonic_ 2015. 10. 6.
반응형

하고있는 프로젝트에서 아두이노를 사용하는데 다양한 센서나 기타 재료를 붙이려다 보니 라이브러리가 필요하고, 내부메모리를 할당해줘야했다. 그러나 소형컴퓨터답게 메모리는 턱없이 부족하였고, 하나에 여러개를 달 수 없다는 생각에 미쳤다. 해서 해결한 방법은 아두이노를 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);

}


사실상 두 소스가 동일하다고 봐도 된다. 쌍방향 통신이 가능하니 필요시 참조하면 된다.


반응형

댓글