ホーム » スタッフ » 斉藤徹 » Arduinoでサーボ制御

2011年7月
« 6月   8月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

最近の投稿(電子情報)

アーカイブ

カテゴリー

Arduinoでサーボ制御

夏休みに工業系先生向けの制御講習会を行うけど、 例年参加している人もでてくるので、少しは違う実験とすべく、 サーボモータの制御を入れてみようと計画中。 ということで、手持ちである共立電子の通信販売のサーボモータ(プチロボ)を動かしてみた。

#include <Servo.h>
Servo motor ;    // White D9
int   d = 1 ;    // Red   5V
int   v = 0 ;    // Black GND
void setup() {
motor.attach( 9 ) ;
}
void loop() { // 0°〜180°〜0°を繰り返す。
motor.write( v ) ;
v = v + d ;
if ( v >= 180 ) {
v = 179 ;
d = -1 ;
} else if ( v < 0 ) {
v = 0 ;
d = 1 ;
}
delay( 2 ) ;
}

これで動かすと、このサーボモータでは、プログラム的には0-180で変化させているが、実際の変化幅は120°程であった。 delay(1)にすると、サーボの制御信号の変化にモータが追いつけないため、 90°ほどの変化幅となった。

ちなみに、最近購入したArduino Uno であったが、開発環境は Arduino 0022 に 更新しないと、Uno への書き込みができなかった。(0017はダメ)

加速度センサーと連動

加速度センサーで傾きを検出し、傾きに応じてサーボモータを動かしてみた。

#include <Servo.h>
Servo motor ;
int acc_x ;  // Vcc--3.3V, GS1-GND g1.5
int acc_y ;  // GND--GND , GS2-GND
int acc_z ;  // X----AN0 , SLP-3.3V
int ang ;    // Y----AN1
// Z----AN2
#define OFFSET 335
void setup() {
motor.attach( 9 ) ;
acc_x = acc_y = acc_z = 0 ;
}
void loop() {
acc_x = (3*acc_x + analogRead(0) - OFFSET )/4 ; // 加重移動平均
acc_y = (3*acc_y + analogRead(1) - OFFSET )/4 ;
acc_z = (3*acc_z + analogRead(2) - OFFSET )/4 ;
ang = (int)( atan2( acc_y , acc_x ) / 3.141592 * 180 ) ;
ang = constrain( ang , 0 , 180 ) ;
delay( 2 ) ;
}