ShelfHelp

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche
ShelfHelp

Datei:ShelfHelp.jpeg

Entwickler

Cem Cayli, Niklas Rüth, Philipp Sonnenschein

Projektdateien

Verwendete Programmiersprachen

C, Java

Eingesetzte Software

Autodesk Fusion 360, Inkscape, Android Studio,


ShelfHelp ist ein Gerät, das mithilfe eines Ultraschallsensors Lücken zwischen Objekten erkennt und diese zum Zählen nutzt.

Projektbeschreibung[Bearbeiten]

Einige Menschen, insbesondere Menschen mit Beeinträchtigungen, brauchen Hilfe beim Zählen. Hier kommt ShelfHelp ins Spiel, um diese Aufgabe zu übernehmen. Das Gehäuse von ShelfHelp ähnelt sehr einem Barcodescanner und besteht im Wesentlichen aus einer rechteckigen Holzbox, einem Griff und einem Knopf zur Bedienung des Geräts. Es ist außerdem mit einem Display ausgestattet, welches die aktuelle Anzahl der zu zählenden Objekte anzeigt. Des Weiteren besitzt es einen Ultraschallsensor, welcher Lücken zwischen Objekten im Abstand von 50 Millisekunden erfasst. Für jede dieser Lücken springt der Zähler auf dem Display um eins nach oben. Gezählte Bestände können außerdem an eine App geschickt werden, die Anzahl, Breite des Objekts und Uhrzeit speichert.

Projektidee[Bearbeiten]

Das Projekt ShelfHelp entstand zusammen mit den Mitarbeitern der Rheinbaben-Werkstatt in Bottrop im Rahmen des Moduls Eingebettete Systeme. In der Werkstatt werden Seitenteile für Regale hergestellt. Diese werden in eine Schablone gelegt und dann zusammengeschraubt. Ursprünglich stand die Idee im Raum, dass wir uns um eine Optimierung der Schablone kümmern sollen. Allerdings stand schnell fest, dass für die Lösung dieses Problems weder ein Microcontroller noch irgendwelche anderen Kenntnisse aus der Informatik notwendig waren. Somit musste eine andere Aufgabe für uns her. Einer der Betreuer hatte dann die Idee, dass ein Zählsystem für die Menschen in der Werkstatt nützlich wäre, um die Regale zu zählen, da die Mehrheit der Mitarbeiter nicht richtig zählen kann. In unseren Augen ließ sich daraus ein interessantes Projekt gestalten. Wir nahmen also die Herausforderung an.

Hardware[Bearbeiten]

Kostenaufstellung[Bearbeiten]

Materialliste
Beschreibung Kosten pro Stück in € Anzahl
Arduino Uno 12,99 1
LCD Display 3,99 1
Potentiometer 0,49 1
Ultraschallsensor 1,99 1
HC-05 Bluetooth Modul 6,29 1
10K Ohm Widerstand 0,08 1
Pushbutton 0,42 1
170-Pin Breadboard 1,00 2
AC/DC Adapter 2,69 1
DC 9m Verlängerungskabel 12,99 1
Diverse Kabel (M-M, F-M) variiert
Gesamtkosten: > 43,93€

Stand: 15.02.2020

3D-Druck und Lasercutting[Bearbeiten]

Unsere ursprüngliche Idee war es, das komplette Gehäuse in 3D zu drucken. Da dies aber im Vergleich zum Lasercutting sehr lange gedauert hätte und auch fehleranfälliger und das Material instabiler gewesen wäre, haben wir uns dazu entschieden, nur den Griff und den Knopf in 3D zu drucken. Ein weiterer Grund gegen den 3D-Druck waren die hohen Kosten im Vergleich zur Alternative. Die Einzelteile der Holzbox haben wir stattdessen mit dem Lasercutter geschnitten. Für die Erstellellung der Vorlagen für den 3D-Druck haben wir Autodesk Fusion 360 und für das Lasercutting MakerCase und InkScape verwendet.

Software[Bearbeiten]

App-Entwicklung[Bearbeiten]

Für die Entwicklung der App haben wir Android Studio benutzt. Die App ist als Kontrolle für die Betreuer in der Rheinbaben-Werkstatt in Bottrop gedacht. Die App benötigt eine Bluetooth-Verbindung. Daher wird sofort beim Start der App gefragt, ob Bluetooth aktiviert werden soll, falls dies noch nicht geschehen ist. Danach gelangt man auf die Hauptseite der App, die folgendermaßen aufgebaut ist:


Ganz oben befindet sich ein "Verbinden"-Button, durch den sich eine Verbindung mit dem Arduino herstellen lässt. In der Mitte der App erscheint die Anzahl des aktuell gezählten Objekts. Weiter unten befinden sich drei weitere Buttons. Nach einer Betätigung des "Speichern"-Buttons wird man nach der Breite der Regale gefragt und die Daten(Anzahl, Breite, Datum und Uhrzeit) werden anschließend im Verlauf gespeichert. Mithilfe des "Teilen"-Buttons lässt sich der erstellte Datensatz auch exportieren. Außerdem ist noch ein "Verlauf anzeigen"-Button vorhanden, der den Benutzer ins Untermenü bringt, welches nachfolgend erläutert wird.


