비글본블랙(이하 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 살레시오
,

 실험을 위해서 여러 하드웨어 보드들을 구해서 잠깐씩 살펴보았는데, 하드웨어를 제어하는 (주로 오픈소스)보드들이 공통적으로 가지고 있는 필수 기능으로 다음과 같은 것들이 있다.


  • (디지털) In/Out 포트            : on/off 입출력
  • 인터럽트 (interrupt)             : 이벤트 처리
  • PWM                                : 아날로그 (처럼) 출력
  • A/D 변환기                         : 아날로그 입력 (주로 센서의 입력)
  • 통신 (주로 시리얼 통신)       : (주로) PC 혹은 다른 보드와의 통신
  • D/A 변환기                      : 아날로그 전압 출력


보드에 따라서 이러한 기능을 구현하는데 사용하는 언어도 다르다.


  • 아두이노는 C++
  • 넷두이노는 (매우 특이하게) C#.Net
  • R-Pi는 주력 언어가 파이썬 (하지만 리눅스 보드이므로 다른 언어도 가능함)
  • 비글본블랙은 자바스크립트 (마찬가지로 C++, JAVA 등도 가능). 비글본블랙은 D/A변환기도 내장하고 있으며 주변기기가 가장 풍부하게 마련되어 있다.


 어떤 보드의 기능과 프로그래밍을 살펴볼 때 위의 기능들을 사용 언어로 어떻게 구현하는지를 파악할 수 있다면 반 이상은 아는 것이라고 봐도 될 것 같다. 많이 사용되는 라즈베리 파이는 GPIO에 A/D변환기가 없으며 PWM기능도 매우 빈약하다.


  언어의 난이도 순으로 배열해 보면 (순전히 주관적인 생각임) 다음과 같다, 


  • C++ >  JAVA, C# > javascript > python


C++이 제일 어렵고 파이썬이 상대적으로 제일 난이도가 낮은 편에 속한다.


얼마 전까지만 해도 임베디드는 닥치고 C/C++ 이었는데 요즘에는 고수준 언어나 심지어 스크립트 언어로도 프로그래밍할 수 있는 보드들이 출시되고 있어서 비전문가들이 좀 더 쉽게 접근할 수 있는 환경이 되고 있다.

[#00093]


Posted by 살레시오
,

udoo neo 라는 보드가 킥스타터에서 캠페인을 진행 중이다.



라즈베리 같은 리눅스 보드인데 아두이노 호환 외부핀을 가지고 있으며 와이파이, 블루투스, 9축 가속센서를 내장하면서 $49불 정도의 가격에 판매될 거라고 한다.


개인적으로 이러한 보드들이 많이 쓰일거라 예상하는데 라즈베리파이를 쓰다보면 아두이노의 기능들이 아쉽기 때문이다.


이와 비슷한 보드로 pcduino 시리즈가 잘 알려져 있는데 있는데 이미 시판 중이다. 아래 그림은 pcduino nano 보드이다.



이 보드도 리눅스 마이컴인데 아두이노 기능과 호환 핀들을 내장하고 있다.


아두이노 호환은 아니지만 아두이노의 모든 기능을 웃도는 내장 하드웨어를 가진 리눅스 보드도 있다. 바로 beaglebone black 이다.


보면 알겠지만 GPIO핀이 넘치도록 많다. 그리고 ADC, PWM, SPI, I2C 등 아두이노의 기능들을 대부분 가지고 있다. 단점은 가격이 $65 정도로 다른 보드들보다 조금 더 비싸다는 점이다.

Posted by 살레시오
,