Projekt: Ein elektronischer Blindenstock mit Arduino Nano
Bild des fertigen Blindenstocks mit Gehäuse in Form einer Taschenlampe

Beschreibung

Mit einem Ultraschall-Sensor wird die Distanz zu einem Hindernis gemessen, und je nach gemessenem Abstand ein Vibrations-Signal erzeugt. Damit sich die Schaltung zusammen mit der Stromversorgung gut in der Hand halten lässt, gibt es hierzu auch ein Gehäuse, das ähnlich wie eine Taschenlampe aussieht. Mit einem entssprechenden Arduino-Programm lässt sich die Empfindlichkeit der Messung (Standardmäßig 1,5 Meter, geht bis 3 Meter) und die Signale einstellen.

Was kann man damit machen?
Hindernisse erkennen bzw. Abstände abschätzen (je nach Programmierung).

Was kann man damit nicht machen?
Die Umgebung abtasten oder Sachen / Personen beiseite schieben. ;-)

Teile-Liste
Bild der Komponenten des elektronischen Blindenstocks vor dem Zusammenbau

3D-Druck

Die mit OpenSCAD erstellte STL-Datei ist so ausgelegt, dass die beiden Vibrationsmotoren mit Silikonmasse (alternativ Heißkleber) mit genügend Bewegungsfreiheit "locker" eingeklebt werden können. Ein Arduino mit oder bereits eingelötete Stiftleiste sollte so in die kleine Öffnung am oberen Ende passen, dass die USB-Dose für die Programmierung zugänglich ist, und für den Schalter, mit dem der Blindenstock ein- und ausgeschaltet werden kann, ist ebenfalls eine Aussparung vorgesehen. Ganz vorne ist eine rechteckige Öffnung für den Ultraschallsensor, der (abgesehen von der Batterie) das größte Element ist. Die 9V-Batterie kann am hinteren Ende des Gehäuses eingeschoben werden, das dann mit einer Verschlusskappe geschlossen wird.

Hier 'blindenstock.stl' herunterladen

Der große Gehäuseteil und die Verschlusskappe sollten natürlich separat gedruckt werden. Als Material hat sich TPU (Thermo-Polyurethan), ein sehr elastischer und bruchfester Kunststoff, bewährt. PLA (das am meisten gebräuchliche Filament) oder PETG funktionieren aber auch. Ein Ausdruck ohne Stützmaterial ist möglich (ggf. Druckgeschwindigkeit und Schichthöhe für beste Ergebnisse reduzieren).

Zusammenbau / Löten

Hinweis: Die Batterie wird als letztes eingebaut und darf weder während des Zusammenbaus vorher, noch beim Programmieren des Arduino angeschlossen sein. Kurzschlussgefahr!

Schaltplan Blindenstock Skizze

Profis, die mit dem Schaltplan und dem Gehäuse auch ohne Anleitung zurecht kommen, können von hier alles bis zum Punkt "Programmieren" überspringen

1. Vibrationsmotoren befestigen

In die beiden langen Aussparungen an der Seite des Gehäuses muss eine Bahn Silikonmasse vorsichtigt aufgebracht werden, die Motoren werden dann vorsichtig eingedrückt, wobei die Kabel durch die kleinen Öffnungen in Richtung des vorderen Gehäuseteils gesteckt werden. Statt Silikon kann auch ein flexibler Kleber verwendet werden (kein Superkleber!), oder dickes doppelseitiges Klebeband. Die Motoren dürfen nicht fest mit dem Gehäuse verbunden werden, da man sonst die Bewegung nicht gut spürt und das Gerät "laut" wird. Die Silikonmasse sollte einen Tag aushärten, so lange kann man die Motoren mit Gummiband fixieren.

2. Löten: Schalter

WARNUNG, Verletzungsgefahr: Wer noch keine Löt-Erfahrung hat oder sich das selbst-zusammenlöten nicht zutraut, sollte sich von jemand mit entsprechender Erfahrung oder Ausbildung helfen lassen.

Die Kabelenden des Batterie-Anschlusskabels werden von der hinteren Gehäuseseite eingesteckt. Das schwarze (Minus-)Kabel wird erst später mit dem Arduino verlötet, das rote muss durch die kleine Öffnung für den Schalter herausgezogen werden, und mit dem mittleren Schalteranschluss verlötet werden.

