Darth – Phase 2: Widerstände

Weniger Panzertape, mehr Heißkleber

Nach den durchaus positiven Erfahrungen mit dem Ultraschallsensor beim Raspberry Pi, habe ich mich heute an den Anschluss und Betrieb des HCR-SR04 im Jetson Nano Fahrzeug gemacht.

Das klappte erstmal überhaupt nicht. Die Widerstand Kombination von 1kOhm zu 2kOhm führte immer wieder zu Aussetzern in der Abstandserkennung.

Da ich bis dato mit der zu Grunde liegenden Elektrotechnik auch noch nicht so wirklich warm geworden bin, war Probieren geht über Studieren angesagt. Ich wollte auf jeden Fall vermeiden hier auch noch einen Kondensator einlöten zu müssen. Schlussendlich bin ich bei den Widerständen R1: 1kOhm und R2: 10kOhm gelandet (Schaltplan).

Das Github Repository: https://github.com/weboliver/darth habe ich entsprechend aktualisiert (Branch: feature/phase2).

from Motor.servo_motor import ServoMotorController
from Sensoren.hcrsr04 import UltraschallHCRSR04
from Sensoren.sensors import Sensors
from XBoxController.xboxcontroller import XBoxController

sensoren = Sensors()
hcrsr04_sensor1 = UltraschallHCRSR04("UART2_RTS", "SPI2_SCK")

sensoren.add_sensor("HCRSR04", hcrsr04_sensor1)

xboxController = XBoxController()
servo_motor = ServoMotorController(default_speed=60, max_speed=100)
servo_motor.add_motor("HINTEN", 'UART2_CTS', 'DAP4_FS', 'GPIO_PE6', 50)

from car import Car

newcar = Car("Darth Car", servo_motor, xboxController)
newcar.add_heartbeat("Camera Observer", 0.5)
newcar.set_sensors(sensoren)
hcrsr04_sensor1.start()

newcar.start()
newcar.drive()

print("Ready to drive")

Der Sensoren “Observer” befindet sich noch in Dummy Status.

Die HCR -S04 Ansteuerung will ich hier auch noch einmal ausgeben. Da sind einige Spezialitäten beim Nano drin:

#Bibliotheken
import threading
import time

import RPi.GPIO as gpio


class UltraschallHCRSR04:
    def __init__(self, Trigger, Echo, set_mode: bool = True):
        self._gpio = {}
        self._gpio["TRIGGER"] = Trigger
        self._gpio["ECHO"] = Echo
        self._stop = False
        if (set_mode):
            # Tegra_soc weil die Bibliothek zur Servo Motoransteuerung diese explizit setzt.
            gpio.setmode(gpio.TEGRA_SOC)
        gpio.setwarnings(False)
        gpio.setup(self._gpio["TRIGGER"], gpio.OUT)
        gpio.setup(self._gpio["ECHO"], gpio.IN)
        self._entfernung_now = 0

    def _entfernung(self):
        while True and self._stop is False:
            # Alle 0.1 Sekunden Abfragen
            time.sleep(0.1)
            # Trig Low setzen (nach 0.01ms)
            gpio.output(self._gpio["TRIGGER"], False)
            gpio.output(self._gpio["TRIGGER"], True)
            time.sleep(0.0002)
            # Trig High setzen
            gpio.output(self._gpio["TRIGGER"], False)
            time.sleep(0.0005)
            Startzeit = time.time()
            Endzeit = Startzeit
            # Start/Stop Zeit ermitteln
            # die Jetson Bibliothek für GPIO wirft hier ab und zu einen Fehler
            try:
                i = 0
                # warte max 100 Schleifen auf 0
                while gpio.input(self._gpio["ECHO"]) == 0 and i < 100:
                    i = i + 1
                    Startzeit = time.time()
                    Endzeit = Startzeit
                    time.sleep(0.00001)
            
                i = 0
                # warte max 100 Schleifen auf 0
                while gpio.input(self._gpio["ECHO"]) == 1 and i < 100:
                    i = i + 1
                    Endzeit = time.time()
                    time.sleep(0.00001)
            # dann 0
            except:
                Endzeit = time.time()
                Startzeit = Endzeit
                pass
        
            # Vergangene Zeit
            Zeitdifferenz = Endzeit - Startzeit
            
            # Schallgeschwindigkeit (34300 cm/s) einbeziehen
            self._entfernung_now = round((Zeitdifferenz * 34300) / 2)
            # Entfernungen > 1000 lassen wir weg, die stimmen eh nicht.
            if self._entfernung_now > 1000:
                self._entfernung_now = 0

    def start(self):
        self.thread = threading.Thread(target=self._entfernung)
        self.thread.start()

    def stop(self):
        self._stop = True

    def display_entfernung(self):
        print(self._entfernung_now, " cm")

    def get_current_entfernung(self):
        return self._entfernung_now

Und hier noch ein Test Script nur für die Abstandsmessung:

import time

from hcrsr04 import UltraschallHCRSR04
from sensors import Sensors

sensoren = Sensors()
hcrsr04_sensor1 = UltraschallHCRSR04("UART2_RTS", "SPI2_SCK")

sensoren.add_sensor("HCRSR04", hcrsr04_sensor1)
HCR = sensoren.get_sensor("HCRSR04")

HCR.start()

try:
    while True:
        time.sleep(0.5)
        HCR.display_entfernung()
# Keyboard Error und alle anderen
except:
    HCR.stop()

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmen Sie dem zu.

Datenschutzerklärung