遠端鍵盤控制自走車+WebCam
Last updated
Last updated
透過遠端SSH連線,直接執行程式並手動控制自走車的行進與轉彎,有了這個功能,只要網路是通的,遠在天邊也可以控制家裡的自走車並且看見家裡的情況。這次一併介紹getkey這個非常方便使用的鍵盤掃描程式庫。
# -*- coding: UTF-8 -*-
# 自走車馬達類別
import time
import RPi.GPIO as GPIO
from getkey import getkey, keys
class Motor:
def __init__(self, ena, in1, in2, enb, in3, in4):
self.ENA = ena
self.IN1 = in1
self.IN2 = in2
self.ENB = enb
self.IN3 = in3
self.IN4 = in4
# 設定右輪
GPIO.setup(self.ENA, GPIO.OUT, initial=GPIO.LOW)
# 利用PWN來改變車子馬達轉速(改變車子速度),初始值為全速100
self.ENA_SPEED = GPIO.PWM(self.ENA, 600)
self.ENA_SPEED.start(0)
self.ENA_SPEED.ChangeDutyCycle(100)
GPIO.setup(self.IN1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(self.IN2, GPIO.OUT, initial=GPIO.LOW)
# 設定左輪
GPIO.setup(self.ENB, GPIO.OUT, initial=GPIO.LOW)
self.ENB_SPEED = GPIO.PWM(self.ENB, 600)
self.ENB_SPEED.start(0)
self.ENB_SPEED.ChangeDutyCycle(100)
GPIO.setup(self.IN3, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(self.IN4, GPIO.OUT, initial=GPIO.LOW)
def right_speed(self, speed):
self.ENA_SPEED.ChangeDutyCycle(speed)
def left_speed(self, speed):
self.ENB_SPEED.ChangeDutyCycle(speed)
def speed(self, speed):
self.right_speed(speed)
self.left_speed(speed)
def forward(self):
GPIO.output(self.ENA, True)
GPIO.output(self.ENB, True)
GPIO.output(self.IN1, True)
GPIO.output(self.IN2, False)
GPIO.output(self.IN3, True)
GPIO.output(self.IN4, False)
def backward(self):
GPIO.output(self.ENA, True)
GPIO.output(self.ENB, True)
GPIO.output(self.IN1, False)
GPIO.output(self.IN2, True)
GPIO.output(self.IN3, False)
GPIO.output(self.IN4, True)
def turn_left(self):
GPIO.output(self.ENA, True)
GPIO.output(self.ENB, True)
GPIO.output(self.IN1, True)
GPIO.output(self.IN2, False)
GPIO.output(self.IN3, False)
GPIO.output(self.IN4, False)
def turn_right(self):
GPIO.output(self.ENA, True)
GPIO.output(self.ENB, True)
GPIO.output(self.IN1, False)
GPIO.output(self.IN2, False)
GPIO.output(self.IN3, True)
GPIO.output(self.IN4, False)
def stop(self):
GPIO.output(self.ENA, True)
GPIO.output(self.ENB, True)
GPIO.output(self.IN1, False)
GPIO.output(self.IN2, False)
GPIO.output(self.IN3, False)
GPIO.output(self.IN4, False)
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
motor = Motor(13, 19, 16, 20, 21, 26)
motor_speed = 100
while True:
motor.speed(motor_speed)
key = getkey()
if key == keys.UP:
print('forward')
motor.forward()
elif key == keys.DOWN:
print('backward')
motor.backward()
elif key == keys.LEFT:
print('turn left')
motor.turn_left()
elif key == keys.RIGHT:
print('turn right')
motor.turn_right()
elif key == 'l':
motor_speed -= 10
if motor_speed <= 30:
motor_speed = 30
elif key == 'h':
motor_speed += 10
if motor_speed >= 100:
motor_speed = 100
elif key == 's':
motor.stop()
elif key == keys.ESCAPE:
motor.stop()
break