비글본블랙(이하 BBB)를 아두이노 모터쉴드(이하 모터쉴드)와 연결해서 모터제어 실험하면서 알게 된 시행착오를 본 포스트에 기록하고자 한다.

 아두이노 모터쉴드는 L298P 칩을 사용하는데 전원이 디지털 블록에 공급되는 핀 (Vss) 와 모터 제어용 전원 핀 (Vs) 두 개가 있다. 쉴드의 5V 헤더가 바로 이 Vss 핀에 연결되어 있으므로 5V핀에 5V 전원을 반드시 연결해야 L298P가 정상동작한다. Vin 헤더핀은 Vs에 연결되어 있으므로 이 핀에는 모터제어용 전원 (datasheet 상으로는 50V 까지 가능) 을 인가하면 된다. 나는 Vin에 적당한 전원을 연결하면 Vss에는 변압되어 들어가는 줄 알았는데 회로도를 보니 그게 아니었다.

<아두이노 모터쉴드 rev C 회로도>

따라서 모터쉴드의 5V 헤더에는 BBB의 5V핀과 연결하여 L298P 의 로직부에 전원을 인가해야 정상동작한다. 문제는 BBB는 3.3V 로 동작한다는 것인데 다행히 L298N이 2.3V 이상이면 HIGH로 간주하므로 문제가 없다.  (실제로 모터쉴드와 3.3V로 동작하는 아두이노Due 와의 연결법도 소개되어 잇다.)

 

 그런데 datasheet상에는 Vss의 최소전압은 4.5V인데 혹시나해서 3.3V를 연결했는데도 정상적으로 동작했다. 하지만 이 방법은 바람직하지는 않은 것 같다.  그리고 모터쉴드의 IOREF 핀은 별다른 역할을 하지 않는다. 여기에 BBB의 동작전압인 3,3V를 연결하면 이것이  L298에 인가되는 것이 아니니 주의해야 한다.

 아래 간략한 회로도를 첨부하였다.

아래는 pyBBIO 모듈을 이용한 파이썬 제어프로그램 예이다. 1초마다 회전 방향을 바꿔준다.


from bbio import *
import time
bbio_init()

pwm = GPIO1_16
brk = GPIO0_5
dir = GPIO0_13

pinMode(pwm, OUTPUT)
pinMode(brk, OUTPUT)
pinMode(dir, OUTPUT)

digitalWrite(pwm, HIGH)
digitalWrite(brk, LOW)
digitalWrite(dir, LOW)

while True:
   digitalWrite(dir, HIGH)
   print(str('dir 1')
   time.sleep(1)
   digitalWrite(dir, LOW)
   print('dir2')
   time.sleep(1)

bbio_cleanup()







Posted by 살레시오
,

 파이썬을 공부해 나가면서 한 동안 파이썬으로 GPIO를 제어하는 방법을 찾고 있었다. 라즈베리파이에서 RPIO나 WiringPi 와 같은 파이썬 모듈을 쓸 수 있으나 라즈베리파이의 GPIO기능 자체가 너무 빈약하다는게 문제다. 아두이노 계열은 파이썬이 되지를 않고 라즈베리파이에 연결할 수 있는 아두이노 (혹은 유사 보드)들이 몇몇 검색되었는데 파이썬으로 제어를 하기에는 제약이 많다. 그나마 아두이노에 standard firmata 를 올리고 라즈베리파에에서 pyFirmata 로 제어하는 방법이 있기는 한데 직접 해 보니 이상하게 잘 동작이 되지 않았다.

 비글본블랙(이하 BBB) 이라는 보드는 (마데 인 America 이다.) 리눅스 머신이면서 GPIO가 라즈베리파이와는 비교도 안 되게 많이 마련되어 있다.  하드웨어를 제어하는데 자바스크립트를 이용하며 이것을 잘 몰랐기 때문에 한 번 살펴보기만 하고 서랍에 넣어두었었다.

그런데 구글링해보니 여기에도 파이썬으로 GPIO를 제어할 수 있는 모듈들이 있었다. 그 중 PyBBIO 와 adafruit 에서 배포하는 Adafruit_BBIO 라는 파이썬 모듈이 활발하게 개발 중인 것 같다. 이것을 이용하면 포트, PWM, ADC 와 같은 주변기기들을 파이썬으로 제어할 수 있다. 그래서 한 번 시도해보기로 했다.

 먼저 BBB 를 모니터에 연결하려면 마이크로HDMI 케이블(없으면 젠더라도)이 있어야 해서 주문을 했다. 다른 방법으로 BBB는 USB만 PC와 연결하면 ssh로 PC상에서 터미널 창을 띄울 수 있고 구글링해보면 방법도 잘 나와 있다. 그래서 putty 라는 프로그램을 이용하여 원격 터미널 창에서 파이썬 모듈을 설치한 후 실험을 몇 개 해 보았는데 잘 되었다. 포트로 LED를 깜박이고 cds셀을 이용한 ADC 실험도 해 보았는데 매우 간단하게 잘 되었다.

 다음은 원격 터미널 상에서 nano를 이용하여 LED를 깜박이는 프로그램을 작성하는 화면이다.


 PyBBIO는 아두이노의 API와 유사하게 작성되어 있으며, 반면 Adafruit_BBIO는 라즈베리파의 RPIO 를 많이 참고한 것 같다. 취향에 따라 선택하면 되겠다.




Posted by 살레시오
,

 기울기 센서는 디지털형과 아날로그형으로 나뉜다. 디지털형은 일정한 각도 이상으로 기울어지면 신호가 바뀌는 것이고 (저가형 아두이노 모듈이 많이 있다.) 아날로그형은 기울어진 각도를 얻을 수 있는 소자이다.

 아날로그형 기울기센서 중에 SCA61T-FA1HiG 라는 모델명의 센서를 사 둔 것이 있었는데 꺼내서 비글본블랙(이하 BBB)의 아날로그핀에 물려서 실험을 해 보았다.

   

[그림 1] 기울기 센서의 외형과 핀 기능

이 그림에서 보듯 8핀 소자인데 5V를 입력으로 받는다. SPI 통신 또는 아날로그 전압값(7번 핀) 두 가지를 모두 얻을 수 있는데 아날로그 전압은 0도 일 경우 2.5V를 내고 각도에 따라서 0V~5V 사이의 전압값을 가진다.

[그림 2] 센서의 동작 방식


그런데 한 가지 문제가 있는데 BBB의 아날로그 핀은 1.8V 가 최대 허용 전압이므로 직결해서 사용할 수는 없다. 그래서 저항 두 개로 이루어진 간단한 전압 분배 회로를 이용하였다.

[그림 3] 전압 분배 회로


이 그림에서 7번 핀이 5V 즉, 최대 전압일 때 AIN0 단자가 1.8V 이도록 저항 x, y가 선택되어야 한다. 이것을 공식을 세워보면 다음과 같다.

이 식에서 저항 x, y의 관계식이 얻어진다. 먼저 x=910 으로 먼저 선정한 후 이 식에 의해서 y=510오옴으로 선택했다. 저항은 소모 전력을 고려하여 선정해야 한다. 이 경우 OUT핀이 5V일 때 5/(910+510)  = 3.5 mA 정도가 흐르게 된다.

 파이썬 코드는 0.01초(10ms)마다 한 번씩 ADC를 수행해서 화면에 보여주도록 하는 간단한 프로그램이다. PyBBIO 모듈을 이용하였다.


from bbio import *
import time
bbio_init()
while True:
   print(analogRead(AIN0))
   time.sleep(0.01)
bbio_cleanup()

analogRead()함수는 ADC된 전압을 mV 단위로 반환한다. 예를 들면 1.8V 일때는 1800을, 0.9V 일때는 900을 반환한다. 이 값을 읽어서 스케일링을 하면 기울어진 각도를 계산할 수 있다.

실험 동영상을 만들어 보았다.



Posted by 살레시오
,