Lesen Sie, wie aus einem einfachen Ultraschallsensor, einem Vibrationsmotor und ein oder zwei Mikrocontrollern ein praktisches Upgrade für eine Gehhilfe wurde. Dieses Ultraschall-Hinderniserkennungsmodul ist in der Lage, Objekte in bis zu vier Metern Entfernung zu erkennen.

Projektübersicht

Dieses Projekt geht auf eine Anfrage meines Onkels zurück, der in einem Altersheim lebte und erhebliche Sehprobleme hatte. Er benutzte eine Gehhilfe, hatte aber Schwierigkeiten, Hindernisse auf seinem Weg zu erkennen, was eine tägliche Herausforderung darstellte. Um ihm zu helfen, sich so gut wie möglich fortzubewegen, habe ich ein Modul zur Hinderniserkennung mit Ultraschall entwickelt. Es ist in der Lage, Objekte in einer Entfernung von bis zu 4 m mit einem Erfassungswinkel von etwa 20° zu erkennen. Wenn ein Hindernis erkannt wird, leuchtet eine rote LED auf, und ein Mikromotor wird aktiviert, um Vibrationen am Rahmen der Gehhilfe zu erzeugen, die der Benutzer als Warnung wahrnehmen kann.

Erste Version

Um das Projekt einfach und modular zu halten, wurde ein Arduino Nano für dieses Projekt verwendet, sowie ein fertiges Grove-Ultraschallsensormodul von Seeed Studio (Bild 1). Die Erzeugung von Vibrationen ist einfach: Man befestigt einfach eine exzentrische Masse an der Welle eines kleinen Motors. Um die Aufgabe noch einfacher zu machen, habe ich hier das Modul Vibration Motor Unit (N20) von M5Stack verwendet, das für knapp drei Euro eine fertige Einheit bietet.

PCB to hold the Arduino Nano
Bild 1: Eine ordentliche Platine zur Aufnahme des Arduino Nano.

Neben dem Motor und der exzentrischen Masse enthält es eine Flyback-Diode und einen MOSFET zur Steuerung des Motors über einen GPIO-Pin des Mikrocontrollers. Das Ganze ist in einem Kunststoffgehäuse untergebracht, das sich mit Hilfe der beiden Befestigungslöcher leicht in der Nähe der Griffe der Gehhilfe anbringen lässt (Bild 2).

Vibration motor is bolted near the handle
Bild 2: Der Vibrationsmotor ist in der Nähe des Griffs angeschraubt. Ein Stück PVC-Rohr verdeckt die Verkabelung.

 

Schaltplan

Der Schaltplan ist in Bild 3 dargestellt. Für den Arduino Nano wurde eine eigene Platine entwickelt, die mit Anschlüssen für die Verkabelung des Vibrationsmotors und des Ultraschallsensormoduls ausgestattet ist. Sowohl die Vibrationsintensität als auch der Erfassungsbereich sind mit zwei Potentiometern RA1 und RA2 einstellbar. Ein Jumper (JP1) ermöglicht die schnelle Auswahl eines Standard-Erfassungsbereichs von einem Meter und der maximalen Motorleistung. Die Platine ist über einen 10-poligen Stecker mit dem Mikromotormodul verbunden, der mit einer 3,5-mm-Stereo-Klinkenbuchse am Gehäuse verdrahtet ist. Von dort zum Motor wird ein Standard 3,5 mm Stereokabel verwendet.

Project scematic
Bild 3: Schaltplan des Arduino-Boards.

Die Stromversorgung erfolgt über ein USB-Kabel, das mit einer 5V USB-Powerbank verbunden ist. Der 10Ah Akku bietet eine Betriebsdauer von etwa einer Woche, und das Aufladen erfolgt bequem über ein Standard Handy Ladegerät. Ein bekanntes Problem mit diesen USB-Powerbanks ist ihre Tendenz, sich abzuschalten, wenn die Stromaufnahme zu gering ist. Um dies zu verhindern, verwendet die Schaltung einen MOSFET (T1), der die Lastwiderstände (R3 bis R8) regelmäßig für einige Millisekunden aktiviert und einen kurzen Stromimpuls zieht, um die Powerbank wach zu halten. Die LED1 zeigt diese Impulse optisch an. Dieser Ansatz ist inspiriert von dem in Elektor veröffentlichten Projekt "USB Battery Interface". Das Potentiometer RA3 regelt das Intervall, in dem sich die USB-Batterie nicht ausschaltet.

 