Das Untermenü ist in Form einer Tabelle aufgebaut und erfasst alle gespeicherten Datensätze, wobei pro Zeile ein Datensatz gespeichert wird. Neben den Spalten für Anzahl, Breite und Zeit gibt es hier noch eine Spalte mit einem "Löschen"-Button und je einer Checkbox pro Datensatz. Durch Abhaken der Checkboxen lassen sich beliebig viele Datensätze auf einmal auswählen, die anschließend mit dem "Löschen"-Button entfernt werden können. Wie auch schon auf der Hauptseite, wo allerdings nur der aktuelle Datensatz geteilt werden kann, lassen sich hier wieder Datensätze mit dem "Teilen"-Button teilen.

Microcontroller-Programmierung[Bearbeiten]

//______________________________________BLUETOOTH____________________________________________

  1. include <SoftwareSerial.h>
  2. define rxPin 8
  3. define txPin 9

SoftwareSerial btSerial(rxPin, txPin);//RX, TX

//______________________________________LCD_Display__________________________________________

  1. include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//LCD Pins

//______________________________________Ultraschall__________________________________________

  1. define trigger 7
  2. define echo 6

int counter = 0; //Anzahl der Regale bool nullsetzer = false; //Hilfsvariable damit wieder beim Zählen wieder bei 0 Angefangen wird long dauer = 0; //Zeit, die eine Schallwelle bis zur Reflektion und zurück benötigt long entfernung = 0; //Berechnete Entfernung int entf2 = 0; //Hilfsvariable damit nicht doppelt gezählt wird bool gefunden = false; //Hilfsvariable damit nicht doppelt gezählt wird

//_______________________________________Taster______________________________________________

  1. define taster 10

int tasterstatus = 0; //Anfangswert


void setup() {

 //_____________________________________BLUETOOTH___________________________________________
 btSerial.begin(9600);               //Benötigt um Baud des Bluetooth Moduls auf 9600 zu setzen
 
 //_____________________________________Taster______________________________________________
 pinMode(taster, INPUT);             //Taster ist ein Eingang
 
 //_____________________________________LCD_Display_________________________________________
 lcd.begin(16, 2);                   //16 Zeichen in 2 Zeilen.
 
 //_____________________________________Ultraschall_________________________________________
 pinMode(trigger, OUTPUT);           //Trigger ist ein Ausgang
 pinMode(echo, INPUT);               //Echo ist ein Eingang

}

void loop() {

 //_____________________________________Taster______________________________________________
 tasterstatus = digitalRead(taster);                 //der Zustand ob der Taster gedrückt ist wird auf tasterstatus gespeichert
 if (tasterstatus == HIGH && nullsetzer == false)    //Wenn der Taster gerückt ist und der nullsetzer false ist...
 {
   messungDurchfuehren();            //...die Messung wird durchgeführt
   //___________________________________LCD_Display_________________________________________
   lcd.setCursor(0, 0);              //lcd.setCursor(0,0) bedeutet: Erstes Zeichen in der ersten Zeile.
   lcd.print("Scannt...... ");       //Ausgabe auf dem Display
   lcd.setCursor(0, 1);              //lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
   lcd.print(counter);               //Ausgabe auf dem Display
   //_______________________________________________________________________________________
 }
 if (tasterstatus == LOW)            //wenn der taster nicht gedrückt ist...
 {
   lcd.setCursor(0, 0);              //lcd.setCursor(0,0) bedeutet: Erstes Zeichen in der ersten Zeile.
   lcd.print("Scan beendet");        //Ausgabe auf dem Display
   lcd.setCursor(0, 1);              //lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
   lcd.print(counter);               //Ausgabe auf dem Display
   nullsetzer = true;                //Der nullsetzer wird auf true gesetzt
 }
 if (tasterstatus == HIGH && nullsetzer == true)   //wenn der Taster gedrückt wird und der nullsetzer auf true ist...
 {
   lcd.setCursor(0, 1);                            //lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
   lcd.print(F("   "));                            //Ausgabe auf dem Display wird gelöscht
   counter = 0;                                    //Die Anzahl wird wieder auf 0 gesetzt
   delay(500);                                     //Es wird 500Ms gewartet um Fehler zu vermeiden (Halbe Sekunde)
   nullsetzer = false;                             //Der nullsetzer ist wieder false
 }

}

//_________________________________________________Ultraschall_______________________________ void messungDurchfuehren() {

 digitalWrite(trigger, LOW);         //Für kurze Zeit auschalten um später ein rauschfreies Signal zu erhalten
 delay(5);                           //5 = 5ms
 digitalWrite(trigger, HIGH);        //"Ton" erklingt für 10ms
 delay(10);
 digitalWrite(trigger, LOW);         //"Ton" wieder abschalten
 dauer = pulseIn(echo, HIGH);        //Zeit in Mikrosekunden die der Schall braucht um zurück zum Sensor zu gelangen
 entfernung = (dauer / 2) * 0.03432; //Berechnung der Entfernung in cm.
 delay(50);                          //Es wird 50Ms gewartet um ungenaue Messwerte zu vermeiden
 if (entfernung < 16 && gefunden == false)       //Wenn die Entfernung unter 16cm ist und noch nichts gefunden wurde...
 {
   gefunden = true;                              //...wird gefunden auf true gesetzt
   entf2 = entfernung;                           //...und entf2 als die entfernung gespeichert in der eine Leiter gefunden wurde
 }
 if (entfernung > entf2 + 5 && gefunden == true) //Wenn die Entfernung größer als entf2 und zusätzlich 5cm ist UND gefunden auf true ist...
 {
   counter = counter + 1;                        //...Der Zähler wird um 1 erhöht
   btSerial.println(counter);                    //Zähler wird vom Bluetooth Modul gesendet
   gefunden = false;                             //...gefunden wird wieder auf false gesetzt
 }

}