본문 바로가기

트렌드 한눈에 보기/학계 트렌드

아두이노 통신 고군분투의 기록 - UART vs I2C

 지난 글들에서도 써 왔지만, 아두이노 통신은 참 믿을 만한 것이 못된다. UART는 불안정하고, I2C는 통신이란 말이 무색할 정도로 거리가 짧다. 그렇기에 두 개의 아두이노를 사용하면서 통신이랄 것도 없이, pulseIn() 함수를 활용했다. 아두이노 자체가 하나의 센서가 되는 것이다. 예를 들어 센서값(force & position values)이 200으로 측정이 된다면, pulseIn(pin, 200) 이라는 함수를 사용해서 200 ms 동안 전기자극을 주고, 두 번째 아두이노로 해당 시간을 또 측정하게 된다.

 직관적인 그림 설명


 물론 비효율적이기 짝이 없는데다가, 밀리초 단위로 측정을 한다는 것이 영 마음에 들지는 않는다. 그럼에도 "아두이노 통신"으로 이름을 달고 있는 여러 친구들(I2C, UART) 같은 녀석들보다는 낫다고 해야하나. 요컨대 차악을 선택한 셈이다.

 

 손으로 보드를 납땜한 초기 버전을 뒤로 하고, PCB보드로 제작할 때가 되었기에 다시 한 번 통신을 공부해보고 살릴 수 있는 녀석을 살리기로 했다. 그래도 나름 많은 사람들이 사용하고 있는 기술일테니 어떻게든 써볼 수 있지 않을까- 하는 마음과 계속해서 밀리초 단위를 측정하는 일을 할 수는 없다는 생각이었다.


1. UART

 

 UART는 보내고자 하는 데이터를 Packet이라고 하는 최소단위로 둘러싼 다음에 송신해서, 수신부에서 다시 해독하는 과정을 거치게 된다. Packet을 만드는 이유는 데이터 송수신의 안정성을 높이기 위해서이지만 효과는 미미하다. 내가 가진 아두이노 상에서는 초당 수 십개의 데이터를 수신하는 수준이었는데 3~4초에 한 번 꼴로 에러가 났다. 말하자면 송신 100회당 1번 꼴인데, 100만개 당 한 두개의 에러를 추구하는 6시그마 전략이 펼쳐진 것도 20년이 넘었으니 뭐 말도 안되게 높은 에러율이라고 할 수 있다. 

 

완벽한 통신은 말도 안된다

 이러매 눈감에 생각해볼밖에 / 겨울은 강철로 된 무지개인가보다 / 하는 구절이 절로 떠오를 만큼 답이 없다. 왜냐하면, 가장 기본적인 UART에서 이런 문제가 나온다는 점은 아무리 아두이노 간 통신이 복잡해진다고 해도 별다른 퀄리티 향상을 노리기 어렵다는 뜻 같기 때문이다. 게다가 내가 측정하는 position 값은 1100 mm까지 다뤄야하는데, UART는 한 번에 255 까지밖에 지원하지 않는다. 여러 데이터를 송신하여 조합하는 수밖에 없다는 뜻이다.

 

2. I2C

 고된 삽질 끝에 얻은 결론이었지만, I2C는 50cm 이상 되는 배선에서 잘 작동하지 못한다. 그럼에도 I2C를 다시금 집어 올린 이유는, 그래도 UART 보다는 괜찮은 송수신을 보여줬던 경험이 있기 때문이다. 게다가 현재 쓰고 있는 OLED Display (설명글) 역시 I2C 통신으로 구현이 되는 셈인데, 화면이 끊기거나 한 적은 전혀 없다. 

 

 

 그래서 찾은 녀석이 위 부품이다. I2C 통신을 30 m 까지 늘려줄 수 있는 기기라고 한다. 데이터를 여러 방식으로 쪼갠 뒤 합치는 과정을 또 다르게 구현한 부품이라는 소리인데, 이미 당한 바 있듯 그렇게 신뢰가 가지는 않는다. 그럼에도 한 발 재겨 디딜 곳조차 없다고 했던가- 남겨진 유일한 희망이다. 이것 마저 안된다면 그냥 pulseIn으로 측정만 두 번 해가는 시스템을 유지해야 한다.

 

 해당 부품은 판매처가 그렇게 많지 않아서, 네이버 쇼핑으로 찾은 곳에 전화해보니 딱 두 개가 남았다고 했더랬다. 숨겨 무엇하랴, 내가 필요한 부품도 딱 두 개였으니 냉큼 주문했다. 내일 출고한다 했으니 다음주에는 받아볼 수 있을테다. 


 보름 전 글에서는 분명히 "1차 발표가 끝나면 여유가 생길테고 그 때를 위해 할 일을 정해두자" 라고 했으나, 웬걸 아직도 같은 주제로 쩔쩔매는 중이다. 어서 내 연구 주제를 설정하고 내 실험을 해보는 날이 왔으면 좋겠다. 

 

 그러기 위해서는 더 많이 읽고 보고 써야겠지. 겨울은 강철로 된 무지개인가보다.