Eine zweifarbige LED (DL1) signalisiert den Systemstatus: grün für normalen Betrieb, rot, wenn ein Hindernis erkannt wird. Falls gewünscht, kann die LED mit dem JP3-Jumper deaktiviert werden. Auf der Platine habe ich einen Platz für ein 8-poliges GY-521-Modul vorgesehen, das einen MPU6050-Beschleunigungssensor verwendet, der in Zukunft hinzugefügt werden soll, um Bewegungen zu erkennen und das System automatisch aufzuwecken. Letztendlich wurde diese Funktion aber nicht genutzt.

Praktischer Aufbau

Die Leiterplatte und der Ultraschallwandler passen in ein durchsichtiges Hammond-Gehäuse, das unter dem Sitz der Gehhilfe montiert wurde, wobei der Sensor nach vorne zeigt. Das Steuergerät, die Batterie und die Kabel sind unter dem Sitz (Bild 4) mit Kabelbindern und kleinen, speziell angefertigten Blechklammern befestigt. Natürlich müssen sehr kurze Schrauben verwendet werden, damit sie nicht ganz durch das Holzbrett gehen.

Project mounted under the seat
Bild 4: Montage unter dem Sitz.

Arduino Software

Die Software ist recht einfach; der Erfassungsabstand, die Schwingungsintensität der Vibrationen (d. h. die Motordrehzahl) und die Verzögerungszeit, mit der verhindert werden soll, dass sich der USB-Akku ausschaltet, können konfiguriert werden. Je nach verwendetem Akkumodell muss das genaue Timing dieser Impulse eventuell angepasst werden. Ein Debug-Modus ist ebenfalls verfügbar, um Echtzeit-Debug-Informationen über den seriellen Monitor anzuzeigen.

 

Die Bibliothek Ultrasonic.h muss eingebunden werden, um die Verwendung des Grove-Ultraschallsensors zu ermöglichen:#include "Ultrasonic.h". Anschließend werden mehrere Konstanten definiert, um die Eingangs- und Ausgangspins zu verwalten und um Standardwerte für verschiedene Parameter festzulegen. In setup(), werden die relevanten Eingangs- und Ausgangspins konfiguriert, der PWM-Ausgang sowie die serielle Schnittstelle initialisiert.

 

In der Hauptschleife loop(), misst das Programm kontinuierlich die Entfernung zu einem Hindernis mit Hilfe des Ultraschallsensors mit einer eingebauten Funktion in der Ultrasonic-Bibliothek (RangeInCentimeters = ultrasonic.MeasureInCentimeters();) und liest die analogen Spannungen an den Potentiometereingängen aus. Wenn ein Objekt innerhalb des konfigurierten Bereichs erkannt wird, leuchtet eine rote LED auf und ein PWM-Signal wird gesendet, um den Vibrationsmotor zu aktivieren. Schließlich hält die Hauptschleife auch die USB-Powerbank aktiv, indem sie die Lastwiderstände wiederholt für ein paar Millisekunden ein- und dann wieder ausschaltet.

Das Projekt entwickelt sich weiter

Nach den Praxistests wies mein Onkel (ein besonders anspruchsvoller Benutzer) darauf hin, dass der Erfassungswinkel des Ultraschallsensors von 20° nicht ausreicht, insbesondere um Hindernisse an den Seiten des Gehwagens zu erkennen. Um den Erfassungsbereich zu vergrößern, gab es mehrere Möglichkeiten; ich entschied mich dafür, den Ultraschallsensor an einer Halterung zu befestigen und ihn mit einem kleinen RC-Servo zu schwenken (Bild 5).

Sensor on its pivot
Bild 5: Der Sensor auf seinem Drehpunkt.

Da ich Änderungen an der bestehenden Platine und der Arduino-Software vermeiden wollte, nahm ich dies zum Anlass, eine zweite Platine zur Steuerung des Servos zu bauen, diesmal mit einem kleinen XIAO SAMD21-Modul von Seeed Studio , das ich auf Lager hatte. Das Ergebnis ist in Bild 6 zu sehen.

Secondary board
Bild 6: Sekundäre Platine zur Ansteuerung des Servos.

