우선 예전 조종기 스케치가 보이지 않아 스케치는 둘째 치고, 핵심적인 통신모듈 테스트부터 해보기로 했다.

Arduino & nRF24L01+ 모듈을 활용하는게 가장 현실적이기에 예전에 사두었던 nRF24L01 모듈 (A 타입, 안테나 내장형) 모듈과 아두이노 나노 2개로 바로 테스트 해보았다.
(nRF24L01 모듈에 대한 글은 내 블로그에 있으니 참고하면 되겠다)




블로그에 있는 글 처럼 아두이노 나노와 nRF24L01 모듈을 2개 각자 연결하고 후딱 코딩을 해봤다.일단 캐패시터는 스킵하고 RF24 의 PA 를 LOW 로 하여 전원에 에로사항이 최대한 안생기게 하고 테스트를 했다.

:: 송신기 측 테스트 코드

:: 수신기 측 테스트 코드


일단 조종기에서 Steering, Acceleration, 기타 채널 3~6 까지 총 6채널이라 가정하고, 각 unsigned short 값에 PWM 값을 보낸다고 가정하여 데이터를 넣어봤다. 이부분은 다음에 조이스틱과 토글스위치 및 볼륨 등으로 바꾸면 될것이다.

데이터를 송/수신 해서 Serial Monitor 에 잘 찍히는지 모니터링 해봤는데 잘 찍힌다. 간단한 테스트라서 그다지 내용은 없으나 작동하니 기분은 좋다. 


[송신기와 수신기의 시리얼 출력 화면] 

다음에는 조종기와 스위치를 달아줘야겠다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

소프트웨어

nRF24L01 은 기본적으로 SPI 방식으로 통신을 하고, 스펙에 정의된 프로토콜로 상호 통신을 한다. (스펙은 아래 링크로 다운로드)

nRF24L01_Product_Specification_v2_0.pdf


일일이 레지스터 비트놀이를 할 수도 있겠지만, 역시나 쉽게 사용할 수 있도록 만들어놓은 라이브러리들이 있다.

몇가지 라이브러리와 대표적인 양대 라이브러리가 있는데

  • RF24 - RadioHead 라는 이름의 통신 라이브러리가 나오는데, 그 개발자가 nRF24L01+를 위해 최적화 해서 만든 라이브러리이다. 아두이노, Raspberry Pi, Attiny 등에서 모두 동작하고 많은 기능을 지원한다. nRF24L01 도 이 드라이버를 통해 지원된다.
  • RF24Network - 위 RF24 라이브러리 기반으로 OSI7 레이어 (SW 개발하시는 분들은 아시쥬?)를 구현해놓은 네트워크 라이브러리이다. 
  • RF24Mesh - 이 또한 RF24 기반으로 센서들의 Mesh Network 을 구현하는 목적으로 만들어놓은 라이브러리이다. 자동 어드레싱과 동적 설정 등이 추가된 버전이다
  • MySensors - Mesh Network 을 목표로 nRF24L01 을 중심으로 한 라이브러리를 만들어 배포하는 곳이다. 센서 데이터를 전달하는데 좀더 적합한 라이브러리 모양이다.
  • Mirf - 양대 라이브러리 중 하나의 라이브러리이다. 코드와 API 모두 심플하여 많은 사람들이 활용한다.AVRLib 의 Arduino 버전을 포팅해놓은것이다.
  • RadioHead - RF24 뿐 아니라 여러가지 통신방식을 "드라이버"개념으로 지원한다. 위 RF24 라이브러리 만든 개발자가 만들었다. 드라이버 중 RH_NRF24 드라이버가 있다.
위 라이브러리들 중 RF24 와 Mirf 라이브러리가 양대 드라이버 정도 되겠다. 가장 유명하다.혹은 위 RadioHead 라이브러리 내의 RH_NRF24 드라이버를 사용해보는것도 좋겠다


여기에서는 RF24 라이브러리를 사용하는 예제를 보겠다


위 처럼 nRF24L01 모듈의 CE, CSN 핀을 결정해주면 된다.

중요한 개념중 하나가 Channel 과 Pipe Address 이다.

