High Performance Messaging 글을 시작하며..

고성능 메시징 (High Performance Messaging)에 대한 니즈가 갈수록 심해지고 있다. Big Data, IoT, Industry 4.0, Cloud to Cloud 등 다수의 개체간에 빠른 통신을 해야하는 상황이 더욱 많아지고, 기업은 메시징 성능에 대해 매우 많은 고민을 하게 될 것이다.

한정된 자원 안에서

  • 매우 많은 개체가 통신할 수 있어야 한다
  • 많은 양의 메시지를 한정된 시간 내에 전달할 수 있어야 한다
  • 매우 빠른 속도로 메시지가 전달되어야 한다
이런 3가지 주요 고민은 "실시간" 이라는 수식어가 붙는 시스템과 서비스에서는 매우 중요한 요소가 될 것이다.

1999년 부터 IT 바닥에 몸담고 일하면서 이 통신분야 만큼 눈부신 발전을 거듭하는 분야를 보지 못했다. 물론 하드웨어와 인프라적인 부분들의 주된 발전이다. 그런데 지금 우리는 어떠한가? 아직도 TCP 기반 위에서, 텍스트 전달하라고 만들어놓은 HTTP 응용 프로토콜로 중요한 시스템들과 심지어 Computing Power 가 작은 Embedded Device 까지 통신하고 있다.

오죽하면 C10K 문제가 IT 기술 분야에서 중요한 화두가 되기도 하고, 시스템 자원 효율성 재고를 위해 Node.js, Vert.X 와 같은 비동기 프로그래밍 방식이 중요하다고 이야기 할까?

이제는 "실시간"성이 중요한 시대이다. 빅데이터도 MR(Map Reduce) 코드를 컴파일해서 수십분~수시간 배치로 돌려 결과를 가져오는것 보다는 빅데이터에 기반을 두고 실시간적인 Insight 를 발견할 수 있도록 의사결정에 즉각적인 도움을 주는 기술이 더 중요하다고들 이야기한다.



앞으로 뭘 할건지..

메시징의 "성능(Performance)" 은 속도(Latency) 뿐만 아니라 처리량(Throughput) 의 개념과 통신 아키텍쳐(1:1, 1:N, N:N)에서의 최적성이 함께 고려되어야 할 것이다.

주로 

  • 메시지 미들웨어 (ActiveMQ, RabbitMQ, ZeroMQ, DDS 등)
  • 고성능 네트워킹 기술 (Infiniband(RDMA), RoCE, iWARP)
  • 고효율 통신을 위한 M2M, MOM, DOM 프로토콜 (MQTT/S, CoAP, AMQP, RTPS 등)
등에 대하여 가급적이면 직접적인 실험을 첨가하여 세부적으로 글을 써나아가보고자 한다.

Block Chain, Ethereum, P2P Messaging, 비동기 프로그래밍 등에 관해서도 시간이 되는대로 글을 쓸 수 있다면 올려보도록 하겠다.

회사에서는 아예 블로그에 글을 올릴 수 없는 관계로 집에 와서 써야하는 현실이 좀 힘겨울 듯 하긴 하지만 열정으로~~ 열정으로~



반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

수신기 회로도를 그려봤다. 이제 연결해줘야할것들이 조금씩 늘어나니 회로도를 안그려놓으면 나중에 분해했다가 다시 만들때 또 고생할 생각을 하니 이건 아니다 싶어서 급 그려본다.

Eagle Cad 보다 Fritzing 이 난 더 맞는듯 하다. 다만 Schematic 의 Wiring 이 아직 많이 불안하지만 그래도 Eagle Cad 의 라이브러리 찾는 고생과 클릭 위주의 인터페이스 보다 더 쉽고 직관적이라 좋다.



입력 전원은 1.2V 짜리 Ni-MH 5알을 사용할것이라 6V 로 잡았다.

모터 전원은 8V 를 쓰고, Servo 는 SG90 미니서보가 집에 굴러다니므로 사용할 예정이다. 그냥 6V 를 넣어줄까 하다가 기존 아들놈의 RC카가 테스트 대상인데, 원래 파워소스가 1.5V AA 5개(배터리 먹는 귀신 같으니라고,...)를 사용하므로 7.5V 가량 나왔으므로, 완충된 AA 배터리라고 가정하고 모터에 8V 를 넣어주기로 했다.

SG90  은 MAX 6V 입력전원이라 7.4V Li-Po 를 물려서 자작 서보테스터로 테스트 해보니 모터가 미친듯이 떤다. PC 의 5V USB 전압으로 돌려보니 출력이 모자라서 아두이노가 계속 꺼졌다 켜졌다 한다. 캐패시터를 1000uF 정도 넣어주니 좀 덜 꺼지기는 하는데 뭐 그거나 그거나다.. 그래서, SG90 의 입력전압은 전원 소스 6V 를 그대로 넣어주는걸로 했다.


