Arduino Projekt: Abfalleimer mit Bewegungssensor

Es gibt diverse Abfalleimer und eigentlich ist an diesen nix besonderes jedoch gibt es auch welche mit Bewegungssensor. Dieser Bewegungssensor setzt einen Motor / Servo in gang welcher den Deckel des Abfalleimers öffnet.

Eigentlich ist dieses System ganz einfach und auch relativ leicht umzusetzen. Jedoch lassen sich die Hersteller dieses System Königlich bezahlen (die Preise können zwischen 30€ bis weit über 100€ liegen).

Nun möchte ich in diesem Projekt zeigen wie man aus einem ganz normalen Abfalleimer und einpaar Sensoren, einem Servo und einem Arduino dieses System selber nachbaut.

Was wird benötigt?

Als erstes wird ein Abfalleimer benötigt, ich verwende den Abfalleimer von IKEA (Modell Filur mit einem Fassungsvermögen von 10l).

IKEA 10l Eimer FILUR
IKEA 10l Eimer FILUR

Es werden für die Durchführung folgende Werkzeuge benötigt:

  • Lötkolben
    • Lötkoblenständer
    • Lötzinn
    • Lötfett
    • Temperaturbeständige Unterlage
  • Heißklebepistole
    • Klebesticks
  • Seitenschneider
  • Bohrmaschine
    • 2mm Bohrer
  • Kreuzschraubendreher

Des Weiteren werden folgende elektronische Bauteile benötigt:

Je nach Material des Abfalleimers kann es sein das ein stärkerer Servo benötigt wird. Die starken Servomotoren haben jedoch auch eine größere Stromaufnahme somit ist es zwingend erforderlich das ein zusätzliches Netzteil verwendet werden muss.

Aufbau

Erstellen eines Prototypen

Bevor ich am Eimer rum schraube möchte ich einen Prototypen am Schreibtisch bauen. Das erstellen eines Prototypen erlaubt es einem kleine bis große Fehler frühzeitig zu erkennen und zu beheben.

Schaltung - Geestensensor ADPS9960, RGB NeoPixel WS1812b, Servo 9g am Arduino UNO
Schaltung – Geestensensor ADPS9960, RGB NeoPixel WS1812b, Servo 9g am Arduino UNO

Video

Geestensensor ADPS9960, Servo und 5mm NeoPixel am Arduino UNO

Aufbau des Projektes

Nachdem das ganze am Prototypen funktioniert wollen wir nun das richtige Projekt aufbauen.

Als erstes müssen wir ein Grundgerüst für den Arduino UNO, die Batterie sowie für den Servo schaffen.
Der Deckel des Eimers hat einen ca. 10mm breiten Rand an diesem werde ich mit Holzleisten eine kleine Sperrholzplatte schrauben. des Weiteren benötige ich noch eine Vorrichtung für den Servo damit dieser beim schwenken den Deckel öffnet bzw. schließt.

Materialliste

  • 2x 1m, 10mm im Quadrat Holzleiste,
  • 1x Sperrholzplatte DIN A4,
  • Holzschrauben 3x12mm
  • Holzleim

Die Materialien findest du in jedem, gut sortierten Baumarkt.
Beim Holzleim schwöre ich auf den Uhu Wasserfest, dieser bietet ein gutes Preis / Leistungsverhältnis und trocknet sehr schnell.

Platte für den Microcontroller

Für die Montage des Arduino UNO und der Batterie benötigen wir eine kleine Sperrholzplatte von 15cm x 15 cm. 
Des Weiteren eine Leiste von 16cm an dem einen Ende sägen wir jedoch mit einer Gärungssäge einen 45° Winkel.

Projekt "Eimer" - Holzplatte für Microcontroller & Batterie
Projekt „Eimer“ – Holzplatte für Microcontroller & Batterie

Da die Schrauben mit einer länge von 12mm zu lang für die dünne (3mm) Sperrholzplatte sind klebe ich noch eine 4mm starke Platte in den passenden Maßen für den Arduino und die Batterie auf.

Eimer - Schaltung mit Servo 4.3g
Eimer – Schaltung mit Servo 4.3g

Ich habe einmal mit einem kleinen Servo probiert den Deckel zu öffnen, jedoch hat dieser nicht genug Leistung daher muss mindestens ein 9g Servero verwendet werden.

Damit die gesamte Schaltung von oben etwas geschützt ist, klebe ich zusätzlich eine dünne Sperrholzplatte drauf. Auf diese Platte wird dann die LED angebracht.

Eimer - Abdeckung mit LED
Eimer – Abdeckung mit LED

Der 9g Servo erhält einen kleinen Arm welcher im Winkel von ca. 105 Grad gedreht wird.

Eimer - Servo mit Arm
Eimer – Servo mit Arm

Der Arm des Servo’s fährt auf der kleinen Holzplatte (blau markiert) entlang. Hier musste ich mit 100er Schleifpapier nachhelfen damit die Leiste ordentlich glatt ist.

Damit ist das Projekt erledigt und wir können das Sketch aufspielen.

Quellcode

Im Sketch habe ich Kommentare verfasst. Dieses macht spätere Modifikationen einfacher.

#include "Adafruit_APDS9960.h" //Bibliothek für den Geestensensor
#include <Servo.h>  //Bibliothek für den Servomotor
#include <Adafruit_NeoPixel.h> //Bibliothek für den 5mm WS1812B NeoPixel

//Initialisieren der Objekte

//Geestensensor
Adafruit_APDS9960 apds;

//Servomotor
Servo servo;

#define PIN            10 //digitaler Pin D10
#define NUMPIXELS      1 //Anzahl der NeoPixel
//NeoPixel
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

//Zeit zwischen den Schritten
//des Servormotors
int waitTime = 15;

//Variable um zu speichern ob der Deckel geschlossen ist.
bool isBinClosed = true;

//Variable wie lange der Deckel geöffnet bleiben soll.
long timer = 5000;

//Variable zum speichern des Zeitstempels wann der Deckel geöffnet wurde
long lastOpenTime = -1;

//Winkel / Schritte wie weit der Servo sich bewegen soll
const int ANGLE = 105;

void setup() {
  Serial.begin(115200); //Beginn der seriellen Kommunikation
  if(!apds.begin()){
    Serial.println("Initialiserung des Sensors fehlgeschlagen.");
    Serial.println("Bitte prüfen Sie die Verkabelung!");
  }
  else {
    Serial.println("Der Sensor wurde erfolgreich initialisiert!");
  }
 
  apds.enableProximity(true);
  apds.enableGesture(true);

  servo.attach(9); //Servomotor am digitalen Pin D9
  pixels.begin(); 
  lightUp(0,0,0); //setzen der Farbe "schwarz" (die LED ist aus)
}

void loop() {
 uint8_t gesture = apds.readGesture(); //lesen der Geeste
 switch(gesture){
      case APDS9960_LEFT:  openBin(); break;
      case APDS9960_RIGHT: closeBin(); break;
 }

 //Wenn der aktuelle Zeitstempel minus der Zeitspanne welcher der Deckel 
 //geöffnet sein soll größer als der Zeitstempel der letzten öffnung ist
 //dann soll der Deckel geschlossen werden.
 if((millis()-timer) > lastOpenTime){
    closeBin();
 }
}

void openBin(){
  //nur wenn der Deckel geschlossen ist dann...
  if(isBinClosed){
    lastOpenTime = millis(); //speichern des aktuellen Zeitstempels
    isBinClosed = false; //setzen das der Deckel geöffnet ist
    lightUp(0,255,0); //LED rot aufleuchten lassen
    //Schleife von 0 bis ANGLE (Deckel öffnet sich)
    for(int position = 0; position<=ANGLE; position++){ 
      servo.write(position); //Schreiben des aktuellen Wertes der Variable 'position' (180...1)
      delay(waitTime); //Pause
    } 
  }
}
 
void closeBin(){
  //nur wenn der Deckel geöffnet ist UND die Zeitabgelaufen ist dann...
  if(!isBinClosed & (millis()-timer) > lastOpenTime){
    lastOpenTime = -1; // zurücksetzen des Zeitstempels
    isBinClosed = true; //setzen das der Deckel geschlossen ist
    lightUp(0,0,255); //LED blau aufleuchten lassen
    //schleife von ANGLE bis 0 (Deckel schließt sich)
    for(int position = ANGLE; position>=0; position--){ 
      servo.write(position); //Schreiben des aktuellen Wertes der Variable 'position' (180...1)
      delay(waitTime); //Pause
    }  
    lightUp(0,0,0);
  }
}

void lightUp(int red, int green, int blue){
  pixels.setPixelColor(0, pixels.Color(red,green,blue));
  pixels.show(); // Wichtig !! für die Anzeige der neuen Farbe muss diese Funktion aufgerufen werden.
}

 

Schreibe einen Kommentar

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