Channel 은 nRF24L01 이 사용하는 2.4 ~ 2.525GHz 주파수 대역을 동시에 사용할 수 있는 통로를 말한다. nRF24L01 은 125개의 채널을 사용할 수 있다. 그런데 이건 256Kbps 아 1Mbps 의 Data Rate 를 사용할때의 이야기이고, D/R를 2Mbps 를 사용할 수 있는데 이때에는 62채널로 줄어든다. 그만큼 대역폭이 더 많이 필요하기 때문이다.

Pipe Address 는 채널 내에서의 가상의 송/수신 주소이다. Ethernet 의 IP 주소와 유사하다고 보면 된다. 이 Pipe Address 는 5바이트 이내의 값을 사용하면 되며, 예제에서는 1Node 2Node 라고 임의로 주었다.

Pipe 를 Open 할 때에는 Sender 의 Write 대상 주소는 Receiver 의 Reader 주소와 같아야 한다. 

또한 이 주소는 총 6개 까지 만들어서 Listen 할 수 있는데, 


이렇게 하나의 RX 가 총 6개의 TX 들과 1채널 내에서 통신할 수 있다. 

단, 하나 주의할 점은, 여러개의 주소(총 6개까지가능한) 중 0번 주소는 5바이트 주소값 전체를 원하는대로 만들어주면 되지만, 1번 ~ 5번 주소는 가장 마지막 LSByte 값을 제외한 나머지 4바이트 값들이 동일해야 한다. (아마도 성능때문에 요런 꼼수를 쓴 듯 하다)

위 설명을 그림으로 나타낸것이다. 

Data Pipe 0 의 주소는 뭘 해도 상관 없고, pipe1 ~ 5 까지는 앞의 4바이트 주소값이 같아야 한다는 이야기이다. 그리고 제일 마지막 1바이트는 같으면 안된다는 이야기이다.

또하나 주의할 점은 nRF24L01 모듈은 Half Duplex 모듈이다. 그래서, Write 를 하기 전에는 Listening 을 멈춰야 한다. 무전기 같은것이다. 그래서 코드에서도 radio.write() 하기 전에 radio.stopListening() 을 호출해주는 것이다.

그러면 stopListening --- startListening 과의 시간차가 발생할텐데 이 간격이 어느정도냐면

 

그림 처럼 130uS 가량 된다. 즉시 Switching 되는게 아니므로 주의해야 하겠다. 

마지막으로 Payload 의 사이즈는 최대 32 byte 까지 가능하다. 한 패킷에 데이터가 32바이트를 넘지 않아야 한다. 

그림처럼, preamble 1 바이트, 주소 3~5바이트, CRC 1~2 바이트가 붙고, 데이터는 1~32 바이트 까지 가게된다. 더 보내려면 잘라서 보내야 한다.


이정도로 기본적인 nRF24L01+ 모듈 사용에 대해 정리해본다. 더 많은 기능들과 Shock Burst 모드 같은게 있다는데 아직 자세히는 안알아보았고, 앞으로 쓰다가 사용하게 되면 차차 추가해보도록 하겠다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

소개

아마도 2006년 쯤 이었던것 같다. 40MHz, 27MHz 대역의 크리스탈을 TX/RX 세트로 열 세트 쯤은 갖고다니다가 2.4GHz 의 유행이 Spektrum 송신기를 통해 불기 시작하더니 결국 FM 주파수는 자취를 감추고 말았다.

nRF24L01 모듈은 2.4Ghz 주파수로 무선통신을 가능하게 해주는 Nordic 社의 RF 모듈이다. 전 세계적으로 Maker 들이 이 nRF24L01+ 모듈을 많이 쓰는데, 이유는 값이 무지하게 싸고 크기도 작으며 성능 또한 매우 떨어지거나 하지 않기 떄문이다.

가격은 PCB 안테나 타입인 nRF24L01 모듈이 우리나라 돈 1,000 원 정도 한다. 물론 국내 판매업자들은 이걸 또 몇 배 이상 뻥튀기 해서 팔고있다.


모양은 위 처럼 생겼고, 크기는 검지손가락 한마디 반 정도 된다 매우 작다

