Hamster Lift - WIP

by FeatherHero in Craft > Cardboard

207 Views, 0 Favorites, 0 Comments

Hamster Lift - WIP

WhatsApp Image 2021-08-09 at 04.19.35 (4).jpeg
IMG_9352.JPG

Een dagelijkse routine van mij en mijn hamster, Coco is altijd:

Coco wordt wakker, ze loopt ongeveer 20 min in haar kooi, maakt zichzelf schoon en zoekt voor snack, na deze 20 minuten begint de frenzy van energy. Ze begint met tegen de rand van haar aquarium proberen te klimmen om mijn aandacht te krijgen. Dit blijft ze dan ook doen voor ongeveer 1 uur tot ze pauze neemt en later weer verder gaat. Meestal werdt dit altijd op gelost met speel tijd; Ik pak Coco op en zet haar in haar speel hoek(direct langs haar aquarium).

Deze dagelijkse routine was voor maanden oke. Maar door mijn slechte gewoontes met deadlines, school projecten en te laat op blijven werdt dit een probleem. Constant aandacht weg halen van mijn werk elke 10 min omdat Coco uit en in haar aquarium wou werkte niet meer.

Uit dit probleem kwam uiteindelijk het idee: de hamster lift! Een makkelijke manier van in en uit het aquarium te gaan zonder mijn hulp!

Supplies

  • Arduino uno
  • IR Pyroelectrische Infrarood PIR Motion Sensor Detector Module
  • 4x 10k Resitor
  • 2x 220 Resitor
  • 1x 330K Resitor
  • 5x Tactile Pushbutton Switch Momentary 4pin 6*6*5mm
  • AAA Battery holder x4
  • S3003 Servo - 6kg - Continuou
  • Breadboard full+
  • Breadboard mini
  • WIRES!

Bouw s

  • Boxes
  • Wire
  • Thread
  • Small spool

Het Concept

Qua concept had ik het idee al snel in mijn hoofd:

Een lift dat automatisch zou werken zonder mijn constant aandacht of hulp. Hierbij moest de lift veilig zijn voor Coco, automatisch werken, zonder mijn hulp besturen en extrene controls hebben.

Hoe de lift er specifiek uit ging zien liet ik voor nu open. Hier ging ik meer op in bij Lift design stap.

Het concept was dus simpel. Een automatisch lift veilig voor hamsters. Maar ging het mij ook lukken

Testing, Testing, Testing...

Screenshot_2.png
Potmeter + servo test

Ik begin Arduino en ITTT met 0 ervaring. Om meer ervaring en comfort op te bouwen begon ik met meerdere kleine testen.

Een paar van deze testen waren:

  • Servo + potmeter test
  • Sonic meter + light test
  • Servo motor continous test
  • Laser + button + light
  • Millis test
  • For loop test
  • etc...

Deze testen bestonden vooral uit componenten en code tests. Dit was uiteindelijk super handig om sneller te kunnen programmeren en meer begrip ontwikkelen qua Arduino.

Servo Testing

WhatsApp Image 2021-08-09 at 04.19.37 (3).jpeg
Anti behoofding
WhatsApp Image 2021-08-09 at 04.19.37 (2).jpeg
Lift prototype up down working

De servo is een van mijn main componenten voor de hamster lift. Daarom heb ik specifiek voor de servo meerdere testen gedaan.

Een van de problemen en angsten waarbij ik tegen de Hamster lift aan liep was; Veiligheid. Ik wou niet dat mijn hamster opeens onthoofd zou kunnen worden door de lift.

Vandaar begin ik met tension tests. Hiermee zou ik de druk op de servo meten en bij een bepaalde thershold van druk de servo stoppen en het programma (en hier mee mijn hamstertje redden).

Uiteindelijk is dit ook gelukt en werdt dit een cruciaal deel van mijn code.

(bij final test prototype nog niet toegevoegd)

Lift Design

