Änderungen
Aus Hackerspace Ffm
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
== 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)
** 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
=== Blockschaltung 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:
* 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 ==
[[Datei:Chassis11.zip]] Schalen<br>
[[Datei:X_Chassis_11.zip]] Chassis <br>
<br>
Als Alternative wurde ein Chassis mit den Motoren im Rad entwickelt. Dadurch wir die Radnabe dicker, aber der Platz im Inneren des Chassis wird deutlich größer. Ausserdem läßt sich jetzt der Aufbau des Chassis wesentlich freier gestalten, es müssen lediglich die Befestigungspunkte der Räder vorgesehen werden.<br>
[[Datei:20190421-fpvauto-inwheelchassis01.jpg|320px]]<br>
[[Datei:20190424InWheel.zip]] In Wheel Chassis (Testplattform)<br>
[[Datei:20190605-InWheelChassis.zip]] In Wheel Chassis (Beta 1) mit Befestigungslöchern für Stack<br>
[[Datei:20190605-StackHolder.zip]] Stackbefestigung für Beta 1 Chassis. Befestigung mittels 2x M4 Senkkopf 5mm <br>
== Raspberry Pi Zero W ==
=== Samba Freigabe<br>===
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 ===
{
"base":{},
"face": {},
"mode":{},
"voice": {}
}
=== Videostreaming ===
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.