Archiv der Kategorie: Programmiersprache

ESP32 Arduino Gui einrichten mit Git

Wie immer gibt es im Netz zahlreiche Informationen, wie die Arduino Gui zu konfigurieren ist. Deshalb fasse ich mich an dieser Stelle sehr kurz, für detailiertere Informationen sei auf die unten verlinkten Quellen verwiesen.

Repository Clonen

Es gibt ein Git Paket zur Einrichtung der GUI für den ESP 32. (Link zu GIT GUI)

Git Gui starten und „Clone Existing Repositiory“ wählen.

Die Quelle für die ESP 32 Sources ist:

https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series.git

dort gibt es auch zusätzliche Infos.

Das Ziel ist das Arduino Projektverzeichnis, in meinem Fall unter MyDocuments/Arduino.

Mit Bestätigung der Eingabe über den Clone Button, erscheint das folgende Bild und alle Dateien werden aus Git extrahiert.

Danach muss man im Verzeichnis ..\Arduino\hardware\heltec\esp32\tools noch das Programm get.exe ausführen und in der Console mit Enter starten.

Erfolgsbestätigung

Arduino Gui neu starten,  tauchen die ESP 32 Einträge in der Board-Liste auf war die Installation erstmal erfolgreich.

Ob auch alles wirklich funktioniert kann mit einen der Beispielprogramme verifiziert werden. Einfach auswählen, übersetzen und auf den ESP 32 übertragen. (Vorher das richtige Board auswählen)

Probleme

Arduino Gui – falsches Installationsverzeichnis gewählt

Ich hatte das falsche Verzeichnis für meine Arduino Gui angegeben .

Zur Lösung des Problems kann der komplette esp32 Ordner in das richtige Verzeichnis unter hardware kopieren werden.

Keine Beispielprogramme für den ESP32 ?!

Zuerst muss das ESP32 Board ausgewählt werden, dann sind auch die entsprechenden Beispielprogramme vorhanden.

Projekte

ESP32 WiFi Lora 433

Quellen

https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md

https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series#instructions

Arduino Uno + WiFi

Hier geht es um einen Chinaimport und nicht um den offiziellen Uno WiFi. Die Platine hat einen vollständigen Ardunio Uno mit Atmega Prozessor und einen ESP8266 Chip on board. Über Dipschalter, kann jeweils der Uno mit dem USB, der ESP mit dem USB oder der ESP mit dem UNO verbunden werden.

Für den Betrieb kann eine externe Wlan-Antenne angeschlossen werden. Es sind zusätzlich ESP-Pins herausgeführt, die Beschaltung steht auf der Rückseite.

Daten

Name Uno + Wifi  
Anzahl/CPU
2 / ATmega328P + ESP 8266
Takt (MHz)16 / 80
Kerne1
Digital IOs / Pins14 / 4
Analog inputs6 / ?
PWM6 / ?
SPI1
Flash Speicher 32 KB / 8 MB
SRam (KB)2 / 128
EEPROM (KB)1 / -
WiFi- /2,4 GHz 802.11 b/g/n
Verschlüsselung- / WEB / WPA2 / TKIP /AES
Bluetooth-
UART1 / 1
I2C1 / 1
Ethernet- / -
Video-
Sound-
USB1 Micro
Betriebsspannung [V]5
Eingangsspannung7 - 12
Strom (mA) / Standby (mA)< 500
Größe l x b x h68,6 x 53,3
Gewicht [g]>25

Ansichten

Frontansicht mit den Verbindern für Erweiterungsplatinen, dem Stromanschluss, USB-Anschluss und einem  Resettaster. Zusätzlich zu den normalen Achlüssen befindet sich noch weitere für den ESP8266,  ein Antennenanschluss und ein Dip-Schalter zur Einstellung der seriellen Schnittstelle an Bord.

Hier ein paar technische Daten und die Pinbelegung der nach aussen geführten ESP Pins.

 

Jumper Einstellungen

DIP

Programmierumgebung

UNO

Dipschalter 3,4 auf ON Rest auf OFF

ESP8266

Dipschalter 5,6,7 auf ON Rest auf OFF. Sollte das programmieren nicht beginne ist ein Reset de des Boards nötig. Das spielen mit der Reset Methode brachte hier leider keine Besserung.