<SG90 미니서보. 개당 2,000원 가량 한다>

L293D 는 아직 내가 MOSFET 기반의 H-브릿지는 만들어보지 않은 관계로 이전에 사용해본 경험을 기반으로 구성했다. (내 블로그에도 사용해본 글이 있으니 참고)

이제 수신기측 동작 코드 짜고 회로 연결해서 수신기쪽 테스트를 해봐야겠음.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

지난번에는 기본적인 통신 테스트를 마쳤고 이번에는 고정된 테스트값이 아니라 정말로 아날로그 스틱에서 값을 읽어와 NRF24L01 모듈로 송수신하여 테스트 해봤다.

일단 내가 만들고자 하는 V1.0 의 송수신기는 아래 그림과 같다.

2축 스틱으로 Steering 과 Accelerometer 를 제어하고 (채널1, 2), 스틱을 누르면 채널3 으로 디지털 입력을 받을 예정이다.

채널 4,5,6 중 채널 4는 아날로그 값을 Volume 으로 받고, 5,6 은 DIGITAL 로 받으려 한다. 마지막으로, V1.0 에서는 간단히 스틱의 입력값 범위를 설정하기 위한 Function S/W 를 하나 달아줄 것이다. 무쟈게 심플하다. Trim 이나 EPA 도 없다. 

전원은 집에있는 USB 보조배터리를 사용하도록 하고, 손잡이 부분에 넣도록 할 것이다.

기구는 집에있는 OC 마네킹 3D 프린터로 찍어볼것이다. 그런데 이게 도면 그리는게 쉽지 않을듯 하다.


자 일단 스틱을 붙였다. 인터넷으로 주문 가능한 바로 그 스틱이다. 뭐 얼마 하지도 않는다. VCC, GND, VRX, VRY, SW 이렇게 4선이 있다. 


나노에 연결하고 지난번 만들었던 코드를 수정했다.

송신기쪽 코드이다

큰 변화라면, 이전에 사용하던 TX_DATA 구조체 내에 accel, steering, ch3, ... 변수를 그냥 배열로 바꾸어 취급하기로 했다. 변수명을 하나씩 써주니 코드도 지저분해져서 배열로 만들고 Loop 로 돌려서 Analog 입력을 받아 저장하고 수신기 쪽으로 보낸다.

아래는 수신기쪽 코드이다

수신쪽 코드는 크게 변한것이 없고, 송신쪽에서 받은 배열값을 화면에 출력한다.



그런데 이상한 현상이 발생한다. Transmission Fail 이 계속 떨어지고, 전송 속도가 무려 40ms 정도가 걸린다. 뭔가 특이한것도 없는데 이렇다.. 혹시 콘덴서 안달아서 이러는가 싶기도 하지만 PA Level 을 LOW 로 주었는데도 이런거면 큰일이다.. 우선 값이 전달되는건 되는걸 확인하고 일단 닫았다.


다음날 저녁에 퇴근하고 집에와서 애들 자는거 보고 또 열었다. 그리고 원래 있던 코드를 손도 안대고 돌려본다. 그런데 갑자기 FAIL 이 안뜬다.. 뭐 이런경우가.. 어제 저녁에는 100% 오류가 나더니.. (기분탓인가.. 그러기에는 저렇게 확연한 증거가 있는데..)

아무튼, 이쯤 하고 값이 잘 전달된다는걸 확인했으니 다시 프로젝트를 닫았다. 참 이상한일이다.

브래드보드에서 실제 기구에 이식할때에는 꼭 콘덴서 달아주리라 마음먹고 오늘은 이쯤한다.

다음에는 출력쪽을 다루어야 하고, 회로도도 그려서 올려야겠다.

지금까지의 회로도는 아래와 같다



반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

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

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

,

 버튼이 많이 필요한 경우에는 아두이노의 PIN 이 모자를때가 있습니다. 궂이 푸시로 하나의 버튼 누르는데 버튼 여러개라고 핀을 여러개 할당 할 필요가 없습니다.

 아래처럼 저항값을 이용하여 전압을 AnalogRead 하면 대략 어떤 버튼이 눌렸는지 알 수 있겠습니다.

같은 저항값으로 버튼 연결 (하나의 버튼 검출)


 위에 R1 은 1M 가 없어서 150K 로 했고, 결과는


S1 을 눌렀을 때 오는 값입니다. S2, 3, 4, 5 모두 다른값들이 옵니다. 저항의 오차를 감안하여 값 범위만 잘 준다면 꽤 쓸만한 방식이겠습니다.