성능은, 여기저기서 실험해본 동영상들이 있지만 좀 시니컬한 테스트 결과를 보면, PCB 버전이 대략 200m 가량. PA-LNA 외장 안테나 버전이 대략 800m 가량의 유효거리가 나온다. 물론 PA(Power Amplifier) 의 세기 설정에 따라 다르다.


몇가지 테스트 데이터와 동영상들 중에서 기특하게도 저렇게 테스트한 결과를 그래프로 표시해둔 자료가 있어서 첨부해봤다


하드웨어


Pin Assign 은 위와 같이 되어있고, SPI 인터페이스를 사용한다. 

전원은 3v3(3.3V) 를 사용하므로, 아두이노의 3.3V 아웃풋에 연결해주면 된다. 단 이때 주의할 것은, 아두이노의 3.3V 레귤레이터의 노이즈로 인해 아두이노 3.3V 에 직접 물려서 사용할 경우, nRF24L01+ 의 VCC 와 GND에 Bypass Capacitor 를 하나 달아줘야 나중에 실전에서 사용할 때 문제가 안생긴다.용량은 UNO 계열은 1~10uF 정도를 달아주는것을 추천하나 100uF 달아서 사용하는 사람들도 많다


아두에노에 연결 방법이다. 아두이노를 Master 로 보므로, nRF24L01 의 CSN(CS)는 아두이노에서 소프트웨어 적으로 핀 할당해줄것이므로 저렇게 8번 핀에 연결해준다.

CE(Chip Enable)은 7번으로 할당하였으나 언제든 바꿀 수 있다

IRQ(Interrupe, Active Low)는 대부분의 라이브러리(아래 소프트웨어 쪽에서 설명할)에서 사용하지 않는다


다음 글에서는 소프트웨어에 관해 써보겠다



반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

98년 부터였을꺼다 Visual C++ 로 개발을 해온것이.. Visual C++ , Embedded Visual C++ 로 개발을 하고 있다가 07년도 부터 Java 로 건너오면서 거의 Visual Studio 를 사용하지 않다보니 이제는 Visual Studio 의 까만색 배경 부터가 왠지 낮설다.

처음에 Eclipse를 접하면서 '뭐 이런 허접한 툴이 다있어.. Visual C++ 의 개발 편의성이나 생산성, 빠릿한 반응은 찾아볼 수가 없구만..' 하고 불평하며 어느새 Eclipse 만 9년을 넘게 쓰고있었다.

Arduino 를 취미삼아 개발하기 시작하면서 당연히 Arduino 는 Arduino IDE 로 개발해야한다는 생각을 하고 정말 UltraEdit 나 NotePad++, 심지어 윈도우의 메모장과 비교할만한 수준의 개발도구에 혀를 차고 있었다.

정말 너무나도 심플한.. IDE 라고 이야기 해도 될까라는 생각이 들 정도의 허무한 기능들이다. 


그래서 Visual Studio 2015 (이왕이면 최신버전~)를 설치하고, "Extensions and Updates" 를 통해 보니 역시나 Visual Micro 의 Arduino IDE 가 있다.

이 Visual Micro Arduino IDE 는 Atmel Studio 의 플러그인으로도 나오고 있다. 그도 그럴것이 Atmel Studio 자체가 Visual Studio Platform 기반으로 동작하기 때문이다.

위에 보이는대로 Arduino IDE for Visual Studio 를 다운로드 한다.

VS 를 재시작 하면 아래와 같이 물어본다. 뭐 별로 건드릴게 없다. 그냥 OK 누르면 이제부터 시작이다.


New Project 를 바로 해보면, Templates>Visual Micro 내에 Blank Project 와 Blink Led Example 이 보인다.


Black Project 를 선택했다. Project 이름과 동일한 .ino 파일이 생기고, 툴바에 뭔가 한줄이 더 생긴다.


정말 감탄을 금치 못한다. 심플하고 있어야 할 기능들이 다 있다. Eclipse CDT 기반으로 개발환경 설정하는 것도 나중에 하나 올리겠지만, Arduino IDE 와 Eclipse CDT 에 Arduino 개발 플러그인 끼운것과 비교하면 '왜 이렇게 안만드나' 싶을정도다.

