Änderungen

Aus Hackerspace Ffm
Wechseln zu: Navigation, Suche

FPV-Auto

7.919 Byte hinzugefügt, 15:39, 16. Dez. 2019
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
== FPV Control Board ==
=== Blockschaltung ===[[Datei:Block diagram FPV Auto Shield.png|1000px]] === Features und Implementation:===
* Stromversorgung:
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)
*** 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)
* 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
** 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 ===
<pre>
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========
</pre>
 
 
=== Pinbelegung ATmega328 ===
{| class="wikitable"
|'''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 via <pre>sudo apt install arduino</pre> installiert wird, und dann aber ersetzt wird, indem von arduino.cc die ARM-Version nach installiert wird.
<pre>
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
</pre>
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 <code>minicom -b 38400 -D /dev/ttyS0</code>
 
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 [https://github.com/MCUdude/MiniCore 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:
<pre>
##############################################################
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
</pre>
 
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
 
<pre>sudo nano /boot/config.txt</pre>
<pre>
...
#dtparam=audio=on
dtoverlay=hifiberry-dac
dtoverlay=i2s-mmap
...
</pre>
 
<pre>sudo nano /etc/asound.conf</pre>
 
<pre>
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"
}
</pre>
 
pygame installieren
<pre>sudo apt install python3-pygame</pre>
 
sound downloaden
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre>
 
python3 script erstellen
<pre>
import pygame
import time
 
pygame.mixer.init(44100, -16, 1, 1024)
pygame.mixer.music.load("chicken.wav")
pygame.mixer.music.play()
 
time.sleep(3)
</pre>
 
==== Kamera aktivieren ====
https://github.com/jacksonliam/mjpg-streamer
 
=== Platinen ===
[[Datei:FPV-Auto PCB Top.png|300px]]
[[Datei:FPV-Auto PCB Bot.png|300px]]
== Motoren ==
== Reifen ==
* https://www.youtube.com/watch?v=k6QX90taK5c
[[Datei:20180604 201225.jpg|320px]][[Datei:20180604 201232.jpg|320px]] Ø = 5,5 8 cm<br>U = π·d = 1718,3 2 cm<br>50 RPM = 15,2 cm/sec<br>200 RPM = 60,7 cm/sec<br>250 RPM = 75,9 cm/sec<br>Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts
== Akkus ==
== 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
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]
 
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]
 
Platine verlötet
 
[[Datei:Fpvcar platine verloetet.jpg|320px]]
[[Datei:Chasis verloetet.jpg|320px]]
[[Datei:Batterie Halter.jpg|320px]]
 
[[Datei:Fpvcar mit 9dof i2c.jpg|320px]]
 
== 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
{
"component":"base",
"forward": 10
}
=== Videostreaming ===
Hier könnten wir UV4L verwenden.<br>
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.<br>Ach ja und stereoskopische Kameras werden auch unterstützt.
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br>
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart
Um den mjpeg Stream in eine Webseite einzubinden einfachfolgendes Tag einfügen. <img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480">einfügen== Emotionen ==Mit einem OLED Display kann man dem Gefährt Emotionen mit geben. Hier ein Test mit einem 128x64 Pixel Display:<br>[[Datei:Eyes neutral.png]][[Datei:Eyes skeptic.png]][[Datei:Eyes angry.png]][[Datei:Eyes sad down.png]] Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br>Das Python-Skript liegt im Git Repo unter python/eyes. == ToDo ==1. Vollbild Control<br>2. Consolenausgaben des Pythonservers der über eine Serviceunit gestartet ist ins syslog bekommen.<br>3. Serviceunit ohne Passwortabfrage starten/stoppen können.
279
Bearbeitungen