Sample_kanirobo - gfd-dennou-club/mrubyc-esp32 GitHub Wiki
Matz 葉がにロボ
ピン配置
- モーター (右): 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)などに載っている.モータの中では磁場は固定されており(モーター内に永久磁石が向き合って配置されている),モータ内のコイルに電流を流すと,いわゆるフレミングの左手の法則によって導体に力が働きモーターを回転させることができる.言い換えれば,モーターを正回転・逆回転させるためには電流の流れる向きや大きさを制御してやればよく,それを担っているのがモータードライバである.
Matz 葉がにロボコンで使っているプログラムでは,PIN1 = GPIO 25, PIN2 = GPIO 26 として, PIN2 を PWM で電圧を上げ下げすることで電流の大きさを変化させモーターの回転速度を調整している. モーターは 100% の速度で正回転させる場合の例は以下の通りである.
motor1 = GPIO.new(25, GPIO::OUT)
motor1_pwm = PWM.new(26)
motor1.write(1)
motor1_pwm.duty( 0 )
モーターを 50% の速度で逆回転させる場合には以下のように書く.
motor1 = GPIO.new(25, GPIO::OUT)
motor1_pwm = PWM.new(26)
motor1.write( 1 )
motor1_pwm.duty( 50 ) #デューティー比 50%
モーターを 100% の速度で逆回転させる場合には以下のように書く.
motor1 = GPIO.new(25, GPIO::OUT)
motor1_pwm = PWM.new(26)
motor1.write(0)
motor1_pwm.duty( 100 )
試しに,以下のようにすると,モーターはほぼ止まるだろう.
motor1_pwm1 = PWM.new(25)
motor1_pwm2 = PWM.new(26)
motor1_pwm1.duty( 50 ) #デューティー比 50%
motor1_pwm2.duty( 50 ) #デューティー比 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 = PWM.new(27, timer:2, channel:3, frequency:50) # 周波数は 50 に.timer と channel はオプション
loop do
servo.pulse_width_us( 1000 )
sleep 1
servo.pulse_width_us( 1500 )
sleep 1
servo.pulse_width_us( 2000 )
end
ライトセンサ
Matz 葉がにロボで使っているライトセンサは ADC で値を得る.ADC の生データ (rawread) をそのまま取得して使えば良い.
lux36 = ADC.new(36)
lux36.read_raw