Node-REDでラズタンク前進・後進(エディタ画面のボタンで操作, & Pythonコード)

(モータードライバーが違う!?)

5月のCoderDojo青梅で皆に配ったモータードライバーにPWM信号がありませんでした!
誤って注文してしまったようです。
PWMでのスピード制御ができないので、すいらぼさんのフロー「Node-REDで前進・後進」が正解です。
4月の組み立て会に参加した人はPWM有りなので、それぞれPWM有無を覚えておいてください。

物理的なPWMはGPIO 12, 13, 18, 19 で有効

PWM (pulse-width modulation)
– Software PWM available on all pins
– Hardware PWM available on GPIO12, GPIO13, GPIO18, GPIO19

配線図(PWM有り)

配線図(PWM無し)

Node-REDのフロー(PWM有り)

PWM無し版は、下図のPWMのノード[Change]と[GPIO]を削除したもので動きます。
GPIO番号は自分のラズタンクの配線にあわせて忘れずに確認してくださいね。
画像をクリックすると拡大できます。

結果、かのメンターのラズタンクはPWM無し版も「前進」と「ストップ」が機能しました。

Pythonコード

もし Node-RED ではなく、Pythonコードで動かす場合はこちらを参考にしてください。GPIO番号は自分の配線にあわせて変更を。
コードをダウンロードするなら[$ curl https://github.com/CoderDojoOme/razpi/blob/main/raztank-test.py]を試してください。
もしくはインストール済みの[tank3_b-type.py]を編集してGPIO番号だけ合わせると同じコードを作れます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# もしも [import readchar]が見つからないエラーが出る場合は↓をインストールします
# sudo pip install readchar

import RPi.GPIO as GPIO
import sys
import time
import readchar

constLeftPWM = 22 #GPIO No.
constLeftIN1 = 27 #GPIO No.   Blue =GPIO22
constLeftIN2 = 17 #GPIO No.17 Green=GPIO27
constRightPWM = 16 #GPIO No.
constRightIN1 = 21 #GPIO No.
constRightIN2 = 20 #GPIO No.

GPIO.setwarnings( False )
GPIO.setmode( GPIO.BCM )
GPIO.setup( constLeftPWM,  GPIO.OUT )
GPIO.setup( constLeftIN1,  GPIO.OUT )
GPIO.setup( constLeftIN2,  GPIO.OUT )
GPIO.setup( constRightPWM, GPIO.OUT )
GPIO.setup( constRightIN1, GPIO.OUT )
GPIO.setup( constRightIN2, GPIO.OUT )

pwmLeft = GPIO.PWM( constLeftPWM, 50 )  #50Hz
pwmLeft.start( 0.0 )
pwmRight = GPIO.PWM( constRightPWM, 50 )  #50Hz
pwmRight.start( 0.0 )

def moveForward():
        GPIO.output( constLeftIN1, 1 )
        GPIO.output( constLeftIN2, 0 )
        GPIO.output( constRightIN1, 1 )
        GPIO.output( constRightIN2, 0 )

def speedSlow():
        pwmLeft.ChangeDutyCycle( 80 )
        pwmRight.ChangeDutyCycle( 80 )

def speedHigh():
        pwmLeft.ChangeDutyCycle( 100 )
        pwmRight.ChangeDutyCycle( 100 )

def moveBack():
        GPIO.output( constLeftIN1, 0 )
        GPIO.output( constLeftIN2, 1 )
        GPIO.output( constRightIN1, 0 )
        GPIO.output( constRightIN2, 1 )

def moveLeft():
        GPIO.output( constLeftIN1, 0 )
        GPIO.output( constLeftIN2, 1 )
        GPIO.output( constRightIN1, 1 )
        GPIO.output( constRightIN2, 0 )

def moveRight():
        GPIO.output( constLeftIN1, 1 )
        GPIO.output( constLeftIN2, 0 )
        GPIO.output( constRightIN1, 0 )
        GPIO.output( constRightIN2, 1 )

def moveStop():
        GPIO.output( constLeftIN1, 0 )
        GPIO.output( constLeftIN2, 0 )
        GPIO.output( constRightIN1, 0 )
        GPIO.output( constRightIN2, 0 )

def end():
        pwmLeft.stop()
        pwmRight.stop()
        GPIO.cleanup()
        sys.exit(0)

######################################
# メインルーチン
######################################
if __name__ == '__main__':

        print('   [W]\n[A][S][D]\n[X] to STOP\n[Q] to QUIT')

        try:
                while True:
                        kb = readchar.readchar()
                        sys.stdout.write(kb)

                        if kb == 'w':
                                speedHigh()
                                moveForward()
                        if kb == 's':
                                speedHigh()
                                moveBack()
                        if kb == 'a':
                                speedHigh()
                                moveLeft()
                        if kb == 'd':
                                speedHigh()
                                moveRight()
                        if kb == 'x':
                                moveStop()
                        if kb == 'q':
                                end()
                        #time.sleep(0.2)
                        #moveStop()

        except KeyboardInterrupt:
                moveStop()
                end()

デバッグ

電子部品の検査です。ラズタンクが想定通り動かない件、下記の検査をして原因を見つけました。

1.プログラム(soma.py)をつかって動作検査:NG(正しく動かない)
2.Linux のダイレクト出力で動作検査:NG(/sys/dev/gpio/gpio17 > 1)
3.プログラム(kano.py)をつかって動作検査:NG(正しく動かない)
4.配線をやり直し:OK
5.モーター正転/逆転の検査:OK
6.LED点灯させてGPIOの出力検査:OK
7.モータドライバ(IC)の交換:NG→OK
8.プログラム(kano.py)をつかって動作検査:OK
9.Node-REDをつかって動作検査:OK(但しGPIO17はPWM誤検知するのでGPIO4に変更)
10. Node-REDダッシュボードで動作検査(Youtube動画の通り)

▼Youtube
https://youtu.be/u4FRbI0XgDQ


Node-REDでラズタンク前進・後進(エディタ画面のボタンで操作, & Pythonコード)」への7件のフィードバック

  1. PWM無しの配線について質問ですが、モーターに繋がってる黄と緑の線はどっちがどっちでしたっけ…?
    現在赤と青のケーブルがモーターから出ています。間違えて繋いで進行方向が逆になりそうで怖くて聞きました。
    それともどっちでもいいやつでしたっけ…?

    1. 実はAモーターを左・右どちらに積んでいるのかで、左・右回転の設定が逆になります。
      そのため、全員にこの表を調べて手描きで書いてもらっています。配線を追って、下記を確認できますか?
      適当に繋いで前進・後進が逆だったら、プログラムコード(Node-RED設定)を変更すれば大丈夫なやつです。

      Aモータ IN1 : GPIO 17
      Aモータ IN2 : GPIO 27

      Bモータ IN1 : GPIO 21
      Bモータ IN2 : GPIO 20

コメントを残す