Test Programme

ESP8266 Durchreiche

Das folgende Programm reicht alles was auf dem seriellen Port eingeht an den verbundenen Server weiter und alles was über das  Netz rein kommt wieder auf den seriellen Port. Das Listing ist etwas lang weil ich die Netzwerkkommunikation aus einem anderen Projekt übernommen habe, deshalb hier nur die gelinkte Datei.

UARTEcho.ino

Alles Wichtige passiert in der loop Funktion. Die Daten für den Accesspoint und den Server müssen entsprechend angepasst werden.

Nachträglich habe ich auch Code von Arduino in den Beispielen der GUI gefunden. Die Datei heisst Wifi2Serial.ino.

Uno Echo

Das Testprogramm des Uno’s ist gleichfalls trivial. Es schreibt alles was er über den seriellen Port empfängt wieder auf diesen zurück.

[gistpen id=“776″]

SerialEcho.ino

Testen

Zum testen kann mein Socket-Tool verwendet werden.

Java Socket Konsolen Server

Dipschalter1,2 auf ON, der Rest auf OFF.

Die Socket Console starten.

Im Feld neben den „send“ Knopf kann ein Text eingegeben werden. Mit Betätigung des „send“ Knopfes, wird der Text an den Client geschickt. Wenn alles geklappt hat, kommt der Text mit einem „Echo: “ davor zurück.

Durch die Testausgaben des ESP auf den seriellen Port, kommen ein paar mehr Echos zurück als eingegeben wurden. Auch fehlt nach der Serververbindung der „New Line“- Befehl. Weshalb erst der 2. eingegeben Text gut sichtbar ist. Für einen ersten Test des Boards reicht es jedoch aus.

Quellen

https://github.com/jandrassy/UnoWiFiDevEdSerial1#writing-sketches-for-esp8266

https://github.com/esp8266/Arduino/issues/3004

https://community.blynk.cc/t/uno-wifi-r3-atmega328p-esp8266-board-32mb-memory-usb-ttl-ch340g-compatible-for/21564

https://github.com/gmag11/FirmataMaster

https://www.arduino.cc/reference/en/language/functions/communication/serial/

Arduino – HC-SR04 Entfernungsmesser

Ansteuerung des HC-SR04 Ultraschall-Entfernungsmesser mit Hilfe des Arduino UNO.

Grundlagen

SR-04

Aufbau

Schaltung

(Ich habe nachträglich noch die Pins von 0/1 auf 2/3 geändert weil an 0/1 noch der ISP hängt).

Testprogramm

Hier ein kleines Testprogramm. Es filtert zu kleine und zu große Werte heraus und ermöglicht die Mittelwertbildung über ein definiertes intervall.

[gistpen id=“756″]

SR04Test.ino

Hier könnte jetzt noch der Median angewendet werden um Ausreisser heraus zu nehmen.

In der Praxis bietet es sich wahrscheinlich an die Millimeter weg zu kürzen und nur den Zentimeterwerte, die wesentlich geringeren Schwankungen unterliegen, zu verwenden.

Output

Quellen

http://www.mikrocontroller-elektronik.de/ultraschallsensor-hc-sr04/

 

 

Java – IP Fernbedienung

Zweck des Ganzen ist eine Fernbedienung für meine Roboter.

Da alle Roboter (zumindest die fortschrittlicheren) über eine Netzwerkverbindung verfügen, möchte ich eine kleine App entwickeln, die per Konfiguration Telegramme an einen bestimmten Empfänger versenden kann.

Erster Wurf

Im ersten Schritt soll die Fernbedienung nur aus einem Tastenfeld bestehen. Der Benutzer kann die Anzahl Zeilen und Spalten bestimmen und die Knöpfe einzeln konfigurieren. Dies sollte ausreichen eine einfache Fernsteuerung zu erstellen.

Std. Layout 3 x 3 Felder
Konfigurierte Version des 3×3 Std. Layouts.

 

 

Java Socket Konsolen Server

Die Java Socket Konsole öffnet einen Server auf einem definierten Port. Der Port kann beim Start mit übergeben werden. Wird kein Port angegeben ist der standard Port 2021.  Alles was an diesen Port gesendet wird, erscheint als zeilenbasierte Ausgabe in einem Fenster.

