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)); 
}

Viel Spaß beim Nachbauen! Fragen und Anregungen bitte einfach in die Kommentare schreiben.

 

5 thoughts on “Pure Magie! WS2812B LED Streifen mit Sharp IR Entfernungssensor

  • 2. Januar 2017 um 0:28
    Permalink

    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

    Antworten
    • 3. Januar 2017 um 14:11
      Permalink

      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.

      Antworten
      • 3. März 2017 um 20:43
        Permalink

        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

        Antworten
  • Pingback: PIR Sensor / Bewegungsmelder am Arduino – Makerblog.at

  • 1. März 2017 um 18:01
    Permalink

    Hallo, wo bekommt man die aktuelle Library für den LED Streifen. Es wird vielfach berichtet, dass die Librarys nicht funktionieren.

    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.