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:


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“

UDP.py
 

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

dateioeffen.py
# 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 <PinChangeInt.h>
#include <eHealthDisplay.h>
#include <eHealth.h>
// 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: