https://hackerspace-ffm.de/wiki/api.php?action=feedcontributions&user=Snow&feedformat=atomHackerspace Ffm - Benutzerbeiträge [de]2024-03-29T09:18:57ZBenutzerbeiträgeMediaWiki 1.25.3https://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11327Arucomover2021-07-10T11:53:19Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
[[Datei:Arucomover.jpg |x300px]]<br />
<br />
Ein kleiner Roboter auf Basis eines Raspberry Pi soll selbstständig Arucocodes finden und anfahren können.<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Positionen und Entfernung zu erkennen.<br />
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow nimmt die Position auf und gibt Steuerbefehle an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten liefert um z.B. die Positionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu.<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Mit dem Dashboard UI aus Node Red heraus ist es möglich, dass der Benutzer steuern kann.<br />
<br />
Die erkannten Aruco IDs werden angezeigt. Ist eine ID erkannt worden, kann User Automatic wählen.<br />
<br />
Automatic heißt,der Flow steuert den Robot auf den Aruco Code und stoppt den Robot kurz davor<br />
<br />
Der Zustand des Bots (Load, Temperaturen, Calibration) wird auch angezeigt.<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
<br />
== Setup ==<br />
Der Code und auch ein Setup können aus https://github.com/hackffm/arucomover geladen werden.<br />
Das Ganze läuft auf einem Debian basiertem Linux. Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das Allermeiste <br />
vorbereiten sollten. <br />
<br><br />
Das Skript arucodetection.py verwendet Shared Memory ! <br />
<br><br />
Erst ab Python 3.8 ist Shared Memory verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher<br />
gibt es im Setup Folder das Hilfskript setup_python3_9.sh für den Pi 3.<br><br />
<br />
Vor der Ausführung der Setups muss das Swapfile auf eine Raspberry vergrößert werden.<br />
<br />
<code><br />
sudo nano /etc/dphys-swapfile -> CONF_SWAPSIZE=1024<br />
<br />
sudo /etc/init.d/dphys-swapfile restart<br />
</code><br />
<br />
Ein gutes Netzteil vorrausgesetzt, läuft das dann einige Zeit. Die übrigen Setup <br />
Skripte können, mit der richtigen Python Version dann ausgeführt werden.<br />
Der Schritt 2_setup_folders.sh installiert auch alle Python Requierements.<br />
Das kann auf einem PI 3 mehrere Stunden dauern, da diverse Kompilierungen im Hintergrund laufen !<br />
<br />
== Arucodetetcion ==<br />
ist ein Pythoncode, der von dieser Seite [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft:<br />
Web und Arucodetecion. Damit der Webprozess die Arcuoposition über einen Websocket liefern kann, sind<br />
beide über eine Managed Queue verbunden. Der Videostream wird in ein Shared Memory<br />
geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich !<br />
Default für den Kameraanschluss ist "Camera Device 0". Sollte eine <br />
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes <br />
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den <br />
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden. <br />
Dort liegt auch eine config.json mit der sich die Kamera, Auflösung, Debug usw. einstellen läßt.<br />
Das Log landet in ~/arucdetection/log.<br />
Default ist DICT_6X6_50 für den Arucocode! Dies kann zur Zeit nur in der camera.py umgestellt werden.<br />
<br />
Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur Verfügung, <br />
die Websocket und Videostream abfragt.<br />
<br />
Die Webseite ist auf 127.0.0.1:9080 zu finden <br />
<br />
[[Datei:Arucodetection.jpg |x300px ]]<br />
<br />
== itsyBitsyM4==<br />
Die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.<br />
Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.<br />
<br />
code.py ist der ausgeführte Code. Der I2C Test ist in diesen eingebaut. Alle verfügbaren Kommandos können<br />
mit ? abgefragt werden. Will man nur I2C testen, kann man auch code.py umbenennen. Dann wird automatisch main.py<br />
aufgerufen, dass in einer Endlosschleife die angeschlossenen I2C Devices abfragt.<br />
<br />
== Node-Red ==<br />
<br />
Entweder durch die Setup Skripte oder so sollte ein Node.js 14x vorhanden sein.<br />
Wenn das Skript 2_setup_folders.sh nicht ausgeführt wurde muss selbst dafür gesorgt werden, dass<br />
das Package.json File in ~/nodered/ abgelegt wurde und alle Package Depencies darin installiert wurden.<br />
<br />
node_red_start.sh führt Folgendes aus:<br />
<br />
<code><br />
node red --settings ~/git/arucomover/code/nodered/arucomover.js --flowFile ~/git/arucomover/code/nodered/flows_arucomover.json<br />
</code><br />
<br />
Das Settings File startet NodeRed auf Port 9010<br><br />
Editor => http:;//127.0.0.1:9010 und<br><br />
UI => http:;//127.0.0.1:9010/ui<br><br />
<br><br />
Der Flow ist in zwei Tabs aufgeteilt.<br><br />
Ein Tab für die Daten von ItsyBitsy M4 und arucomover.py<br><br />
Ein Tab für die Steuerbefehle an den ItsyBitsy M4<br><br />
Beide Tabs habe UI Elemente und sind miteinander verbunden um ein einheitliches Handling zu ermöglichen.<br><br />
<br><br />
<br />
== Start ==<br />
<br />
Es müssen zwei Prozesse gestartet werden also entweder nacheinander mit & in den Hintergrund oder z.B. mit screen oder tmux.<br />
<br />
1.Start der arucodetection<br><br />
<code><br />
source ~/arucodetection/venv/bin/activate<br />
<br />
...../arucomover/code/arucodetection/arucodetection.py<br />
<br />
</code><br />
<br />
2.Start der Node-Red Flows<br><br />
<code><br />
...../arucodetection/cosde/bash/node_red_start.sh<br />
</code><br />
<br />
== Hardware Evolution ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br><br />
BNO055<br><br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomoverui.png&diff=11326Datei:Arucomoverui.png2021-07-10T11:48:02Z<p>Snow: Snow lud eine neue Version von Datei:Arucomoverui.png hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Projekte&diff=11318Projekte2021-07-05T18:43:16Z<p>Snow: </p>
<hr />
<div>== Info Sammlung ==<br />
* [[Fern Bild Sprechanlage Einrichten]]<br />
* [[Face Shield]]<br />
* [[OpenCV mit Python]]<br />
* [[Python Grundlagen|Grundlagen zur Benutzung von Python]]<br />
* [[ESP32_with_OLED|ESP32 Module mit integriertem OLED Display]]<br />
* [[Heltec Wifi LoRa 32]]<br />
* [[DataTransferWebRaspberryArduino]]<br />
* [[RaspberryGPIOSerial]]<br />
* [[Kameramodule fuer uC]]<br />
* [[Bluetooth-Modul HC-05]]<br />
* [[Arduino / C Programmierung Grundlagen]]<br />
* [[COVID-19 Nukleotidsequenz anschauen]]<br />
<br />
== Geplante Gemeinschaftsprojekte ==<br />
* [[Corona Konzept]]<br />
* [[Space Zugangssysem]]<br />
* [[NachtderMuseen2020|Alien Space Escape auf der Nacht der Museen]]<br />
* Lötstation<br />
* 5 Achsenfräse<br />
* Käsehobel Upgrade<br />
* Drehbank<br />
* 100W Lasercutter Überarbeitung<br />
* 10 Jahre Hackerspace<br />
<br />
== Laufende Projekte ==<br />
<br />
<gallery mode="packed"><br />
Image:BLEbc.jpg|link=Reloaded: Bluetooth LE bicycle computer |[[Bluetooth LE bicycle computer]]<br />
Image:elektronisches_saiteninstrument.jpg|link=Reloaded: Elektronisches Saiteninstrument 1.0|[[Elektronisches Saiteninstrument 1.0]]<br />
Image:neuer_CO2-Laser.jpg|link=Reloaded: CO₂-Laser 2.0|[[Reloaded: CO₂-Laser 2.0]]<br />
Image:Diningroomlight_on_table.jpg|link=DesignerEsszimmerLampe|[[DesignerEsszimmerLampe|Designer Esszimmer Lampe]]<br />
Image:HoloDingsYoutube.jpg|link=HoloDings|[[HoloDings|Holo Dings]]<br />
Image:20180624-fpvauto-fpvauto-stdconfig.jpg|link=FPV-Auto|[[FPV-Auto]]<br />
Image:LoRaGoPort aufRPi.jpg|link=LoRaWAN|[[LoRaWAN]]<br />
Image:AVRProgrammer.jpg|link=AVRProgrammer|[[AVRProgrammer]]<br />
Image:EXCISS-isback.jpg|link=EXCISS|[[EXCISS|EXCISS - Experimental Chondrule Formation at the ISS]]<br />
Image:uni_frankfurt_2018.jpg|link=Elektronische_Bassflöte|[[Elektronische_Bassflöte|Elektronische kleine Bassflöte Version 2.0]]<br />
Image:Wiessenthaner ESB 01.jpg|link=Elektronische_Bassflöte|[[Elektronische_Bassflöte|Elektronische kleine Bassflöte Version 1.5]]<br />
Image:LineCamPrinter.jpg|link=LineCamPrinter|[[LineCamPrinter]]<br />
Image:Ominibot.jpg|link=OmnibotWebcontrol|[[OmnibotWebcontrol]]<br />
Image: Steering_kartesian.PNG|link=Space Robot Experimental aka SpaceREx|[[Space Robot Experimental aka SpaceREx]]<br />
Image:Elektronische Bassquerfloete 1.jpg|link=Elektronische_große_Bassflöte_Version_1.0|[[Elektronische_große_Bassflöte_Version_1.0|Elektronische große Bassflöte Version 1.0]]<br />
Image:Kleine Bassfloete.jpg|link=Elektronische_kleine_Bassflöte_Version_1.0|[[Elektronische_kleine_Bassflöte_Version_1.0|Elektronische kleine Bassflöte Version 1.0]]<br />
Image:20170114_161830.jpg|link=Spider UFO|[[Spider UFO|Ufo von SpaceInLasers_3.0]]<br />
Image:AutoUpload_2016_11_08_22_00_57.jpg|link=ReaktiveRadioLight|[[ReaktiveRadioLight|Reaktivlicht auf NRF24L01+ Basis]]<br />
Image:DIY CNC Fräser 2016-10-25 19-42.jpg|link=OpenBuilds Fräse|[[OpenBuilds Fräse]]<br />
Image:Trash.Cache.Logo.png|link=Trash.Cache|[[Trash.Cache]]<br />
Image:Actioncam_case_1.jpg|link=CubicPlates|[[CubicPlates]]<br />
Image:SpaceShuttel_base2.jpg|link=Space_Shuttle|[[Space_Shuttle]]<br />
Image:ntc_clock_progress_1.jpg|link=Clockwork NTP|[[Clockwork NTP]]<br />
Image:Arucomover.jpg|link=Arucomover|[[Arucomover]]<br />
</gallery><br />
<br />
== Projekte im Planungsstadium ==<br />
* [[Stickmaschine]] - Crowdfunding im Mai 2016 zur Anschaffung eines ''CrowdStitchers''<br />
* [[Raum 2.0 - PHASE 2]]<br />
* [[SNES-4-Space]] (Super Nintendo Entertainment System)<br />
* [[hackffmhome|Startseite des Hackerspaces]]<br />
* [[ATmega-Assembler-Lehrgang]]<br />
* [[Geocache]]<br />
* [[IR_Reaktivlicht]]<br />
* [[Ultimaker - ALU]]<br />
* [[Einrichtung]]<br />
* [[Orscheler Seifenkistenrennen]]<br />
* [[PCB Ätzresist tschüss Laser Apparat]]<br />
<br />
== Abgeschlossene Projekte ==<br />
* [[Mini Sustain Pedal for APC Key25]]<br />
* [[SAMLAIR Airbrush Chamber]]<br />
* [[Flaschenlampe]]<br />
* [[ESP8266 Internet Button]]<br />
* [[CloudBox]]<br />
* [[SpaceInLasers_3.0]] auf der [[Make Rhein-Main 2017]]<br />
** [[Spider UFO]]<br />
*** [[UFO]]<br />
* [[SpaceInLasers|SpaceInLasers 2.0]]<br />
* [[BrickUsingMultipleModules]]<br />
* [[Barcode Scanner Hack]]<br />
* [[Wackelbildprotokollator]]<br />
* [[Do It Yourself Slider für Zeitraffer und Videoaufnahmen|Do It Yourself Slider]]<br />
* [[Rundbunt_Mini_WIFI|Rundbunt Mini WIFI]]<br />
* [[Mikroturbine]]<br />
* [[HackffmActivitySensors_MQTT]]<br />
* [[BrettBoard|BrettBoard - Modulares Transport System (work in progress)]]<br />
* [[Ultraschall Luftpumpe]]<br />
* [[Raspberry PI Zero + nano USB WiFi Adapter mod ]]<br />
* [[Gobo-Projektor]]<br />
* [[ESP8266 mit Arduino programmieren]]<br />
* [[SMD Tools]]<br />
* [[HackFFM-Duino_Chime]]<br />
* [[Raum 2.0 - PHASE 1]]<br />
* [[Workshop BB-One]]<br />
* [[Arduino 1.0.6 auf Raspberry Pi installieren]]<br />
* [[Arduino Bootloader Programmer]]<br />
* [[raspicam|USB-Webcam am Raspberry]]<br />
* [[Raspberry Pi enable ttyS0]]<br />
* [[Spulentraeger]]<br />
* [[LED step-up converter with ATtiny85]]<br />
* [[RPG Effect Templates]]<br />
* [[PLA Flieger]]<br />
* [[Rundbuntplasma|Plasmalampe mit LPD8806 und Raspberry]]<br />
* [[Rundbunt Mini]]<br />
* [[Community 3d-Drucker]]<br />
* [[Mehr_Dampf_Maus]]<br />
* [[Mumomi_Electronic| mumomi RepRap Electronic]]<br />
* [[Isolated_versatile_FTDI|Isolated versatile FTDI]]<br />
* [[CO₂-Laser]]<br />
* [[Jet Antrieb im Maßstab 1:87|Jet-Antrieb für einen Modelltruck im Maßstab 1:87]]<br />
* [[Arduino_IDE_like_serial_monitor_in_the_Raspberry_Pi_shell|Arduino IDE like serial monitor in the Raspberry Pi shell]]<br />
* [[Raspi_EDLC_UPS|Simple Uninterruptible Power Supply (UPS) for Raspberry Pi using Supercapacitors (EDLC)]] <br />
* [[Processing250kBaud|Trick to use non-standard baud rates like 250kB under Linux with Processing]]<br />
* [[DIY-Autoloader]]<br />
* [[Hackffm³RepRap|hackffm³RepRap]]<br />
* [[HanseBot|HanseBot I]]<br />
* [[Podcast]]<br />
* [[SimpleSDAudio|Arduino Library zur Audiowiedergabe mit SD-Karten]]<br />
* [[Hackffm on Air|hackffm on Air]]<br />
* [[HackffmActivitySensors]]<br />
* [[LedBrett]]<br />
* [[Merlin Extruder|Merlin Extruder]]<br />
* [[Buntich]]<br />
* [[Git Benutzen]]<br />
* [[DIY Mikroskop| DIY Mikroskop]]<br />
* [[WMFRA45|Webmontag 45]]<br />
* [[Mendel_Upgrade|Ikea Mendel Upgrade]]<br />
* [[Hackerspace Ffm Stempel und T-Shirts]]<br />
* [[Drawbot@MfK]]<br />
* [[@MfK]]<br />
* [[3D Drucker für Wöhlerschule]] (3 Wochen)<br />
* [[3D-Drucker mit AUGE.de]] (7 Monate)<br />
* [[3D-Drucker für MfK]] (2 Monate)<br />
* [[Raumsuche|Raum 1.0]] (12 Monate)<br />
* [[Hackerspace Flyer]] (7 Wochen)<br />
* [[Wikimediawettbewerb]]<br />
* [[Bristlebots]] (MfK, TEDxYouth)<br />
<br />
== Eingestellte Projekte ==<br />
* [[HACKFFM-Server]]<br />
* [[Community 3d-Drucker 2.0]]<br />
* [[RGB-Pipe]]<br />
* [[Fail Button]]<br />
* [[Ultraschall GPS]]<br />
* [[Neuland Taskforce]]<br />
* [[Airsoft_Pellet_Bitmaps_(build_blog)|Airsoft Pellet Bitmaps (build blog)]]<br />
<br />
[[Kategorie:Projekte|!]]</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11317Arucomover2021-07-05T18:41:01Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
[[Datei:Arucomover.jpg |x300px]]<br />
<br />
Ein kleiner Roboter auf Basis eines Raspberry Pi soll selbstständig Arucocodes finden und anfahren können.<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Positionen und Entfernung zu erkennen.<br />
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow nimmt die Position auf und gibt Steuerbefehle an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten liefert um z.B. die Positionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu.<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Mit dem Dashboard UI aus Node Red heraus ist es möglich, dass der Benutzer steuern kann.<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
<br />
== Setup ==<br />
Der Code und auch ein Setup können aus https://github.com/hackffm/arucomover geladen werden.<br />
Das Ganze läuft auf einem Debian basiertem Linux. Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das Allermeiste <br />
vorbereiten sollten. <br />
<br><br />
Das Skript arucodetection.py verwendet Shared Memory ! <br />
<br><br />
Erst ab Python 3.8 ist Shared Memory verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher<br />
gibt es im Setup Folder das Hilfskript setup_python3_9.sh für den Pi 3.<br><br />
<br />
Vor der Ausführung der Setups muss das Swapfile auf eine Raspberry vergrößert werden.<br />
<br />
<code><br />
sudo nano /etc/dphys-swapfile -> CONF_SWAPSIZE=1024<br />
<br />
sudo /etc/init.d/dphys-swapfile restart<br />
</code><br />
<br />
Ein gutes Netzteil vorrausgesetzt, läuft das dann einige Zeit. Die übrigen Setup <br />
Skripte können, mit der richtigen Python Version dann ausgeführt werden.<br />
Der Schritt 2_setup_folders.sh installiert auch alle Python Requierements.<br />
Das kann auf einem PI 3 mehrere Stunden dauern, da diverse Kompilierungen im Hintergrund laufen !<br />
<br />
== Arucodetetcion ==<br />
ist ein Pythoncode, der von dieser Seite [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft:<br />
Web und Arucodetecion. Damit der Webprozess die Arcuoposition über einen Websocket liefern kann, sind<br />
beide über eine Managed Queue verbunden. Der Videostream wird in ein Shared Memory<br />
geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich !<br />
Default für den Kameraanschluss ist "Camera Device 0". Sollte eine <br />
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes <br />
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den <br />
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden. <br />
Dort liegt auch eine config.json mit der sich die Kamera, Auflösung, Debug usw. einstellen läßt.<br />
Das Log landet in ~/arucdetection/log.<br />
Default ist DICT_6X6_50 für den Arucocode! Dies kann zur Zeit nur in der camera.py umgestellt werden.<br />
<br />
Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur Verfügung, <br />
die Websocket und Videostream abfragt.<br />
<br />
Die Webseite ist auf 127.0.0.1:9080 zu finden <br />
<br />
[[Datei:Arucodetection.jpg |x300px ]]<br />
<br />
== itsyBitsyM4==<br />
Die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.<br />
Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.<br />
<br />
code.py ist der ausgeführte Code. Der I2C Test ist in diesen eingebaut. Alle verfügbaren Kommandos können<br />
mit ? abgefragt werden. Will man nur I2C testen, kann man auch code.py umbenennen. Dann wird automatisch main.py<br />
aufgerufen, dass in einer Endlosschleife die angeschlossenen I2C Devices abfragt.<br />
<br />
== Node-Red ==<br />
<br />
Entweder durch die Setup Skripte oder so sollte ein Node.js 14x vorhanden sein.<br />
Wenn das Skript 2_setup_folders.sh nicht ausgeführt wurde muss selbst dafür gesorgt werden, dass<br />
das Package.json File in ~/nodered/ abgelegt wurde und alle Package Depencies darin installiert wurden.<br />
<br />
node_red_start.sh führt Folgendes aus:<br />
<br />
<code><br />
node red --settings ~/git/arucomover/code/nodered/arucomover.js --flowFile ~/git/arucomover/code/nodered/flows_arucomover.json<br />
</code><br />
<br />
Das Settings File startet NodeRed auf Port 9010<br><br />
Editor => http:;//127.0.0.1:9010 und<br><br />
UI => http:;//127.0.0.1:9010/ui<br><br />
<br><br />
Der Flow ist in zwei Tabs aufgeteilt.<br><br />
Ein Tab für die Daten von ItsyBitsy M4 und arucomover.py<br><br />
Ein Tab für die Steuerbefehle an den ItsyBitsy M4<br><br />
Beide Tabs habe UI Elemente und sind miteinander verbunden um ein einheitliches Handling zu ermöglichen.<br><br />
<br><br />
<br />
== Start ==<br />
<br />
Es müssen zwei Prozesse gestartet werden also entweder nacheinander mit & in den Hintergrund oder z.B. mit screen oder tmux.<br />
<br />
1.Start der arucodetection<br><br />
<code><br />
source ~/arucodetection/venv/bin/activate<br />
<br />
...../arucomover/code/arucodetection/arucodetection.py<br />
<br />
</code><br />
<br />
2.Start der Node-Red Flows<br><br />
<code><br />
...../arucodetection/cosde/bash/node_red_start.sh<br />
</code><br />
<br />
== Hardware Evolution ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br><br />
BNO055<br><br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover.jpg&diff=11316Datei:Arucomover.jpg2021-07-05T18:39:44Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11315Datei:Arucomover konzept.jpg2021-07-05T18:28:37Z<p>Snow: Snow lud eine neue Version von Datei:Arucomover konzept.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11314Datei:Arucomover konzept.jpg2021-07-05T18:27:52Z<p>Snow: Snow lud eine neue Version von Datei:Arucomover konzept.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11313Datei:Arucomover konzept.jpg2021-07-05T18:25:16Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11312Datei:Arucomover konzept.jpg2021-07-05T18:23:46Z<p>Snow: Snow lud eine neue Version von Datei:Arucomover konzept.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11311Datei:Arucomover konzept.jpg2021-07-04T18:06:26Z<p>Snow: Snow lud eine neue Version von Datei:Arucomover konzept.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11310Arucomover2021-07-04T18:05:17Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Roboter auf Basis eines Raspberry Pi soll selbstständig Arucocodes finden und anfahren können.<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Positionen und Entfernung zu erkennen.<br />
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow nimmt die Position auf und gibt Steuerbefehle an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten liefert um z.B. die Positionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu.<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Mit dem Dashboard UI aus Node Red heraus ist es möglich, dass der Benutzer steuern kann.<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
<br />
== Setup ==<br />
Der Code und auch ein Setup können aus https://github.com/hackffm/arucomover geladen werden.<br />
Das Ganze läuft auf einem Debian basiertem Linux. Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das Allermeiste <br />
vorbereiten sollten. <br />
<br><br />
Das Skript arucodetection.py verwendet Shared Memory ! <br />
<br><br />
Erst ab Python 3.8 ist Shared Memory verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher<br />
gibt es im Setup Folder das Hilfskript setup_python3_9.sh für den Pi 3.<br><br />
<br />
Vor der Ausführung der Setups muss das Swapfile auf eine Raspberry vergrößert werden.<br />
<br />
<code><br />
sudo nano /etc/dphys-swapfile -> CONF_SWAPSIZE=1024<br />
<br />
sudo /etc/init.d/dphys-swapfile restart<br />
</code><br />
<br />
Ein gutes Netzteil vorrausgesetzt, läuft das dann einige Zeit. Die übrigen Setup <br />
Skripte können, mit der richtigen Python Version dann ausgeführt werden.<br />
Der Schritt 2_setup_folders.sh installiert auch alle Python Requierements.<br />
Das kann auf einem PI 3 mehrere Stunden dauern, da diverse Kompilierungen im Hintergrund laufen !<br />
<br />
== Arucodetetcion ==<br />
ist ein Pythoncode, der von dieser Seite [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft:<br />
Web und Arucodetecion. Damit der Webprozess die Arcuoposition über einen Websocket liefern kann, sind<br />
beide über eine Managed Queue verbunden. Der Videostream wird in ein Shared Memory<br />
geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich !<br />
Default für den Kameraanschluss ist "Camera Device 0". Sollte eine <br />
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes <br />
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den <br />
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden. <br />
Dort liegt auch eine config.json mit der sich die Kamera, Auflösung, Debug usw. einstellen läßt.<br />
Das Log landet in ~/arucdetection/log.<br />
Default ist DICT_6X6_50 für den Arucocode! Dies kann zur Zeit nur in der camera.py umgestellt werden.<br />
<br />
Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur Verfügung, <br />
die Websocket und Videostream abfragt.<br />
<br />
Die Webseite ist auf 127.0.0.1:9080 zu finden <br />
<br />
[[Datei:Arucodetection.jpg |x300px ]]<br />
<br />
== itsyBitsyM4==<br />
Die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.<br />
Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.<br />
<br />
code.py ist der ausgeführte Code. Der I2C Test ist in diesen eingebaut. Alle verfügbaren Kommandos können<br />
mit ? abgefragt werden. Will man nur I2C testen, kann man auch code.py umbenennen. Dann wird automatisch main.py<br />
aufgerufen, dass in einer Endlosschleife die angeschlossenen I2C Devices abfragt.<br />
<br />
== Node-Red ==<br />
<br />
Entweder durch die Setup Skripte oder so sollte ein Node.js 14x vorhanden sein.<br />
Wenn das Skript 2_setup_folders.sh nicht ausgeführt wurde muss selbst dafür gesorgt werden, dass<br />
das Package.json File in ~/nodered/ abgelegt wurde und alle Package Depencies darin installiert wurden.<br />
<br />
node_red_start.sh führt Folgendes aus:<br />
<br />
<code><br />
node red --settings ~/git/arucomover/code/nodered/arucomover.js --flowFile ~/git/arucomover/code/nodered/flows_arucomover.json<br />
</code><br />
<br />
Das Settings File startet NodeRed auf Port 9010<br><br />
Editor => http:;//127.0.0.1:9010 und<br><br />
UI => http:;//127.0.0.1:9010/ui<br><br />
<br><br />
Der Flow ist in zwei Tabs aufgeteilt.<br><br />
Ein Tab für die Daten von ItsyBitsy M4 und arucomover.py<br><br />
Ein Tab für die Steuerbefehle an den ItsyBitsy M4<br><br />
Beide Tabs habe UI Elemente und sind miteinander verbunden um ein einheitliches Handling zu ermöglichen.<br><br />
<br><br />
<br />
== Start ==<br />
<br />
Es müssen zwei Prozesse gestartet werden also entweder nacheinander mit & in den Hintergrund oder z.B. mit screen oder tmux.<br />
<br />
1.Start der arucodetection<br><br />
<code><br />
source ~/arucodetection/venv/bin/activate<br />
<br />
...../arucomover/code/arucodetection/arucodetection.py<br />
<br />
</code><br />
<br />
2.Start der Node-Red Flows<br><br />
<code><br />
...../arucodetection/cosde/bash/node_red_start.sh<br />
</code><br />
<br />
== Hardware Evolution ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br><br />
BNO055<br><br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11307Arucomover2021-07-03T13:53:55Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finden und anfahren können<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Position und Entfernung zu erkennen.<br />
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow Nimmt die Position auf und gibt Steurbefehle über an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten Liefert um z.B. die Positionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Es soll aber trotzdem möglich sein, daß ein Benutzer eingreift,dafür die UI aus Node-Red heraus<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
<br />
== setup ==<br />
Aller Code und auch ein Setup können im https://github.com/hackffm/arucomover gefunden werden.<br />
Es wird davon ausgegangen, daß das ganze auf einem Debian basiertem Linux läuft.<br />
Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das Allermeiste <br />
vorbereiten sollten. Das in der arucodetection verwendete Shared Memory ist <br />
erst ab Python 3.8 verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher<br />
gibt es im Setup Folder ein entsprechendes Skript für den Pi. Vor der Ausführung<br />
der Setups muss das Swapfile vergrößert werden<br />
<br />
<code><br />
sudo nano /etc/dphys-swapfile -> CONF_SWAPSIZE=1024<br />
<br />
sudo /etc/init.d/dphys-swapfile restart<br />
</code><br />
<br />
Ein gutes Netzteil vorrausgesetzt, läuft daß dann einige Zeit. Die übrigen Setup <br />
Skripte können, mit der richtigen Python Version dann ausgeführt werden.<br />
Der Schritt 2_setup_folders.sh installiert auch alle python requierements.<br />
Das kann auf eine PI 3 mehrere Stunden dauern, da diverse Kompilierungen im Hintergrund laufen !<br />
<br />
== Arucodetetcion ==<br />
ist ein Pythoncode, der von dieser Seite [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft. <br />
Web und Arucodetecion.Damit der WebProzess die Arcuo Position über einen Websocket liefern kann, sind<br />
beide über eine Managed Queue verbunden. Der Video Stream wird in ein Shared Memory<br />
geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich !<br />
Es wird davon ausgegangen, daß ein Camera Device 0 vorhanden ist. Sollte eine <br />
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes <br />
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den <br />
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden. <br />
Dort liegt auch eine config.json mit der sich die Camera, Auflösung, Debug usw. einstellen läßt.<br />
Das los landet in ~/arucdetection/log.<br />
Es wird immer von einem DICT_6X6_50 Aruco Code ausgegangen und kann zur Zeit nur in der camera.py umgestellt werden.<br />
<br />
Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur verfügung, <br />
die Websocket und Video Stream abfragt.<br />
<br />
Die Webseite ist auf 127.0.0.1:9080 zu finden <br />
<br />
[[Datei:Arucodetection.jpg |x300px ]]<br />
<br />
== itsyBitsyM4==<br />
die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.<br />
Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.<br />
<br />
code.py ist der Ausgeführte Code. I2C Test in diesen eingebaut. Alle Verfügbaren Kommands können<br />
mit ? abgefragt werden. Will man nur I2C testen, kann man code.py umbenennen. Dann wird automatisch main.py<br />
aufgerufen, daß in einer Endlosschleife die angeschlossenen I2C Devices abfragt.<br />
<br />
== Node-Red ==<br />
<br />
Entweder durch die Setup Skripte oder so sollte ein Node.js 14x vorhanden sein<br />
Wenn 2_setup_folders.sh nicht ausgeführt wurde muss selbst dafür gesorgt werden, daß<br />
das Package.json File in ~/nodered/ abgelegt wurde und alle Package Depencies darin müssen installiert wurden.<br />
<br />
node_red_start.sh startet<br />
<br />
<code><br />
node red --settings ~/git/arucomover/code/nodered/arucomover.js --flowFile ~/git/arucomover/code/nodered/flows_arucomover.json<br />
</code><br />
<br />
Das Settings File starte NodeRed auf Port 9010<br><br />
Der Editor kann dann auf http:;//127.0.0.1:9010 und<br><br />
Die UI auf kann dann auf http:;//127.0.0.1:9010/ui gefunden werden.<br><br />
<br><br />
Der Flow ist in zwei Tabs aufgeteilt.<br><br />
Ein Tab für die Daten von ItsyBitsy M4 und arucomover.py<br><br />
Ein Tab für die Steuerbefehle an den ItsyBitsy M4<br><br />
Beide Tabs habe UI Elemente und sind miteinander verbunden um ein einheitliches Handling zu ermöglichen.<br><br />
<br><br />
<br />
== Start ==<br />
<br />
Es müssen zwei Prozesse gestartet werden also entweder nacheinander mit & in den Hintergrund oder z.B. mit screen oder tmux.<br />
<br />
1.Start der arucodetection<br><br />
<code><br />
source ~/arucodetection/venv/bin/activate<br />
<br />
...../arucomover/code/arucodetection/arucodetection.py<br />
<br />
</code><br />
<br />
2.Start der Node-Red Flows<br><br />
<code><br />
...../arucodetection/cosde/bash/node_red_start.sh<br />
</code><br />
<br />
== Hardware Evolution ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br><br />
BNO055<br><br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11306Arucomover2021-07-03T13:17:33Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finden und anfahren können<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Position und Entfernung zu erkennen.<br />
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow Nimmt die Position auf und gibt Steurbefehle über an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten Liefert um z.B. die Positionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Es soll aber trotzdem möglich sein, daß ein Benutzer eingreift,dafür die UI aus Node-Red heraus<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
<br />
== setup ==<br />
Aller Code und auch ein Setup können im https://github.com/hackffm/arucomover gefunden werden.<br />
es wird davon ausgegangen, daß das ganze auf einem Debian basiertem Linux läuft.<br />
Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das allermeiste <br />
vorbereiten sollten. Das in der arucodetection verwendete Shared Memory ist <br />
erst ab Python 3.8 verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher<br />
gibt es im Setup Folder ein entsprechendes Skript für den Pi. Vor der Ausführung<br />
muss das Swapfile vergrößert werden<br />
<br />
<code><br />
sudo nano /etc/dphys-swapfile -> CONF_SWAPSIZE=1024<br />
<br />
sudo /etc/init.d/dphys-swapfile restart<br />
</code><br />
<br />
Ein gutes Netzteil vorrausgesetzt, läuft daß dann einige Zeit. Die übrigen Setup <br />
Skripte können, mit der richtigen Python Version dann ausgeführt werden.<br />
Der Schritt 2_setup_folders.sh installiert auch alle python requierements.<br />
Das kann auf eine PI 3 mehrere Stunden dauern.<br />
<br />
== Arucodetetcion ==<br />
ist ein Pythoncode, der von dieser Seite [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft. <br />
Web und Arucodetecion.Damit der WebProzess die Arcuo Position über einen Websocket liefern kann, sind<br />
beide über eine Managed Queue verbunden. Der Video Stream wird in ein Shared Memory<br />
geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich !<br />
Es wird davon ausgegangen, daß ein Camera Device 0 vorhanden ist. Sollte eine <br />
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes <br />
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den <br />
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden. <br />
Dort liegt auch eine config.json mit der sich die Camera, Auflösung usw. einstellen läßt.<br />
Es wird immer von einem DICT_6X6_50 Aruco Code ausgegangen.<br />
<br />
Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur verfügung, <br />
die Websocket und Video Stream abfragt.<br />
<br />
<br />
[[Datei:Arucodetection.jpg |x300px ]]<br />
<br />
== itsyBitsyM4==<br />
die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.<br />
Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.<br />
<br />
code.py ist der Ausgeführte Code. I2C Test in diesen eingebaut. Alle Verfügbaren Kommands können<br />
mit ? abgefragt werden. Will man nur I2C testen, kann man code.py umbenennen. Dann wird automatisch main.py<br />
aufgerufen, daß in einer Endlosschleife die angeschlossenen I2C Devices abfragt.<br />
<br />
== Hardware Evolution ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br><br />
BNO055<br><br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucodetection.jpg&diff=11305Datei:Arucodetection.jpg2021-07-03T13:05:46Z<p>Snow: Check Arucodetection Tool</p>
<hr />
<div>Check Arucodetection Tool</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11304Arucomover2021-07-02T10:24:56Z<p>Snow: Mit Git repo verheiratet</p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finden und anfahren können<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Position und Entfernung zu erkennen.<br />
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow Nimmt die Position auf und gibt Steurbefehle über an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten Liefert um z.B. die Positionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Es soll aber trotzdem möglich sein, daß ein Benutzer eingreift,dafür die UI aus Node-Red heraus<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
<br />
== setup ==<br />
Aller Code und auch ein Setup können im https://github.com/hackffm/arucomover gefunden werden.<br />
es wird davon ausgegangen, daß das ganze auf einem Debian basiertem Linux läuft.<br />
Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das allermeiste <br />
vorbereiten sollten. Das in der arucodetection verwendete Shared Memory ist <br />
erst ab Python 3.8 verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher<br />
gibt es im Setup Folder ein entsprechendes Skript für den Pi. Vor der Ausführung<br />
muss das Swapfile vergrößert werden<br />
<br />
<code><br />
sudo nano /etc/dphys-swapfile -> CONF_SWAPSIZE=1024<br />
<br />
sudo /etc/init.d/dphys-swapfile restart<br />
</code><br />
<br />
Ein gutes Netzteil vorrausgesetzt, läuft daß dann einige Zeit. Die übrigen Setup <br />
Skripte können, mit der richtigen Python Version dann ausgeführt werden.<br />
Der Schritt 2_setup_folders.sh installiert auch alle python requierements.<br />
Das kann auf eine PI 3 mehrere Stunden dauern.<br />
<br />
== Arucodetetcion ==<br />
ist ein Pythoncode, der von dieser Seier [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft. <br />
Web und Arucodetecion.Damit der WebProzess die Arcuoposition über ein Websocket liefern kann, sind<br />
beide über eine Managed Queue verbunden. Der Video Stream wird in ein Shared Memory<br />
geschrieben und vom Webprozess drausgeholt. Dies ist erst ab Python 3.8 möglich<br />
Es wird davon ausgegangen, daß ein Camera Device 0 vorhanden ist. Sollte eine <br />
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes <br />
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den <br />
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden<br />
<br />
== itsyBitsyM4==<br />
die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.<br />
Z.B. adafruit_bno055. Diese Müssen zur CircuitPython Version des M4 passen<br />
<br />
code.py ist der Ausgeführte Code. Mitlerweile ist ein I2C Test in diesen eingebaut.<br />
will man nur I2C testen, kann man code.py umbenennen. Dann wird automatisch main.py<br />
aufgerufen, daß in einer Endlosschleife die angeschlossenen I2C devices abfragt<br />
<br />
<br />
== Hardware Evolution ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br><br />
BNO055<br><br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11303Datei:Arucomover konzept.jpg2021-07-01T10:08:34Z<p>Snow: Snow lud eine neue Version von Datei:Arucomover konzept.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11302Arucomover2021-07-01T10:06:57Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finden und anfahren können<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Position und Entfernung zu erkennen.<br />
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow Nimmt die Position auf und gibt Steurbefehle über an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten Liefert um z.B. die Positionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Es soll aber trotzdem möglich sein, daß ein Benutzer eingreift,dafür die UI aus Node-Red heraus<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
== Fortschritte ==<br />
<br />
== Erste Ergebnisse ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br />
BNO055<br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11301Arucomover2021-07-01T10:04:49Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finden und anfahren können<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Position und Entfernung zu erkennen.<br />
Der Videostream und die Position, Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow Nimmt die Position auf und gibt Stuerbefehle über an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der SensorDaten Liefert um z.B. die Postionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Es soll aber trotzdem möglich sein, daß ein Benutzer eingreift,dafür die UI aus Node-Red heraus<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
== Fortschritte ==<br />
<br />
== Erste Ergebnisse ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br />
BNO055<br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11300Datei:Arucomover konzept.jpg2021-07-01T10:02:29Z<p>Snow: Snow lud eine neue Version von Datei:Arucomover konzept.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Benutzer:Snow&diff=11299Benutzer:Snow2021-07-01T09:52:01Z<p>Snow: </p>
<hr />
<div>== kenntnisse ==<br />
*Python, JavaScript<br />
* Ein wenig von allem<br><br />
<br />
==Current Projects==<br />
<br />
*[[Arucomover]]<br />
*[[CubicPlates]]<br />
*[[USB Kabel]]<br />
<br />
==GIT==<br />
Das Entwickler Tool zum Verwalten von Software Ständen und dezentralem entwickeln ist gemeint<br />
die wichtigsten Handgriffe [[Git Benutzen]]<br />
<br />
==Roboter Kopf==<br />
<br />
Neues Projekt soll ein Roboter sein. Um die Arbeit ( und Gedanken ) zu sortieren ist die Idee den Bot von oben nach unten zu entwerfen. Also zuerst den Kopf...<br />
<br />
Erster Erfolg bei den Augen...Sprich das Bild einer Webcam in einem Stück Software zu analysieren und einen roten Ball zu finden..<br />
<br />
<gallery caption="Ball Tracking" perrow=5><br />
Datei:20140112 174335.jpg|Vorderansicht<br />
Datei:BallTracking.png|Ball Tracking<br />
</gallery></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11298Arucomover2021-07-01T09:47:59Z<p>Snow: </p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finde finden und anfahren können<br />
<br />
== Konzept ==<br />
<br />
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Position und Entfernung zu erkennen.<br />
Der Videostream und die Position, Entfernung werden von dem Script zur Verfügung gestellt.<br />
<br />
Ein Node-Red Flow Nimmt die Position auf und gibt Stuerbefehle über an einen ItsyBitsy M3, der damit ein MotorShield steuert.<br />
<br />
Angeschlossen aber nicht benutzt ist ein BNO055, der SensorDaten Liefert um z.B. die Postionsbestimmung zu verbessern.<br />
<br />
Hier eine Übersicht <br />
<br />
[[Datei:Arucomover_konzept.jpg ]]<br />
<br />
Hier ein Schaltplan dazu<br />
<br />
[[Datei:Arucomover diagram.jpg |x200px]]<br />
<br />
Es soll aber trotzdem möglich sein, daß ein Benutzer eingreift,dafür die UI aus Node-Red heraus<br />
<br />
[[Datei:Arucomoverui.png |x300px]]<br />
<br />
== Fortschritte ==<br />
<br />
== Erste Ergebnisse ==<br />
<br />
<gallery perrow=6 caption = "Stepps"><br />
Datei:Arucomover_01.jpg | Start<br />
Datei:Arucomover_02.jpg | Stepp 2<br />
Datei:Arucomover_03.jpg | Stepp 4<br />
Datei:Arucomover_04.jpg | Final Hardware<br />
</gallery><br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br />
BNO055<br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomoverui.png&diff=11297Datei:Arucomoverui.png2021-07-01T09:45:28Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_diagram.jpg&diff=11296Datei:Arucomover diagram.jpg2021-07-01T09:38:41Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_konzept.jpg&diff=11295Datei:Arucomover konzept.jpg2021-07-01T09:35:30Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_01.jpg&diff=11294Datei:Arucomover 01.jpg2021-07-01T09:29:07Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_04.jpg&diff=11293Datei:Arucomover 04.jpg2021-07-01T09:22:36Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_03.jpg&diff=11292Datei:Arucomover 03.jpg2021-07-01T09:22:13Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Arucomover_02.jpg&diff=11291Datei:Arucomover 02.jpg2021-07-01T09:21:31Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Arucomover&diff=11289Arucomover2021-07-01T09:16:06Z<p>Snow: Die Seite wurde neu angelegt: „== Ziel == Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finde finden und anfahren können == BOM == Raspberry Pi 3 BNO055…“</p>
<hr />
<div>== Ziel ==<br />
<br />
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finde finden und anfahren können<br />
<br />
== BOM ==<br />
<br />
Raspberry Pi 3<br />
BNO055<br />
MotorAeshield V2</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=USB_Kabel&diff=11152USB Kabel2020-06-27T10:57:36Z<p>Snow: Die Seite wurde neu angelegt: „USB Kabel und ihre Qualität == USB C Kabel == ReicheltSTUSB2C5C50CM USB2C5C50CM Verlust 0.03 Volt == Magnet Ve…“</p>
<hr />
<div>USB Kabel und ihre Qualität<br />
<br />
== USB C Kabel ==<br />
<br />
ReicheltSTUSB2C5C50CM<br />
<br />
[[Datei:ReicheltSTUSB2C5C50CM.jpg|x300px|USB2C5C50CM]]<br />
<br />
Verlust 0.03 Volt<br />
<br />
== Magnet Verbund ==<br />
<br />
USB Kabel Fließbandbeleuchtung mit Magnet Verbindung<br />
<br />
[[Datei:FließbandbeleuchtungUSBMagnet.jpg|x300px|Fließband mit Magnet]]<br />
<br />
Verlust 0.13 Volt<br />
<br />
== Andere ==<br />
<br />
ReichelDELOCK83569<br />
<br />
[[Datei:ReichelDELOCK83569.jpg|x300px|Deadlock Meßkabel]]<br />
<br />
Verlust 0.22 Volt</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:ReicheltSTUSB2C5C50CM.jpg&diff=11151Datei:ReicheltSTUSB2C5C50CM.jpg2020-06-27T10:53:35Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:ReichelDELOCK83569.jpg&diff=11150Datei:ReichelDELOCK83569.jpg2020-06-27T10:53:13Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Flie%C3%9FbandbeleuchtungUSBMagnet.jpg&diff=11149Datei:FließbandbeleuchtungUSBMagnet.jpg2020-06-27T10:52:54Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Benutzer:Snow&diff=11145Benutzer:Snow2020-06-27T10:32:40Z<p>Snow: </p>
<hr />
<div>== kenntnisse ==<br />
*Python, JavaScript, Java<br />
* Ein wenig von allem<br><br />
<br />
... blog auf http://blog.more-machines.org<br/><br />
<br />
==Bujinkan Logo==<br />
** Zuerst Holz Teile und Logo gefräst mit Hilfe der Fräse. Details auf der Fräsen Seite [[Zen_Toolworks_CNC_Fräse]]<br />
<gallery caption="Logo Teile" perrow=6><br />
Datei:Bujinkan.jpg|Bujinkan Logo<br />
Datei:Bujin 001.png|[[Media:BujinkanLogo 002.svg]]<br />
Datei:BujinkanLogo Path AXL 001-c Bildschirmfoto.png|EMC Screen Version 002<br />
Datei:Bujin IMG 1906.JPG|... Ergebnis in Plexiglas<br />
Datei:Bujinkan Logo 003 001 Bildschirmfoto.png|Bujinkan Logo 003 - Entwurf für Gehäuse<br />
Datei:Bujinkan Logo 003 100 4609.JPG|Gravur in 6mm Plexiglas<br />
</gallery><br />
<br />
** Elektronik Planen und verdrahten<br />
<gallery caption="Logo Elektronik" perrow=6><br />
Datei:DFR0103PinOut.jpg|DFR0132 PinOut<br />
Datei:BujinkanLogoCircuit.png|Logo Circuit<br />
Datei:DFR0132.jpg|DFRduino Pro Mini 8Mhz<br />
Datei:Bujinkanlogo45.jpg|DFRduino an den Leds<br />
Datei:Bujinkanlogo48.jpg|Anschluss Anzahl reduziert<br />
Datei:IMAG0144.jpg|Folien Antenne<br />
</gallery><br />
<br />
** Standfuss und fertig aufgebaut<br />
<gallery caption="Logo Fertig" perrow=4><br />
Datei:LotusFlower.jpg|Standfuss Vorlage<br />
Datei:Bujinkanlogo Stand.jpg|Logo Standfuss<br />
Datei:Bujinkanlogo Back.jpg|Logo Rückseite<br />
Datei:BujinkanLogo Front.jpg|Logo Vorderseite<br />
</gallery><br />
<br />
Und so funktionierts [http://youtu.be/iS56w4qt68w]<br />
<br />
==Current Projects==<br />
<br />
==Stift Wechsler==<br />
<br />
<gallery caption="Pen Disc Bilder" perrow=5><br />
Datei:StiftwechslerFront.jpg|Vorderansicht<br />
Datei:Pendisc test IMG 1692.jpg|Seitenansicht<br />
Datei:PenDisc 20120113 04.jpg|Kaputt<br />
Datei:PenDisc 20120113 02.jpg|Sitft Seite<br />
Datei:PenDisc 20120113 01.jpg|Motor Seite<br />
</gallery><br />
<br />
<br />
<gallery caption="Pen Disc Bilder II" perrow=5><br />
Datei:2012 02 13 05.jpg|Servo über CAT 5<br />
</gallery><br />
<br />
<gallery caption="Elektronics" perrow=5><br />
Datei:DrawbotPenDiscPinOut.jpg<br />
</gallery><br />
<br />
<gallery caption="Scad Files" perrow=5><br />
Datei:DrawbotWireConnector 001.png|Aufhängung<br />
Datei:DrawbotWireConnector 002.png|Aufhängung neuer Versuch<br />
</gallery><br />
<br />
<br />
==GIT==<br />
Das Entwickler Tool zum Verwalten von Software Ständen und dezentralem entwickeln ist gemeint<br />
die wichtigsten Handgriffe [[Git Benutzen]]<br />
<br />
==Roboter Kopf==<br />
<br />
Neues Projekt soll ein Roboter sein. Um die Arbeit ( und Gedanken ) zu sortieren ist die Idee den Bot von oben nach unten zu entwerfen. Also zuerst den Kopf...<br />
<br />
Erster Erfolg bei den Augen...Sprich das Bild einer Webcam in einem Stück Software zu analysieren und einen roten Ball zu finden..<br />
<br />
<gallery caption="Ball Tracking" perrow=5><br />
Datei:20140112 174335.jpg|Vorderansicht<br />
Datei:BallTracking.png|Ball Tracking<br />
</gallery><br />
<br />
*[[CubicPlates]]<br />
*[[USB Kabel]]</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=OpenCV_mit_Python&diff=11076OpenCV mit Python2020-04-21T13:49:35Z<p>Snow: /* OpenCV Cheats */</p>
<hr />
<div>= Installation =<br />
Nach Update auf Pycharm 2019.1 kann es zu Problemen mit ALtGr+[ etc. kommen<br />
<br />
Workaround: In PyCharm click Ctrl + Shift + A. Then write registry and click on it. Find actionSystem.fix.alt.gr and uncheck it.<br />
<br />
== Raspberry Pi ==<br />
<br />
=== OpenCV Installation ===<br />
* Installiere eine aktuelle Version mit Allem von [https://www.raspberrypi.org/downloads/raspbian/ Raspbian] auf die SD-Karte, richte alles ein, update das System via:<br />
<code><br />
sudo apt update && sudo apt upgrade -y<br />
</code><br />
* Installiere alles Mögliche nach was OpenCV so braucht (alles muss in eine Zeile):<br />
<pre><br />
sudo apt install libatlas3-base libsz2 libharfbuzz0b libtiff5 libjasper1 libilmbase12 libopenexr22 libilmbase12 libgstreamer1.0-0 libavcodec57 libavformat57 libavutil55 libswscale4 libqtgui4 libqt4-test libqtcore4 libwebp6<br />
</pre><br />
* Installiere dann OpenCV (und falls es fehlt numpy) via pip3, hier als root, in der fettesten Geschmacksrichtung:<br />
<code><br />
sudo pip3 install opencv-contrib-python numpy <br />
</code><br />
* Teste ob numpy und opencv richtig installiert sind. Öffne dazu <code>python3</code> auf der Konsole und probiere aus, ob die beiden folgenden Befehle kein Fehler ausgeben: <br />
** <code>import numpy</code><br />
** <code>import cv2</code><br />
** <code>quit()</code><br />
<br />
Wenn beim import cv2 Fehlermeldungen angezeigt werden, hilft es folgende libs zu installieren:<br />
<pre><br />
sudo apt-get install libcblas-dev<br />
sudo apt-get install libhdf5-dev<br />
sudo apt-get install libhdf5-serial-dev<br />
sudo apt-get install libatlas-base-dev<br />
sudo apt-get install libjasper-dev <br />
sudo apt-get install libqtgui4 <br />
sudo apt-get install libqt4-test<br />
</pre><br />
<br />
* Tipp: Als IDE unter Raspbian für Python3 ist '''Thonny''' ein Versuch wert:<br />
** Installation am besten via pip: <code>sudo pip3 install thonny</code><br />
** Nach dem starten von Thonny unter "Tools->Options...->General" den UI mode auf "expert" stellen, bei der Gelegenheit kann auch gleich ein dunkles Theme eingestellt werden, dann sieht es auch gut aus.<br />
** Das Ding kann Variablen anschauen, Breakpoints setzen, Variabelninhalte anzeigen und Pakete installieren und zeigt Vorschläge zum sauberen Programmieren - also ein Ersatz für das PyCharm, was unter Raspberry nicht läuft.<br />
<br />
=== Kamera Installation ===<br />
* Aktiviere die Kamera: <code>sudo raspi-config</code>, dann unter "5 Interfacing Option" die Kamera aktivieren. Tool beenden über "Finish", Raspberry neu starten <code>sudo reboot</code><br />
* Teste die Kamera via <code>raspivid -t 5000</code> : Der Videostream sollte für 5s zu sehen sein.<br />
* Damit auch Standard-Beispiele laufen, sollte die Raspberry-Kamera noch als V4L2-Device eingebunden werden. Dazu folgendes tun:<br />
** Edititere die Datei '''/etc/modules''' als root via <code>sudo nano /etc/modules</code><br />
** Füge am Ende der Datei eine Zeile mit dem Inhalt <code>bcm2835-v4l2</code> ein, Datei dann mit STRG+o speichern, den Editor mit STRG+x verlassen, das System neu starten<br />
** Danach sollte das Kommando <code>ls /dev/video0</code> eine Device-Datei finden und keinen Fehler ausgeben. Wenn nicht, hilft es evtl. im obigen Schritt noch vor die '''bcm2835-v4l2'''-Zeile eine Zeile mit folgendem Inhalt einzufügen: <code>v4l2_common</code> (auch hier nach neu booten). Bei mir war das allerdings nicht nötig.<br />
* Jetzt kann alles zusammen getestet werden, in dem das Skript im Abschnitt [[OpenCV_mit_Python#Testen_der_Kamera_unter_Python-OpenCV]] auf der Konsole oder z.B. in Thonny gestartet wird. Es sollte ein Fenster mit dem Kamerabild in Graustufen anzeigen.<br />
<br />
== Windows (und ggf auch Mac/Linux) via PyCharm ==<br />
* Installiere Python3 von Python.org: '''Wichtig:'''<br />
** Per Rechtsklick als Admin installieren<br />
** Bei Installation auch pip installieren lassen und Pfade setzen lassen<br />
* Installiere PyCharm Community Edition von [https://www.jetbrains.com/pycharm/ Jetbrains]<br />
** Darin habe ich dann ein neues Projekt angelegt, dabei "Virtualenv" als Environment gewählt<br />
** Über "File->Settings..." das Settings-Fenster öffnen,<br />
*** darin dann Links das eigene "Projekt: xxx" ausklappen, dort drunter auf "Project Interpreter" gehen<br />
*** Hier sollte jetzt eine Python3-Version ausgewählt sein und unter den Packages mind. "pip" vorhanden sein<br />
*** Über das kleine "+"-Symbol recht weit rechts können nun weitere Packages für das Projekt installiert werden, es öffnet sich ein Fenster "Available Packages"<br />
**** Darin in der Suche "opencv" eingeben und das Paket '''"opencv-contrib-python"''' installieren - unten wird dann irgendwo angezeigt ob es geklappt hat<br />
**** Darin dann auch noch nach "numpy" suchen und das Paket '''"numpy"''' installieren<br />
**** Dann das Packet-Manager-Fenster schliessen<br />
*** Auch das Settings-Fenster mit "OK" schliessen<br />
** Vermutlich muss man jetzt trotzdem noch etwas warten, weil PyCharm im Hintergrund immernoch installiert. Erst wenn PyCharm fertig ist, kann man das test_video.py starten.<br />
<br />
= Testen der Kamera unter Python-OpenCV =<br />
Das folgende Skript sollte unter allen Betriebsystemen laufen, unter Linux/Raspbian wird ein V4L2 Device benötigt, unter Windows ging es direkt. Das folgende Skript auf der jeweiligen Maschine ausprobieren - via Terminal, Thonny, PyCharm oder was auch immer:<br />
<pre><br />
import numpy as np<br />
import cv2 as cv<br />
cap = cv.VideoCapture(0)<br />
while(True):<br />
# Capture frame-by-frame<br />
ret, frame = cap.read()<br />
# Our operations on the frame come here<br />
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)<br />
# Display the resulting frame<br />
cv.imshow('Hit ESC to close', gray)<br />
if cv.waitKey(1) & 0xFF == 27:<br />
break<br />
# When everything done, release the capture<br />
cap.release()<br />
cv.destroyAllWindows()<br />
</pre> <br />
<br />
Es sollte das Videobild in Graustufen angezeigt werden, im aktiven Kamerabildfenster "ESC" drücken, um das Program ordentlich zu beenden.<br />
<br />
== RAW-Zugriff auf die Raspberry Pi Kamera ==<br />
Mit dem folgenden Skript kann ohne V4L2-Treiber auf die Raspberry Pi Kamera zugegriffen werden. Evtl. ermöglicht das auch feinere Einstellungsmöglichkeiten der Kamera wie z.B. Belichtungszeit etc. <br />
<pre><br />
# OpenCV camera test special for Raspberry Pi<br />
# import the necessary packages<br />
from picamera.array import PiRGBArray<br />
from picamera import PiCamera<br />
import time<br />
import cv2<br />
import numpy as np<br />
<br />
# initialize the camera and grab a reference to the raw camera capture<br />
camera = PiCamera()<br />
camera.resolution = (640, 480)<br />
camera.framerate = 32<br />
camera.rotation = 0<br />
rawCapture = PiRGBArray(camera, size=camera.resolution)<br />
<br />
# allow the camera to warmup<br />
time.sleep(1)<br />
<br />
# capture frames from the camera<br />
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):<br />
# grab the raw NumPy array representing the image, then initialize the timestamp<br />
# and occupied/unoccupied text<br />
image = frame.array<br />
<br />
# show the frame<br />
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)<br />
cv2.imshow("Hit ESC to end", gray.astype(np.uint8))<br />
<br />
# clear the stream in preparation for the next frame<br />
rawCapture.truncate(0)<br />
<br />
# if the `q` or ESC key was pressed, break from the loop<br />
key = cv2.waitKey(1) & 0xFF<br />
if key == ord("q") or key == 27:<br />
break<br />
<br />
cv2.destroyAllWindows()<br />
camera.close()<br />
</pre><br />
<br />
Es sollte das Videobild in Graustufen angezeigt werden, im aktiven Kamerabildfenster "ESC" drücken, um das Program ordentlich zu beenden.<br />
<br />
= OpenCV Cheats =<br />
* Tutorials hier: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html<br />
* Buntes Bild in Graustufen umwandeln: <code>gray = cv2.cvtColor(bild,cv2.COLOR_BGR2GRAY)</code><br />
* Graustufen Bild in Buntbild umwandeln: <code>bunt = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)</code> (es bleibt Grau, kann dann aber eingefärbt werden)<br />
* Kasten in ein Bild malen: <code>cv2.rectangle(bild, (x0,y0), (x1,y1), (b,g,r), rahmendicke)</code><br />
* Text ins Bild malen: <code>cv2.putText(bild, "Hallo", (10,400), cv2.FONT_HERSHEY_PLAIN, 1, (255,0,255))</code> (Größerer Font: cv2.FONT_HERSHEY_SIMPLEX)<br />
* Bildbereich kopieren: <code>block = bild[y0:y1, x0:x1]</code><br />
* Bildbereich woanders einfügen (Größe muss genau passen!): <code>bild[y0:y1, x0:x1] = block</code><br />
* Alle Farbkomponenten eines Pixels ändern: <code>bild[y,x] = [b,g,r]</code><br />
* Nur eine Farbkomponente ändern (hier g = Index 1 da Reihenfolge BGR): <code>bild[x,y,1] = 255</code><br />
* 8-Bit Farbkomponenten holen: <code>bild.astype(np.uint8)</code> (falls man mal mit float oder so gerechnet hat)<br />
* ArUco Marker (QR-Code ähnlich). http://www.philipzucker.com/aruco-in-opencv/<br />
* ArUco's können mit opencv erstellt werden oder online here http://chev.me/arucogen/<br />
<br />
== Maus-Events ==<br />
Maus-Events können über ein Callback verarbeitet werden, OpenCV möchte aber wissen, welches der "imshow"-Fenster dafür herangezogen werden soll. Dazu muss das Fenster am Start einmal explizit mit einem Namen versehen werden.<br />
<br />
<pre><br />
mx = 10<br />
my = 10<br />
<br />
def mouseEvent(event,x,y,flags,param):<br />
global mx,my<br />
mx = x<br />
my = y<br />
#print(x, y)<br />
<br />
cv.namedWindow("Window1")<br />
cv.setMouseCallback("Window1", mouseEvent)<br />
</pre><br />
<br />
== Bar/QR Codes Lesen ==<br />
Eine funktionierende Library dafür ist "zbar" (mit PIP als "pyzbar" zu finden).<br />
Allerdings benötigt die Library noch "PIL" (Python Imaging Library), die aktuell als "PILLOW" weitergeführt wird.<br />
Um die Examples von "zbar" also ausführen zu können muss neben "PILLOW" noch der Wrapper "PILLOW - PIL" installiert werden.<br />
<br />
<pre><br />
decoded = pyzbar.decode(im)<br />
<br />
for obj in decoded:<br />
print('Typ : ', obj.type)<br />
print('Wert: ', obj.data, '\n')<br />
</pre><br />
<br />
[[Datei:OpencvWorkshopQRCodeRecognition.jpg]]<br />
<br />
== Optical Flow ==<br />
Beispiel Code um features zu verfolgen, aka optical flow.<br />
Code funktioniert unter OpenCV Version 3.4.4<br />
<br />
[[Datei:OpencvOpticalFlowPICam.zip]]<br />
<br />
[[Datei:OpencvOpticalFlowUSBCam.zip]]<br />
<br />
[[Datei:OpencvWorkshopOpticalFlow.jpg|400px]]<br />
<br />
== ArUco - Pose Estimation ==<br />
Findet den ArUco Marker und seine Position sowie Orientierung im Raum.<br><br />
Über eine Distanzfunktion kann dann z.B. die Entfernung des Markermittelpunktes zur Kamera ermittelt werden. Dieser wird in cm unten links angezeigt.<br />
<br />
<pre><br />
import numpy as np<br />
import cv2<br />
import cv2.aruco as aruco<br />
<br />
cap = cv2.VideoCapture(0)<br />
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)<br />
parameters = aruco.DetectorParameters_create()<br />
<br />
while(True):<br />
ret, frame = cap.read()<br />
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)<br />
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)<br />
gray = aruco.drawDetectedMarkers(gray, corners, ids)<br />
<br />
mtx = np.array([[5.3434144579284975e+02, 0., 3.3915527836173959e+02],<br />
[0., 5.3468425881789324e+02, 2.3384359492532246e+02],<br />
[0., 0., 1.]], np.float)<br />
dist = np.array([-2.8832098285875657e-01, 5.4107968489116441e-02,<br />
1.7350162244695508e-03, -2.6133389531953340e-04,<br />
2.0411046472667685e-01], np.float)<br />
<br />
if ids != None: # if aruco marker detected<br />
rvec, tvec, objp = aruco.estimatePoseSingleMarkers(corners, 3.5, mtx, dist) # For a single marker<br />
aruco.drawDetectedMarkers(gray, corners, ids, (0, 255, 0))<br />
aruco.drawAxis(gray, mtx, dist, rvec, tvec, 10)<br />
print(tvec[0][0])<br />
distance = round( np.linalg.norm(tvec[0][0]), 2)<br />
cv2.putText(gray, str( distance ) + " cm", (10, 400), cv2.FONT_HERSHEY_PLAIN, 1, (255, 0, 255))<br />
<br />
cv2.imshow('frame',gray)<br />
if cv2.waitKey(1) & 0xFF == ord('q'):<br />
break<br />
<br />
# When everything done, release the capture<br />
cap.release()<br />
cv2.destroyAllWindows()<br />
</pre><br />
[[Datei:ArUco_PoseEstimation.png|400px]]</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10917FPV-Auto2019-12-16T15:39:57Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung FPV-Auto Board ===<br />
<pre><br />
AOUT2 AOUT1 | SERVO1 +5V5 GND | VO-<br />
BOUT2 BOUT1 | SERVO2 +5V5 GND | VO+<br />
=======PCB===========PCB==========PCB========<br />
<br />
[MOTOR_RIGHT] | [SERVO1 +5V5 GND] | |Spk|<br />
[MOTOR_LEFT ] | [SERVO2 +5V5 GND] | |Spk|<br />
=======PCB===========PCB==========PCB========<br />
</pre><br />
<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verlötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
[[Datei:Chasis verloetet.jpg|320px]]<br />
[[Datei:Batterie Halter.jpg|320px]]<br />
<br />
[[Datei:Fpvcar mit 9dof i2c.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"component":"COMPONENTNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"component":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.<br />
<br />
== ToDo ==<br />
1. Vollbild Control<br><br />
2. Consolenausgaben des Pythonservers der über eine Serviceunit gestartet ist ins syslog bekommen.<br><br />
3. Serviceunit ohne Passwortabfrage starten/stoppen können.</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10915FPV-Auto2019-12-09T16:00:07Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung FPV-Auto Board ===<br />
<pre><br />
AOUT2 AOUT1 | SERVO1 +5V5 GND | VO-<br />
BOUT2 BOUT1 | SERVO2 +5V5 GND | VO+<br />
=======PCB===========PCB==========PCB========<br />
<br />
[MOTOR_RIGHT] | [SERVO1 +5V5 GND] | |Spk|<br />
[MOTOR_LEFT ] | [SERVO2 +5V5 GND] | |Spk|<br />
=======PCB===========PCB==========PCB========<br />
</pre><br />
<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verlötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
[[Datei:Chasis verloetet.jpg|320px]]<br />
[[Datei:Batterie Halter.jpg|320px]]<br />
<br />
[[Datei:Fpvcar mit 9dof i2c.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"component":"COMPONENTNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"component":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.<br />
<br />
== ToDo ==<br />
1. Vollbild Control<br />
2. Config Page<br />
3. Consolenausgaben des Pythonservers der über eine Serviceunit gestartet ist ins syslog bekommen.<br><br />
4. Serviceunit ohne Passwortabfrage starten/stoppen können.</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10914FPV-Auto2019-12-09T14:36:15Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung FPV-Auto Board ===<br />
<pre><br />
AOUT2 AOUT1 | SERVO1 +5V5 GND | VO-<br />
BOUT2 BOUT1 | SERVO2 +5V5 GND | VO+<br />
=======PCB===========PCB==========PCB========<br />
<br />
[MOTOR_RIGHT] | [SERVO1 +5V5 GND] | |Spk|<br />
[MOTOR_LEFT ] | [SERVO2 +5V5 GND] | |Spk|<br />
=======PCB===========PCB==========PCB========<br />
</pre><br />
<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verlötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
[[Datei:Chasis verloetet.jpg|320px]]<br />
[[Datei:Batterie Halter.jpg|320px]]<br />
<br />
[[Datei:Fpvcar mit 9dof i2c.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"component":"COMPONENTNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"modul":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.<br />
<br />
== ToDo ==<br />
1. Vollbild Control<br />
2. Config Page<br />
3. Consolenausgaben des Pythonservers der über eine Serviceunit gestartet ist ins syslog bekommen.<br><br />
4. Serviceunit ohne Passwortabfrage starten/stoppen können.</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10913FPV-Auto2019-12-09T14:35:08Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung FPV-Auto Board ===<br />
<pre><br />
AOUT2 AOUT1 | SERVO1 +5V5 GND | VO-<br />
BOUT2 BOUT1 | SERVO2 +5V5 GND | VO+<br />
=======PCB===========PCB==========PCB========<br />
<br />
[MOTOR_RIGHT] | [SERVO1 +5V5 GND] | |Spk|<br />
[MOTOR_LEFT ] | [SERVO2 +5V5 GND] | |Spk|<br />
=======PCB===========PCB==========PCB========<br />
</pre><br />
<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verlötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
[[Datei:Chasis verloetet.jpg|320px]]<br />
[[Datei:Batterie Halter.jpg|320px]]<br />
<br />
[[Datei:Fpvcar mit 9dof i2c.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"component":"COMPONENTNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"modul":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.<br />
<br />
== ToDo ==<br />
1. Consolenausgaben des Pythonservers der über eine Serviceunit gestartet ist ins syslog bekommen.<br><br />
2. Serviceunit ohne Passwortabfrage starten/stoppen können.<br />
3. Config Page</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10770FPV-Auto2019-09-30T17:09:39Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verlötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
[[Datei:Chasis verloetet.jpg|320px]]<br />
[[Datei:Batterie Halter.jpg|320px]]<br />
<br />
[[Datei:Fpvcar mit 9dof i2c.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"modul":"MODULNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"modul":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Fpvcar_mit_9dof_i2c.jpg&diff=10769Datei:Fpvcar mit 9dof i2c.jpg2019-09-30T17:07:26Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Batterie_Halter.jpg&diff=10768Datei:Batterie Halter.jpg2019-09-30T17:03:20Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Chasis_verloetet.jpg&diff=10767Datei:Chasis verloetet.jpg2019-09-30T17:02:36Z<p>Snow: Snow lud eine neue Version von Datei:Chasis verloetet.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Chasis_verloetet.jpg&diff=10766Datei:Chasis verloetet.jpg2019-09-30T17:02:27Z<p>Snow: Snow lud eine neue Version von Datei:Chasis verloetet.jpg hoch</p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10765FPV-Auto2019-09-24T13:45:51Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verlötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"modul":"MODULNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"modul":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10764FPV-Auto2019-09-23T18:51:28Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verlötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
[[Datei:Chasis verloetet.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"modul":"MODULNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"modul":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Chasis_verloetet.jpg&diff=10763Datei:Chasis verloetet.jpg2019-09-23T18:47:52Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10759FPV-Auto2019-09-09T18:21:45Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
<br />
Ø = 5,8 cm<br><br />
U = π·d = 18,2 cm<br><br />
50 RPM = 15,2 cm/sec<br><br />
200 RPM = 60,7 cm/sec<br><br />
250 RPM = 75,9 cm/sec<br><br />
Dateien sind hier zu finden https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Alle Teile für das aktuelle Chassis sind hier zu finden - https://github.com/bmarl/FPVCar/tree/master/3D-print-parts<br />
<br />
<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
Platine verötet<br />
<br />
[[Datei:Fpvcar platine verloetet.jpg|320px]]<br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"modul":"MODULNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"modul":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.</div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=Datei:Fpvcar_platine_verloetet.jpg&diff=10758Datei:Fpvcar platine verloetet.jpg2019-09-09T18:20:11Z<p>Snow: </p>
<hr />
<div></div>Snowhttps://hackerspace-ffm.de/wiki/index.php?title=FPV-Auto&diff=10698FPV-Auto2019-07-01T18:47:37Z<p>Snow: </p>
<hr />
<div>Wir wollen ein fernsteuerbares Auto bauen mit folgenden Features:<br />
* Einfach nachzubauen<br />
* Steuerung per FPV über WLAN<br />
* Selbstgedrucktes Chassis aus dem 3D-Drucker<br />
* Selbstgegossene Silikon-Reifen mit selbstgedruckten Gießformen für beste Bodenhaftung<br />
* Energieversorgung: <strike>2x</strike> 1x 18650 LiIon Akku (bevorzugt Zellen mit integrierter Schutzschaltung)<br />
* Antrieb: 4x Mini-Motor mit Getriebe<br />
* Lenkung: Nur über unterschiedliche Ansteuerung der Motoren<br />
* Elektronik:<br />
** Raspberry Pi Zero W mit Kamera für FPV <br />
** Selbstentwickeltes Board für Stromversorgung, Mototreiber, Batteriemanagement, Servokanäle und NRF24L01+ Funkmodul um einen ATmega328 Mikrocontroller<br />
<br />
== FPV Control Board ==<br />
=== Blockschaltung ===<br />
[[Datei:Block diagram FPV Auto Shield.png|1000px]]<br />
<br />
=== Features und Implementation ===<br />
* Stromversorgung:<br />
** 3.3V/0.15A mit Enable und Selbsthaltung für ATmega328 - optimiert auf geringen Ruhestrom (nRF24L01+ typ. 12mA)<br />
*** '''LP5907MFX-3.3/NOPB (LDO, 12uA Iq, Ultra-Low-Noise for RF, SOT-23, 0.45 EUR)'''<br />
*** TPS70633DBVR (LDO, 1uA Iq, 0.64 EUR, SOT-23)<br />
*** TPS62272 (Buck, 3.3V, 1.23 EUR, 18uA)<br />
*** TPS62740 (Buck, mit mehr Schnickschnack, unter 1uA)<br />
*** TPS62007 (Buck, teuer, größeres Gehäuse)<br />
** Booster: 3x einstellbar, am besten mit Enable<br />
*** 5.1V/1A für Raspberry Pi (Zero W braucht etwa 240mA, Kamerastrom extra)<br />
*** 4 - 6V/2A für Motoren<br />
*** evtl. separate 5V/1-2A für Servos/Neopixel<br />
*** '''TPS61236P (3A max, max 5.5V, 1.66 EUR, Current-Limit einstellbar)''' -> 1x für Motoren, 1x für Servos<br />
*** TPS61230A (2.4A max 5.5V, 1.66 EUR, seltsames Gehäuse)<br />
<br />
* Batteriemanagement:<br />
** '''bq25892 (Lader, +OTG, I2C, 2A oder 3A Ladestrom? Featurecreep. 2.70 EUR)'''<br />
** bq24262 (Lader, per I2C einstellbar, 3.40 EUR)<br />
** bq24125 (Nur Lader, gut, aber 5.50 EUR!)<br />
** bq25606 (Lader und Booster) - nicht so gut, damit darf nur mit 5V geladen werden<br />
** Ideal: Balancer und Ladeschaltung für 2 LiIon in Reihe, min 1A Ladestrom<br />
** Gibts nicht, aber es gibt Balancer mit LDO Ausgang: bq296xx<br />
** Reiner Balancer: bq2920x<br />
** Buck-Boost Charger: bq25703<br />
** Günstiger Buck Charger: bq24133<br />
* Motortreiber:<br />
** Kontrollierbar mit 3.3V Pegeln<br />
** 2 Motorkanäle für bis zu 9V Vin, 0.8A Motorstrom würde reichen<br />
** DRV8835 (Sleep wenn VM aus) oder DRV8833 (Sleep 15uA, int. 3.3V Regler) (welcher ist besser?)<br />
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.<br />
* Pegelwandler:<br />
** 4x 3.3V -> 5V für 4 Servokanäle (Problem: 328 bringt per PWM nur 2 Servokanäle, besser gleich '''PCA9685''')<br />
** 2x 3.3V -> 5V für Neopixel<br />
* Optional: 1 Kanal Class-D Audio-Amp (oder Codec?) für 5V '''MAX98357A''' ist hier gut<br />
* NRF24L01+ Mini-Modul<br />
<br />
=== Pinbelegung ATmega328 ===<br />
{| class="wikitable"<br />
|'''Arduino-Pin''' || '''Port''' || '''Funktion''' <br />
|-<br />
| 0 || PD0 (RxD) || TxD am Raspi <br />
|-<br />
| 1 || PD1 (TxD) || RxD am Raspi<br />
|-<br />
| 2 || PD2 (INT0) || EN_3V3<br />
|-<br />
| 3 || PD3 (OC2B) || DRV8835 BENBL<br />
|- <br />
| 4 || PD4 || EN_5V1<br />
|- <br />
| 5 || PD5 (OC0B) || DRV8835 BPHASE<br />
|-<br />
| 6 || PD6 (OC0A) || DRV8835 APHASE<br />
|-<br />
| 7 || PD7 || EN_5V5<br />
|-<br />
| 8 || PB0 || /CHARGER_CE<br />
|- <br />
| 9 || PB1 (OC1A) || PWM/Servo out A<br />
|-<br />
|10 || PB2 (OC1B) || PWM/Servo out B<br />
|-<br />
|11 || PB3 (MOSI/OC2A) || DRV8835 AENBL<br />
|-<br />
|12 || PB4 (MISO) ||<br />
|-<br />
|13 || PB5 (SCK) || NRF_MOSI<br />
<br />
|-<br />
|A0|| PC0 || NRF_CE<br />
|-<br />
|A1|| PC1 || NRF_CS<br />
|-<br />
|A2|| PC2 || NRF_SCK<br />
|-<br />
|A3|| PC3 || NRF_MISO<br />
|-<br />
|A4|| PC4 || SDA<br />
|-<br />
|A5|| PC5 || SCL<br />
|-<br />
|A6|| ADC6 ||<br />
|-<br />
|A7|| ADC7 || BUTTON_SENSE<br />
|}<br />
<br />
=== Software für FPV-Control Board Arduino ===<br />
<br />
==== Package für Arduino ====<br />
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.<br />
<pre><br />
wget https://downloads.arduino.cc/arduino-1.8.9-linuxarm.tar.xz<br />
tar -xvf arduino-1.8.9-linuxarm.tar.xz<br />
sudo mv arduino-1.8.9 /opt<br />
sudo /opt/arduino-1.8.9/install.sh<br />
</pre><br />
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.<br />
<br />
==== Kommandos von FPVAutoControl ====<br />
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><br />
<br />
Kommandos:<br />
* m xx yy rr : Drive mit den Werten XX YY RR (alt, eher unsinn ohne Omniwheels)<br />
* f ll rr : Aktiviere Motoren Links / Rechts (-255 ... 0 ... 255)<br />
* N aa bb : Stelle Servo A/B (0..180 besser nur 0..160 bei SG90...)<br />
* p!999 : Abschalten nach 60sek<br />
* ph aa : Stelle Servo A<br />
* pv aa : Stelle Servo B<br />
<br />
==== Bootloader ====<br />
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:<br />
* Board: "ATmega328"<br />
* Clock: "8 MHz external"<br />
* BOD: "1.8v"<br />
* Variant: "328 / 328A" (wir haben wohl keine P Version verbaut...)<br />
<br />
<br />
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: <br />
<pre><br />
##############################################################<br />
fpva.name=FPV-Auto <br />
fpva.upload.tool=avrdude<br />
fpva.upload.protocol=arduino<br />
fpva.upload.maximum_size=32256<br />
fpva.upload.maximum_data_size=2048<br />
fpva.upload.speed=38400<br />
fpva.build.mcu=atmega328<br />
fpva.build.f_cpu=8000000L<br />
fpva.build.board=AVR_MINI<br />
fpva.build.core=arduino<br />
fpva.build.variant=eightanaloginputs<br />
</pre><br />
<br />
Damit lässt sich das FPV-Auto Board einfach programmieren.<br />
<br />
==== Avrdude mit GPIO-Reset ====<br />
https://github.com/TOLDOTECHNIK/avrdude-gpio-autoreset<br />
<br />
==== Audio Ausgabe aktivieren ====<br />
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<br />
<br />
<pre>sudo nano /boot/config.txt</pre><br />
<pre><br />
...<br />
#dtparam=audio=on<br />
dtoverlay=hifiberry-dac<br />
dtoverlay=i2s-mmap<br />
...<br />
</pre><br />
<br />
<pre>sudo nano /etc/asound.conf</pre><br />
<br />
<pre><br />
pcm.speakerbonnet {<br />
type hw card 0<br />
}<br />
<br />
pcm.dmixer {<br />
type dmix<br />
ipc_key 1024<br />
ipc_perm 0666<br />
slave {<br />
pcm "speakerbonnet"<br />
period_time 0<br />
period_size 1024<br />
buffer_size 8192<br />
rate 44100<br />
channels 2<br />
}<br />
}<br />
<br />
ctl.dmixer {<br />
type hw card 0<br />
}<br />
<br />
pcm.softvol {<br />
type softvol<br />
slave.pcm "dmixer"<br />
control.name "PCM"<br />
control.card 0<br />
}<br />
<br />
ctl.softvol {<br />
type hw card 0<br />
}<br />
<br />
pcm.!default {<br />
type plug<br />
slave.pcm "softvol"<br />
}<br />
</pre><br />
<br />
pygame installieren<br />
<pre>sudo apt install python3-pygame</pre><br />
<br />
sound downloaden<br />
<pre>wget http://www.wavsource.com/snds_2018-06-03_5106726768923853/animals/chicken.wav</pre><br />
<br />
python3 script erstellen<br />
<pre><br />
import pygame<br />
import time<br />
<br />
pygame.mixer.init(44100, -16, 1, 1024)<br />
pygame.mixer.music.load("chicken.wav")<br />
pygame.mixer.music.play()<br />
<br />
time.sleep(3)<br />
</pre><br />
<br />
==== Kamera aktivieren ====<br />
https://github.com/jacksonliam/mjpg-streamer<br />
<br />
=== Platinen ===<br />
[[Datei:FPV-Auto PCB Top.png|300px]]<br />
[[Datei:FPV-Auto PCB Bot.png|300px]]<br />
<br />
== Motoren ==<br />
* [https://de.aliexpress.com/item/12GA-DC-3V-Miniature-Electric-Reduction-Gear-Motor-Metal-Gearbox-for-RC-robot-model-Toy-DIY/2027091831.html 3V 250RPM N20] -- die 250RPM sind etwas flott, daher Tests mit:<br />
* [https://www.aliexpress.com/item/1pcs-EBOWAN-N20-Micro-motor-Electric-gear-box-motor-3v-6v-12v-15-30-50-60/32770564311.html?spm=a2g0s.9042311.0.0.ecb74c4dElVdZS 3V 200RPM N20]<br />
<br />
<br />
== Reifen ==<br />
* https://www.youtube.com/watch?v=k6QX90taK5c<br />
<br />
[[Datei:20180604 201225.jpg|320px]]<br />
[[Datei:20180604 201232.jpg|320px]]<br />
<br />
Ø = 5,5 cm<br><br />
U = π·d = 17,3 cm<br><br />
200 RPM = 57,6 cm/sec<br><br />
250 RPM = 72 cm/sec<br />
<br />
Felge 8-2018 Zum eingießen in Silikon oder für gedruckte Reifen [[Datei:felge8-2018.zip]] (spitze Madenschraube M3 wird benötigt)<br><br />
Reifen zum drucken in weichem Material (TPU, Ninjaflex etc.) [https://drive.google.com/open?id=1lXRN7BjhyoFlRAwqvAEh77fFSULiji9e Reifen]<br><br />
<br />
<br />
== Akkus ==<br />
18650 Akku<br />
<br />
== Chassis ==<br />
Da es zwei unterschiedliche Ansätze zur Nutzung gibt<br />
*Tumbler mit großer Bodenfreiheit und Option über Kopf zu fahren<br />
*Universal Drohne zur Ausstattung mit größeren Kameras oder Manipulatoren <br />
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.<br />
*Maße: 115mm x 72mm x 15mm<br />
*Aufnahme für 4 12GA Motoren<br />
*Aufnahme für Raspberry Pi Zero Minikamera<br />
<br />
[[Datei:20180624-fpvauto-rahmen.jpg|320px]]<br />
<br />
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<br />
<br />
[[Datei:20180624-fpvauto-tumblrschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-tumblrchassis.jpg|320px]]<br />
<br />
<br />
Für die Standard Version werden zwei 12mm Schalen verwendet, das Chassis bietet dann zwei 18650 Zellen Platz, der RasPi Stack steh hier senkrecht.<br />
<br />
[[Datei:20180624-fpvauto-stdschale.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdconfig.jpg|320px]]<br />
[[Datei:20180624-fpvauto-fpvauto-stdchassis.jpg|320px]]<br />
<br />
[[Datei:Chassis11.zip]] Schalen<br><br />
[[Datei:X_Chassis_11.zip]] Chassis <br><br />
<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><br />
[[Datei:20190421-fpvauto-inwheelchassis01.jpg|320px]]<br><br />
[[Datei:20190424InWheel.zip]] In Wheel Chassis (Testplattform)<br><br />
[[Datei:20190605-InWheelChassis.zip]] In Wheel Chassis (Beta 1) mit Befestigungslöchern für Stack<br><br />
[[Datei:20190605-StackHolder.zip]] Stackbefestigung für Beta 1 Chassis. Befestigung mittels 2x M4 Senkkopf 5mm <br><br />
<br />
== Raspberry Pi Zero W ==<br />
<br />
=== Samba Freigabe ===<br />
Einrichten wie hier beschrieben [[Raspberry_Pi_Grundlagen#Samba]]<br />
<br />
=== Git ===<br />
Git installieren<br />
sudo apt-get install git<br />
Das Repository https://github.com/hackffm/FPVCar.git clonen<br />
git clone https://github.com/hackffm/FPVCar.git<br />
<br />
== Software ==<br />
=== Protokoll für Commandos aus der Webgui ===<br />
{<br />
"modul":"MODULNAME",<br />
"key": "value"<br />
}<br />
<br />
Beispiel<br />
<br />
{<br />
"modul":"base",<br />
"forward": 10<br />
}<br />
=== Videostreaming ===<br />
Hier könnten wir UV4L verwenden.<br><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><br />
Ach ja und stereoskopische Kameras werden auch unterstützt.<br />
<br />
Beispiel mit Gesichtserkennung [https://www.linux-projects.org/uv4l/tutorials/custom-webapp-with-face-detection/]<br><br />
Hier wird gezeigt wie man sich die Bibliothek installiert<br />
[https://www.linux-projects.org/uv4l/installation/]<br><br />
<br />
Zum Verwenden die Auflösung und Qualität konfigurieren z.B. auf 640x480 mit einer frame rate von 16 und jpeg quality von 20.<br />
Das kann über die Oberfläche unter <b>Control Panel</b> gemacht werden, die Änderungen werden aber bei jedem Neustart zurückgesetzt.<br />
Besser ist die Konfigurationsdatei für permanente Einstellungen zu ändern.<br />
Sie befindet sich unter /etc/uv4l/uv4l-raspicam.conf .<br />
Anschließend den Service neu starten mit: sudo service uv4l_raspicam restart<br />
<br />
Um den mjpeg Stream in eine Webseite einzubinden einfach folgendes Tag einfügen.<br />
<img id="video" src="http://raspberrypi:8080/stream/video.mjpeg" width="640" height="480"><br />
<br />
== Emotionen ==<br />
Mit einem OLED Display kann man dem Gefährt Emotionen mit geben.<br />
<br />
Hier ein Test mit einem 128x64 Pixel Display:<br><br />
[[Datei:Eyes neutral.png]]<br />
[[Datei:Eyes skeptic.png]]<br />
[[Datei:Eyes angry.png]]<br />
[[Datei:Eyes sad down.png]]<br />
<br />
Verwendet wird die Python Bibliothek [https://github.com/rm-hull/luma.oled Luma.OLED].<br><br />
Das Python-Skript liegt im Git Repo unter python/eyes.</div>Snow