Skip to content

Sample_kanirobo

Ko-ichiro Sugiyama edited this page Jun 1, 2024 · 13 revisions

Matz 葉がにロボ

matz-ba-gani-robot2

ピン配置

  • モーター (右): GPIO 25, 26
  • モーター (左): GPIO 32, 33
  • サーボモータ: GPIO 27, 14
  • ライトセンサ: GPIO 36, 34, 35, 2

モータドライバ

ほとんどのモータドライバは,制御信号によってモータの動きを制御しており, 以下のように制御信号を PIN1, PIN2 によって与えることによってモータの動作を制御できる. かにロボでつかっているモータードライバ DRV8212 では,データシートの Table 8-3. に掲載されているように,以下のように制御できる. PIN1, PIN2 ともに PWM 信号に対応している.

     入力                      出力
PIN1        PIN2        OUT1       OUT2       モード
--------------------------------------
0           0           Hi-Z       Hi-Z       low-power automatic sleep mode   [Hi-Z: ハイインピーダンス]
LOW         HIGH        LOW        HIGH       逆回転
HIGH        LOW         HIGH       LOW        正回転
HIGH        HIGH        LOW        LOW        ブレーキ

モーターの回転する原理と仕組みは例えばモーターの構造とは?(Tech Web)はじめてのモータ・ドライバ(Marubun)などに載っている.モータの中では磁場は固定されており(モーター内に永久磁石が向き合って配置されている),モータ内のコイルに電流を流すと,いわゆるフレミングの左手の法則によって導体に力が働きモーターを回転させることができる.言い換えれば,モーターを正回転・逆回転させるためには電流の流れる向きや大きさを制御してやればよく,上記の表のように OUT1 が HIGH で OUT2 は LOW ならば OUT1 から OUT2 へ向かって電流を流すことができ,それによってモーターがとある方向へ回転する (もしくは OUT1 が LOW で OUT2 が HIGT ならば逆向きに電流を流すことができ,モーターを逆回転させることができる).

Matz 葉がにロボコンで使っているプログラムでは,PIN1 = GPIO 25, PIN2 = GPIO 26 として, PIN2 を PWM で電圧を上げ下げすることで電流の大きさを変化させモーターの回転速度を調整している. モーターは 100% の速度で正回転させる場合の例は以下の通りである.但し,PWM の解像度を 10 bit とする.

motor1 = GPIO.new(25, GPIO::OUT)
motor1_pwm = PWM.new(26, ch=0)

motor1.write(1)
motor1_pwm.duty( 0 )

モーターを 50% の速度で逆回転させる場合には以下のように書く.

motor1 = GPIO.new(25, GPIO::OUT)
motor1_pwm = PWM.new(26, ch=0)

motor1.write( 1 )
motor1_pwm.duty( 512 )  #デューティー比 50%

モーターを 100% の速度で逆回転させる場合には以下のように書く.

motor1 = GPIO.new(25, GPIO::OUT)
motor1_pwm = PWM.new(26, ch=0)

motor1.write(0)
motor1_pwm.duty( 1024 )

試しに,以下のようにすると,電圧差がつかないので電流が流れなくなり,モーターはほぼ止まるだろう.

motor1_pwm1 = PWM.new(25, ch=0)
motor1_pwm2 = PWM.new(26, ch=1)

motor1_pwm1.duty( 512 ) #デューティー比 50%
motor1_pwm2.duty( 512 ) #デューティー比 50%

サーボモータ

サーボモーターからは3本の端子が出ており,赤は電源のプラス,黒あるいは茶色はグランド(電源のマイナス)に接続する.オレンジあるいは黄色には制御信号を接続する.

サーボモータを制御するためには周期を 20 ms (周波数 50 Hz) にするのが基本だが,50 ~ 100 Hz 程度は許容される.またパルス幅は 1 ms から2 ms の間で変化させ,パルス幅が 1 ms の時にサーボモーターの軸の角度が 0 度となる.また 2 ms の時にサーボモーターの軸の角度は 180 度となる.半分の 1.5 ms の時は 90 度となる.この様にパルス幅を微妙に変えることによって,サーボモーターの軸の角度を 0 度から 180 度の間で制御することができる.

servo

servo27 = PWM.new(27, ch=3)
servo27.freq( 80 )   # 50 でエラーが出るときはちょっと大きくしておく

servo27.duty( 80 ) # 0 度に
sleep 3
servo27.duty( 120 ) # 約 90 度に
sleep 0.1
servo27.deinit  # PWM 停止

ライトセンサ

Matz 葉がにロボで使っているライトセンサは ADC で値を得る.ADC の生データ (rawread) をそのまま取得して使えば良い.

lux36 = ADC.new(36, ADC::ATTEN_11DB, ADC::WIDTH_12BIT)

lux36.rawread
Clone this wiki locally