【2】DCモーターをPWMで速度制御
今回はDCモーターを単純にON/OFFするのと
DualSenseにはアナログトリガーがあるので
モーターの回転スピードを調整する制御まで進めます。
目次
- 【1】Raspberry pi の、GPIOをTypescriptから操作
- 【2】DCモーターをPWMで速度制御
- 【3】サーボモーターを制御
- 【4】DualSenseをブラウザに接続
- 【5】DualSenseの情報をRaspberryPiに飛ばす
- 【6】DualSenseのチャタリング?問題対応
- 【7-1】RaspberryPiから低遅延で映像を飛ばす
- 【7-2】RaspberryPiから低遅延で映像を飛ばす
- 【8】ThreeJSでVRもどきを作成
- 【9-1】iPhoneの加速度から頭の向きをVRに反映
- 【9-2】スマホVRゴーグル向けデザインに変える
- 【10】ラジコン本体の製作
- 【11】パワーアップとバッテリー問題の解決
モーター
別件で使用していた
タミヤのダブルギアボックス(左右独立4速タイプ)
これのモーターを使用します。
無くても大丈夫!な記事も見かけたので試してみましたが
私の環境ではRaspberryPIが落ちる場合がありましたので
ノイズ対策に、端子の間に10μF程度のコンデンサを挟んだほうが
多分良いです。
モータードライバー
DCモーターを制御するのに
モータードライバーが必要になります。
初めは、Arduinoに繋いで使用していた余り物の上画像の物
これを使用する予定でしたが
Arduinoのアナログポートでは使えるのですが
RaspberryPIから出力可能なソフトウェアPWMでは速度の変更が出来ない。
という問題が出たので
イカしたヒートシンクが付いた、こちらを使います。
L298Nが搭載されたモータードライバーです。
電源
ここでは、単3乾電池4本を電源として使います。
モーターが回れば何でもいいので
電源は適当に用意してください。
本件では、4本差しメガネ端子タイプのよくある電池ボックス。
これにAmazonの格安充電式単3乾電池、4本を挿して利用しています。
RaspberryPIとモータードライバの接続
モータードライバーと、RaspberryPIの接続は
下記のようにしています。
PWMの出力が可能なポートに指定がありますので
利用するRaspberryPIに合わせて調整してください。
モータードライバー | RaspberryPI |
---|---|
IN1 | 19番ポート |
IN2 | 26番ポート |
ENA | 12番ポート |
IN側 12v | 電源の+ |
IN側 GND | 電源の- |
IN側 GND | RaspberryPIのGND |
IN側 5v | どこにも繋がない! |
OUT1 | モーターの+ |
OUT2 | モーターの- |
モータードライバーのIN側のGNDに
電源の-とRaspberryPIのGNDを一緒に繋ぐので注意してください。
モーター回転方向の制御はプログラム側で行うので
OUT側はモーターの極性はどちらでも構いません
試験コード
試験用のコードの全体は下記になります。
前回のサービスに、GPIOのポートをそれぞれ割り振り
pwm書き込み用のメソッドを呼ぶことで
DCモーターを制御します。
const gpio = require('./gpio.service')
const MotorPorts = {
MORTOR_1: 19,
MORTOR_2: 26,
MORTOR_PWM: 12,
MORTOR_POWER: 1,
}
// ポート追加
gpio.addPort({port: MotorPorts.MORTOR_1, mode: 'out'})
gpio.addPort({port: MotorPorts.MORTOR_2, mode: 'out'})
gpio.addPort({port: MotorPorts.MORTOR_PWM, mode: 'out'})
await gpio.initGpio()
// 初期値を出力
console.log(gpio.write(MotorPorts.MORTOR_1, 0))
console.log(gpio.write(MotorPorts.MORTOR_2, 0))
console.log(gpio.pwmWrite(MotorPorts.MORTOR_PWM, MotorPorts.MORTOR_POWER))
// パワーの上昇・加工フラグ
let up = true
// モーター駆動開始
while (true) {
console.log(gpio.write(MotorPorts.MORTOR_1, 0))
console.log(gpio.write(MotorPorts.MORTOR_2, 1))
console.log(gpio.pwmWrite(MotorPorts.MORTOR_PWM, MotorPorts.MORTOR_POWER))
if (up) {
MotorPorts.MORTOR_POWER += 10
if (MotorPorts.MORTOR_POWER >= 150) {
up = false
}
} else {
MotorPorts.MORTOR_POWER -= 10
if (MotorPorts.MORTOR_POWER <= 1) {
break
}
}
// 0.5秒待機
await new Promise((resolve) => setTimeout(resolve, 500))
}
モーター駆動試験
このコードを動かすと
加速 → 減速 → 停止 と動きます。
が、加速時のトルクが足りないので
弾みをつけてやる必要があります。
これで、DCモーターを制御出来ましたので
次回は、ハンドル部分のサーボモーターの制御を行います。
UZAYA
Uzayaでは、多分仕事を求めています。
何かの役に立ちそうでしたら、是非お知らせを。