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