Het Dansende Huisje

by Iza Morel in Circuits > Arduino

145 Views, 1 Favorites, 0 Comments

Het Dansende Huisje

VideoCapture_20220614-163052.jpg
VideoCapture_20220614-163107.jpg

Dit is mijn eindproject voor If This Then That. Ik heb voor dit project een dansend huisje gemaakt dat reageert op muziek. Het huisje komt tot leven door de pootjes en de LED's.

Voor dit project ben ik geïnspireerd door het idee van levenloze dingen die tot leven komen. Dit idee werd versterkt toen ik een ontzettend gaaf model van Howl's Moving Castle zag uit de studio Gibli film. De "Moving Castle" is een enorm en rommelig gebouw met smalle pootjes die door het prachtige landschap wandelt. Hierna is het concept van een dansend huisje ontstaan.

Dit project heeft mij ontzettend uitgedaagd en ik heb gaandeweg een aantal dingen moeten veranderen. Toch heb ik me gelukkig kunnen vasthouden aan mijn concept.

Supplies

Elektronische onderdelen:

  • 1 - Arduino Uno
  • 2 - LED 5mm Rgb Helder Common Cathode
  • 6 - Resistor 220 Ohm
  • 1 - KY-037 Sound Detection Sensor
  • 4 - SG90 Micro-servo motor
  • 1 - Prototyping Board / Pcb (39x30 Gaats / 10x7,5cm)
  • 17 - Breadboard Jumper Kabeltjes Dupont 10cm


Behuizing materiaal:

  • 1 - 60x100x3 mm MDF plaat
  • 1 - 60x70x2 mm Grijs Karton plaat
  • 1 - 120x80x1 mm Grijs Karton plaat
  • Houtlijm
  • Hete lijm
  • Bakpapier
  • Witte verf
  • Bruine verf
  • Paarse verf
  • Zilveren verf


Gebruikte gereedschappen:

  • Lasersnijder
  • Soldeerbout met soldeertin
  • Striptang
  • Lijmpistool
  • Dremel Lite
  • Verfkwasten

Testen

20220312_154326.jpg
20220312_161150.jpg
20220511_194230.jpg

Na de kick-off van ITTT ben ik begonnen met kleine experimentjes uitvoeren om erachter te komen hoe ik mijn idee het beste kon realiseren.

Ik heb verschillende soorten pootjes gemaakt die worden aangestuurd door servo's. Ook heb ik een kartonnen prototype gemaakt. Dit prototype wilde ik vooral maken om de maat van mijn behuizing goed in te schatten. Ik ben begonnen met een kartonnen huisje van 24x20 cm en was uiteindelijk tevreden met het prototype van 16x12 cm.

Om de verschillende onderdelen te testen heb ik testcode geschreven.


RGB LED test:

int red_light_pin = 11;
int green_light_pin = 10;
int blue_light_pin = 9;

int red2_light_pin = 6;
int green2_light_pin = 5;
int blue2_light_pin = 3;

void setup() 
{
 pinMode(red_light_pin, OUTPUT);
 pinMode(green_light_pin, OUTPUT);
 pinMode(blue_light_pin, OUTPUT);

 pinMode(red2_light_pin, OUTPUT);
 pinMode(green2_light_pin, OUTPUT);
 pinMode(blue2_light_pin, OUTPUT);
}

void loop() 
{
// Ik zette steeds om en om de kleur aan om te testen of alle kleuren het deden.

   RGB_color(255, 0, 0); // Red
// delay(1000);
// RGB_color(0, 255, 0); // Green
// delay(1000);
// RGB_color(0, 0, 255); // Blue
// delay(1000);
// RGB_color(255, 255, 125); // Raspberry
// delay(1000);
// RGB_color(0, 255, 255); // Cyan
// delay(1000);
// RGB_color(255, 0, 255); // Magenta
// delay(1000);
// RGB_color(255, 255, 0); // Yellow
// delay(1000);
}

void RGB_color(int red_light_value, int green_light_value, int blue_light_value)
{
 analogWrite(red_light_pin, red_light_value);
 analogWrite(green_light_pin, green_light_value);
 analogWrite(blue_light_pin, blue_light_value);

 analogWrite(red2_light_pin, red_light_value);
 analogWrite(green2_light_pin, green_light_value);
 analogWrite(blue2_light_pin, blue_light_value);
}


Servo test:

#include <Servo.h>

Servo myservo;

int pos = 0;

void setup() 
{
 myservo.attach(8);
}

void loop() 
{
// Hier heb ik getest of forloops de beweging van de servo verbeterde.

 for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees in steps of 1
  {
  myservo.write(pos);       // tell servo to go to position in variable 'pos'
  delay(15);                // waits 15ms for the servo to reach the position
 }
 for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees in steps of 1
 { 
  myservo.write(pos);       // tell servo to go to position in variable 'pos'
  delay(15);                // waits 15ms for the servo to reach the position
 }
}