포트 선택도 연결된 포트가 심플하게 나온다. COM5 에 VUSB 로 잡혀있다.

툴바 말고도, Visual Micro 메뉴가 보이고, 안에는 각종 기능들이 보인다. 오리지널 Arduino IDE 보다 낫다.


특히나 Visual Micro Explorer 를 메뉴를 통해 띄워보면, Arduino API Reference 와 예제들, 보드 정보, Arduino.cc 에서 볼 수 있었던 각종 써드파티 Library 들이 모두 보인다. 

그냥 웹페이지로의 링크가 아니라 심지어 클릭하면 Library 를 바로 다운로드 받을 수 있다. 정말 훌륭하다.

코드가 코드 답고, 오른쪽에 살짝 보이는 저 창은 Serial Port Monitor 이다.


정말 나에게 필요했던 바로 이 기능! VIM 으로 C++ 개발할때도 지원되던 Intellisense(Code Assist) 기능과 Parameter 정보 표시 기능이 왜 Arduino IDE 에는 없는것인가.. 완벽하게 동작한다. Eclipse 의 플러그인 보다도 훨 낫다. 한 100배 정도?


Arduino IDE 에서도 제공하지 못하는 Debug 기능도 제공된다. 아직 사용법을 잘 몰라서 그런건지 loop() 함수의 Entry 부분에서 항상 Break 걸리는 수준의 Debug 이지만 아마도 사용법을 좀더 익혀보면 되지 않을까 싶다.

모든게 정말 완벽하다. 그러나 아쉬운점도 있다. 바로 Serial Monitor 기능인데, 이게 한글이 안나온다. .ino 파일의 인코딩을 바꿔서도 해보고 여러가지 시도를 해봤지만 한글이 Serial Monitor 에서는 깨져서 나온다.

이 다음에는 Atmel Studio 7 을 설치해보고 마찬가지로 Visual Micro Arduino IDE 플러그인을 설치해보겠다. 


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

RC를 하다보면 녀석들이 많아질때 마다 수신기를 늘려가야하는 부담이 있었다.

수년간 모델체인지 없는 송신기용 수신기이면 몰라도 한때 FUTABA 와 양대 산맥을 이루던 SANWA 의 내 조종기 M11 도 5~6년 간 각종 모듈에 악세사리에 잘 나오다가 결국 2.4GHz 대 조종기가 나오면서 2.4GHz 모듈을 끝으로 은퇴를 하고 말았다.


[추억의 M11]

이 2.4GHz 모델이 Radio Post 라는 국내 브랜드 모듈이었는데 몇년 버티지 못하고 결국 단종이 되고 말았다. 이 송신기 모듈에 맞는 수신기는 그냥 없다고 봐야한다.


[Radiopost 2.4GHz 수신기와 M11용 모듈]

이렇게 2.4GHz 의 같은 대역대를 사용하는 송수신기 이더라도 문제는 각 조종기 벤더마다 호환이 안된다는 즉 표준이 없다는게 문제이다.


요새는 쿼드콥터를 하는 관계로 난생처음 4채널 이상의 비행기 조종기를 써보는데 이놈들도 그러한 프로토콜 호환의 문제점과 전용 수신기의 비싼 가격은 마찬가지이다.

값싼 아두이노를 기반으로 송수신기를 만들어보고자 마음먹고 프로젝트를 해본다. 뭐 프로젝트라 할 것 까지는 없고, 일단 초간단 송수신기를 차량용으로 만들어보고 향후 쿼드콥터용도 만들어보고자 한다.


이미 아두이노를 활용한 송수신기를 만들어보는 자작기 들은 몇몇 외국인들과 국내 분들도 시도해본 듯 하다. 

[Instructable 에서 발견한 아두이노 기반 조종기]



[국내 RC 카페 동호인께서 개조하신 조종기]

나는 우선 우리 4살 둘째놈이 한손으로 조종할 수 있을 만큼 작은, 스틱 기반의(휠 기반으로 하려니 마땅한 부품을 구입하기 쉽지 않아보인다) 송신기와 Arduino Pro Mini 기반의 4~6채널 정도의 수신기를 만들어보고자 한다. 

