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 ) ;
}
 

2015年12月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

アーカイブ

Google

このブログ記事について

このページは、T-Saitohが2011年7月13日 15:15に書いたブログ記事です。

ひとつ前のブログ記事は「リストを用いたスタックとキュー」です。

次のブログ記事は「来年度は認証評価とJABEE...」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。