Screenshot_3.png
Screenshot_4.png
Screenshot_5.png
Screenshot_6.png
Show off adjustable height
WhatsApp Image 2021-08-09 at 04.19.35 (5).jpeg
WhatsApp Image 2021-08-09 at 04.19.34.jpeg
WhatsApp Image 2021-08-09 at 04.19.35 (2).jpeg
WhatsApp Image 2021-08-09 at 04.19.35 (3).jpeg
WhatsApp Image 2021-08-09 at 04.19.35 (1).jpeg
WhatsApp Image 2021-08-09 at 04.19.36 (1).jpeg
In kooi lift test
WhatsApp Image 2021-08-09 at 04.19.37.jpeg

Na de standaard testen en specifieke servo testen begon ik met het bouwen en ontwerpen van de lift.

Sinds ik ervaring heb met 3D modellen begon ik met het maken van een 3D mockup inplaats van schetsen. Hierdoor kreeg ik ook een beter beeld van de mechaniek.

Foto 1 - Design 1:

Dit was de meest basic opzet voor de lift. Een cabine, en shute waar de lift in beweegt. Dit ontwerp was uiteindelijk ook van carton gemaakt en werdt mee getest.

Foto 2 - Design 2:

Dit ontwerp werdt uiteindelijk niet gebruikt. De kans van onthoofding werd verhoogt door de dichte ruimte kort na ophoog gaan van de lift + mijn hamster werdt oncomfortabel van de dichte ruimte bij design 1 en dit design.

Foto 3 - Design 3:

Dit ontwerp is bijna het eind prototype geworden. De cabine is niet helemaal dicht maar ook niet helemaal open voor optimale comfort, de hoogte is af stelbaar en de hamster kon makkelijk vanaf de bovenkant van de lift naar beneden.

Overige foto's:

Dit zijn progress foto's naar een carton prototype.

Final Prototype Tests

Setup complete project
WhatsApp Image 2021-08-09 at 04.19.33 (1).jpeg
WhatsApp Image 2021-08-09 at 04.19.35.jpeg
WhatsApp Image 2021-08-09 at 04.19.34 (1).jpeg

Na het maken van het lift design begon ik met een aantal laatste tests. Hierbij moest alle vorige tests, kennis en code samen komen tot 1 programma wat de lift zou laten werken.

Dit bleek uiteindelijk 10.000 x moeilijker te zijn dan ik verwacht had. Ik liep vaak tegen problemen aan qua code en componenten. Maar toch...

Succes!

Succesful run
Lange uitleg video

Na strijden tot een final programma was het eindelijk gelukt! De lift werkt nu helemaal zoals vooruit bedacht en een succesvole test was ook uitgevoerd.

Code Final Prototype

Screenshot_1.png

Hierbij de code die bij het final prototype en succesvolle run gebruikt wordt:

(Beschrijving van wat code doet staat als grotendeels in comments)

//Pins int LED1 = 8; int LED2 = 9; int BUTTONStart = 2; int BUTTONStop = 3; int BUTTONUp = 4; int BUTTONDown = 5; int BUTTONThershold = 6;

//Button Variables int ButtonStateStart = 0; int ButtonStopStart = 0; int ButtonStateUp = 0; int ButtonStateDown = 0; int ButtonThershold = 0;

//Light Variables int LightSensor = 0; int LightThreshold = 0; int LightSensorOn = 0;

//BottomTop Variables int TopTouched = 0; int BottomTouched = 1; int ReadyToGoDown = 0; int ReadyToGoUp = 1; int Pauze = 0; int PauzePassed = 0;

//Motion Detecting Variables unsigned long PreviousTime_D = 0; const long Event_D = 500; int MotionDetected = 0;

//Other int START = 0;

//Servo #include Servo Myservo; int ValServo = 96;