일단 계획이 너무 창대하면 실현이 어려울듯 하여 Sprint 를 3차로 나누어 조종기 Version 1.0 을 만들어 보도록 하겠다.

Sprint #1 의 목표

. 2.4GHz 로 송/수신 된다

. 4채널 데이터를 송신기가 보낼 수 있다

. 4채널 데이터를 수신기가 PWM 으로 출력할 수 있다

. 브레드보드에서 회로가 동작한다


(이후 글 부터는 실제 구현 과정을 담아보도록 하겠다)


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

 FPV 레이싱 쿼드를 시작하겠다고 알리에 주문해놓고서는 그새를 못참아서 X5CCX10A 를 우리동네 드론플XX 에서 구매~ 성질 급한 사람은 자꾸 추가지출이 생긴다는...
 (X5C 는 얼마전 중고로 팔아넘긴 바람에 앞으로 블로그에 등장할 일이 없다)

 사이즈가 작으니 조종하기가 여간 까다로운게 아니었지만, 드론의 움직임을 이해하는데 큰 도움이 되었고 조종하는 재미도 쏠쏠하다.

 다만 문제가 좀 있는데, 

  • 프로펠러 가드가 없어서 프로펠러가 망가지기 쉽다
  • 일단 날면 앞뒤 구분이 힘들다
  • 배터리 교체가 불가능해서 3~5분 날리고 20분 충전하고를 반복한다
그래서 인터넷 서핑을 하던 중 CX-10 을 배터리 교체 가능하게 개조하는 글들을 몇개 발견하고, CX-10 이나 CX-10A 나 같기 때문에 나도 따라서 해보았다.

 저렇게, 추가 배터리를 알리에서 3개 더 주문했고 (원래 4개였는데 애들이 배터리 하나를 어디다가 잃어버렸다는..), 커넥터는 몰렉스 커넥터를 달아줬다.

 뭐 딱히 배선이랄게 할게 없이 원래 배터리가 남땜되어있던 부분을 떼어내고 그자리에 몰렉스 커넥터와 전선을 이어주고, 배터리의 원래 있던 Micro JST 커넥터도 떼어내고 몰렉스 수컷으로 바꿔줬다. 

 그런데 이게 화근이었다. 저 커넥터가 무겁고 커서인지 안그래도 날리기 어려웠던 CX10A 가 난다기 보다는 거의 점프 수준으로 비행을 한다.

 그래서 커넥터를 알리에 주문했고 배송비 포함 6천원 좀 안되는 가격에 Micro JST 커넥터를 20 쌍 주문했다. China Post 를 통해 받으니 3주가 채 안걸렸다.

 지금와서 후회되는건, 원래 배터리에 달려있던게 Micro JST 이었는데 몰렉스를 달았다가 다시 또 Micro JST 로 바꾸려니 또 납땜을 해야한다는 불편함이 생겨버렸다 ㅠㅠ


 위 사진에 있는건 프로펠러 가드가 없어서 프로펠러가 자꾸 부러져서 또 알리에 주문한 프로펠러 4세트 + 바디 1세트 + 모터 2개 의 모습이다. 프롭가드까지 포함해서 1만원 정도 들었다. 자꾸 배보다 배꼽이 더 커지는듯한 느낌이다.


 프로펠러 가드 사진이다. 사실 CX-10A 처럼 실내에서 재미로 날리는 드론은 어딘가에 부딫히기 일쑤이므로 이 프롭가드가 필수하고 생각한다. 

 무게도 매우 가벼운 편이므로 나는데에 큰 지장을 안줄 듯 하고, CX-10A 바닥에 끼우기만 하면 되는 구조라서 꼈다뺐다 하기가 매우 편하게 되어있다.



 위 처럼 프롭가드 끼우고 배터리 연결하고 날려보면 거의 못날아가는 수준이라고 보아야한다. 그래서 다시 Micro JST 커넥터로 바꾸는 작업을 하려고 한다. 

 다음은 배터리 커넥터 연결하는 작업 글을 올려보아야겠다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,