FPV-Auto
Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:
- Einfach nachzubauen
- Steuerung per FPV über WLAN
- Selbstgedrucktes Chassis aus dem 3D-Drucker
- Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung
- Energieversorgung:
2x1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung) - Antrieb: 4x Mini-Motor mit Getriebe
- Lenkung: Nur über unterschiedliche Ansteuerung der Motoren
- Elektronik:
- Raspberry Pi Zero W mit Kamera für FPV
- Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller
Inhaltsverzeichnis
FPV Control Board
Blockschaltung
Features und Implementation
- Stromversorgung:
- 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)
- LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)
- TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)
- TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)
- TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)
- TPS62007 (Buck, teuer, größeres Gehäuse)
- Booster: 3x einstellbar, am besten mit Enable
- 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)
- 4 - 6V/2A für Motoren
- evtl. separate 5V/1-2A für Servos/Neopixel
- TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar) -> 1x für Motoren, 1x für Servos
- TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)
- 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)
- Batteriemanagement:
- bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)
- bq24262 (Lader, per I2C einstellbar, 3.40 EUR)
- bq24125 (Nur Lader, gut, aber 5.50 EUR!)
- bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden
- Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom
- Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx
- Reiner Balancer: bq2920x
- Buck-Boost Charger: bq25703
- Günstiger Buck Charger: bq24133
- Motortreiber:
- Kontrollierbar mit 3.3V Pegeln
- 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen
- DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)
Der DRV8835 ist mit nur 2 PWM-Kanälen einfacher anzusteuern da er by design einen Pin für die Richtung hat und einen für den PWM pro H-Brücke. Der DRV8833 ist für 4 PWMs ausgelegt. Er kann zwar auch nur mit 2 angesprochen werden, aber das ist komplizierter anzusteuern.
- Pegelwandler:
- 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich PCA9685)
- 2x 3.3V -> 5V für Neopixel
- Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V MAX98357A ist hier gut
- NRF24L01+ Mini-Modul
Pinbelegung FPV-Auto Board
AOUT2 AOUT1 | SERVO1 +5V5 GND | VO- BOUT2 BOUT1 | SERVO2 +5V5 GND | VO+ =======PCB===========PCB==========PCB======== [MOTOR_RIGHT] | [SERVO1 +5V5 GND] | |Spk| [MOTOR_LEFT ] | [SERVO2 +5V5 GND] | |Spk| =======PCB===========PCB==========PCB========
Pinbelegung ATmega328
Arduino-Pin | Port | Funktion |
0 | PD0 (RxD) | TxD am Raspi |
1 | PD1 (TxD) | RxD am Raspi |
2 | PD2 (INT0) | EN_3V3 |
3 | PD3 (OC2B) | DRV8835 BENBL |
4 | PD4 | EN_5V1 |
5 | PD5 (OC0B) | DRV8835 BPHASE |
6 | PD6 (OC0A) | DRV8835 APHASE |
7 | PD7 | EN_5V5 |
8 | PB0 | /CHARGER_CE |
9 | PB1 (OC1A) | PWM/Servo out A |
10 | PB2 (OC1B) | PWM/Servo out B |
11 | PB3 (MOSI/OC2A) | DRV8835 AENBL |
12 | PB4 (MISO) | |
13 | PB5 (SCK) | NRF_MOSI |
A0 | PC0 | NRF_CE |
A1 | PC1 | NRF_CS |
A2 | PC2 | NRF_SCK |
A3 | PC3 | NRF_MISO |
A4 | PC4 | SDA |
A5 | PC5 | SCL |
A6 | ADC6 | |
A7 | ADC7 | BUTTON_SENSE |
Software für FPV-Control Board Arduino
Package für Arduino
Die Idee ist, dass das Board direkt vom Raspberry Zero geupdatet werden kann. Dazu muss auf den Raspberry zunächst Arduino installiert werden - am besten indem zunächst der Default-Arduino viasudo apt install arduinoinstalliert wird, und dann aber ersetzt wird, indem von arduino.cc die ARM-Version nach installiert wird.
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz tar -xvf arduino-1.8.9-linuxarm.tar.xz sudo mv arduino-1.8.9 /opt sudo /opt/arduino-1.8.9/install.sh
In der neuen Arduino-IDE unter File->Preferences den Sketchbook-Speicherort auf das Arduino-Verzeichniss aus dem GIT-Repository gesetzt und die IDE neu gestartet. Damit sind sofort alle speziellen Libraries und das FPV-Auto in der Board-Auswahl verfügbar. Auf dem Raspberry muss "FPV-Auto on Raspberry" gewählt werden, um vom Raspberry das aufgesteckte Board umzuprogrammieren. Die Variante ohne "on Raspberry" ist für den Fall, dass man das Board vom PC aus programmieren möchte - hierzu muss man RX/TX/Reset und GND mit einem 3.3V USB-Seriell-Adapter anschliessen.
Kommandos von FPVAutoControl
Die Kommandos werden per Serieller Schnittstelle übertragen mit 38400,8N1. Komplexere Kommandos müssen mit einem Return terminiert werden, andere werden direkt ausgeführt um z.B. das Auto rudimentär mit den Tasten W-S-A-D zu steuern. Test per Minicom minicom -b 38400 -D /dev/ttyS0
Kommandos:
- m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)
- f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)
- N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)
- p!999 : Abschalten nach 60sek
- ph aa : Stelle Servo A
- pv aa : Stelle Servo B
Bootloader
Verwendet wurde der MiniCore Bootloader, damit der ATmega328 auch unter 3.3V und 8MHz externen Quarz und mit Optiboot funktioniert. Zum Aufspielen des Bootloaders die Arduino-IDE mit der MiniCore-Erweiterung bestücken, dann kann darüber mit einem externen Programmer der Bootloader eingespielt werden. Genutzte Einstellungen dazu:
- Board: "ATmega328"
- Clock: "8 MHz external"
- BOD: "1.8v"
- Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)
Ist der Bootloader einmal aufgespielt, kann statt MiniCore zu installieren auch nur die Datei unter "arduino-1.8.x/hardware/arduino/avr/boards.txt" um folgendes bevorzugt am Anfang erweitert werden:
############################################################## fpva.name=FPV-Auto fpva.upload.tool=avrdude fpva.upload.protocol=arduino fpva.upload.maximum_size=32256 fpva.upload.maximum_data_size=2048 fpva.upload.speed=38400 fpva.build.mcu=atmega328 fpva.build.f_cpu=8000000L fpva.build.board=AVR_MINI fpva.build.core=arduino fpva.build.variant=eightanaloginputs
Damit lässt sich das FPV-Auto Board einfach programmieren.
Avrdude mit GPIO-Reset
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset
Audio Ausgabe aktivieren
Geht am Arduino vorbei, dieses Tutorial nutzen: http://www.lucadentella.it/en/2017/04/26/raspberry-pi-zero-audio-output-via-i2s/ und die asound.conf mit dem Kram von hier bestücken: https://learn.adafruit.com/adafruit-max98357-i2s-class-d-mono-amp/raspberry-pi-usage#detailed-install-5-16
sudo nano /boot/config.txt
... #dtparam=audio=on dtoverlay=hifiberry-dac dtoverlay=i2s-mmap ...
sudo nano /etc/asound.conf
pcm.speakerbonnet { type hw card 0 } pcm.dmixer { type dmix ipc_key 1024 ipc_perm 0666 slave { pcm "speakerbonnet" period_time 0 period_size 1024 buffer_size 8192 rate 44100 channels 2 } } ctl.dmixer { type hw card 0 } pcm.softvol { type softvol slave.pcm "dmixer" control.name "PCM" control.card 0 } ctl.softvol { type hw card 0 } pcm.!default { type plug slave.pcm "softvol" }
pygame installieren
sudo apt install python3-pygame
sound downloaden
wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav
python3 script erstellen
import pygame import time pygame.mixer.init(44100, -16, 1, 1024) pygame.mixer.music.load("chicken.wav") pygame.mixer.music.play() time.sleep(3)
Kamera aktivieren
https://github.com/jacksonliam/mjpg-streamer
Platinen
Motoren
- 3V 250RPM N20 -- die 250RPM sind etwas flott, daher Tests mit:
- 3V 200RPM N20
Reifen
Ø = 5,8 cm
U = π·d = 18,2 cm
50 RPM = 15,2 cm/sec
200 RPM = 60,7 cm/sec
250 RPM = 75,9 cm/sec
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts
Akkus
18650 Akku
Chassis
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts
Da es zwei unterschiedliche Ansätze zur Nutzung gibt
- Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren
- Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren
wurde das Chassis als Baukasten System entwickelt mit dem sich diese und weitere Ansprüche umsetzen lassen. Basis ist der mittlere Rahmen der die Motoren aufnimmt.
- Maße: 115mm x 72mm x 15mm
- Aufnahme für 4 12GA Motoren
- Aufnahme für Raspberry Pi Zero Minikamera
Für die Tumbler Version werden zwei flache (5mm) Schalen jeweils oben und unten an den Rahmen geschraubt, sie bieten dem Stack aus Raspberry Pi Zero und Drohnen Shield, sowie einer 18650 Zelle Platz
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.
Platine verlötet
Raspberry Pi Zero W
Samba Freigabe
Einrichten wie hier beschrieben Raspberry_Pi_Grundlagen#Samba
Git
Git installieren
sudo apt-get install git
Das Repository https://github.com/hackffm/FPVCar.git clonen
git clone https://github.com/hackffm/FPVCar.git
Software
Protokoll für Commandos aus der Webgui
{ "component":"COMPONENTNAME", "key": "value" }
Beispiel
{ "modul":"base", "forward": 10 }
Videostreaming
Hier könnten wir UV4L verwenden.
Neben einfachem Videostreaming wie mjpg und h264 wird auch WebRTC unterstützt. Damit lassen sich bidirektionale Video-, Audio- und Datenstreams aufbauen um eine Telepräsenz realisieren zu können.
Ach ja und stereoskopische Kameras werden auch unterstützt.
Beispiel mit Gesichtserkennung [1]
Hier wird gezeigt wie man sich die Bibliothek installiert
[2]
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20. Das kann über die Oberfläche unter Control Panel gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt. Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern. Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf . Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480">
Emotionen
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.
Hier ein Test mit einem 128x64 Pixel Display:
Verwendet wird die Python Bibliothek Luma.OLED.
Das Python-Skript liegt im Git Repo unter python/eyes.
ToDo
1. Vollbild Control
2. Config Page
3. Consolenausgaben des Pythonservers der über eine Serviceunit gestartet ist ins syslog bekommen.
4. Serviceunit ohne Passwortabfrage starten/stoppen können.