Servo en geluidssensor test:

#include <Servo.h>
Servo servo1;
int servoPin = 5;

const int micPin = 3;

int micVal = 0;

void setup() 
{
 Serial.begin(9600);

 servo1.attach(servoPin);
 pinMode(micPin, INPUT);
}

void loop()
{
// Hier teste ik of de servo's reageerden wanneer de waarde die de geluidsensor hoger was dan 600

 micVal = digitalRead (micPin);

 if (micVal > 600)
 {
   servo1.write(180);
 }
  
 else
 {
   servo1.write(0);
 }
  
}

Eerste Behuizing

ISA Model Turnaround
Desktop Screenshot 2022.06.10 - 15.37.49.45.png
Desktop Screenshot 2022.01.24 - 17.05.33.31.png

In eerste instantie wilde ik voor dit project de behuizing 3D printen. Ik heb het kartonnen prototype gebruikt als houvast en ben begonnen. Ik ben van block out naar meer details naar uiteindelijk printklaar gegaan.

Ik was ontzettend blij dat mijn model af was, maar ik had helaas veel problemen met het printen. Zo wilde de 3D print programma's mijn model niet inladen, toen dat uiteindelijk was verholpen bleek dat printen in de gewenste maat erg lastig zou worden. Dit omdat het ontzettend veel tijd en materiaal zou kosten, maar ook omdat ik het niet in één stuk kon printen.

De deadline kroop dichterbij en ik heb uiteindelijk gekozen om het materiaal van mijn behuizing te veranderen.

Uiteindelijke Behuizing

20220524_162057.jpg
20220516_135926.jpg
20220530_181814.jpg
20220531_124043.jpg

Nadat de beslissing over materiaalwisseling was gemaakt, ben ik me volledig gaan focussen op het maken van de uiteindelijke behuizing.

Vanaf hier probeer ik mijn proces op een manier uit te leggen dat je het ook echt na zou kunnen maken.

Je begint met het maken van het illustratorbestand voor het huisje. Hieronder staan de bestanden als je deze specifiek wilt gebruiken. Dit bestand exporteer je als .dxf en hiermee kan je op de lasersnijder al je onderdelen uitsnijden. Ik heb gebruik gemaakt van 3 mm dik MDF om het uiteindelijk huisje zo licht mogelijk te houden. Houd er rekening mee dat het document hieronder op deze dikte gebaseerd is.

Nadat je dit hebt gedaan kan je alle onderdelen in elkaar zetten. Het is een beetje een puzzel maar alles heeft z'n plek. Ik heb houtlijm gebruikt maar andere opties zijn contactlijm of hete lijm. Nadat je alle MDF onderdelen in elkaar hebt gezet, kan je gebruik maken van de kartonnen stroken en dakpannen om het huisje meer karakter en details te geven. Dit is optioneel maar zorgt wel voor een afgewerkt resultaat.

Neem vooral volledig creatieve vrijheid tijdens het schilderen. Je kan het zo wild of realistisch maken als je zelf wilt. Ik heb gekozen voor een beige, bruin en paars kleurenpalet omdat dit redelijk neutraal en rustig is. Ook biedt het contrast tegenover de zilveren pootjes. Je kan bij het schilderen ook verschillende technieken zoals drybrushing of het verdikken/verdunnen van verf gebruiken om interessante structuren en kleuren te krijgen.

Elektronica

imageedit_2_9936818709.png
20220603_135335.jpg
20220603_125034.jpg
20220603_120612.jpg

De elektronica is denk ik beginnersvriendelijk. Dit was voor mij pas de tweede keer dat ik met de arduino en onderdelen heb gewerkt en het was goed te doen.

Gebruik de schematische tekening en de foto's als bouwinstructie.

Begin met het uitbouwen van je circuit op een breadboard. Zo kan je testen of al je losse onderdelen werken. Of als ze niet werken kan je ze een stuk makkelijker vervangen. Ook kan je in deze fase al code gaan testen maar er bestaat een kans dat de servo's de snoeren uit het breadboard trekken.

Nadat je alles hebt getest op een breadboard kan je alle spullen gaan verzamelen om te solderen. Gebruik een printplaatje om het gemaakte circuit op te solderen. Ik heb van te voren nagedacht over de positie van alle snoeren, de LED's en de plus- en minrij. Let ook op dat het printplaatje dat je gebruikt niet te groot is aangezien het in de behuizing moet passen. Ik gebruikte een printplaatje van ongeveer 6x4 cm, maar kijk wat voor jou past en lukt!

Code

#include <Servo.h>

//Servo's benoemen
Servo myServo1;
Servo myServo2;
Servo myServo3;
Servo myServo4;
int i_Position = 0;

