DruPro

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche

Drupro ist ein Feedbacksystem, dass einem Benutzer es erlaubt, ein Gefühl an der Hand zu imitieren. DruPro ist in der Lage Druckempfinden teilweise zu emulieren und kann durch einen modularen Aufbau leicht individualisiert werden.

DruPro

Logo.jpeg

Entwickler

Anil Canbulat, Jorel Weiß, Hendrik Terhar

Verwendete Programmiersprache

Arduino C/C++

Verwendete Software

Arduino IDE, Autodesk Fusion 360 , Cura Eagle


Eingesetzte Hardware

Ultimaker 2+ ,Platinenfräse

Projektdateien

Google Drive

Idee[Bearbeiten]

Die Idee zu diesem Projekt entstand im Hinblick auf Nutzer, die in ihrem Tastgefühl (z.B durch Prothesen) eingeschränkt sind und ein leicht anpassbares, effizientes Assistenzsystem suchen.

Materialliste[Bearbeiten]

Material Modell Kosten Anzahl Gesamtkosten Link
Drucksensor Force-Sensing Resistor FSR 400 Short 0.2N 6,95€/Stück 4 27,80€ Eckstein
Vibrationsmotoren JOYKK DC 3V 70mA 12000 ± 2500RPM 3,70€/10 Stück 4 3,70€ Amazon
Mikrocontroller Esp32-Entwicklungsboard(siehe Anmerkung) 9,99€/Stück 1 9,99€ Conrad
Powerbank Power Bank Patsy 9,13€/Stück 1 9,13€ Griffits
Klettverschluss metalbucklestrapsx2 2,5cm x 50cm 7,89€/2 Stück 2 7,89€ Amazon
NPN-Transistoren Diotec Transistor 0,03998€/Stück 4 0,16€ Conrad
Widerstand Metallschicht Widerstände 0,02€/Stück 8 0,16€ Modellbau-Schonwitz
Summe 58,83€

In diesem Fall wurde das "NodeMCU ESP32S"-Entwicklungsboard verwendet, auch wenn andere ESP32-basierte Boards prinzipiell ebenfalls funktionieren.

ACHTUNG:Diese unterscheiden sich meist im Pinout des Entwicklungsboards, weshalb sie inkompatibel mit der Platine sind und kleinere Änderungen im Code benötigen.

Platine[Bearbeiten]

Idee[Bearbeiten]

Der erste prototypische Aufbau erfolgte mithilfe von Breadboards und normalen Verbindungskabeln, wurde aber schnell zu klobig und anfällig gegen äußere Einflüsse. Daraus entstand die Idee zum Bau einer Platine. Anstatt mit einer herkömmlichen Lochplatine, war es uns durch die (mehrmalige) Unterstützung des FabLabs möglich unsere Platine vor Ort fräsen zu lassen. Dank dieser Platine wurde der Aufbau überhaupt tragbar und kompakt genug, um den Nutzer im Alltag möglichst wenig zu behindern. Der Aufbau ist allerdings genauso mit einer Lochplatine umsetzbar. Andernfalls existieren mittlerweile viele Platinen-Hersteller, die auch kleine Produktionsserien kostengünstig fertigen und damit eine Alternative zum Selbstbau darstellen.

Aufbau der Platine[Bearbeiten]

Ziel der Platine ist es, entsprechend eines Sensors einen kleinen Vibrationsmotor anzutreiben. Der Sensor ist in diesem Fall ein FSR402, der einen druckabhängigen elektrischen Widerstand besitzt. Dieser ergibt sich mithilfe eines Spannungsteilers zwischen Sensor und einem fest verbauten Widerstand. Die danach am Pin anliegende Spannung wird dann vom ESP32 verarbeitet. Dieser Aufbau findet sich 4-mal auf der Platine und füllt den oberen Teil aus. Erwähnenswert ist auch, dass der GND-Pin des ESP32 mit der nichtbenutzten Fläche der Platine kurzgeschlossen ist, was besonders bei der Platzierung der Transistoren geholfen hat.

