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

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

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

配線図(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()

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

コメントを残す