void setup() { //ASSIGMENT VARIABLES pinMode(LED1 , OUTPUT); pinMode(LED2 , OUTPUT); pinMode(BUTTONStart, INPUT); pinMode(BUTTONStop, INPUT); pinMode(BUTTONUp, INPUT); pinMode(BUTTONDown, INPUT); pinMode(BUTTONThershold, INPUT); Serial.begin(9600); Myservo.attach(10);

//START UP MESSAGE AND SIGNALS digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); delay(500); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); Serial.println("Ready!"); }

void loop() { //READS int ButtonStateStart = digitalRead(BUTTONStart); //Start button int ButtonStateStop = digitalRead(BUTTONStop); // Stop button int ButtonStateUp = digitalRead(BUTTONUp); //Lift up button int ButtonStateDown = digitalRead(BUTTONDown); // Lift down button int ButtonThershold = digitalRead(BUTTONThershold); //Register max distance lift button int LightSensor = analogRead(A0); //Light sensor int Motion = digitalRead(11); //Motion sensor

//ESSENTIAL BUTTON CONTROLS /*Start button: If start button is pressed excute program below.*/ if (ButtonStateStart == 1) { START = 1; Serial.println("Start pressed"); digitalWrite(LED1, HIGH); delay(50); digitalWrite(LED1, LOW); }

/*Emergency Stop Button: Almost always stops all code.*/ if (ButtonStateStop == 1 && START == 1) { ValServo = (94); Myservo.write(ValServo); START = 0; Serial.println("EMERGENCY STOP"); }

/*ON START: If start button activated, excute code below.*/ if (START == 1) {

//UP DOWN BUTTON CONTROLS /*Up: If up button is pressed, rotate servo clockwise.*/ if (ButtonStateUp == 1) { ValServo = (0); Myservo.write(ValServo); Serial.println("Up Pressed"); } if (ButtonStateUp == 0 && ValServo == 160) { ValServo = (96); Myservo.write(ValServo); }

/*Down: If down button is pressed, rotate servo counter clockwise.*/ if (ButtonStateDown == 1) { ValServo = (160); Myservo.write(ValServo); Serial.println("Down Pressed"); } if (ButtonStateDown == 0 && ValServo == 0) { ValServo = (96); Myservo.write(ValServo); }

//MAIN CODE EVENTS

//Motion Detection /*Motion sensor timer, activates motion sensor every x amount of ms and senses)*/ unsigned long CurrentTime = millis(); /* Assigned current ms to Currentime (CurrentTime is now millis) */ if (CurrentTime - PreviousTime_D >= Event_D) {/* Check if CurrentTime - PreviousTime_D isn't greater than/equal to Event_D(x amount of ms). */ if (Motion == HIGH && Pauze == 0) {/*Check if Motion(Motion sensor) is returning High voltage(Triggered) and if Pauze isn't activated*/ Serial.println("Motion Detected"); MotionDetected = 1;/*Register check in var*/ PreviousTime_D = CurrentTime;/*Sets PreviousTime_D to CurrentTime(To catch up with timing(Become the same as CurrentTime))*/ } else { MotionDetected = 0;/*Register check in var*/ } }

// Thershold marker /*The marker code made to stop lift when it reaches the top. Assigns LightSensor data to var when button pressed(To store for later code).*/ if (ButtonThershold == 1) {/*If button pressed...*/ LightThreshold = LightSensor;/*Store actual LightSensor data in Var*/ Serial.print("Thershold:"); Serial.println(LightThreshold); digitalWrite(LED2, HIGH);/*Turn on led*/ Serial.println(LED2); delay(5000);/*5 secs*/ digitalWrite(LED2, LOW);/*Turn off led*/ Serial.println(LED2); LightSensorOn = 1;/*Store var that the thershold has been made*/ LightSensor = 1000;/*Reset Light sensor (to prevent left over sensing from messing with code)*/ Serial.println("Sensor ready!"); }

//LIGHT SENSOR: Top touched Check.(sent top touched signal) /*Check if TopThershold(LightThershold) has been touched, if LightSensor has been turned on and activated(vars have been stored, and if buttom is touched(Standard when program started)*/ if (LightSensor <= LightThreshold && LightSensorOn == 1 && BottomTouched == 1) { Serial.println("TOP REACHED"); digitalWrite(LED2, HIGH);/*Turn on led*/ digitalWrite(LED2, LOW);/*Turn off led*/ TopTouched = 1;/*Register top has been reached*/ BottomTouched = 0;/*Register bottom has been left(isn't at bottom)*/ ReadyToGoDown = 1; }

//Top touched check. No? MOVE! /* Check if motion has been detected, if top has been touched, and if LightSensor has been turned on and activated(vars have been stored)*/ if (MotionDetected == 1 && TopTouched == 0 && LightSensorOn == 1 && Pauze == 0) { Myservo.write(0); } else { Myservo.write(96);

//Top touched check. YES? PAUZE! /*Check if motion has been detected, if top has been touched, if bottom hasn't been touched and if LightSensor has been turned on and activated(vars have been stored)*/ } if (TopTouched == 1 && BottomTouched == 0 && LightSensorOn == 1) { Myservo.write(96);/*Stop Servo */ digitalWrite(LED2, HIGH);/*Turn on led*/ digitalWrite(LED2, LOW);/*Turn off led*/ Pauze = 1;/*Sent pauze signal/store pauze data in var*/ } //Top touched? PAUZE OVER? GOING DOWN! (sent bottom touched signal) if (ReadyToGoDown == 1 && MotionDetected == 1 && Pauze == 0 && ReadyToGoUp == 0 ) { Serial.println("Going Down!"); Myservo.write(160); delay(5000);/*x sec delay to bottom*/ BottomTouched = 1;/*Store that bottom has been touched in var*/ TopTouched = 0;/*Store that top hasn't been touched in var*/ ReadyToGoUp = 1;/*Store that bottom has been touched in var*/ delay(10000); Serial.println("Ready to go up again!"); } //Pauze event - TOP REACHED - READY TO GO DOWN /*If Pauze variable is activated (after reaching top), delay code for x amount of ms*/ if (Pauze == 1) { MotionDetected = 0; ValServo = (96); Myservo.write(ValServo); Serial.println("Pauzed..."); ReadyToGoUp = 0; /*Tell code no more going up*/ ReadyToGoDown = 1; /*Tell code it's ready to go down*/ TopTouched = 0; delay(10000);/*10 secs*/ Pauze = 0;/*Reset counter to 0 so pauze doesn't repeat.*/ PauzePassed = 1; } if (PauzePassed == 1) { MotionDetected = 0; PauzePassed = 0; Pauze = 0; Serial.println("Restrict movement."); } } }

Reflectie Wat Nu? &

WhatsApp Image 2021-08-09 at 04.19.31.jpeg
IMG_20210809_051852482_HDR.jpg
IMG_20210809_051409778_HDR.jpg

Reflectie:

Als ik terug kijk op het project ben ik trost op wat ik gemaakt heb. Uiteindelijk heb ik veel geleerd qua coderen en hoe Arduino en de technieken hiervan werken. Ondanks vaak vast te komen zitten qua code vond ik het een leuk project om uit te voeren (ook al is het niet afgekomen). Ik zou graag in de toekomst meer tijd aan het project willen besteden en misschien de scope van mijn project kleiner willen maken. Sinds de grote van het project niet hielp bij het afronden.

Wat nu?

Door slecht plannen van deadlines, gebrek aan motivatie en probleem na probleem kon ik het project niet op tijd totaal afronden. Het main prototype is af maar solderen en hout bewerking zijn uiteindelijk niet gelukt.

In de toekomst hoop ik dit project wel af te maken en dan ook zonder constante problemen.

Enige tips of opmerkingen? Laat het me weten!