Diese sitzen im unteren Teil und dienen dazu die Motoren zu kontrollieren. Der ESP32 erzeugt gemäß der gemessenen Werte verschiedene PWM-Signale, welche die Steuerspannung für die Diotec NPN-Transistoren darstellen, welche wiederum für die Drehzahl der Motoren verantwortlich sind, indem sie die Verbindung zwischen den Motoren und GND regulieren. Ein PWM(Pulse-Width-Modulated)-Signal ist ein Signal, mit einer rechteckigen Spannungskurve mit variierender Dauer von "High"- und "Low"-Abschnitten. Je länger das Signal "High" bleibt, desto höher ist der mittlere Stromdurchfluss. Dadurch ist es möglich mit digitalen Signalen, welche eigentlich nur "High"/"Low" kennen, auch Zwischenstufen abzubilden. Oft wir dies zur Steuerung von Motoren oder Leuchtelementen benutzt, in diesem Fall begrenzt es jedoch nur den Stromfluss zum Motor als annähernd analoges Signal.

Die Motoren werden gespeist über eine 5V-Schiene, welche über den Pin-Header auf den V(in)-Pin und dann mit dem Micro-USB-Anschluss des ESP32 durchverbunden ist. In früheren Versionen der Platine befand sich auf dieser Schiene noch eine Verbindung für eine 5V-Stromversorgung mittels eines Powerbankmoduls für 18650-LiIon-Zellen, welches leider nicht mehr rechtzeitig zum Präsentationstermin aus Übersee angekommen ist.

Stattdessen erfolgt die Stromversorgung nun direkt über eine handelsübliche Powerbank für Mobilgeräte, welche direkt am Micro-USB-Anschluss des ESP32 angeschlossen wird. Der Aufbau wird dadurch zwar ausladender, jedoch verteilt sich das Gewicht auch besser.

3D-Druck[Bearbeiten]

Alle 3D Drucke wurden aus dem Kunstoff PLA und in der Farbe Anthrazit gedruckt.

Fingerkuppe[Bearbeiten]

Auf der Fingerkuppe liegt sitzt eine Art Plättchen, welches die kleine Sensoroberfläche kompensieren soll, indem Druck von der größeren Plättchenfläche auf die kleinere Sensorfläche übertragen wird. Dieses Plättchen besitzt eine glatte Oberfläche nach außen hin und einen einzelnen Noppen zum Sensor hin, welcher in seiner Größe auf die Sensorfläche abgestimmt ist. Dadurch wird der Sensor effektiv mit mehr Druck belastet, gibt also höhere Werte aus. Falls Sensor/Plättchen/ggf. beides ausgetauscht werden, muss innerhalb des Codes dafür kompensiert werden. Die Maße des Plättchens betrugen in unserem Fall 20mm x 10mm. Die Höhe des Noppens ist irrelevant, solange sichergestellt ist, dass Plättchen und Sensor sich nur in der Mitte des Sensors berühren. Wie glatt die Oberfläche wird ist abhängig vom Drucker und der eventuellen Nachbearbeitung des Drucks mit Schleifpapier. Die Platine unterstützt ohne Modifikationen bis zu 4 seperate Sensoren mit je einer Aktorik. Daher werden insgesamt 4 Plättchen benötigt.

Platinenhalter[Bearbeiten]

Der Platinenhalter hat die Form eines Rechtecks.Sie besitzt die Maße 60,22mm x 46,6mm x 7,83mm. Die kleinen Löcher an den Ecken werden zum Befestigen an den Handschuh benötigt.Sie besitzt eine zusätzliche Befestigung an der Oberkante der Halterung ,welche 5mm nach außen und 2,5mm nach oben verläuft.Diese dient zum fixieren der Platine. Bei alltäglichem Gebrauch empfiehlt es sich mithilfe der Bohrungen am ESP32-Board eine weitere Abdeckung anzubauen um die Robustheit des Systems zu erhöhen.

Batteriehalter[Bearbeiten]

Der Batteriehalter hat die Form eines Trapezes.Sie besitzt die Maße 97,7mm x 44,2 mm x 12,07 mm. Es ist für eine Powerbank der Größe 97,70mm x 25,8mm konstruiert worden. Die vier Öffnungen am Boden der Halterung dienen als Kabelkanäle, um die Vibrationsmotoren mit der Platine zu verbinden. Die Zacken am Modell ist ein zusätzlicher Schutz vor dem Verrutschen. Die Aushöhlungen an den beiden Seiten der Halterung erfüllt den Zweck, die Powerbank auf dem Arm zu fixieren und mit Hilfe eines Klettbands durch die Öffnungen zu führen und diese festzuzurren. Bei längerfristigem Gebrauch kann auf Klettband verzichtet und stattdessen ein elastischeres Band verwendet werden. Weitere Modifikationen müssen an den jeweiligen Nutzungszweck angepasst werden.


