Aus Raspberry Pi Geek 11/2024

Fischertechnik Maker Kit Car (Seite 2)

Mit der Diode und dem relativ großen Kondensator in der Spannungsversorgung stabilisieren wir die Versorgungsspannung für den ESP32. Um den aktuellen Status anzuzeigen, verfügen beide Controller über eine RGB-LED. Auf den beiden Schaltplänen in Abbildung 3 und Abbildung 4 sehen Sie, wie Sie alle Bauteile miteinander verbinden müssen. Auf Abbildung 5 können Sie das fertige Auto mit Fernbedienung bewundern.

Abbildung 3: Der Schaltplan für die Fernbedienung.

Abbildung 3: Der Schaltplan für die Fernbedienung.

Abbildung 4: Der Schaltplan für die Fahrzeugelektronik.

Abbildung 4: Der Schaltplan für die Fahrzeugelektronik.

Abbildung 5: So sieht das Auto mit Fernbedienung aus.

Abbildung 5: So sieht das Auto mit Fernbedienung aus.

Testprogramme

Für jeden der Mikrocontroller brauchen wir ein eigenes Programm. Sehen wir uns im ersten Schritt das Programm für das Fahrzeug an. Der erste Codeblock (Listing 1) erzeugt auf dem ESP32 einen Access Point mit vordefinierten Parametern. Anschließend definieren Sie die PWM-Ausgänge für die Motoren. Dabei stehen die Variablen I1 (Zeile 23) und I2 (Zeile 24) für die beiden Drehrichtungen des Gebermotors. Die Pins am Motortreiber sind mit I1 und I2 beschriftet.

Der nächste Codeblock startet einen UDP-Server auf dem Port 1701 (Star-Trek-Fans wissen, warum). Wir verwenden hier das UDP-Protokoll, weil die Datenrate höher ausfällt und wir die bei TCP integrierte Fehlerkorrektur nicht benötigen. Innerhalb der While-Schleife (Zeile 31) werden die empfangenen Pakete dekodiert und die darin enthaltenen Werte des Joysticks so umgerechnet, dass die Motoren sinnvoll angesteuert werden können.

An dieser Stelle sei erwähnt, dass der Joystick nicht sehr präzise arbeitet und ebenso nicht den vollen Hebelweg komplett ausnutzt. Dafür kostet er in der Anschaffung nicht allzu viel. Innerhalb des Programms finden sich schließlich auch Codezeilen, die den aktuellen Status über die Farbe der RGB-LED signalisieren.

Listing 1

auto.py

import network
import socket
import time
import machine
port = 1701
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(ssid='FT-CAR')
ap.config(password='FT-CAR-Password')
ap.config(authmode=network.AUTH_WPA_WPA2_PSK)
ap.ifconfig(('192.168.42.42', '255.255.255.0',
  '192.168.42.42', '192.168.42.42'))
while ap.active() == False:
  print("*",end="")
  pass
print('Connection successful')
print(ap.ifconfig())
time.sleep(.5)
servo = machine.PWM(machine.Pin(21))
servo.freq(50)
I1=machine.PWM(22)
I2=machine.PWM(23)
I1.freq(8000)
I2.freq(8000)
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('192.168.42.42',port))
print('waiting...')
while True:
  data,addr=s.recvfrom(1024)
  print('received:',data,'from',addr)
  x = int(str(data.split()[0].decode()))
  y = int(str(data.split()[1].decode()))
  b = int(str(data.split()[2].decode()))
  print("X: "+str(x))
  print("Y: "+str(y))
  print("B: "+str(b))
  x=2000000-(x*250)
  #print (x)
  servo.duty_ns(x)
  if (y > 2148):
    y= 45000 +((y-2048)*10)
    print ("1:"+str(y))
    I1.duty_u16(y)
    I2.duty_u16(0)
  elif (y < 1948):
    y= 45000 +((2048-y)*10)
    print ("2:"+str(y))
    I2.duty_u16(y)
    I1.duty_u16(0)
  else:
    I1.duty_u16(0)
    I2.duty_u16(0)

Nun ist das Programm für die Fernbedienung (Listing 2) an der Reihe. Nach dem Start versucht die Fernbedienung, sich mit dem Access Point des Fahrzeugs zu verbinden. Hat das geklappt, werden die Messwerte des Joysticks kontinuierlich an den UDP-Port 1701 gesendet. Auch hier zeigt eine RGB-LED den aktuellen Status an.

Listing 2

controller.py

from machine import ADC,Pin
import time
import network
import socket
port = 1701
serverIp = "192.168.42.42"
xAxis = ADC(Pin(34, Pin.IN))
xAxis.atten(xAxis.ATTN_11DB)
yAxis = ADC(Pin(35, Pin.IN))
yAxis.atten(yAxis.ATTN_11DB)
button = Pin(32, Pin.IN, Pin.PULL_UP)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('FT-CAR', 'FT-CAR-Password')
while(wlan.isconnected() == False):
  print("*",end="")
  time.sleep(1)
  pass
ip = wlan.ifconfig()[0]
print(ip)
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
  xValue = str(xAxis.read())
  yValue = str(yAxis.read())
  buttonv = str(button.value())
  data=str.encode(xValue+" "+yValue+" "+buttonv)
  time.sleep(0.1)
  s.sendto(data,(serverIp,port))

Bei den zwei Testprogrammen handelt es sich nur um einfache Beispiele, die demonstrieren sollen, wie Sie eine Feinsteuerung aufbauen. Eine durchdachte Fehlerbehandlung täte den zwei Programmen gut. Scheuen Sie sich also nicht, den Code zu verbessern. Um die Programme beim Start automatisch auszuführen, müssen Sie den Dateinamen in main.py umwandeln. Falls Sie das Auto in Aktion sehen möchten, finden Sie auf Youtube ein entsprechendes Video [6].

Fazit

Eines ist sicher: Nach diesem Projekt sehe ich alle Arten von Fernbedienungen mit anderen Augen. Es erfordert doch eine ganze Menge Arbeit, um ein einfaches Auto zu steuern. Hinterher halten Sie allerdings einen funktionierenden Basisaufbau in den Händen, der sich einfach erweitern lässt. Es bieten sich unter anderem Blinker, Abstandswarner, Bremslicht, Hupe oder auch autonomes Fahren an, um nur einige Beispiele zu nennen. Ich wünsche Ihnen viel Spaß bei eigenen Experimenten mit dem Fischertechnik Maker Kit Car. (csi)

Der Autor

Martin Mohr hat die komplette Entwicklung der modernen Computertechnik live miterlebt. Nach dem Studium entwickelte er überwiegend Java-Applikationen. Mit dem Raspberry Pi erwachte seine alte Liebe zur Elektronik wieder.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben