BlueNinjaを使ってTowerProのマイクロサーボ(SG92R)を動かしてみました。
SG92R
制御パルス:0.5ms〜2.4ms
制御角:±約90度
トルク:2.5kgf*cm
動作電圧:4.8V(〜6V)
サーボの制御方法
SG92Rの配線は電源、GND、制御信号の3本です。
制御信号のDuty比によって角度を制御します(PWM制御)。
BlueNinjaと接続
SG92Rの動作電圧は5Vですので、電源はBlueNinjaの5V_INから取りました。
制御信号はBlueNinjaのPWM出力リソースを使用するためGPIO_8,GPIO_9を使用します。
ただ、制御信号はBlueNinjaの出力3.3Vを5Vに変換してあげる必要があります。
そこで今回は、この双方向ロジックレベル変換モジュールを使いました。
制御プログラム
PWM制御ソフトはCerevoからサンプルプログラムが提供されているのでそれを利用するとよいと思います。
今回は上記サンプルプログラムのpwm_outを使用して、SG92R用ドライバソフトを作成しました。
sg92r_drv.h
#ifndef _SG92R_DRV_H_ #define _SG92R_DRV_H_ #include "pwm_out.h" #define SG92R_init() pwm_out_init() bool SG92R_start(PWM_OUT_CH ch, int degree); #define SG92R_stop(ch) pwm_out_stop(ch) #endif /* _SG92R_DRV_H_ */
sg92r_drv.c
#include "TZ01_console.h" #include "sg92r_drv.h" #define SG92R_CLOCK (50) /* 50Hz */ #define SG92R_DUTY_OFFSET (0.025) /* duty% */ #define SG92R_DUTY_RESOLUTION ((2.4 - 0.5)/20/180) /* duty% */ bool SG92R_start(PWM_OUT_CH ch, int degree) { if (degree < 0 || degree > 180) return false; float duty = SG92R_DUTY_OFFSET + SG92R_DUTY_RESOLUTION * degree; return pwm_out_start(ch, SG92R_CLOCK, duty); }
そして、忘れがちなのがリソースの有効化もお忘れなく。
RTE_Device.h
... #define RTE_GPIO_8_ID 0 /* GPIO8,9はADVTMRが使用するため無効にする */ #define RTE_GPIO_9_ID 0 ... #define RTE_ADVTMR 1 ... #define RTE_ADVTMR_PWM0 1 /* ADVTMR0 - PWM出力を有効にする */ ... #define RTE_PWM0_ID 1 /* 出力先をGPIO_8に設定 */ ... #define RTE_ADVTMR_PWM1 1 /* ADVTMR1 - PWM出力を有効にする */ ... #define RTE_PWM1_ID 1 /* 出力先をGPIO_9に設定 */ ...
で、実際に動かしてみたのが冒頭の動画になります。
あとがき
サーボとかモーターは実際にものを動かせるので、作っていて楽しいですね。
組込みの醍醐味だと思います。
今回はプログラムよりも、動かす対象(HappyNewYearプレート)を作るほうが時間がかかりました。
ではでは〜。