Mit drei Potentiometern lassen sich der minimale und maximale Winkel sowie die Abtastrate einstellen. Dies ermöglicht bei Bedarf einen Sweep-Scan von bis zu 180°. Der Schaltplan ist in Bild 7 dargestellt.

Schematic of servo control module
Bild 7: Schaltplan des zusätzlichen Servosteuermoduls.

Diese zweite SAMD21-Platine wird mit Strom versorgt, indem sie über den Anschluss CN1 (der mit CN2 auf der ersten Platine verbunden ist) an die oben beschriebene erste Arduino-Platine angeschlossen wird. Auf diese Weise sind die beiden Platinen und der Ultraschallsensor in Reihe geschaltet, wobei der Ultraschallsensor an CN2 des SAMD21-Moduls angeschlossen ist. Auf diese Weise wird die Verdrahtung einfach gehalten; die primäre Arduino-Platine übernimmt weiterhin die Steuerung des Sensors. Der Servo und der Sensor sind durch ein kleines 3D-gedrucktes Gehäuse geschützt, für das die 3D-Modelldatei bei Elektor Labs erhältlich ist.

SAMD21 Software

Die Arduino-Umgebung wurde auch zur Programmierung des XIAO-Moduls verwendet. Nach Einbindung der Bibliotheken Servo.h und Arduino.h wird der Servo an Pin 9 angeschlossen. Die Potentiometer-Eingänge werden konfiguriert, und die serielle Kommunikation wird mit 9600 Baud gestartet. In der Hauptschleife werden die Potentiometerwerte gelesen und in Winkel (zwischen 0 und 180 Grad) und eine Sweep-Dauer (bis zu 3000 ms) umgewandelt. Es wird die Funktion servo.write() verwendet, die den gewünschten Winkel für den Servo als Argument erhält. Um eine gleichmäßige Bewegung zu erreichen, habe ich mich für eine Bewegung in 20-ms-Schritten entschieden. Daher wird die Dauer des Sweeps (in Millisekunden) durch 20 geteilt, um die Anzahl der benötigten Schritte zu ermitteln. Der Winkel, um den sich das Servo in jedem Schritt bewegen muss, ist der gesamte Sweep-Winkel angleEnd - angleStart geteilt durch die Anzahl der Schritte. Eine for-Schleife wird verwendet, um alle Winkel Schritt für Schritt zu durchlaufen. Dann wird eine ähnliche Schleife aufgerufen, die in umgekehrter Richtung zählt, um eine gleichmäßige Bewegung in die entgegengesetzte Richtung zu erreichen, wie in Listing 1 zu sehen ist.


Listing 1: Ausschnitt aus dem Code der Servosteuerung.

void smoothControl(int angleStart, int angleEnd, int duration)

{
  int steps = duration / 20; // Divide duration into 20 ms steps
  float increment = (angleEnd - angleStart) / (float)steps;
  float angle = angleStart;

 

  // Forward transition
  for (int i = 0; i <= steps; i++) {
    angle = angleStart + increment * i;
    monServo.write(angle);
    delay(20); // Wait 20 ms between each step
  }

 

 
  int durationForward = duration; // Use the calculated duration

 

  // Return transition with the same duration
  for (int i = steps; i >= 0; i--) {
    angle = angleStart + increment * i;
    monServo.write(angle);
    delay(durationForward / steps); // Use the same duration for the return transition
  }
}


Der schwingende Sensor erleichtert die Erkennung von Hindernissen an den Seiten und hat sich als nützliche Ergänzung erwiesen. Ich betrachte diesen Artikel als eine kleine Hommage an meinen verstorbenen Onkel, mit dessen Bitte alles begann; ich bin froh, dass dieses Projekt ihm helfen konnte, ein gewisses Maß an Unabhängigkeit wiederzuerlangen. Ich hoffe, dass dieser Artikel Sie zu weiteren Ideen inspiriert, wie Sie Ihre Angehörigen pflegen können! Vielen Dank an Vincent, Bastian und Cyril für ihre wertvolle Hilfe.

Fragen oder Kommentare?

 

Haben Sie technische Fragen oder Kommentare zu diesem Artikel? Wenden Sie sich bitte an den Autor unter pascal.tours@gmail.com oder an Elektor unter editor@elektor.com.

 

Abonnieren
Tag-Benachrichtigung zu Test & Messung jetzt abonnieren!