Es gibt diverse Abfalleimer und eigentlich ist an diesen nichts 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 ein paar Sensoren, einem Servo und einem Arduino dieses System selber nachbaut.
Was wird benötigt für den Abfalleimer mit Bewegungssensor?
Als Erstes wird ein Abfalleimer benötigt, ich verwende den Abfalleimer von IKEA (Modell Filur mit einem Fassungsvermögen von 10l).
Es werden für die Durchführung folgende Werkzeuge benötigt:
- Lötkolben
- Lötkolbenständer
- Lötzinn
- Lötfett
- Temperaturbeständige Unterlage
- Heißklebepistole
- Klebesticks
- Seitenschneider
- Bohrmaschine
- 2 mm 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 des Abfalleimer mit Bewegungssensors
Erstellen eines Prototypen
Bevor ich am Eimer herumschrauben möchte ich einen Prototyp am Schreibtisch bauen. Das Erstellen eines Prototyps erlaubt es einem kleine bis große Fehler frühzeitig zu erkennen und zu beheben.
Video des Abfalleimer mit Bewegungssensor
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. 10 mm 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 1 m, 10 mm 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 einen guten Preis / Leistungsverhältnis und trocknet sehr schnell.
Platte für den Mikrocontroller
Für die Montage des Arduino UNO und der Batterie benötigen wir eine kleine Sperrholzplatte von 15 cm x 15 cm.
Des Weiteren eine Leiste von 16 cm an dem einen Ende sägen wir jedoch mit einer Gehrungssäge einen 45° Winkel.
Da die Schrauben mit einer Länge von 12 mm zu lang für die dünne (3 mm) Sperrholzplatte sind, klebe ich noch eine 4 mm starke Platte in den passenden Maßen für den Arduino und die Batterie auf.
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.
Der 9g Servo erhält einen kleinen Arm welcher im Winkel von ca. 105 Grad gedreht wird.
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 den 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. }
Super tolle Sache so ein Abfalleimer mit Bewegungssensor. Sehr praktisch!