Für ein kleines Roboterprojekt wollte ich mal mehr machen als die üblichen 1 oder 2 Entfernungssensoren, die im Bereich am Bug des des Roboters montiert sind und Hindernisse erkennen. Der Roboter soll während der Fahrt den Bereich in einem vorgegebenen Sichtwinkel permanent scannen und schnell entscheiden können, wo der Weg frei ist.

Um die Messungen des Sharp Infrarot Sensors GP2Y0A02YK zu visualisieren, gebe  ich die ermittelten Werte als Balken auf einem 8×8 LED Matrix Display aus.

Verwendet wurden:

  • Arduino Uno R3
  • Sharp IR Infrarot Sensor GP2Y0A02YK zur Entfernungsmessung
  • Modellbau Servo modellcraft RS-2 (angesteuert mit Servo.h, der Servo Library für Arduino)
  • 8×8 LED MAtrix Display mit MAX 7219 Treiber, angesteuert mit der MaxMatrix Library für Arduino

In Schritten von 4 Grad werden 24 Messungen durchgeführt und jeweils der Mittelwert von 3 Schritten auf einem der 8 Balken des Displays angezeigt. So ergibt sich ein einfaches Bild der Umgebung. Kürzere Balken bedeuten, das ein Hindernis erkannt wurde.

Das Video zum Projekt gibts hier:

Nachtrag:
Nachdem es einige Anfragen nach dem Sourcecode für diesen Aufbau gab, hier meine paar Zeilen. Ich habe ein paar Kommentare hinzugefügt, weiß aber, dass der Sketch trotzdem ziemlich hässlicher Code ist :/

#include <Servo.h>
#include <MaxMatrix.h>
 
int val;
int dist;
int distSum;
int tempMeas;
 
// 24 Messungen in 4 Grad Schritten
int viewDistance[24];
int viewPos = 0;
int viewPosMultiplier = 4;
int viewPosDx = +1;
int angle;
 
// LED Ansteuerung
// näheres in meinem LED-Display Tutorial
int LEDdata = 8;
int LEDload = 9;
int LEDclock = 10;
int LEDmaxInUse = 1;
 
double colData;
 
MaxMatrix m(LEDdata, LEDload, LEDclock, LEDmaxInUse);
Servo myservo;
 
void setup()
{
  myservo.attach(11);
  Serial.begin(9600);
  m.init();
  m.setIntensity(10);  
}
 
void loop()
{
 
  angle = viewPos * viewPosMultiplier;
  Serial.println(angle);
  myservo.write(angle);
  delay(200);
 
  // Entfernungssensor an Analog Pin 5
  tempMeas = analogRead(5);
 
  viewDistance[viewPos] = (int)tempMeas/1;
 
  viewPos = viewPos + viewPosDx;
 
  if (viewPos < 0) {     viewPos = 0;     viewPosDx = -viewPosDx;   }   if (viewPos > 23) {
    viewPos = 23;
    viewPosDx = -viewPosDx;   
  }
 
  // Hier werden jeweils 3 Messungen zu einem Wert zusammengefasst, die resultierenden 8 Werte können dann am Display angezeigt werden
  for (int x=0; x <= 7; x++) 
  {
    distSum = 0;
    for (int y=0; y <= 2; y++)
    {
      distSum += viewDistance[x*3+y];
    }
    dist = distSum / 3;
    Serial.print(dist);
    Serial.print("-");
 
    // Der Distanzwert wird auf den Wertebereich 0-7 gemapped, damit er auf die 8 LEDs passt. 
    // Die Start- und Endwerte 60 und 500 sind experimentell mit der Ausgabe auf den seriellen Monitor ermittelt. 
    // Bei Bedarf einfach anpassen.
    dist = map(dist,60,500,0,7);
    colData = pow(2.0, dist)-1.0;
    m.setColumn(7-x, (int)(255.0-colData+0.5));  
  }
}

4 thoughts on “Hindernisse erkennen mit Arduino, Servo und dem IR Sensor GP2Y0A02YK von Sharp

  • 29. Oktober 2014 um 22:18
    Permalink

    Hallo,
    gibt es den Sketch auch zu diesem Test im Download im Internet zu finden?
    Wäre schön, wenn ich Ihn von Ihnen bekommen könnte.
    Gerne per Email.

    Gruß
    Ulrich Engel

    Antworten
  • 16. November 2014 um 17:11
    Permalink

    Vielen Dank für den Nachtrag zum Projekt (Sketch).
    Da ich noch Neuling im Thema bin und aktuell sehr viel aus fertigen Projekten lernen kann, möchte ich auch dieses Projekt einmal ausführlich bearbeiten, nachbauen und erweitern.
    Nun meine Frage: Gibt es zu diesem Aufbau eine Verkabelungs-Skizze? Die Pinbelegung ist ja wichtig, um den obigen Sketch auch zu nutzen.
    LG aus Berlin
    Ulrich Engel

    Antworten
  • Pingback: VCNL4000 Sensor für Entfernung und Helligkeit am Arduino | Makerblog.at

  • 4. Februar 2017 um 4:32
    Permalink

    Klasse Idee, vielen Dank fuer die umfangreichen Infos. Ich denke drueber nach, das bei meinem aktuellen Projekt (Laufroboter nach Theo Jansen) umzusetzen. Ich werde berichten :)

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.