//RGB LED's benoemen en aan juiste pin koppelen
intred_light_pin = 11;
int green_light_pin = 10;
int blue_light_pin = 9;

int red2_light_pin = 6;
int green2_light_pin = 5;
int blue2_light_pin = 3;

void setup()
{
 // Hierdoor kan je info laten printen in de monitor en plotter.
 Serial.begin(9600); 

 //Servo's koppelen aan de juiste pin
 myServo1.attach(12);
 myServo2.attach(8);
 myServo3.attach(4);
 myServo4.attach(2);

 //Output RGB LED
 pinMode(red_light_pin, OUTPUT);
 pinMode(green_light_pin, OUTPUT);
 pinMode(blue_light_pin, OUTPUT);

 pinMode(red2_light_pin, OUTPUT);
 pinMode(green2_light_pin, OUTPUT);
 pinMode(blue2_light_pin, OUTPUT);

 //Startpositie Servo
 myServo2.write(0);
 myServo4.write(0);

 myServo1.write(180);
 myServo3.write(180);
}

void loop()
{
 // Hiermee print je de info van de geluidcensor in monitor of plotter.
 Serial.println(analogRead(A0)); 
 delay(100);

 // If statement zodat de beweging en LED's alleen activeren als het geluid een bepaalde waarde berijkt.
 if (analogRead(A0) >= 680)
 {

 // Voor de bewegingen van het huisje gebruik je forloops, hierdoor kan je de snelheid van de servo en 
    de graden makkelijk bepalen en aanpassen.

  //OPSTAAN
  for (i_Position = 0; i_Position <= 180; i_Position += 1) // Gaat van 0 naar 180 graden in stapjes van 1
  {
   myServo2.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   myServo4.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   delay(30);                        // Wacht 30ms zodat de servo naar de juiste positie kunnen komen
  }

  for (i_Position = 180; i_Position >= 0; i_Position -= 1) // Gaat van 180 naar 0 graden in stapjes van 1
  {
   myServo1.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   myServo3.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   delay(30);                        // Wacht 30ms zodat de servo naar de juiste positie kunnen komen
  }


  delay(1000);


 // Alle forloops die hieronder volgen werken hetzelfde als de forloop hierboven. 
   Je gebruikt alleen verschillende graden om de beweging te maken.

 //DANS

  //BEWEGING 1
  for (i_Position = 180; i_Position >= 160; i_Position -= 1)
  {
   RGB_color(255, 0, 0); // Rood
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 0; i_Position <= 20; i_Position += 1)
  {
   RGB_color(0, 255, 0); // Groen
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }

  for (i_Position = 160; i_Position <= 170; i_Position += 1)
  {
   RGB_color(0, 0, 255); // Blauw
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 20; i_Position >= 0; i_Position -= 1)
  {
   RGB_color(255, 255, 125); // Paars
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }


  //BEWEGING 2
  for (i_Position = 170; i_Position >= 150; i_Position -= 1)
  {
   RGB_color(0, 255, 255); // Cyaan
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 0; i_Position <= 10; i_Position += 1)
  {
   RGB_color(255, 0, 255); // Magenta
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }

  for (i_Position = 150; i_Position <= 160; i_Position += 1)
  {
   RGB_color(255, 255, 0); // Geel
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 10; i_Position >= 0; i_Position -= 1)
  {
   RGB_color(255, 0, 0); // Rood
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }


  //BEWEGING 3
  for (i_Position = 160; i_Position >=140 ; i_Position -= 1)
  {
   RGB_color(0, 255, 0); // Groen
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 0; i_Position <= 20; i_Position += 1)
  {
   RGB_color(0, 0, 255); // Blauw
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }

  for (i_Position = 140; i_Position <= 150; i_Position += 1)
  {
   RGB_color(255, 255, 125); // Paars
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 20; i_Position >= 10; i_Position -= 1)
  {
   RGB_color(0, 255, 255); // Cyaan
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }


  //BEWEGING 4
  for (i_Position = 150; i_Position >= 140; i_Position -= 1)
  {
   RGB_color(255, 0, 255); // Magenta
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 10; i_Position <= 30; i_Position += 1)
  {
   RGB_color(255, 255, 0); // Geel
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }

  for (i_Position = 140; i_Position <= 160; i_Position += 1)
  {
   RGB_color(255, 0, 0); // Rood
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 30; i_Position >= 20; i_Position -= 1)
  {
   RGB_color(0, 255, 0); // Groen
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }


  //BEWEGING 5
  for (i_Position = 160; i_Position >= 150; i_Position -= 1)
  {
   RGB_color(0, 0, 255); // Blauw
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 20; i_Position <= 30; i_Position += 1)
  {
   RGB_color(255, 255, 125); // Paars
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }

  for (i_Position = 150; i_Position <= 170; i_Position += 1)
  {
   RGB_color(0, 255, 255); // Cyaan
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 30; i_Position >= 10; i_Position -= 1)
  {
   RGB_color(255, 0, 255); // Magenta
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }


  //BEWEGING 6
  for (i_Position = 170; i_Position >= 160; i_Position -= 1)
  {
   RGB_color(255, 255, 0); // Geel
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 10; i_Position <= 20; i_Position += 1)
  {
   RGB_color(255, 0, 0); // Rood
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }

  for (i_Position = 160; i_Position <= 180; i_Position += 1)
  {
   RGB_color(0, 255, 0); // Groen
   myServo2.write(i_Position);
   myServo4.write(i_Position);
   delay(25);
  }

  for (i_Position = 20; i_Position >= 0; i_Position -= 1)
  {
   RGB_color(0, 0, 255); // Blauw
   myServo1.write(i_Position);
   myServo3.write(i_Position);
   delay(25);
  }


  delay(500);


  //AFSLUITING
  for (i_Position = 180; i_Position >= 0; i_Position -= 1) // Gaat van 180 naar 0 graden in stapjes van 1
  {
   RGB_color(0, 0, 0); // LED Uit
   myServo2.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   myServo4.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   delay(30);                        // Wacht 30ms zodat de servo naar de juiste positie kunnen komen
  }

  for (i_Position = 0; i_Position <= 180; i_Position += 1) // Gaat van 0 naar 180 graden in stapjes van 1
  {
   myServo1.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   myServo3.write(i_Position);       // Vertelt servo om naar de positie van variabele "i_Position" te gaan
   delay(30);                        // Wacht 30ms zodat de servo naar de juiste positie kunnen komen
  }

  delay(1000);
 }
}