Danach wird am Schalter ein (am besten auch rotes) Kabel, ca. 8cm lang, am vorderen Anschluss festgelötet und durch die Schalter-Öffnung nach vorne durchgeleitet, damit der Arduino mit Strom versorgt werden kann. Der Schalter kann anschließend mit den beiden kleinen Schrauben am Gehäuse festgeschraubt werden.

3. Löten: Sensor, Motoren, Stromversorgung

Im weiteren Verlauf ist die Reihenfolge nicht mehr so wichtig. Die für die Verbindung zwischen den Komponenten verwendeten Kabel sollten so dünn sein, dass jeweils zwei davon in einen Lötanschluss des Arduino Nano passen, und nach dem Einlöten auch noch einmal mit Heißkleber oder einem starken Alleskleber zusätzlich an der Platine "angeklebt" werden, so dass sie bei einem leichten Zug, wie er beim Einbauen oder Verschieben im Gehäuse immer mal entstehen kann, nicht abreißen. Der Schaltplan und die Anschlussbelegungs-Tabelle darunter zeigen, wie die einzelnen Bauteile miteinander verbunden werden müssen.

Motor 1 rotArduino pin D4
Motor 2 rotArduino pin D5
Sensor trigArduino pin D6
Sensor echoArduino pin D7
Sensor vccArduino pin 5V
Sensor gndArduino GND
Batteriehalter schwarzes KabelArduino GND
Motor 1 blauArduino GND
Motor 2 blauArduino GND
Schalter (9V) rotArduino pin Vin

Da der Arduino zwei GND-Lötanschlüsse besitzt, klappt es mit etwas Geschick so, dass dort je zwei Kabel in einem Lötanschluss sitzen.

Der Arduino wird nun vorsichtig (damit keine Kabel abreißen) in die Öffnung am vorderen Teil des Gehäuses eingeschoben, und da noch etwas Platz ist, von der Wand mit Hilfe von doppelseitigen Klebeband oder kleinen Schaumgummi-Pads auf Abstand gehalten werden, so dass die USB-Buchse genau in der dafür vorgesehenen Aussparung landet.

Programmierung

Der Arduino Nano ist ein Microcontroller, also eine Art Mini-Computer, auf dem im wesentlichen nur ein einzoges Programm läuft, das man selbst auf den Chip "flashen" muss. Hierzu wird ein USB-Programmierkabel an den Arduino angeschlossen und mit dem Computer verbunden. Zum Programmieren und Hochladen des Programms auf den Arduino wird eine Software verwendet, die zufällig genauso heißt wie der Microcontroller: https://www.arduino.cc/en/software

Da die Arduino-Entwicklungsumgebung auch sehr viele andere Microcontroller unterstützt, muss für unser Programm zunächst in den Einstellungen die entsprechende "Board Support Package" ausgewählt werden: "Arduino AVR Boards" → "Arduino Nano". Unter "Prozessor" sollte "Atmega328P (Old Bootloader)" und als "Programmer", da wir per USB das Programm auf den Chip flashen, sollte "USBasp" ausgewählt sein (zumindest hat es in den Tests so geklappt, man kann nicht viel falsch machen, schlimmstenfalls funktioniert das Hochladen mit diesen Einstellungen nicht und muss mit anderen neu probiert werden).

Das Programm

Der Arduino soll in einer "Endlosschleife"...

  1. Einen Ultraschall-Impuls (10 Millisekunden Dauer) senden,
  2. Über eine Laufzeit-Messung des reflektierten Impulses herausfinden, wie weit das Hindernis vom Sensor entfernt ist,
  3. gesteuert durch die Entfernungsmessung die Motoren so vibrieren lassen, dass man eine Idee davon bekommt, wie weit das Hindernis entfernt ist.

