====== Joystick Rover ======
====== Beschreibung: ======
Unser Rover ist über eine H-Brücke mit einem Raspberry Pi verbunden (die beiden Motoren auf derselben Seite sind gleichgeschaltet) und mit einem Ultraschall Sensor, der den Rover vor einer Kollision mit Gegenständen abhält, sowie einer Pi Camera.
An einen zweiten Raspberry Pi ist ein Joystick angeschlossen, der die Werte der x und y-Achse ausliest und diese über eine UDP Verbindung an den - mit dem Rover verbundenen Raspberry Pi - sendet.
Aus dem Winkel zur x-Achse und der Länge des Vektors werden dort die Basisgeschwindigkeit der Räder sowie der Faktor mit dem diese, im Fall einer Drehung, auf der jeweiligen Seite multipliziert werden soll. [Kamera Code erklären?]
**Verwendete Komponenten:**
* Raspberry Pi 3B+
* H-Brücke
* Rover
* Ultraschallsensor
* Joystick
* AD-Wandler
* PiCamera
====== Projektaufbau:======
{{ :me-health.png?direct&400 |}}
----------------------------------
{{ :me-health_project.png?600 |}}
===== UDP-Verbindung =====
UDP (User Datagram Protocol) haben wir benutzt um einen Raspberry Pi über das W-LAN miteinander zu verbinden. TCP wäre als Alternative infrage gekommen, was aber für unsere einfache Anwendung nicht notwendig war.
Dabei speisen wir die Rohdaten des Joysticks an dem Client in ein Programm ein, das diese in unsere gewünschte Skala umwandelt und schließlich an den anderen Raspberry Pi (den Server) schickt.
Nachteil dieser Art von Übertragung ist, dass der Rover nur innerhalb der Grenzen des W-LANs funktioniert.
**Beispiel dieses Clientprogramms: **
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ip = ("192.168.178.200")
nachricht= ("Hallo")
s.sendto(nachricht.encode(), (ip,50000))
s.close
Die Funktion Socket erzeugt eine Socket Instanz, worin wir zwei Parameter übergeben: Die IP-Adresse des Empfängers und die Nachricht selbst, in unserem Fall kontinuierlich die Koordinaten des Joysticks und im Beispielcode "Hallo"
**Beispiel des Serverprogrammes:**
import socket
try:
s.bind(("", 50000))
while True:
daten, addr = s.recvfrom(1024)
print("[{}] {}".format(addr[0], daten.decode()))
finally:
s.close()
Auch hier wird eine Socket-Instanz erstellt. Bind() übernimmt zwei Parameter: Die IP-Adresse des Senders als String und die Portnummer. Wir persönlich haben, wie im Beispiel, keine IP-Adresse angegeben, weil niemand uns sonst störende Nachrichten schicken wollte.
recvfrom() wartet theoretisch endlos auf eine Nachricht, weshalb auch eine try/finally-Anweisung gebraucht wird damit wir mit einem KeyboardInterrupt mit close() die Verbindung schließen können.
Die übergebene Nachricht ist als String vorhanden, deswegen ggf. darauf achten diese wieder in den ursprünglichen Datentyp umzuwandeln (ast.literal_eval())
====== PiCamera Konfiguration ======
Erstmal muss die Kamera in den Raspberry Pi Configurations aktiviert werden:
**Command:**
//sudo raspi-config//
Interface -> Kamera -> aktivieren
Den Livestream haben wir dann mit dem Code dieser Website erstellt:
[[https://randomnerdtutorials.com/video-streaming-with-raspberry-pi-camera/]]
====== ======
Das e-health kit wird auf einen Arduino aufgesteckt.
!! Achtung: für die Nutzung der cooking-hacks e-health Kit v2.0 Bibliothek wird Arduino 1.0.1 bzw. 1.0.5 benötigt!
Beispielcode:
Serielle Verbindung herstellen in Python:
# Python Bibliothek
Import serial
VARIABLE = serial.Serial("/dev/ttyACM0", 115200, timeout=1)
# Sleep für Verbindung (ganz wichtig, sonst keine zuverlässige Verbindung)
time.sleep(5)
# Im Anschluss kann über VARIABLE die Verbindung genutzt werden
# Lesen der seriellen Schnittstelle
VARIABLE.readline()
# Schreiben über serielle Schnittstelle
VARIABLE.write("ÜBERGABE an Arduino")
Dateiverwaltung in Python
# Python Bibliothek
Import os
# Bestimmte Datei öffnen (a = anfügen, w = neuschreiben, r = lesen)
VARIABLE = open("Datei", "w")
# Test in Datei schreiben
VARIABLE.write("Toller Text")
Beispielcode zur Auswertung eines Pulsoximeters des e-Health Kits in Arduino
//Bibliotheken cooking-hacks e-health kit v2 - Biblioheken muessen im Lib Ordner der Arduino Entwicklungsumgebung abgelegt werden
#include
#include
#include
// Var Überwachung Werte PulsOx
int cont = 0;
void setup() {
Serial.begin(115200);
eHealth.initPulsioximeter();
i_zwerg = 10;
//Initialisierung Pulsoximeter
PCintPort::attachInterrupt(6, readPulsioximeter, RISING);
}
//Pulsoximeter Werte auslesen
void get_spo2(int i_zwerg)
{
int i_count = 0;
String str_zwerg = 0;
Serial.print("Start_ard_get_spo2");
Serial.print("\n");
//Beginn Schleife
while (i_zwerg > i_count) {
//Aufrufen der Bibliotheken und zuweisen der Messwerte
int pox_bpm = eHealth.getBPM();
int pox_spo2 = eHealth.getOxygenSaturation();
//Begrenzung auf bestimmten Wertebereich
if (pox_bpm >= 20 && pox_bpm <= 200) {
Serial.print("BPM:");
Serial.print(pox_bpm);
Serial.print("\n");
i_count++;
}
//Begrenzung auf bestimmten Wertebereich
if (pox_spo2 >= 91 && pox_spo2 <= 100) {
Serial.print("SPo2:");
Serial.print(pox_spo2);
Serial.print("\n");
i_count++;
}
delay(500);
}//Ende Schleife
Serial.print("END_ard_get_spo2");
Serial.print("\n");
}
//Include always this code when using the pulsioximeter sensor (laut cooking-hacks)
//=========================================================================
void readPulsioximeter(){
cont ++;
if (cont == 50) { //Get only of one 50 measures to reduce the latency
eHealth.readPulsioximeter();
cont = 0;
}
}
====== MySQL ======
MySQL Pakete mit allen Abhängigkeiten installieren
Command: sudo apt-get install mysql-client mysql-server
MySQL-Server auf loopback Adresse binden
**Command:**
///vim /etc/mysql/my.cnf///
**File:**
//[...]
bind-address = 127.0.0.1
[...]//
MySQL-Server in den Autostart beim Booten aktivieren
**command:**
//systemctl enable mysqld.service//
Mit Hilfe von SQL auf der MySQL Konsole oder per Client
* Datenbanken "Sensoren" anlegen
* Tabellen "Blutdruck,EKG,Koerpertemperatur,Patient,Pulssensor" anlegen
* User "sensoren, www-data" angelegt und auf Datenbank "Sensoren" berechtigen
Datenbank und Tabellen Struktur sowie die Userberechtigung entnehmen Sie bitte den Files
* " MySQLDatabasesMeHealthProjekt.sql"
* " MySQLUserMeHealthProjekt.sql"
====== Weboberfläche ======
Die gesamte Weboberfläche ist html5 basiert. Das Layout der Oberfläche wird mit Hilfe von CSS umgesetzt. Benutzereingaben in der Oberfläche werden mit Hilfe von PHP (POST) an den Webserver übergeben und ausgeführt.
Apache Webserver installieren und konfigurieren
**Pakete:**
**command:**
//__sudo apt-get install apache2__//
**Konfiguration**
**File:**
///etc/apache2/apache2.conf//
Alle für die Anwender erforderlichen Dateien und Skripte im gewünschten Webserver-Verzeichnis hinterlegen.
**Path:**
///var/www/html///
Damit aus der Weboberfläche Python Skripte ausgeführt werden können müssen folgende Schritte durchgeführt werden:
Sudo Berechtigungen setzen
**File:**
//[...]
# User privilege specification
www-data ALL=(ALL) NOPASSWD: ALL
[...]//
Benutzer und Gruppe des Webservers anpassen
**Path:**
///var/www/html/eHealthProjekt/mobile//
**Command:**
//chown -R www-data:www-data /var/www/html/eHealthProjekt/*//
Benötigte Skripte ausführbar machen
**Command:**
//chmod +x Script.py//
//-rwxr-xr-x 1 www-data www-data Script.py//
===== LCD =====
Alle Pakete und Abhängigkeiten für das LCD installieren:
**command:**
//sudo apt-get install libx11-dev libxext-dev libxi-dev x11proto-input-dev//
github.com: xinput_calibrator herunterladen und installieren
LCD Display über xinput calibrator kalibrieren und Kalibrierung speichern
**command:**
///vim /etc/X11/xorg.conf.d/99-calibration.conf//
**File:**
//[...]
Section "InputClass"
Identifier "calibration"
MatchProduct "eGalax Inc. Touch"
Option "Calibration" "34 1979 106 1974"
EndSection
[...]//
Midori Browser installieren und konfigurieren für die Vollbildanzeige auf dem LCD
Alle Pakete und Abhängigkeiten installieren:
**command:**
//sudo apt-get install matchbox midori unclutter//
Skriptdatei erstellen für den Aufruf der Seite im Vollbildmodus:
**command:**
///vim /$path/meHealthProjekt.sh//
**File:**
//[...]
#!/bin/sh
xset -dpms # disable DPMS (Energy Star) features.
xset s off # disable screen saver
xset s noblank # don't blank the video device; "uncluter" ausblenden des Mauszeigers; "matchbox" aufrufen des window-manager; "midori" aufruf des Midori browser im Fullscreen
unclutter &
matchbox-window-manager &
midori -e Fullscreen -a http://localhost/eHealthProjekt/mobile/index.html
[...]//
Optional eine Skriptdatei erstellen "me-healthOberflächestarten" für einen Aufruf aus dem Fileverzeichnis ohne Ausführen des Konfigurationsskriptes
**command:**
///vim /$path/me-healthOberflächestarten//
**File:**
//[...]
#!/bin/sh
xinit ./meHealthProjekt.sh
[...]//
Beide Skripte ausführbar machen:
**command:**
//chmod +x meHealthProjekt.sh me-healthOberflächestarten//
Weboberfläche automatisch starten beim booten des Raspberry: