아주 기본적인 이야기 이지만, 버튼을 눌렀을 때 Bouncing 이 발생한다는건 많은사람들이 상식적으로 알고있는 이야기 이다.

하지만 실제로 어떻게 시그널이 생성되는지 잠시 알아보기 위해 몇가지 실험을 해보고 이를 해결하기 위한 방법을 S/W 와 H/W 로 접근해보기로 한다.

일단 수치적으로 보면 버튼을 눌렀을 때 아래와 같은 현상이 발생한다.

A0 (14) 핀에 버튼을 물려놨고, 버튼이 처음 HIGH 일 때 부터 1000 번의 루프에서 digitalRead() 를 한 결과이다. 

버튼을 누르고 있는 상태에서 조금 버튼을 비벼(?)댔더니 96%와 심지어 28%까지의 결과가 중간에 나온다.


위 실험 결과를 보면, 눌렀다 떼었다 한 부분이 다른 부분은 명확하지만 파란색 박스가 쳐져있는 부분은 순간적인 Bouncing 이 일어난 부분이다. 만약 무조건 HIGH = 눌림 으로 했거나 Interrupt 를 걸어서 H-L 위상 변화 시에 눌림으로 인식하게 했다면 파란색 부분은 두번 이상 눌린 효과가 발생했을 것이다.

(Plotting 도구와 내 컴퓨터의 성능 한계로, 아두이노는 115200 속도에 5ms 딜레이를 매 루프 내에 주었다. 5ms 미만으로 줄 경우 툴이 반응하지 못해서 측정이 불가하다. 오실로스코프가 필요한때이다 싶다)


위 그래프는 아날로그로 Read 한 결과이다. 누른 상태에서 버튼을 비벼대니 저런 지저분한 결과가 나왔다. 원래 의도대로라면 계속 눌려있어야 하는데 눌리지 않고 중간에 저렇게 전압이 마구 변동되는 모습을 볼 수 있다. 

앞으로 해볼일은 위 현상들을 Single 버튼일때 없애는 것과 ADC 를 통해 Analog 로 여러 버튼으로 읽을 때 없애는 것이며, S/W 와 H/W 적인 방식에 대해 직접 테스트 해볼 예정이다.

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

오늘 둘째놈이 아빠방에 고장나서 방치되어있는 자기 지프차를 보더니 "아빠 이거 고쳐줘잉~" 이런다. 요새 계속되는 회사 야근때문에 손을 거의 데지 못하고 있었는데, 오늘 좀더 진도를 나가본다.

오늘은 수신기쪽에 모터와 서보를 붙여놓고 실제로 돌아가는지 테스트를 해봤다.

좌측이 송신기쪽, 우측이 수신기쪽이다. 

수신기쪽에 파란색 작은 SG90 이 스티어링 서보이고, 스탠다드 사이즈의 서보처럼 생긴것은 서보가 아니고 그냥 감속기어 달린 모터이다.

좌측의 송신기쪽 스틱 하나로 스티어링과 서보를 모두 제어하게 설계하였는데, 이게 문제가 좀 있다. 스틱이 하나이다보니 스로틀+스티어링이 동시에 제어되기 힘든구조이다.

앞으로 밀면서 옆으로 밀면 앞으로 밀 수가 없다. 저 스틱의 움직이는 범위가 사각형이 아니라 원형이기 때문에 왼쪽+위 이런게 안된다. 우선 1차 버전은 심플하게 이렇게 만들고 다음 버전에서는 스틱을 분리하던지 건타입을 어떻게 해서든 만들어봐야하겠다.

움직이는 동영상 하나 올려본다.

이번에 수정한 코드이다. 좀더 설계를하고 만들어야 하는데, 막코딩으로 가고있다.

송신기 코드는 이전과 같고, 수신기 코드만 올려본다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

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

,