다른 저항값으로 버튼 연결 (동시 누른 버튼 검출)

 위 회로도에서, 각 저항값만 2K, 4K, 8K ... 과 같이 달리 해준다면 대략의 계산된 결과로 어떤 버튼들이 동시에 눌렸는지 계산이 가능하겠습니다. 

- 끝 -





반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,


 이번에는 여러 입력값을 받아서 적은 출력값을 내도록 하는 (74164나 595와는 반대의) 실험을 해보겠습니다. 스마트 어항 제어기 하나로 3개의 어항을 모니터링 하려니 INPUT 핀이 매우 모자르기에 집에 있는 74151, 74138, 4053B 를 갖고 INPUT Multiplexing 실험을 해보도록 하겠습니다.

 Input / Output 이 모두 되어 Multiplexing / Demultiplexing 이 되고, Analog IN/OUT 이 된다고 하니 한번 모두 해보도록 하겠습니다.

CD4053B

CD4053B 는 " triple 2-Channel multiplexer having three separate digital control inputs, A, B, and C, and an inhibit input." 이라고 되어있다. 즉 2채널의 INPUT/OUTPUT 을 3개 갖고있고, 이를 A,B,C 를 통해서 선택할 수 있는거다.

4015B 는 가장 많이 쓰는녀석인데, 8 채널의 INPUT 중 1개를 A,B,C 로 선택해서 입출력할 수 있고, 8개의 채널을 1개의 핀으로 읽거나 쓸 수 있어, 총 4개의 핀만 있으면 8개를 읽거나 쓸 수 있는겝니다.

4052B 는 4채널 씩 X 와 Y 로 나누어 A,B 로 입출력할 수 있고, 2개의 핀 + 2개의 핀(A,B) 총 4개 핀으로 입출력이 가능한겁니다. 

4053B 는 위에서 얘기했듯이 3개의 핀으로 입출력이 오고 3개의 핀(A,B,C)으로 선택을 하니까 총 6개의 핀으로 6개의 입출력을 하게됩니다. 이걸 쓰느니 그냥 6개 입력이나 출력을 그냥 해버리면 되니 아두이노에서는 그닥 쓸모가 없어보입니다. 그래서인지 예제도 거의 안나옵니다. 4051B 만 예제가 나오지요..ㅠㅠ 


위 마지막 4053B 를 갖고 실험해보기로 한다.

빨간색 박스가 각각 a,b,c 이고, a, b, c 에는 각각 x 와 y 의 2개의 채널이 있다. 스위치 처럼 되어있으며, ax, ay 의 IN/OUT 은 14번 핀으로 OUT/IN 되고, bx, by 의 IN/OUT 은 15번 핀 으로 OUT/IN 된다. cx, cy 도 마찬가지이다.

INH는 HIGH 인 경우 칩의 동작을 멈추게 합니다.

VEE 와 VSS 는 모두 GND 로 연결합니다.

VDD 는 5V 에 연결해주면 되고, A, B, C 는 Arduino 로 연결합니다.

허용전류는 10mA 이므로 입력이나 출력전류를 잘 계산하도록 합니다.


 위 그림은 4053B 의 기능도인데, 이를 보면, A,B,C 시그널에 의해 각 x,y 중 하나를 선택해서 IN/OUT 을 OUT/IN 으로 연결해주는것을 알 수 있습니다. 


푸시 스위치 입력받기  (디지털 입력)

 푸시 스위치를 입력받아 보겠습니다. 그런데 푸시스위치를 이런 방식으로 읽어들이는것은 바람직하지 않겠네요. 동시에 푸시스위치를 여러 개 누를게 아니라면 좋지 않습니다. 

 왜냐하면, 예를 들어 100ms 씩 채널의 INPUT 을 READ 한다고 가정할 때 10개의 버튼 입력값을 읽어들일 때 제일 마지막 버튼이 눌렸지 체크하는데 까지 걸리는 시간은 1초가 됩니다. 물론 4053B 는 3개 채널 그룹으로 병렬로 READ 할 수 있으니 이것보다는 짧겠네요. 하지만, 여전히 바람직하지는 않겠어요.

 이보다는 405X 시리즈는 INPUT 시그널을 스위칭 해가면서 READ 할 때 사용하거나 출력할 때 사용하는게 더 낫겠다는 생각입니다.

 그래도 아래와 같이 한번 해봅니다.



센서 입력받기  (아날로그 입력)


더많은 입력받기 (Shift Register 응용)

 2043B 의 INH 를 활용하면 더 많은 204XB 들을 연결하여 더 많은 입력을 받아 SELECT 할 수 있습니다. 이제 그 진가가 발휘되는거죠.


위 예시는 2051B 입니다만, 2053B 도 그대로 응용할 수 있습니다.






반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,