Das Programm ermöglicht genau eine Verbindung.  Über die Textbox am Fuß des Dialogs und den „send“ Knopf kann Text an den verbundenen Client gesendet werden.

Vorausetzung

Java Version >= 7 muss installiert sein
Wurde bis jetzt nur unter Win 10 getestet

Starten

Die Datei kann einfach per Mouse-Doppelkick gestartet werde.

Ein starten über die die Konsole, um den Port mit zu geben, sieht wie folgt aus.

Der Port kann direkt hinter dem Dateinamen angegeben werden.

Ausgabe

Dateien

Jar Archiv

SocketConsole

Sourcen (Eclipse Projekt)

net.fambach.net.socket.console.zip

Probleme

Bei Problemen Mail an mich anfrage(at)fambach.net

Quellen

http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_21_006.htm

https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html

https://docs.oracle.com/javase/tutorial/networking/sockets/index.html

https://javabeginners.de/Netzwerk/Socketverbindung.php

Raspberry PI + Servo

Ansteuerung eines Standard Servos mit dem Raspberry PI 3.

Für die spätere Verwendung auf einem Roboter soll der Servo in +/- Grad mit Bezug zur Mittelstellung gesteuert werden.

Weiterhin soll für den Servo, da die beiden Hardware PWMs schon für einen anderen Zweck verwendet werden, der Software PWM zur Anwendung kommen.

Auf die Funktionsweise eines Servos gehe ich hier nicht ein, dies kann bei Bedarf bei http://rn-wissen.de/wiki/index.php/Servos oder anderen Websites nachgelsen werden.


Hardware

PI3 (oder älter bitte auf die richtigen Pins achten)
Standard-Servo
Diverse Kabel ( Vorgefertigte Pin-Header Kabel)


Aufbau

GPIOs

  • Ansteuerung des Servos GPIO 27

(Die GPIOs gelten nur in Verbindung mit pi4j und wirePi)

 

Plan

 


Software

Entwicklungsumgebung

Als Entwicklungsumgebung verwende ich BlueJ auf dem PI selbst. Hiermit habe ich die folgenden Klassen erstellt.


Code

Erste Testklasse

Hier die erste Testklasse welche alle Positionen des Servos mal abfährt.

[gistpen id=“232″]

Servo-Klasse

Klasse zur Steuerung des Servos. Die zwei wichtigsten Methoden sind:

  • setPos – Setzen der Position, Wertebereich von posMin bis posMax wobei (posMax-posMin+1)  die Mittelstellung ist.
  • setDeg – Diese Methode projeziert die eingegebende Gradzahl auf die möglichen positionen (sehr ungenau 🙁 )

[gistpen id=“228″]

Test-Klasse

Klasse mit Main-Methode zum Testen des Servos. In der Main-Methode werden alle Positionen abgefahren wobei die Positionierung über den Winkel relativ zur 0 Position erfolgt.

[gistpen id=“230″]


Tips

Das Positionieren über die PI4j Lib ist sehr ungenau für die 180° Bewegungspielraum des Servos stehen gerade mal rund 20 (+-2) Positionen zur Verfügung. Das sind rund 9° pro Position.  Evtl. sollte man vorher testen welche Positionen für den Aktuellen Zweck am besten geeignet sind. Sollte der genaue Winkel wichtig sein, ist es besser diesen vorab zu messen als ihn über die setDeg Methode berechnen zu lassen.

Es gibt noch weitere Lib’s (Servoblast, … ) die evtl genauer sind, evtl müsste man auch überlegen die Programmiersprache zu wechseln und dann den Ensprechenden Code über das Nativ-Interface anzusprechen bzw. irgendwie anders 😉 .


Einen anderen Weg gehen …

Ich habe versucht den Software PWM innerhalb eines Threads laufen zu lassen, jedoch ohne Erfolg. Der Servo weigert sich zu funktionieren.  Über die Ursache hierfür bin ich mir noch im unklaren ich nehme allerdings an, dass hierdurch der Timer zerschossen wird.

