0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ブラウザから操作可能なラジコンを作る【2】

Last updated at Posted at 2025-03-02

【2】DCモーターをPWMで速度制御

今回はDCモーターを単純にON/OFFするのと
DualSenseにはアナログトリガーがあるので
モーターの回転スピードを調整する制御まで進めます。


目次

モーター

別件で使用していた
タミヤのダブルギアボックス(左右独立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を一緒に繋ぐので注意してください。

画像のように、GND部分に2本接続されます。

モーター回転方向の制御はプログラム側で行うので
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では、多分仕事を求めています。
何かの役に立ちそうでしたら、是非お知らせを。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?