Lego Power Function에는 Servo Motor가 있다. (파트 번호: 88004, https://shop.lego.com/en-US/Power-Functions-Servo-Motor-88004 ) 이번 포스팅에서는 RPI로 Servo 모터를 제어해 보도록 하겠다.
Lego Power Function의 ServoMotor는 다음처럼 생겼다.
연결선은 다음과 같이 구성되는데, 앞서 제작한 모터 드라이버의 모터 Yield에 C1,C2를 연결한다. 9V 전원을 별도로 9V, GND 선에 연결한다.
(참조: https://www.hackster.io/Notthemarsian/take-control-over-lego-power-functions-ee0bfa )
Google Voice Kit의 Servos 0번과 2번을 모터 드라이버의 Direction, Speed에 각각 연결한다.
다음은 a, s, d키로 서버 모터를 제어하는 노드 코드이다. PWM Length는 1200Hz 로 0-100%의 Duty Cycle로 제어한다. 특이한 것은 0-100% Duty Cycle에 따라 90도까지 제어 가능하며 반대 90도로 움직이기 위해서는 Direction을 False로 설정해 줘야 한다.
node.js의 rpio 모듈에서 pwmSetClockDivider설정은 19.2MHz를 설정값으로 나누면 MHz 설정 가능하다. 즉 하기는 19.2/16=1.2MHz 로 설정한다. 그리고 pwmSetRange는 1024로 설정하고 각 키 입력을 받으면 100을 더하거나 빼면서 제어한다. pwmSetData는 duty cycle을 설정한다.
const stdin = process.stdin; const rpio=require('rpio'); rpio.init({gpiomem:false,mapping:'gpio'}) rpio.open(26,rpio.OUTPUT); rpio.open(13,rpio.PWM); rpio.pwmSetClockDivider(16); rpio.pwmSetRange(13,1024) stdin.setRawMode( true ); stdin.resume(); stdin.setEncoding( 'utf8' ); let add=0; stdin.on( 'data', function( key ){ if ( key === '\u0003' ) { process.exit(); } if(key==='s'){ add=0; } else if(key==='a'){ if(add+100>0) rpio.write(26,rpio.HIGH); if(add+100>1024) add=1024; else add=add+100; } else if(key==='d'){ if(add-100<0) rpio.write(26,rpio.LOW); if(add-100<-1024) add=-1024; else add=add-100; } if(add>0) rpio.pwmSetData(13,add); else rpio.pwmSetData(13,-add); console.log('add:'+add); }); |
다음은 실행한 결과이다.