[PYTHON] Machen Sie ein Auto mit automatischem Fahrroboter mit Raspberry Pi3 B + und Ultraschall-Abstandssensor HC-SR04

Einführung

Die Elemente, aus denen ein autonomes Fahrzeug in der realen Welt besteht, sind die eigene Fahrzeugpositionsschätzung, Objekterkennung, Handlungsbeurteilung und Fahrzeugkörperkontrolle. Es ist möglich, alle diese vier Elemente basierend auf einer Funksteuerung zu implementieren, aber es ist nicht einfach, die Position des eigenen Fahrzeugs leicht abzuschätzen, und dieses Mal besteht das Ziel darin, mit niedriger Geschwindigkeit zu fahren, so dass fast keine Kontrolle der Fahrzeugkarosserie erforderlich ist. Daher möchte ich dieses Mal das Objekt vor dem Ultraschall-Abstandssensor erkennen und das Aktionsurteil leicht realisieren, um es mit dem Roboterauto des automatischen Fahrens auf der Basis der Funksteuerung zu vermeiden.

Umgebung

Gesamtkonfiguration des Roboterautos

Ein PWM-Signal wird von der Raspeltorte an eine im Handel erhältliche Funksteuerung gesendet, um das Gaspedal und die Lenkung zu steuern. Die drei vorderen Ultraschall-Abstandssensoren werden verwendet, um das vordere Objekt zu erkennen und das Verhalten zu beurteilen, indem die Lenkung nach links und rechts gedreht wird.

Verwendete Teile

** - Radicon: Tamiya 1/10 XB Serie Nr. 199 NSX (TT-02 Chassis) ** Für den Hauptkörper ist alles in Ordnung, aber ich möchte den Körper trotzdem anbringen und verschiedene Hardware ordentlich montieren, daher empfehle ich einen größeren. Wie ich später erklären werde, wollte ich diesmal mit niedriger Geschwindigkeit laufen, daher denke ich, dass es einfacher war, die Geschwindigkeit zu steuern, wenn es sich nicht um ein 7,2-V-System handelte.

** - Körperbatterie: Tamiya 7.2V Custom Pack ** Es war in Ordnung, die Spannung von 7,2 V des Hauptkörpers mit einem Linearregler abzustimmen und mit der Stromversorgung von Raspai zu teilen. Da es jedoch einfacher war, eine mobile Batterie für die Stromversorgung der Raspai-Seite zu verwenden, sind diesmal die Stromversorgung der Raspai-Seite und der Hauptkörper von Radicon unabhängig. Ich durfte.

** - Drehzahlregler: HiLetgo 5A Mini-Gleichstrommotor PWM-Drehzahlregler 3V-35V ** Dies ist derjenige, der mich am meisten gestört hat. Der Motor wird von einer PWM von 7,2 V gesteuert, aber mit der Methode über die Steuerung scheint es, dass das Tastverhältnis allein bei einem bestimmten Verhältnis auf der Seite mit niedriger Drehzahl abschaltet, deshalb habe ich es verwendet, weil es nicht möglich ist, eine niedrige Drehzahl zu erhalten. Da es in dieser Schaltung gleichgerichtet ist, tritt darüber hinaus keine Rückwärtsdrehung auf. Es scheint möglich, wenn Sie zwei verwenden und sowohl der positiven als auch der negativen Seite entsprechen, aber diesmal ist es nur eine Vorwärtsrotation.

** - Einplatinencomputer: Raspberry Pi3 B + ** Es gibt keine besonderen Vorsichtsmaßnahmen. Es kann so verwendet werden, wie es ist. Betriebssystem ver.

** - Batterie für Raspeye: Poweradd Ombar ijuice 3350mAh Mobile Batterie ** Jede Art ist billig und in Ordnung. Je größer die Kapazität, desto besser, aber ich habe diese Größe im Hinblick auf das Layout gewählt.

** - Schalter für Raspeye: Audio Fan USB Typ A ** Für den Schalter, der den Raspeltorte aktiviert. Wenn dies aktiviert ist, wechselt es in den Standby-Zustand.

** - Infrarot-Fernbedienungsmodul: IR HX1838 ** Es wird als Auslöser verwendet, um die Fahrt aus dem Standby-Modus zu starten.

