Blokfluit Robot: verschil tussen versies

Uit KekBot
Naar navigatie springen Naar zoeken springen
Rainier (overleg | bijdragen)
Ruben (overleg | bijdragen)
 
(23 tussenliggende versies door 2 gebruikers niet weergegeven)
Regel 3: Regel 3:


De blokfluit wordt aangestuurd met 4 servo motoren en een luchtpomp.
De blokfluit wordt aangestuurd met 4 servo motoren en een luchtpomp.
Voor de luchtpomp is wel een externe voeding nodig (9V).
Voor de luchtpomp is wel een externe voeding nodig (max 12V).
Verder wordt er gebruik gemaakt van een arduino uno.
Verder wordt er gebruik gemaakt van een arduino uno.
----
----
Regel 9: Regel 9:
== Status ==
== Status ==


De blokfluit kan worden bespeeld met verschillende liedjes.
* De blokfluit kan worden bespeeld met verschillende liedjes. deze kunnen steeds uitgebreid worden door een nieuw array aan de code toe te voegen.
* De blokfluit kan luisteren naar de dirigent, hij krijgt hierbij de snelheid door die aangehouden moet worden.
 
----
----


== Problemen ==  
== Problemen ==  
<nowiki>
 
- de servo's die de gaten moeten dichten was een klein probleem mee.
# De servo's die de gaten moeten dichten was een klein probleem mee.We hebben hiervoor een schuim tape soort gebruikt, deze neemt de vorm van de gaten aan. Het probleem was dat deze lucht doorlaten tussen de schuim delen, deze hebben we nu afgeplak met plakband.
  we hebben hiervoor een schuim tape soort gebruikt, deze neemt de vorm van de gaten aan.  
# Er is een externe voeding nodig voor de lucht pomp. (min 5V, max 12V)
  Het probleem was dat deze lucht doorlaten tussen de schuim delen, deze hebben we nu afgeplak met plakband.
