Vor einigen Wochen habe ich kommentarlos dieses Video auf Youtube gepostet und viele Leser haben die Lösung natürlich gleich erraten.
Wie so oft ist das am wichtigsten, was man im Video nicht sieht. In diesem Fall ein Infrarot-Entfernungssensor von Sharp, der außerhalb des Bildes positioniert ist.
Der Projektaufbau ist eigentlich recht simpel. Der Sharp-IR-Sensor liefert einen Analogwert ans Arduino-Pin A0, der mit Hilfe der SharpIR Library in einen ungefähren Zentimeter-Wert umgerechnet wird. Damit die doch recht sprunghaften Messwerte des Sensors etwas geglättet werden, lege ich diese in einem Array mit den letzten 20 Messwerten ab und bilde daraus einen gleitenden Durchschnitt. Das führt auch zu einer schön fließenden Bewegung des beleuchteten LED-Bereichs.
Aus dem so ermittelten Abstand werden dann die LEDs auf dem WS2812B LED Streifen ermittelt, die eingeschaltet werden müssen. Fertig ist der Zauber.
Für das Projekt werden die folgenden Teile benötigt:
– Arduino Uno R3 (oder ähnlich)
– Sharp IR Sensor, z.B. GP2Y0A02YK
– WS2812B LED Streifen (60 LEDs)
– Netzteil mit 6V/4A
– Kleinteile wie ein Breadboard, 100 nF Kondensator, 200 Ohm Widerstand und einige Jumper-Kabel.
Hier das Tutorial-Video. Den benötigten Arduino-Sketch findet ihr weiter unten.
Die beiden im Sketch verwendeten Libraries können beide in der aktuellen Version über den Library Manager der Arduino IDE installiert werden.
/* WS2812B LED Stripe Magic - Demo * * Sharp IR Sensor: Analog Pin A0 * WS 2812B NeoPixel Pin: Digital 6 * * More information http://www.makerblog.at/2016/12/der-magische-ws2812b-led-streifen/ * */ #include <Adafruit_NeoPixel.h> #define PIN 6 #define NUMPIXELS 60 #include <SharpIR.h> #define ir A0 // Running average variables const int numReadings = 20; int readings[numReadings]; // the readings from the analog input int readIndex = 0; // the index of the current reading int total = 0; // the running total int average = 0; // the average int newValue = 0; int lastpixel = 0; SharpIR sharp(GP2Y0A02YK0F, A0); Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { Serial.begin(115200); pixels.begin(); // This initializes the NeoPixel library. // Reset running average array for (int thisReading = 0; thisReading < numReadings; thisReading++) { readings[thisReading] = 0; } } void loop() { int dis=sharp.getDistance(); // this returns the distance to the object // map distance to LED strip // map 20-110cm distance to LEDs #0 to #59 // play with this value to match your LED strip int dispix = map(dis,18,95,0,60); // Ignore results out of bound, send -10 to average array instead // This leads to LED marker gliding to end of strip when no object is within distance if ((dispix >= 0) && (dispix < 60)) { newValue = dispix; } else { newValue = -10; } // Running average code from // https://www.arduino.cc/en/Tutorial/Smoothing // subtract the last reading: total = total - readings[readIndex]; // read from the sensor: readings[readIndex] = newValue; // add the reading to the total: total = total + readings[readIndex]; // advance to the next position in the array: readIndex = readIndex + 1; // if we're at the end of the array... if (readIndex >= numReadings) { // ...wrap around to the beginning: readIndex = 0; } // calculate the average: int avePos = total / numReadings; // set LEDs with following function and show them draw(avePos); pixels.show(); } // Simple function resetting all pixels and lighten some around desired distance void draw(int pix) { for (int i=0; i<60; i++) { pixels.setPixelColor(i, pixels.Color(2,0,0)); } pixels.setPixelColor(pix-2, pixels.Color(0,0,30)); pixels.setPixelColor(pix-1, pixels.Color(0,0,100)); pixels.setPixelColor(pix, pixels.Color(0,0,250)); pixels.setPixelColor(pix+1, pixels.Color(50,0,50)); pixels.setPixelColor(pix+2, pixels.Color(20,0,20)); } |
Alle benötigten Teile gibt es bei Amazon:
Viel Spaß beim Nachbauen! Fragen und Anregungen bitte einfach in die Kommentare schreiben.
Hey,
Ist es auch möglich den Aufbau mit einem Ultraschallsensor statt einem Infarotsensor zu bauen, der kann doch die Entfernung auch messen?
Wenn ja wie würde denn der Sketch denn aussehen?
Vielen Dank
Hi, die gängigen Ultrasonic-Sensoren wie die HC-SR04 Modelle funktionieren ja etwas anders und überlassen die Zeitmessung zwischen Ping und Echo meistens dem Arduino. Dazu gibt es eine sehr gute Library hier https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home – die ist mit fast allen Sensoren kompatibel und sehr gut dokumentiert.
Ich werde den Sketch auf einen HC-SR04 anpassen und ebenfalls veröffentlichen.
Hallo,
danke für die tolle Arbeit.
Die Anpassung ein den HC-SR04 würde ich mir auch wünschen.
Habe es selber probiert, aber als Anfänger komme ich da irgendwie nicht weiter
Did you ever write the SR04 version of this sketch?
Hallo mein Name ist Christoph ich wollte fragen wo ich den angepassten sketch mit ultraschallsensor finden kann für das magische Licht
Mfg
Christoph
Pingback: PIR Sensor / Bewegungsmelder am Arduino – Makerblog.at
Hallo, wo bekommt man die aktuelle Library für den LED Streifen. Es wird vielfach berichtet, dass die Librarys nicht funktionieren.
Guten Tag,
ist es möglich mit so einem Infrarot sensor auch messungen im Millimeter bereich durchzuführen?
Hi,
Hast du schon mit dem ultrasonic mal probiert ob es funktioniert. Hätte auch Interesse an ultrasonic.
Hallo,
ich habe einen led Streifen “ rgbww5″ und wollte ihn für dieses Projekt nutzen. Leider funktioniert das nicht so einfach. Die Neopixel Library geht dafür nicht. Kann mir jemand helfen für meinen LED-Streifen eine Library und Programm zu finden?
Vielen Dank
Ardufrosch
Bist du dir sicher, dass es sich bei deinem LED-Strip um einzelen ansteuerbare LEDs handelt? RGBWW steht meiste für „RGB warm white“ und bezeichnet oft LED-Streifen, bei denen alle LEDs in der gleichen Farbe leuchten. Eigentlich müsste das an den Eingängen erkennbar sein, wie sind denn die Pins an deinem Streifen beschriftet?
Hallo,
Ich habe den sketch 1zu1 kopiert und nur die Anzahl der der LEDs geändert. Die Librarys sind installiert, doch beim Kompilieren kommt folgende Fehlermeldung:
‚GP2Y0A02YK0F‘ was not declared in this scope
Vielleicht kann mir ja jemand helfen,
Vielen Dank und Gruß. Bernie
Das Problem könnte sein, dass es verschiedene Libraries für die Sharp-Sensoren gibt, die alle ähnlich heissen. Hast du sicher die hier https://github.com/qub1750ul/Arduino_SharpIR installiert?
Hallo,
ich habe das Problem gelöst indem ich in der Zeile „SharpIR sharp(GP2Y0A02YK0F, A0);“ das „GP2Y0A02YK0F“ durch die Zahl 1 ersetzt habe (ich habe einen GP2Y0A21 Sensor und in der lib sind die unterschiedlichen Sensoren nummeriert). Dann ließ sich der Sketch kompilieren.
Nun läuft das LED Licht zwar, jedoch mit einem nervigen Fehler: es blinken ständig wahllos unterschiedliche LEDs in verschiedenen Farben auf, auch die die eigentlich Leuchten sollen wechseln vereinzelt ganz kurz die Farbe. Dies ist unabhängig vom Analogen Eingang, passiert also auch wenn ich den Sharp Sensor abgezogen habe. Sheit am Ausgang des UNOs zu liegen. Habe es schon mit einem anderen Ausgang versucht – ändert sich nichts.
Wegen des Flackerns: Wie versorgst du die LEDs mit Strom? Eventuell ist die Stromversorgung nicht stabil genug. Und: Hast du GND der LEDs und vom Arduino miteinander verbunden? Das kann sonst auch zu diesem Effekt führen.
JUCHUUU
Das wars! Der fehlende Potentialausgleich.
Vielen Dank für die Hilfe, bin noch blutiger Anfänger auf dem Gebiet ;)
Gruß Bernie
Die nicht verbundenen GNDs haben mich irgendwann mal bei einem Projekt viele Stunden gekostet. Sowas vergisst man dann nicht mehr :)
Noch eine Frage, jetzt wo es so schön läuft:
Wie bekomme ich denn zwei identische LED-Stripes angeschlossen? Einfach beide Steuerleitungen zusammen an pin6 oder muss ein zweiter Ausgangs-pin angesteuert werden? ….und wenn ja – wie? ;)
Hi wo kann man den sketch mit dem ultraschallsensor finden?