らずらいと姫の挑戦日記(第17回)~モーターを動かしてみよう②~
2016-08-02
今回はもう1つの「サーボモーター」について勉強します♪ORIZURUでは2個のサーボモータを搭載して、上下左右の制御を行っています。
サーボモータって?
ネットで調べると、サーボは「追従」の意味で、サーボ・モーターは、回転数(=速度)の制御、停止位置(=角度)の制御をするためのモーター、との事です。
最近の用途として、二足歩行のロボット等に使用されることが多いそうです。
車のタイヤなら、前進・バックがDCモーターで、ハンドルを操作して左右の方向を決めるのがサーボモーターです。
サーボモーターは、送られる信号の時間の長さで角度が決まる!
サーボモーターは、送られた信号をコンピューターで処理するのに適した信号に変換する装置や回路を内部に備えています。
なので、1msの信号の時を中心とすると、0.5msで左へ最大傾き、1.5msで右に最大傾くように出来ているんです。
ORIZURUの場合、コントローラーのジョイスティックを操作してサーボモーターを動かしています。サーボモーターの値を最小500μs、中心1000μs、最大1500μsに指定されていて、その間の細かい値はレバーの位置によって決まります。
信号の長さをサーボモータにどう伝えればよいの・・・
Lazuriteではその難解な操作を、専用のモーター関数を使って、回路番号・ピン番号や数値を入力するだけで簡単にモーターを動かせるようになっています♪DCモーターの時同様、サーボモーターでも専用関数を使い、数値を入力して、プログラムを作成します。
2つのモーターを動かすプログラム
ORIZURUのコントローラーから無線で送信された値を受信して、モーターを動かすプログラムです↓↓↓
[c]
#define DEBUG
#define SUBGHZ_CH 36
#define SUBGHZ_PANID 0xABCD
uint8_t rx_data[256];
uint32_t last_recv_time = 0;
SUBGHZ_STATUS rx;
#define MOTOR_PS 17
#define MOTOR_PWM 2
void setup(void)
{
SUBGHZ_MSG msg;
long myAddress;
#ifdef DEBUG
Serial.begin(115200);
#endif
msg = SubGHz.init();
if(msg != SUBGHZ_OK)
{
SubGHz.msgOut(msg);
while(1){ }
}
#ifdef DEBUG
myAddress = SubGHz.getMyAddress();
Serial.print("myAddress1 = ");
Serial.println_long(myAddress,HEX);
#endif
msg = SubGHz.begin(SUBGHZ_CH, SUBGHZ_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_1MW);
if(msg != SUBGHZ_OK)
{
SubGHz.msgOut(msg);
while(1){ }
}
msg = SubGHz.rxEnable(NULL);
if(msg != SUBGHZ_OK)
{
SubGHz.msgOut(msg);
while(1){ }
}
pinMode(25,OUTPUT);
digitalWrite(25,HIGH);
// initializing motor
digitalWrite(MOTOR_PWM, LOW);
digitalWrite(MOTOR_PS, HIGH);
pinMode(MOTOR_PWM,OUTPUT);
pinMode(MOTOR_PS,OUTPUT);
hhb.init(3,1023);
hhb.attach(3,4,5);
hhb.attach(3,6,7);
hhb.write(3,0);
hhb.start(3);
hsv.init(4, 24000);
hsv.attach(0,9);
hsv.attach(1,3);
hsv.attach(2,16);
hsv.attach(3,20);
hsv.write(0,map(0,-512,511,500,1500));
hsv.write(1,1);
hsv.write(2,map(0,-512,511,500,1500));
hsv.write(3,1);
hsv.start();
return;
}
void loop(void)
{
uint32_t get_time;
uint32_t delta_time;
short len;
short motor[3];
do
{
len = SubGHz.readData(rx_data,sizeof(rx_data));
} while (len <= 0);
memcpy(motor,&rx_data[7],6);
#ifdef DEBUG
// Serial Output
get_time = millis();
SubGHz.getStatus(NULL,&rx);
delta_time = get_time – last_recv_time;
last_recv_time = get_time;
Serial.print_long(delta_time,DEC);
Serial.print(" ");
Serial.print_long((long)rx.rssi,DEC);
Serial.print(" ");
Serial.print_long((long)rx.status,DEC);
Serial.print(" ");
Serial.print_long(map(motor[0],-512,511,1000,2000),DEC);
Serial.print(" ");
Serial.print_long(map(motor[1],-512,511,1000,2000),DEC);
Serial.print(" ");
Serial.print_long((long)motor[2],DEC);
Serial.println("");
#endif
hsv.write(0,map(motor[0],-512,511,1000,2000));
hsv.write(2,map(motor[1],-512,511,1000,2000));
hhb.write(3,(unsigned short)motor[2]);
hhb.update();
return;
}
[/c]
『hsv』がサーボモーター用のLazurite専用関数です。
Hardware H-Bridgeライブラリ: hsv
モーターライブラリの初期化:
60行目:hsv.init(4, 24000);
サーボモータを4個使い、周期(間隔)は24000μs(24ms)という宣言になります。
61~64行目:hsv.attach(0,9); hsv.attach(1,3); hsv.attach(2,16); hsv.attach(3,20);
0番回路の出力を9pin; 1番を3pin; 2番を16pin; 3番を20pinにする
65行目:hsv.write(0,map(0,-512,511,500,1500));//X軸
67行目:hsv.write(2,map(0,-512,511,500,1500));//Y軸
0番回路と2番回路の出力を0にする(ジョイスティックが0の値の時にサーボモーターを中心位置に設定する)
66・68行目:hsv.write(1,1); hsv.write(3,1);
ダミー
mapとは? 
コントローラーを操作して送信されてくる値は-512~511で、サーボモーターは500~1500で、異なっています。そこで、コントローラー側の値-512~511をサーボモーター側の値500~1500に置き換えてくれるmap関数を使用します。
65行目、67行目では、map(0,-512,511,500,1500)、となっていて、コントローラーの値が0の時のサーボモーターの値を求める関数になっています。
コントローラから送られたモーターの値を反映する
110行目:hsv.write(0,map(motor[0],-512,511,1000,2000));//X軸
111行目:hsv.write(2,map(motor[1],-512,511,1000,2000));//Y軸
コントローラから受信したサーボモータの値はmotor[0]と[1]に格納されています。それを、map関数でサーボモータの値を求め、0番回路(X軸)と2番回路(Y軸)に書きこんでいます。
動かしてみよう!
DCモーター
1)DCモーターとLazuriteを下の図の番号ように繋ぎます。※繋ぐときにGNDと5Vを間違えないで下さい!
2)LazuriteIDEを起動して、モーターを動かすプログラムを貼り付けます。画面左、ライブラリの「HardwareHBredge」「HardwareServo」の2箇所にチェックをいれます。
3)もう一度LazuriteIDEを起動して、以前作ったORIZURUのコントローラーのプログラムを貼り付けます。モーター側のCHとPANIDとあわせ、HOST_ADDRESSを入力します。
4)コントローラーの値が0になっている事を確認後、マイコンボードへ転送します。
※コントローラーの値が0になっていないと、通信した瞬間にモーターが回り始めちゃいます。
モーター音がだんだんと大きくなり、MAXのパワーだとかなりの勢いでした!
サーボモーター
サーボモーターとLazuriteを繋ぎます。
hhb関数とhsv関数を使って、簡単にモーターを動かせちゃいました♪
これで、モーターの準備は完了です。次回は、いよいよORIZURUを飛ばしてみたいと思います☆