** - Ultraschall-Abstandssensor: HC-SR04 + Acryl-Montagewinkel ** Es ist ein Sensor zum Erkennen von Hindernissen vorne, links und rechts.

** - Hartbefestigungsvorrichtung: MOLATE gerade Platte flache Reparaturplatte 96 * 19 mm Dicke 2,6 mm ** Das Schwierigste bei der Herstellung dieses Roboterautos ist das Layout der Hardware. Ich befestigte diese Platte, indem ich sie zwischen die Schrauben steckte, die ursprünglich am Hauptkörper befestigt waren, oder indem ich mit einem Bohrer Schraubenlöcher bohrte.

Hardware-Implementierung

** - Verkabelung ** Für die Gesamtkonfiguration habe ich auf diese Site verwiesen, die auf demselben Funkcontrollertyp basiert. Die endgültige Gesamtverdrahtung ist in der letzten Abbildung dargestellt.

**-Ultraschallsensor ** Die grundlegende Verwendung von Ultraschallwellen ist [diese Site](http://make.bcde.jp/raspberry-pi/%e8%b6%85%e9%9f%b3%e6%b3%a2%e8% b7% 9d% e9% 9b% a2% e3% 82% bb% e3% 83% b3% e3% 82% b5hc-sr04% e3% 82% 92% e4% bd% bf% e3% 81% 86 /) Ich habe es als Referenz verwendet. Sowohl 5 V als auch 3,3 V werden zur Verwendung von 3 Ultraschallsensoren verwendet. Es wird angegeben, dass bei Verwendung eines 5-V-Ausgangs mit einem Widerstand auf 3,3 V heruntergefahren werden muss, dieser jedoch direkt so verwendet wird, wie er ist (5 V können problemlos verwendet werden). Ich habe einen Artikel gesehen, in dem stand, aber es war vorerst möglich zu operieren. Im Nachhinein stellte sich heraus, dass nur einer anders wäre, wenn ich dachte, ich hätte genau die gleichen drei Gegenstände erhalten.

** - Infrarotfernbedienung ** Ich habe die Infrarot-Fernbedienung verwendet, als ich auf diese Website verwiesen habe, um die Bewegung des Roboterautos auszulösen. Ich hatte keine Zeit hier zu verbringen, also beschloss ich, den Betrieb durch Drücken einer beliebigen Taste auf der Fernbedienung zu starten. Weitere Informationen finden Sie im folgenden Quellcode. Die Gesamtkonfiguration der Hardware-Verkabelung ist in der folgenden Abbildung dargestellt.

Raspberry Pi Setup

** - Netzwerkeinstellungen für Raspberry Pi und PC ** Auf der Raspeye-Seite müssen Sie eine Verbindung zum Internet herstellen, die erforderliche Software herunterladen und den Server für die SSH-Verbindung einstellen. Natürlich erfolgt die Entwicklung in einer Umgebung, in der der Server Raspai und der Client-PC Wi-Fi verwenden können. Wenn jedoch ein Debugging an einem Ort erforderlich ist, an dem keine breite Wif-Fi-Umgebung für Betriebstests vorhanden ist, wird Razzpie verwendet. Eine Ad-hoc-Verbindung ist erforderlich, um den PC direkt drahtlos zu verbinden. Für eine Ad-hoc-Verbindung habe ich auf [diese Site] verwiesen (https://research.itplants.com/?p=2113). ** - Raspberry Pi Starteinstellungen ** Fügen Sie /etc/rc.local die folgende Beschreibung hinzu, um python3 so einzustellen, dass das Programm /home/pi/nsx.py ausgeführt wird, wenn die Stromversorgung des Funkcontrollers und des Raspelkuchens eingeschaltet ist und der Raspelkuchen so beginnt, wie er ist. Bitte beachten Sie, dass Sie sudo in Ihrer Umgebung ausführen müssen, sodass Sie das Kennwort (in diesem Fall hogehoge) und den vollständigen Pfad übergeben müssen.

:/etc/rc.local

echo "hogehoge" | sudo -u pi /user/bin/python3 /home/pi/nsx.py

Software-Implementierung

** - Servosteuerung durch ServoBraster ** Ich habe Servo Blaster verwendet, um Befehlswerte mithilfe von PWM-Signalen an den Geschwindigkeitsregler und das Lenkservo zu senden. Abhängig vom Tastverhältnis des PWM-Signals werden 150 zur Mitte des Neutralleiters und ein Wert von 100 bis 200 übertragen, um die Öffnung einzustellen. Da dieser Wert je nach Servo unterschiedlich ist, muss bei der Implementierung der Wert ermittelt werden, der zur Steuerung verwendet werden soll. Aus irgendeinem Grund erhielt der Wert an der Grenze von ungefähr 150 keinen detaillierten Befehl, und es gab eine Totzone zwischen 140 und 150 und zwischen 160 und 150, so dass es aufgrund der Gaspedalöffnung eine Grenze für das Fahren mit niedriger Geschwindigkeit gibt. Daher verwenden wir einen zusätzlichen Geschwindigkeitsregler HiLetgo, um den aktuellen Wert einzugrenzen.

** - Messung der Entfernung zu einem Objekt mit einem Ultraschall-Abstandssensor ** Es scheint, dass die maximale Entfernungsgenauigkeit etwa einige Zentimeter beträgt. Wenn jedoch die Reflexion von Ultraschallwellen nicht korrekt gemessen werden kann, wird die Messung nicht endlos abgeschlossen und Sie können die While-Schleife nicht verlassen. Daher haben wir einen Abbruch-Timer eingeführt. Wenn Abbruch durchgeführt wird, wird der zuletzt gemessene Wert unverändert verwendet. Ich habe verschiedene Methoden ausprobiert, z. B. den Durchschnittswert mehrerer Schritte, aber die Genauigkeit des Werts wurde beeinträchtigt, da die einfache Methode den stabilsten Betrieb ergibt.

** - Schalter mit Infrarot-Fernbedienung starten ** Ich habe lilc für die Infrarotübertragung und den Empfang von Raspai verwendet. Das Installationsverfahren usw. ist wie in dieser Site gezeigt, auf das ich Bezug genommen habe, aber die Hinweise sind die Beschreibung der folgenden Konfigurationsdatei. Geben Sie den GPIO-Pin an, indem Sie dtoverlay als gpio-ir und gpio_pin festlegen. Hier werden 20 GPIO-Pins (= Platinen-Pin Nr. 38) verwendet.

:/boot/config.txt

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi
#dtparam=gpio_in_pin=20
#dtparam=gpio_in_pull=up
dtoverlay=gpio-ir,gpio_pin=20
dtoverlay=gpio-irtx,gpio_pin=20

Basierend auf dem oben Gesagten ist der gesamte Quellcode wie folgt.

:~/nsx.py

import subprocess as sp #Führen Sie Servo Blaster mit sudo aus
import os
import sys
from time import sleep
import time 
import RPi.GPIO as GPIO #Für Raspeye GPIO

#Wertedefinition für die Ausführung
dirServo = "PiBits/ServoBlaster/user"
dirHome = "/home/pi"
passwd = ("hogehoge").encode() #Passwort für die Ausführung von sudo

#Parameter des Ultraschall-Abstandssensors
trigCenter = 19
echoCenter = 18
trigLeft = 15
echoLeft = 16
trigRight = 7
echoRight = 8

#Ausführung (Initialisierung) von Servo Blaster
def resetSystem(dirServo, passwd, dirHome):
    os.chdir(dirHome)
    os.chdir(dirServo)
    sp.run(("sudo", "./servod"), input=passwd)
    os.chdir(dirHome)
    print("Reset System")

#Lenkung und Gaspedal (Motorbefehlswert) gleichzeitig neutralisieren
def setNeutral():
    stNeutral = "echo 1=150 > /dev/servoblaster"
    accNeutral = "echo 2=150 > /dev/servoblaster"    
    os.system(stNeutral)
    os.system(accNeutral)
    print("Set Neutral")

#Neutralisation der Lenkeinheit
def setStNeutral():
    stNeutral = "echo 1=150 > /dev/servoblaster"
    os.system(stNeutral)
    print("Set Steer Neutral")

#Neutralisation des Gaspedals allein
def setAccNeutral():
    accNeutral = "echo 2=150 > /dev/servoblaster"    
    os.system(accNeutral)
    #print("Set Accel Neutral")

#Vorwärtsbeschleuniger Maximaler Befehlswert
def setFwdMax():
    fwdMax = "echo 2=100 > /dev/servoblaster"
    os.system(fwdMax)
    #print("Set fwdMax")

#Linke Lenkung Maximaler Befehlswert
def setLeftMax():
    leftMax = "echo 1=100 > /dev/servoblaster"
    os.system(leftMax)
    print("Set leftMax")

#Linke Lenkung Min. Befehlswert (diesmal nicht verwendet)
def setLeftMin():
    leftMin = "echo 1=140 > /dev/servoblaster"
    os.system(leftMin)
    print("Set leftMin")

#Rechte Lenkung Maximaler Befehlswert
def setRightMax():
    rightMax = "echo 1=200 > /dev/servoblaster"
    os.system(rightMax)
    print("Set rightMax")

#Rechte Lenkung Min. Befehlswert (diesmal nicht verwendet)
def setRightMin():
    rightMin = "echo 1=160 > /dev/servoblaster"
    os.system(rightMin)
    print("Set rightMin")

#Entfernungsmessung mit Ultraschall-Abstandssensor
def getDistance(TRIG, ECHO, abortTime):
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(TRIG, GPIO.OUT)
    GPIO.setup(ECHO, GPIO.IN)
    GPIO.output(TRIG, GPIO.LOW)
    time.sleep(0.01)

    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG, False)
    
    startTime = time.time()
    while GPIO.input(ECHO) == 0:
        signaloff = time.time()
        
        if ((signaloff - startTime) > abortTime):
            distance = -1
            return distance

    while GPIO.input(ECHO) == 1:
        signalon = time.time()

    timepassed = signalon - signaloff
    distance = timepassed * 17000
    
    return distance
    
    GPIO.cleanup()

#Empfang der Infrarot-Fernbedienung
def getRemoteSignal(flagState):
    boardNo = 38
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(boardNo, GPIO.IN)
  
    try: 
        if (GPIO.LOW  ==  GPIO.input(boardNo)):
            
            if (flagState == False):
                flagState = True
                print("Switch ON !!!!!!!!")

            elif (flagState == True):
                flagState = False
                print("Switch OFF !!!!!!!!")

            time.sleep(0.5)

    except:
        GPIO.cleanup()
    
    return flagState

#Beschleunigersteuerung (einfache Vorwärts- und Stoppsteuerung nur durch Vorwärtsdistanzmessung)
def getAccControl(currDist, setDist):

    flagStop = 0
    
    if (currDist < setDist) and (currDist > -1):
        
        setNeutral()
        flagStop = 1

    else:
        setFwdMax()
    
    return flagStop

#Lenksteuerung (einfache Steuerung nur durch Distanzmessung)
def getStControl(currDistRight, setDistRight, currDistLeft, setDistLeft, flagStop):
    statusRight = (currDistRight < setDistRight) and (currDistRight > -1)
    statusLeft =  (currDistLeft < setDistLeft) and (currDistLeft > -1)

    if (flagStop == 1):

        setStNeutral()

    elif (statusRight and statusLeft):

        setStNeutral()
    
    elif (statusRight):

        setLeftMin()

    elif (statusLeft):

        setRightMin()

    else:
        setStNeutral()

#Fehlerwerte des Ultraschall-Abstandssensors vermeiden
def getTakeOverValue(distLeft, distRight):

    global prevDistLeft
    global prevDistRight

    if (distLeft == -1):
        distLeft = prevDistLeft

    prevDistLeft = distLeft

    if (distRight == -1):
        distRight = prevDistRight

    prevDistRight = distRight

    return (distLeft, distRight)


def main():

    #Initialisierung des Empfangsstatusflags der Infrarotfernbedienung
    global flagState
    flagState = False
    
    #Initialisierung des vorherigen Werts des Abstands zwischen dem linken und dem rechten Objekt
    global prevDistRight
    global prevDistLeft
    prevDistRight = 0
    prevDistLeft = 0

    #Kalibrierwert des Ultraschall-Abstandssensors
    centerThreshold = 30 #Die Front ist kurz zum Anhalten eingestellt
    rightThreshold = 70 #Nur der rechte Sensor hat einen anderen Typ (Los ??), daher sind der linke und der rechte Wert unterschiedlich.
    leftThreshold = 60

    #In den Standby-Modus schalten und die Parameter auf Neutral stellen
    resetSystem(dirServo, passwd, dirHome) 
    setNeutral()
    
    while True:
        
        #Überprüfen Sie den Empfangsstatus der Infrarot-Fernbedienung (zu Beginn des Betriebs).
        flagState = getRemoteSignal(flagState)
        
        if (flagState == True):        

            #Abstandsmessung mit allen Ultraschall-Abstandssensoren
            distCenter = getDistance(trigCenter, echoCenter, 0.1)
            distLeft = getDistance(trigLeft, echoLeft, 0.1)
            distRight = getDistance(trigRight, echoRight, 0.3)
           
            #Alternative Wertgenerierung, wenn der Ultraschall-Abstandssensor einen Fehler zurückgibt
            distLeft, distRight = getTakeOverValue(distLeft, distRight)
            
            #Stoppen Sie die Befehlswertgenerierung basierend auf dem Abstand zum vorausliegenden Objekt
            flagStop = getAccControl(distCenter, centerThreshold)

            #Generierung des Lenkbefehlswertes basierend auf dem Abstand zu den linken und rechten Objekten
            getStControl(distRight, rightThreshold, distLeft, leftThreshold, flagStop)
            
            #Überprüfen Sie den Empfangsstatus der Infrarot-Fernbedienung
            flagState = getRemoteSignal(flagState)
            
        else:
            setNeutral()

if __name__ == "__main__":
    main()

Am Ende

Wofür haben Sie diesen Funkcontroller verwendet? Ich habe ihn als Ringkissen-Roboterauto verwendet, das bei Hochzeiten Ringe trägt. Wahrscheinlich der erste auf der Welt.

Link

  1. Ich habe einen Internetradio-Controller mit Raspberry Pi 2 und 1/10 RC von Tamiya erstellt

  2. [Ultraschall-Abstandssensor (HC-SR04) verwenden](http://make.bcde.jp/raspberry-pi/%e8%b6%85%e9%9f%b3%e6%b3%a2%e8 % b7% 9d% e9% 9b% a2% e3% 82% bb% e3% 83% b3% e3% 82% b5hc-sr04% e3% 82% 92% e4% bd% bf% e3% 81% 86 /

  3. Steuern Sie die Fernbedienung mit Raspberry Pi 3 Model B + und lilc 1

  4. So erstellen Sie ein Ad-hoc-Netzwerk für RPI

  5. ServoBlaster

Recommended Posts

Machen Sie ein Auto mit automatischem Fahrroboter mit Raspberry Pi3 B + und Ultraschall-Abstandssensor HC-SR04
MQTT Radicon Car mit Arduino und Himbeere
Machen Sie eine Regenschirmerinnerung mit Raspberry Pi Zero W.
Machen Sie einen in die Klimaanlage integrierten Personal Computer "airpi" mit Raspberry Pi 3!
Machen Sie einen einfachen CO2-Inkubator mit Raspberry PI und CO2-Sensor (MH-Z14A)
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 4 sichtbar
Erstellen Sie einen Kanji-Kompass mit Raspberry Pi und Sense Hat
Machen wir ein IoT-Shirt mit Lambda, Kinesis, Raspberry Pi [Teil 1]
Erstellen Sie mit Raspberry Pi einen WLAN-Ethernet-Konverter und einen einfachen Router
Erfassen Sie den Sensorwert von Grove Pi + mit Raspberry Pi und speichern Sie ihn in Kintone
Haustierüberwachung mit Rekognition und Raspberry pi
Verbesserter menschlicher Sensor mit Raspberry Pi
Verwenden Sie einen PIR-Bewegungssensor mit Himbeer-Pi
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Bedienen Sie das Oszilloskop mit dem Raspberry Pi
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 3 sichtbar
Ich habe die Beleuchtungsstärke des Raumes mit Raspberry Pi, Arduino und einem optischen Sensor getwittert
[Für Anfänger] Ich habe mit Raspberry Pi einen menschlichen Sensor erstellt und LINE benachrichtigt!
Stellen Sie ein Überwachungsgerät mit einem Infrarotsensor her
Himbeere + am2302 Temperatur und Luftfeuchtigkeit mit Temperatur- und Feuchtigkeitssensor messen
Holen Sie sich Temperatur und Luftfeuchtigkeit mit DHT11 und Raspberry Pi
GPS-Tracking mit Raspeye 4B + BU-353S4 (Python)