// Functie om de kleuren in de code aan te kunnen geven met RGB waarden tussen 0 en 255.
void RGB_color(int red_light_value, int green_light_value, int blue_light_value)
{
 analogWrite(red_light_pin, red_light_value);
 analogWrite(green_light_pin, green_light_value);
 analogWrite(blue_light_pin, blue_light_value);

 analogWrite(red2_light_pin, red_light_value);
 analogWrite(green2_light_pin, green_light_value);
 analogWrite(blue2_light_pin, blue_light_value);
}

Met extra dank aan mijn klasgenoot voor zijn hulp met het schrijven van deze code!

Samenvoegen

20220612_174855.jpg
20220612_174834 (1).jpg

En dan de allerleukste stap van het hele proces. Je mag al je harde werk samenvoegen en je eindresultaat binnenkort bewonderen.

Als het goed is heb je nu je behuizing afgewerkt, al je elektronica gesoldeerd en de code geüpload. De laatste stap voor het vastplakken is het bevestigen van bakpapier voor alle ramen. Dit bakpapier zorgt ervoor dat de twee felle LED's gediffuseerd worden.

Voor het samenvoegen zit er een plankje in het midden van de bodem van het huisje. Hierop bevestig je de servo's met sterkte dubbelzijdige tape en daar bovenop plak je de arduino en het printplaatje. Let bij het in elkaar zetten goed op of alle snoertjes goed vast zitten en probeer de LED's zo vrij mogelijk te houden, dan is het licht het mooist. Als laatste kan je de geluidssensor bevestigen dichtbij een van de raampjes. Ik heb zelf gekozen voor een zijraampje aan de linkerkant. Denk eraan dat hier je geluidsbron bij in de buurt moet kunnen komen.

Wanneer dit allemaal gelukt is, kan je de bovenste verdieping op het huisje zetten en de toren ernaast. En zo heb je je eigen dansende huisje gemaakt!

Conclusie

ITTT Eindproduct

Dit is dan het eindresultaat!

Ik vond dit project ontzettend leuk om te doen. Wel heeft het ook voor "handen in mijn haar" gezorgd omdat ik veel nieuwe dingen heb gedaan. Ik heb voor het eerst elektronica gesoldeerd, ik heb voor het eerst geëxperimenteerd met 3D printen en ik heb voor het eerst laser gesneden. Ondanks dat ik tevreden ben over het eindproduct, vind ik het jammer dat ik mijn behuizing niet 3D heb kunnen printen. Ik had al mijn elektronica gebaseerd op het gewicht van een plastic huisje, toen werd dit huisje opeens van MDF. Hierdoor is mijn behuizing een stuk zwaarder en hebben de servo's moeite met opstaan en dansen. Dat vind ik erg jammer. Tegelijkertijd geeft het mij de mogelijkheid om zelf verder te knutselen aan dit project en het met alle tips die ik heb gekregen te verbeteren.

Ik heb tijdens dit project ontzettend veel geleerd en geëxperimenteerd en het heeft een enorme interesse in arduino's en robotica opgewekt. Ik hoop zelf in de toekomst nog veel coole dingen te maken met behulp van deze gave elektronica.