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 Rev3 [A000066] – Vielseitiges Entwicklungsboard mit ATmega328P-Mikrocontroller, kompatibel mit Arduino IDE, ideal für Einsteiger und Elektronik-, Robotik- und DIY-Projekte.
- Sharp IR Infrarot Sensor GP2Y0A02YK zur Entfernungsmessung – Sharp GP2Y0A02YK Distanz-Sensor 1 St. 5 V/DC Reichweite max. (im Freifeld): 150cm
- 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));
}
}
Code-Sprache: Arduino (arduino)
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
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
Pingback: VCNL4000 Sensor für Entfernung und Helligkeit am Arduino | Makerblog.at
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 :)