Nach diversen Tests mit unterschiedlichen Frequenz-Einstellungen habe ich mich entschlossen ServoBlaster od.  besser die PI variante (PiBits) zu verwenden. Die Installation gestaltet sich einfach wie folgt.

[gistpen id=“257″ ]

Jetzt muss der ServoBlaster nur noch über Java angesprochen werden. Hier ein einfaches Beispiel zum testen.

… kommt noch

Die Implementierung in anständigen Klassen sieht dann wie folgt aus.

… kommt noch


Tips für den neuen Weg

Wenn die exec Funktion von Java nix macht ist hier ein guter Link zum Bugfixing.

http://www.javaworld.com/article/2071275/core-java/when-runtime-exec—won-t.html

Weiterhin könnte es helfen nicht die Println Methode zu verwenden, da zumindest mein PI den Abschluss der Zeile nicht richtig interpretieren konnte. (Beispiel „5=100\n)“ sollte funktionieren).

 

Quellen

http://razzpisampler.oreilly.com/ch05.html
https://github.com/Pi4J/pi4j/blob/master/pi4j-example/src/main/java/MaestroServoExample.java
https://www.bluej.org/raspberrypi/ServoMotor.html
https://phyks.me/2015/05/controlling-servomotors-on-a-raspberry-pi.html
http://rn-wissen.de/wiki/index.php/Servos
https://github.com/richardghirst/PiBits/tree/master/ServoBlaster

Raspberry Pi Servo Motor Steuerung

Between 0 and 1 – PWM with Raspberry Pi

 


Anhang

Pin-Belegung

 

Pi4J + BlueJ

Da ich am liebsten im Java programmiere, verwende ich die Bibliothek Pi4J zur Ansteuerung der GPIOs am Raspberry Pi 2 und 3.

Auf die Installation der Bibliothek werde ich nicht näher eingehen, da dies auf den folgenden Webseiten schon erschöpfend beschrieben wurde.

http://pi4j.com/install.html
http://pi4j.com/utility/pi4j.html
http://www.forum-raspberrypi.de/Thread-tutorial-ansteuerung-der-gpio-ports-mit-pi4j

Auch wichtig zu wissen ist, dass Pi4J auf der wiringPI Bibliothek aufbaut und diese natürlich mit installiert werden muss.

Als Entwicklungsumgebung verwende ich BlueJ, weil man hier auch gleich noch ein Klassendiagramm mit bekommt.

Also Doku gibts genug, warum dann dieser Beitrag?

Ich möchte nach und nach eine kleine FaQ erstellen mit den Problemen die ich während der Nutzung dieser beiden Tools hatte, habe und haben werde.

Die Ports machen nix

In der alten Version vom BlueJ, scheint in den Einstellungen das Flag zur Auführung als Root nicht richtig initialisiert zu sein. Nach dem Start von BlueJ einfach das Flag entfernen und wieder rein machen dann gehts. Dieses Problem scheint in der aktuellen Version behoben zu sein.

Sollte es dann immer noch nicht klappen einfach mal die IOs auf der Console testen. Hilfe gibts hier oder hier.

Soweit ich weiss muss man zur Ansteuerung der GPIOs root (od. sudo) rechte besitzen. Der Benutzer pi ist ensprechend gut ausgestattet und eignet sich am Besten für erste Tests. (Man soll sich ja nicht mehr als root anmelden ;( ).

Nach dem Upgrade geht nix mehr

Ich habe meinen Raspberry auf die neuste Version aktualisiert. Hierbei wurde auch der Kernel auf die Version 4.9.32 aktualisiert. Danach gingen die GPIOs nicht mehr. Ein Downgrade des Kernels auf die Version 4.4.50 hat das Problem erstmal gelöst. Hilfe hierzu gibt es hier und hier.

Software PWM beim Servo

Für ca. 180° stehen beim Software PWM leider nur 20 Stellungen/Schritte für den Servo zur Verfügung was ca. 9° pro Schritt entspricht.
Weiterhin gibt es durch andere Funktionen im Betriebssystem oft gewackel am Servo (jitter). Man sollte ihn so programmieren, dass die entsprechende Stellung angefahren wird und dann den PWM wieder ausschalten.

Eine bessere Möglichkeit ist natürlich einen Hardware PWM zu verwenden, wenn man noch einen frei hat ;).