Aufbau[Bearbeiten]

DruPro Prototyp

Der Handschuh dient bei diesem Projekt nur als Beispielobjekt und ist für Prothesenbenutzer optional.Die Drucksensoren werden mit der Rückseite an den Handschuh bzw. Prothese mit doppelseitigen Klebeband oder ähnlichen Hilfsmitteln geklebt. Auf der Vorderseite der Drucksensoren wird um den Druckpunkt zu vergrößern die Fingerkuppe angeklebt. Die bestückte Platine wird in den Platinenhalter eingeklickt und dann mit doppelseitigen Klebeband an den Handrücken des Handschuhs bzw. Prothese befestigt. Nun zur Stromquelle, diese ist eine einfache Powerbank, die am Unterarm befestigt wird.Zur einfachen Befestigung die von uns benutzte Powerbank hatte eine zentrier Vorrichtung, die an den Handschuh angenäht wurde. Optional kann die Powerbank auch mit doppelseitigen Klebeband an der Prothese fixiert werden. Zur Befestigung am Unterarm wird Klettband verwendet.Die einzelnen Bauteile werden jeweils mit Kabeln verbunden, die an die jeweiligen Komponenten gelötet werden.Die Vibrationsmotoren werden mit der Klebeseite oder Doppelseitigen Klebeband zur Verstärkung der Klebekraft an das Klettband angeklebt und so positioniert, dass es für den Anwender am angenehmsten ist.Das Klettband kann so verschoben werden wie es für den Anwender am Sinnvollsten ist.

Code[Bearbeiten]


const int PWMout1 = 33; //Pinbelegung für die 4 Vibrationsmotoren
const int PWMout2 = 32;
const int PWMout3 = 35; 
const int PWMout4 = 34;      
                       
const int frq = 5000;               
const int ch1 = 0; // 4 PWM-Kanale, auf ESP32 bis zu 8 problemlos verfügbar,
const int ch2 =1;
const int ch3 =2;
const int ch4 =3;

                           
const int res = 8;//Auflösung am Ausgang in Bit


void setup() {             //läuft einmalig und bei reset
 Serial.begin(115200);     //Start von Serielle Komunikation mit 115200 Baudrate
 ledcSetup(ch1, frq, res); //Konfig. v. PWM
   
  ledcAttachPin(PWMout1, ch1);
  ledcAttachPin(PWMout2, ch2);
  ledcAttachPin(PWMout3, ch3);
  ledcAttachPin(PWMout4, ch4);
  
  
}

void loop() {

// die einzelnen Methoden für die Steuerung der Motoren werden ausgeführt
gebeWertAus(26);  
gebeWertAus2(27);
gebeWertAus3(14);
gebeWertAus3(12);

}

double Mittelwert(int pin){  // int pin ist der Pinname, von der die Werte gelesen werden soll
  double summe = 0; 
  
  for(int i=1;i<=10000;i++){
    sensorValue = analogRead(pin);  // analoge Wert wird auf dem Pin(int pin) gelesen und 
                                       zwischen den Bereich 0 und 1023 vom Drucksensor zurückgegeben.Diese wird 1000x wiederholt.
    summe+=sensorValue;
   // Serial.println(sensorValue);
  }
  double mittelwert = summe / 10000; // Durschnittswert(1000 Werte)wird zurückgegeben 
  
  return mittelwert;
}

// Methoden um die Motoren anzusteuern 

void gebeWertAus(int pin){        // int pin ist der Pinname, von der die Werte gelesen werden soll
 float cycle = Mittelwert(pin);   // der Durschnittswert wird über die Methode Mittelwert berechnet und der Parameter cycle übergeben
 ledcWrite(ch1,cycle+62);         // ansteuern der Motoren auf dem Channel 1 mit der Pinbelegung 33
  
}

  void gebeWertAus2(int pin){
  double cycle = Mittelwert(pin);

ledcWrite(ch2,cycle+62);
  
}

  void gebeWertAus3(int pin){
  double cycle = Mittelwert(pin);
   ledcWrite(ch3,cycle+62);
  
}



void gebeWertAus4(int pin){
  double cycle = Mittelwert(pin);
  ledcWrite(ch4,cycle+62);
  
}