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()