# Het gebruik van een externe voeding voor de servo motoren:<nowiki>
</nowiki>
  We hebben geprobeerd om de 12 V voeding voor de lucht pomp te gebruiken voor de voeding van de servo motoren.
  We hebben dit gedaan door een "12v to 5v dc-dc converter circuit" te maken.
  Info over zo'n circuit hebben we van de volgende </nowiki>[http://www.circuitstune.com/2011/12/12-to-5-volt-dc-dc-converter-circuit.html website] <nowiki> gehaald.
  Een foto van het circuit is te vinden via de volgende </nowiki>[http://img819.imageshack.us/img819/1121/20130122115332.jpg link] <nowiki>
  De uitgangsspanning van het circuit was inderdaad 5 V.
  Toen we uiteindelijk de servo's op deze voeding hadden aangesloten, leek het alsof de spanning de hoog was.
  Ze werkten dus niet!
  We hebben er toen dus voor gekozen om toch bij de Arduino te blijven, omdat we dit probleem niet opgelost kregen.
  Het rare van dit probleem is dat de 5 V spanning van de arduino exact overeenkomt met de uitgangsspanning van het door ons gemaakte circuit.</nowiki>
 
----
----


== Filmpje: ==  
== Filmpje ==  


in de maak.
Zie de robot in actie : [http://www.youtube.com/watch?v=juqLX5JyaA0 Filmpje]
----
----


== Code ==
== Code ==
 
<nowiki>
<nowiki>
Hieronder is de code die we gebruiken voor de blokfluit:
Hieronder is de code die we gebruiken voor de blokfluit:


Regel 38: Regel 48:
Servo myservo4;   
Servo myservo4;   


int Grepen[16] = {0,1,2,3,4,3,2,1,0,1,2,3,4,3,2,1};  // liedje 1
int Delay = 300; // start delay
 
int Grepen1[16] = {0,1,2,3,4,3,2,1,0,1,2,3,4,3,2,1};  // liedje 1
int Grepen2[16] = {1,3,4,3,1,0,1,3,4,3,1,0,1,3,4,3};  // liedje 2
int Grepen2[16] = {1,3,4,3,1,0,1,3,4,3,1,0,1,3,4,3};  // liedje 2
int Grepen3[16] = {1,2,3,4,1,2,3,4,1,2,3,4,3,2,1,0};  // liedje 3
void wait(int d)
{
    if (digitalRead(9) == HIGH && digitalRead(8) == LOW)  // krijgt pin 9 een HOOG binnen?, ga dan de tijd meten.
    {
      getTime();
    }
    else
    {
        unsigned long time = millis();
        while (time + d > millis())
        {
          if(digitalRead(9) == HIGH && digitalRead(8) == LOW)
          {
            getTime();
          }
        }
    }
}
void getTime()
{
  unsigned long time = millis();
  while (digitalRead(8) == LOW)
  Delay = millis() - time;
  Delay = Delay * 2;    // de tijd die gegeven is keer 2 anders speeld de blokfluit te snel.
}


void setup()  
void setup()  
Regel 47: Regel 88:
   myservo3.attach(11);  // zet eerste servo op pin 11
   myservo3.attach(11);  // zet eerste servo op pin 11
   myservo4.attach(10);  // zet eerste servo op pin 10
   myservo4.attach(10);  // zet eerste servo op pin 10
 
  pinMode(8, INPUT);
  pinMode(9, INPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
   
}  
}  
void loop()  
void loop()  
{  
{  
   for(int i = 0; i <= 16 ; i++)          // deze loop doorloopt het grepen arry voor het liedje.
   for(int i = 0; i <= 16 ; i++)          // deze loop doorloopt het grepen arry voor het liedje.
   {
   {
     switch (Grepen1[i])  
     switch (Grepen3[i])                 // hier kan je het liedje aanpassen
     {
     {
     case 0:
     case 0:
       myservo.write(60);  //open
       myservo.write(60);  //open
       delay(50);
       wait(50);
       myservo2.write(120); //open
       myservo2.write(120); //open
       delay(50);
       wait(50);
       myservo3.write(60); //open
       myservo3.write(60); //open
       delay(50);
       wait(50);
       myservo4.write(120); //open
       myservo4.write(120); //open
       delay(300);
       wait(Delay);  
       break;
       break;


     case 1:     
     case 1:     
       myservo.write(120); //dicht
       myservo.write(120); //dicht
       delay(50);
       wait(50);
       myservo2.write(120); //open
       myservo2.write(120); //open
       delay(50);
       wait(50);
       myservo3.write(60); //open
       myservo3.write(60); //open
       delay(50);
       wait(50);
       myservo4.write(120); //open
       myservo4.write(120); //open
       delay(300);
       wait(Delay);  
       break;
       break;


     case 2:     
     case 2:     
       myservo.write(120);  //dicht
       myservo.write(120);  //dicht
       delay(50);
       wait(50);
       myservo2.write(60); //dicht
       myservo2.write(60); //dicht
       delay(50);
       wait(50);
       myservo3.write(60); //open
       myservo3.write(60); //open
       delay(50);
       wait(50);
       myservo4.write(120); //open
       myservo4.write(120); //open
       delay(300);
       wait(Delay);  
       break;
       break;


     case 3:
     case 3:
       myservo.write(120);  //dicht
       myservo.write(120);  //dicht
       delay(50);
       wait(50);
       myservo2.write(60); //dicht
       myservo2.write(60); //dicht
       delay(50);
       wait(50);
       myservo3.write(120); //dicht
       myservo3.write(120); //dicht
       delay(50);
       wait(50);
       myservo4.write(120); //open
       myservo4.write(120); //open
       delay(300);
       wait(Delay);  
       break;
       break;


     case 4:
     case 4:
       myservo.write(120); //dicht
       myservo.write(120); //dicht
       delay(50);
       wait(50);
       myservo2.write(60); //dicht
       myservo2.write(60); //dicht
       delay(50);
       wait(50);
       myservo3.write(120); //dicht
       myservo3.write(120); //dicht
       delay(50);
       wait(50);
       myservo4.write(60); //dicht
       myservo4.write(60); //dicht
       delay(300);
       wait(Delay);  
       break;
       break;
     }  
     }  
   }
   }
}
}  
</nowiki>
</nowiki>
----
----

Huidige versie van 22 jan 2013 om 12:08

Info:

De blokfluit robot is gemaakt door Rainier en Ruben.

De blokfluit wordt aangestuurd met 4 servo motoren en een luchtpomp. Voor de luchtpomp is wel een externe voeding nodig (max 12V). Verder wordt er gebruik gemaakt van een arduino uno.


Status

  • De blokfluit kan worden bespeeld met verschillende liedjes. deze kunnen steeds uitgebreid worden door een nieuw array aan de code toe te voegen.
  • De blokfluit kan luisteren naar de dirigent, hij krijgt hierbij de snelheid door die aangehouden moet worden.

Problemen

  1. De servo's die de gaten moeten dichten was een klein probleem mee.We hebben hiervoor een schuim tape soort gebruikt, deze neemt de vorm van de gaten aan. Het probleem was dat deze lucht doorlaten tussen de schuim delen, deze hebben we nu afgeplak met plakband.
  2. Er is een externe voeding nodig voor de lucht pomp. (min 5V, max 12V)
  3. Het gebruik van een externe voeding voor de servo motoren: We hebben geprobeerd om de 12 V voeding voor de lucht pomp te gebruiken voor de voeding van de servo motoren. We hebben dit gedaan door een "12v to 5v dc-dc converter circuit" te maken. Info over zo'n circuit hebben we van de volgende website gehaald. Een foto van het circuit is te vinden via de volgende link De uitgangsspanning van het circuit was inderdaad 5 V. Toen we uiteindelijk de servo's op deze voeding hadden aangesloten, leek het alsof de spanning de hoog was. Ze werkten dus niet! We hebben er toen dus voor gekozen om toch bij de Arduino te blijven, omdat we dit probleem niet opgelost kregen. Het rare van dit probleem is dat de 5 V spanning van de arduino exact overeenkomt met de uitgangsspanning van het door ons gemaakte circuit.

Filmpje

Zie de robot in actie : Filmpje


Code

Hieronder is de code die we gebruiken voor de blokfluit:


#include <Servo.h>  // library van de servo's motoren

Servo myservo;    // maak servo objecten aan.
Servo myservo2;          
Servo myservo3;  
Servo myservo4;  

int Delay = 300; // start delay

int Grepen1[16] = {0,1,2,3,4,3,2,1,0,1,2,3,4,3,2,1};  // liedje 1
int Grepen2[16] = {1,3,4,3,1,0,1,3,4,3,1,0,1,3,4,3};  // liedje 2
int Grepen3[16] = {1,2,3,4,1,2,3,4,1,2,3,4,3,2,1,0};  // liedje 3

void wait(int d)
{
    if (digitalRead(9) == HIGH && digitalRead(8) == LOW)  // krijgt pin 9 een HOOG binnen?, ga dan de tijd meten.
    {
       getTime(); 
    }
    else
    {
        unsigned long time = millis();
        while (time + d > millis())
        {
          if(digitalRead(9) == HIGH && digitalRead(8) == LOW)
          {
            getTime();
          }
        } 
    }
}

void getTime()
{
  unsigned long time = millis();
  while (digitalRead(8) == LOW)
  Delay = millis() - time;
  Delay = Delay * 2;     // de tijd die gegeven is keer 2 anders speeld de blokfluit te snel. 
}


void setup() 
{ 
  myservo.attach(13);    // zet eerste servo op pin 13
  myservo2.attach(12);   // zet eerste servo op pin 12
  myservo3.attach(11);   // zet eerste servo op pin 11
  myservo4.attach(10);   // zet eerste servo op pin 10
  
  pinMode(8, INPUT);
  pinMode(9, INPUT); 
  digitalWrite(8, LOW); 
  digitalWrite(9, LOW); 
     
} 

void loop() 
{   
  for(int i = 0; i <= 16 ; i++)          // deze loop doorloopt het grepen arry voor het liedje.
  {
    switch (Grepen3[i])                  // hier kan je het liedje aanpassen
    {
    case 0:
      myservo.write(60);   //open
      wait(50);
      myservo2.write(120); //open
      wait(50);
      myservo3.write(60); //open
      wait(50);
      myservo4.write(120); //open
      wait(Delay); 
      break;

    case 1:    
      myservo.write(120); //dicht
      wait(50);
      myservo2.write(120); //open
      wait(50);
      myservo3.write(60); //open
      wait(50);
      myservo4.write(120); //open
      wait(Delay); 
      break;

    case 2:    
      myservo.write(120);  //dicht
      wait(50);
      myservo2.write(60); //dicht
      wait(50);
      myservo3.write(60); //open
      wait(50);
      myservo4.write(120); //open
      wait(Delay); 
      break;

    case 3:
      myservo.write(120);  //dicht
      wait(50);
      myservo2.write(60); //dicht
      wait(50);
      myservo3.write(120); //dicht
      wait(50);
      myservo4.write(120); //open
      wait(Delay); 
      break;

    case 4:
      myservo.write(120); //dicht
      wait(50);
      myservo2.write(60); //dicht
      wait(50);
      myservo3.write(120); //dicht
      wait(50);
      myservo4.write(60); //dicht
      wait(Delay); 
      break;
    } 
  }
}