본문 바로가기

아두이노/보드12

아두이노 통신 UNO TO UNO -#6 이전에 시리얼 통신으로 데이터를 받았다. 사실 주고 받는 통신은 아니다. 일반적으로 보내는 통신이다. 쉽게 말해서 제어에 가깝다고 보면 된다. 주고 받는 통신은 이것 보다 더 난이도가 높다. 우리도 생활에서 일반적으로 시키는게 더 쉽다. 그만큼 대화의 소통은 더 어려운것과 비슷하다. ... 잡담은 그만하고 앞으로 할 것은 I2C와 SPI 통신을 할 것이다. 시작하기전에 3개의 통신 모두의 연결을 보자. 공통점과 다른점만 파악해도 모두 이해 했다고 보면 된다. 물론 각각의 통신에서 다시 설명하겠지만, 오늘은 연결만 보고 가자. 그리고 잘못된점은 본인이 TinkerCad 초보라서 I2C LCD를 찾지 못해서 대충 그렸다. 이것만 제외하고 보면 된다. 이것도 I2C LCD와 그냥 LCD의 차이를 모른다면 그냥.. 2021. 12. 4.
아두이노 통신 번외편 -#4 3번까지 이해 했다면 거의 모두 이해 했다. 여기서 의문이 들어야 한다. 정의하지 않는다고 했다. 소프트웨어 시리얼, 하드웨어 시리얼.. 두개를 정의 하지 않고 사용자가 그냥 호출하는것만으로 결정되어 진다. 정의하지 않는다고 했지, 하드웨어 시리얼, 소프트웨어 시리얼 통신이라고 하지는 않았다. 그렇다. 여기서는 아무것도 정의하지 않았다. 쉽게 말해서 모든 통신을 넣을수가 있다는것이다. 지금 이야기가 정확히 이해가 안 될수도 있지만, 앞으로 I2C와 SPI를 통해서 코드를 보면서 이해 하도록 하자. 이전내용에 대한 전체 코드다. #include #include SoftwareSerial sSerial= SoftwareSerial(2, 3); //HardwareSerial& sSerial = Serial2;.. 2021. 11. 20.
아두이노 통신 번외편 -#3 이제 번외편 마지막이다. 이전에 인자만 다르고 동일한 함수를 두개 만들어서 사용했다. 아두이노 메가 처럼 하드웨어시리얼도 많고 소프트웨어 시리얼도 가능하다면 유용한 코드가 될것이다. 그래도 동일한, 유사한 함수가 두개라는것은 좀 그렇다. 그래서 최종적으로 진화하는 템플릿으로 진화 하는것이다. 변수의 타입, 객체의 형태를 정의하지 않는것이다. 정의하지 않는 형태가 바로 템플릿이다. template void read_serial(Info& _info, T& ss) { memset(&_info, 0x00, sizeof(Info)); if (ss.available()) { char c; char *p; p = (char*)&_info; while( (p - ((char*)&_info)) < sizeof(Info.. 2021. 11. 20.
아두이노 통신 번외편 -#2 이전 코드가 이해 했다면 이것은 1분이면 이해 할 수 있는 단순한 코드 이다. - 소프트웨어 시리얼을 사용하지 않고 하드웨어 시리얼을 사용하고 싶다면 아래와 같이 간단하게 고치면 된다. - 쉽게 말해서 코드자체가 변경되지는 않는다. 단지 하드웨어, 혹은 시리얼 차이만 변경되는것이다. - 아두이노가 C언어가 아니라 C++ 이기 떄문에 함수이름은 동일해도 상관없다. 그래서 아래코드가 가능하다. void read_serial(Info& _info, SoftwareSerial& ss); void read_serial(Info& _info, HardwareSerial& ss); void read_serial(Info& _info, SoftwareSerial& ss) { memset(&_info, 0x00, siz.. 2021. 11. 20.
아두이노 통신 번외편 -#1 사실 이전에 했던 내용과 이어져 있지만, 좀 다르다. 그렇다고 꼭 필요하지는 않다. 그렇지만 알아 두면 좋은 내용이다. 기존의 코드에서 범용성을 기반으로 코드를 수정 하는것이다. 기존의코드는 시리얼통신을 기반으로 하고 있다. 그렇다면 하드웨어 시리얼을 사용한다면 코드를 변경해야 한다. 혹은 다른 시리얼 통신을 사용한다면 또 코드를 변경해야 한다. 그래서 시리얼통신을 변수화 하는것이다. 이전코드와 이후코드의 차이를 보는것만으로 도움이 될것이다. void read_serial(Info& _info, SoftwareSerial& ss) { memset(&_info, 0x00, sizeof(Info)); if (ss.available()) { char c; char *p; p = (char*)&_info; wh.. 2021. 11. 20.
아두이노 통신 UNO TO UNO -#5 우노B의 소스코드도 우노A에 비하면 더 단순하다. 우노A와 공통된 사항을 제외하면 우노B도 두개의 함수로 구성되어 있다. 우노A로 부터 오는 데이터를 읽기 위한 함수 데이터를 출력하기 위한 LCD함수로 구성되어 있다. LCD출력 함수에 대해서는 몇 줄되지 않고 다른 강좌에서 많기 때문에 생략하기로 한다. 그러면 마지막으로 남는 함수는 우노A로 부터 오는 데이터를 읽기 위한 함수 이다. 우노A의 시리얼 모니터 읽기 함수와 유사 하지만 차이가 있다. 시리얼 모니터에서 읽는 함수는 엔터를 기준으로 데이터를 읽었지만, 우노B의 읽기 함수는 구조체의 크기 만큼 읽는 함수 이다. 거의 유사 하지만, 약간의 차이가 있다. void read_serial(Info& _info) { memset(&_info, 0x00, .. 2021. 11. 16.
아두이노 통신 UNO TO UNO -#4 우노B의 연결은 우노A에서 오는 통신 시리얼통신 포트룰 2,3번 핀에 연결하는것과 I2C통신을 위한 2핀과 VCC, GND를 포함하여 총 6개의 핀이 연결되어 있다. 우노B의 소스코드 부터 보자 #include #include SoftwareSerial sSerial= SoftwareSerial(2, 3); //HardwareSerial& sSerial = Serial2; #define version 0x01 #define BAUD 9600 typedef struct _Info { char ver; char lcd_1[20+1]; _Info() { ver = version; memset(lcd_1, 0x00, sizeof(char)*21); } }Info; //LiquidCrystal_I2C lcd(0x.. 2021. 11. 16.
아두이노 통신 UNO TO UNO -#3 우노A의 소스코드는 2개의 함수로 구성되어 있다. 1. 시리얼모니터를 이용하여 컴퓨터로 부터 입력 받는 함수 2. 소프트웨어 시리얼을 통하여 우노B로 전송하는 함수 2번 함수는 너무 단순해서 설명할 것도 없다. 1번 함수만 공부하면 될것이다. 시리얼 모니터를 통해서 엔터를 입력 할 때까지 무한 대기 상태로 들어간다. 처음 나오는 while 문장으로 이루어 진다. 시리얼 데이터가 있다면 한 바이트씩 읽는다. 읽은 데이터를 버퍼에 저장하지만 20글자를 초과하면 더 이상 입력받지 않고 버린다. 데이터는 포인터를 이용해서 저장한다. 입력된 데이터가 있고 정상적인 엔터가 입력 되었다면 버프의 데이터를 구조체로 복사 한다. 딱히 어려운 문장은 없을수도 있지만, 포인터에 익숙하지 않다면 어려워 보일 수도 있다. 그래.. 2021. 11. 16.
아두이노 통신 UNO TO UNO -#2 우노A의 연결은 2번, 3번 핀을 우노 B와 연결해서 시리얼 통신을 할 것이다. 추가로 연결한것은 없다. 우노A의 소스코드를 보자 #include #include SoftwareSerial sSerial= SoftwareSerial(2, 3); //HardwareSerial& sSerial = Serial2; #define version 0x01 #define BAUD 9600 typedef struct _Info { char ver; char lcd_1[20+1]; _Info() { ver = version; memset(lcd_1, 0x00, sizeof(char)*21); } }Info; void setup() { Serial.begin(BAUD); sSerial.begin(BAUD); } void.. 2021. 11. 16.