Kontrollera en Raspberry Pi RC bil med ett tangentbord (5 / 8 steg)
Steg 5: programvara
Nedan är python koden behöver du för att programmet ska fungera. Spara programmet som rc_car.py när du är klar.importera RPi.GPIO som io
IO.setmode (io. BCM)
importera sys, tty, termios, tid
# Dessa två block av kod konfigurera PWM-inställningarna för
# två DC motorer på RC bilen. Det definierar de två GPIO
# stift används för input, startar PWM och sätter den
# motors hastighet 0
motor1_in1_pin = 4
motor1_in2_pin = 17
IO.Setup (motor1_in1_pin, io. OUT)
IO.Setup (motor1_in2_pin, io. OUT)
motor1 = io. PWM(4,100)
motor1.start(0)
motor1. ChangeDutyCycle(0)
motor2_in1_pin = 24
motor2_in2_pin = 25
IO.Setup (motor2_in1_pin, io. OUT)
IO.Setup (motor2_in2_pin, io. OUT)
motor2 = io. PWM(4,100)
motor2.start(0)
motor2. ChangeDutyCycle(0)
# Definiera GPIO stiften som ska användas för lysdioderna på
# RC bil och ställa in produktionen till false
IO.Setup (18, io. OUT)
IO.output (18, falskt)
IO.Setup (23, io. OUT)
IO.output (23, falskt)
# Metoden getch kan avgöra vilken tangent har tryckts
# av användaren på tangentbordet genom att öppna systemfiler
# Kommer sedan tillbaka pressade nyckeln som en variabel
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
försök:
TTY.setraw(sys.stdin.fileno())
CH = sys.stdin.read(1)
Slutligen:
termios.tcsetattr (fd, termios. TCSADRAIN, old_settings)
returnera ch
# Denna del av koden definierar de metoder som används för att bestämma
# om en motor behöver snurra framåt eller bakåt. Den
# olika riktningar uppnås genom att ange en av de
# GPIO pins true och den andra till false. Om status för
# båda stiften matcha, motorn startar inte.
def motor1_forward():
IO.output (motor1_in1_pin, sant)
IO.output (motor1_in2_pin, falskt)
def motor1_reverse():
IO.output (motor1_in1_pin, falskt)
IO.output (motor1_in2_pin, sant)
def motor2_forward():
IO.output (motor2_in1_pin, sant)
IO.output (motor2_in2_pin, falskt)
def motor2_reverse():
IO.output (motor2_in1_pin, falskt)
IO.output (motor2_in2_pin, sant)
# Denna metod kommer att växla ljus på/av när användaren
# pressar en särskild tangent. Det kommer att ändras status
# av lamporna så det vet om du vill aktivera dem eller
# av när det är nästa kallas.
def toggleLights():
globala lightStatus
IF(lightStatus == false):
IO.output (18, True)
IO.output (23, True)
lightStatus = sant
annat:
IO.output (18, falskt)
IO.output (23, falskt)
lightStatus = False
# Den här metod vilja avlång knapp ledning av styrningen
# motorn. Metoden kommer att avgöra om användaren vill
# att vända vänster eller höger beroende på nyckeln för de trycker och
# sedan göra lämpliga justeringen. Det fungerar som en växla
# eftersom programmet inte kan läsa flera tangenterna på
# samtidigt. Möjliga lägen för hjulen är
# "rätt", "centrum" och "vänster". Det kommer att uppdatera sedan den
# status på hjulet för att få tillgång till nästa gång det kallas.
def toggleSteering(direction):
globala wheelStatus
om (riktning == "rätt"):
om (wheelStatus == "centrum"):
motor1_forward()
motor1. ChangeDutyCycle(99)
wheelStatus = "rätt"
Elif (wheelStatus == "vänster"):
motor1. ChangeDutyCycle(0)
wheelStatus = "centrum"
om (riktning == "vänster"):
om (wheelStatus == "centrum"):
motor1_reverse()
motor1. ChangeDutyCycle(99)
wheelStatus = "left"
Elif (wheelStatus == "rätt"):
motor1. ChangeDutyCycle(0)
wheelStatus = "centrum"
# Ange PWM stift till false så motorerna inte kommer flytta
# tills användaren trycker den första nyckeln
IO.output (motor1_in1_pin, falskt)
IO.output (motor1_in2_pin, falskt)
IO.output (motor2_in1_pin, falskt)
IO.output (motor2_in2_pin, falskt)
# Globala variabler till status av lamporna och styrning
lightStatus = False
wheelStatus = "centrum"
# Instruktioner för när användaren har ett gränssnitt
skriva ut ("w/s: acceleration")
skriva ut ("en/d: styrning")
skriva ut ("l: ljus")
skriva ut ("x: exit")
# Oändlig loop som inte slutar förrän användaren trycker den
# exit-knappen
samtidigt sant:
# Tangentbord karaktär hämtningsmetod kallas och sparade
# till variabel
char = getch()
# Bilen kommer att driva fram när nyckeln "w" trycks
om (char == "w"):
motor2_forward()
motor2. ChangeDutyCycle(99)
# Bilen kommer att vända när "s"-tangenten är nedtryckt
om (char == "s"):
motor2_reverse()
motor2. ChangeDutyCycle(99)
# Den "en" nyckeln kommer att växla styrningen vänster
om (char == "a"):
toggleSteering("left")
# "D"-tangenten att växla styrningen höger
om (char == "d"):
toggleSteering("right")
# "L"-tangenten att växla lysdioderna på/av
om (char == "l"):
toggleLights()
# "X"-knappen kommer att bryta loopen och avsluta programmet
om (char == "x"):
skriva ut ("programmet avslutades")
Break
# I slutet av varje slinga stoppas acceleration motorn
# och vänta på sin nästa kommando
motor2. ChangeDutyCycle(0)
# Tangentbord tecken variabeln sätts till tomt, redo
# att spara nästa knapp som trycks
char = ""
# Programmet upphör all GPIO aktivitet innan avslutande
IO.CleanUp()