Andere Bibliotheken die besser funktionieren sollen habe ich noch nicht getestet hier eine kleine Auflistung, diese müssten dann gegebenen Falls mit dem Java Native Interface angesteuert werden:

Weiteres zu PWM [1] [2] [3]

Weiter Probleme werden sicherlich folgen ….

Raspberry PI 3 + Motorsteuerung

Ziel ist es mit dem Raspberry PI 3 unter Zuhilfenahme einer Motorbrücke, 2 Gleichstrommotoren zu betreiben.

Dies soll später genutzt werden um einen zweirädrigen Roboter anzutreiben.


Hardware

PI3 (oder älter bitte auf die richtigen Pins achten)
Motorbrücke L9110s
2x DC Motor
Diverse Kabel ( Vorgefertigte Pin-Header Kabel)


Testaufbau

GPIOs am Raspberry

  • Motor1 Richtung GPIO 26
  • Motor1 Geschwindigkeit GPIO 1
  • Motor2 Richtung GPIO 24
  • Motor3 Geschwindigkeit GPIO 23

(Die GPIOs gelten nur in Verbindung mit pi4j und wirePi)

Plan


Software

Entwicklungsumgebung

Als Entwicklungsumgebung verwende ich BlueJ auf dem PI selbst. Hiermit habe ich vier Klassen erstellt. Diese werden im folgenden Abschnitt kurz erklärt.


Code

Da ich anfänglich ein paar Probleme hatte und die Motorbrücke nicht wie erwartet reagierte, habe ich mich langsam an das Thema herangetastet.

Digitale Ansteuerung

Zuerst habe ich eine kleine Testklasse geschrieben, welche die Motoren digital ansteuert. Hiermit konnte ich die richtige Verkabelung sicherstellen. Mit diesem Test ist noch keine Geschwindigkeitsregulierung möglich.

[gistpen id=“197″]

PWM Ansteuerung

Als nächstes habe ich eine Testklasse erstellt, die den Hardware PWM benutzt und ebenfalls die Richtungen wechselt.

[gistpen id=“205″]

Funktionalität in Klasse gepackt

Als letzten Schritt habe ich eine Klasse Drive zur Steuerung beider Motoren und die dazu gehörende Testklasse erstellt.

Drive Klasse

Klasse zur Steuerung der zwei Motoren.

[gistpen id=“207″]

Test-Drive Klasse

Klasse zum Testen der Motoren. Diese testet, wie auch im vorhergehenden Beispiel,  unterschiedliche Geschwindigkeiten und Richtungen.

[gistpen id=“209″]

 


Tips

Motoren drehen nicht in die richtige Richtung

Sollten die Motoren nicht in die richtige Richtung drehen, einfach die polarität am Anschluss an der Motorbücke vertauchen bis es passt. Sollte das nicht möglich sein, die Methoden forwardLeft/Right() und backwardLeft/Right() entsprechend anpassen.

Raspberry rebooted bei Aktivierung/Betrieb der Motoren

Sollte beim Einschalten/Betrieb der Motoren der Raspberry neu booten, kann dies am hohen Stromverbrauch der Motoren liegen. Dann sollte man überlegen die Motoren entweder über eine zusätzliche Spannungsquelle zu versorgen oder zumindest die Motoren mit einer Spule zu entstören. Condensatoren können zusätzlich Spannungspitzen abfangen.

Mehr zur Entstörung:

http://www.bnhof.de/~ho1645/entstoer.htm
https://www.mikrocontroller.net/articles/Motoransteuerung_mit_PWM

Schaltung mit zusätzlicher Spannungsquelle:

Hier wird der L9110 mit einem LiPo versorgt, wichtig ist es die Masse des Lipo mit der des Raspberries zu verbinden, sonst funktioniert es nicht. Der Lipo sollte im Bereich 3.7v und < 12V liegen (Beschränkung des L9910).

 


Quellen

Beispiel auf GitHub
PI4j Webseite
PWM + Motoren allgemein beim RoboterNetz

Einige andere Webseiten waren auch noch nützlich, einfach mal Google bemühen.


Anhang

Pin-Belegung

http://www.pi4j.com