Dabei hat es sich herausgestellt, dass es zwar möglich ist, auch sehr weit entferne Objekte (z.B. durch leichtes Ticken der Motoren) zu melden, aber wenn die Einstellung zu empfindlich ist, verwirrt es eher Dinge, die nicht ansatzweise in greifbarer Nähe sind, zu erfassen. Im folgenden Beispiel ist der elektronische Blindenstock so eingestellt, dass die Reichweite etwa der eines herkömmlichen Langstocks (1,5m) entspricht, und Objekte, die sich weniger als 50cm vor dem Sensor befinden, werden als "Maximum" gemeldet. So lassen sich auch z.B. Türöffnungen finden.

Mit den Werten der Variablen ganz am Anfang des Programms lässt sich das Verhalten des eletronischen Blindenstocks auch ohne großen Aufwand verändern.

/******************************\
* Digital cane for blind users *
* (C) Klaus Knopper 2023       *
* License: GPL V2              *
* Firmware for Arduino Nano.   *
\******************************/

#include <Arduino.h>

const int max_distance = 150; // Ignore everything beyond this distance (cm)
const int min_distance =  50; // Full intensity below this distance
const int min_time_on  =  50; // minimum time on for vibration motor
const int trigPin      =   6; // pin D6
const int echoPin      =   7; // pin D7
const int left_Motor   =   4; // pin D4
const int right_Motor  =   5; // pin D5

/* Forward declarations */
int sensor();
void motors(int);

void setup() {
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin,INPUT);
  pinMode(left_Motor,OUTPUT);
  pinMode(right_Motor,OUTPUT);
  Serial.begin(115200);
}

void loop(){
  int intensity = sensor();
  motors(intensity);
}

int sensor(){
  int duration, distance, intensity=0;
  digitalWrite (trigPin, HIGH);
  delayMicroseconds (10);
  digitalWrite (trigPin, LOW);
  duration = pulseIn (echoPin, HIGH);
  distance = (duration/2) / 29.1;
  //distance= duration*0.034/2;
  Serial.print("Distance ");
  Serial.print(distance);
  Serial.print("cm\n\r");
  if(distance > max_distance){
   return 0;
  }
  distance -= min_distance; /* bias */
  intensity = 100 * (max_distance - distance ) / max_distance;
  if(intensity>100) intensity=100;
  return intensity;
}

// motors() duration should be exactly 100 ms in which one or both motors are "on"
void motors(int intensity){
 static int on = 0, skip=0;
 int skips_total = (100 - intensity) / 10;
 Serial.print("Motor intensity: ");
 Serial.print(intensity);
 Serial.print("\n\r");
 if(intensity && !skip){
   if(!on){
     digitalWrite (left_Motor, HIGH);
     digitalWrite (right_Motor, HIGH);
     on = 1;
   }
 } else {
   if(on){
     digitalWrite (left_Motor, LOW);
     digitalWrite (right_Motor, LOW);
     on = 0;
   }
 }
 skip++;
 if(skip > skips_total) skip = 0;
 delay(min_time_on);
}

Wie man hier vielleicht auch erkennt, werden die gemessenen Distanz-Werte auch auf der "Konsole", die in der Arduino-Programmiersoftware aktiviert werden kann, ausgegeben. So kann man testen, ob der Sensor funktioniert und welche Distanzen er erfassen kann.

Achtung: Sobald das Programm hochgeladen wurde, läuft es auf dem Arduino, und die Motoren werden zwangsläufig "brummen", sobald etwas näher als 1,5 Meter an den Sensor kommt, also bitte nicht erschrecken!
Zum "Ausschalten" kann einfach das USB-Kabel abgezogen werden. Der Arduino muss nicht "heruntergefahren" werden.

Fertig

Wenn das Programm zufriedenstellend arbeitet, ist es an der Zeit, den elektronischen Blindenstock fertig zu stellen. Der Platz über dem in das Gehäuse eingeschobenen Arduino wird nun mit dem dicken, doppelseitige Klebeband verschlössen (auch zur Isolation) und der Ultraschallsensor - möglichst gerade - darüber angebracht. Falls sich der Sensor anders nicht vernünftig befestigen lässt, kann er auch mit Heißkleber befestigt werden, dann lässt er sich später allerdings nicht mehr so einfach entfernen, wenn man den Arduino noch einmal neu programmieren will.

Jetzt kann auch die Batterie angeschlossen und im hinteren Teil des Gehäuses versenkt, und das Gehäuse mit der Verschlusskappe verschlossen werden.