Dirigent: verschil tussen versies

Uit TrompBot
Naar navigatie springen Naar zoeken springen
 
(7 tussenliggende versies door een andere gebruiker niet weergegeven)
Regel 1: Regel 1:
{{Hoofdmenu}}
Een [[http://nl.wikipedia.org/wiki/Dirigent dirigent]] zorgt ervoor dat alle muzikanten in een orkest gelijk beginnen en in hetzelfde tempo spelen. Als we met ons robot orkest gaan spelen, moeten we ook zorgen dat iedereen op het zelfde moment start en in hetzelfe tempo speelt.
Een [[http://nl.wikipedia.org/wiki/Dirigent dirigent]] zorgt ervoor dat alle muzikanten in een orkest gelijk beginnen en in hetzelfde tempo spelen. Als we met ons robot orkest gaan spelen, moeten we ook zorgen dat iedereen op het zelfde moment start en in hetzelfe tempo speelt.


=Probleem=
=Probleem=
Hebben wij ook een dirigen nodig bij onze robot orkesten? Robots zijn toch heel precies en doen altijd exact hoe ze geprogrammeerd zijn. Dus waarom zouden ze naar een dirigent moeten luisteren.
Hebben wij ook een dirigen nodig bij onze robot orkesten? Robots zijn toch heel precies en doen altijd exact hoe ze geprogrammeerd zijn. Dus waarom zouden ze naar een dirigent moeten luisteren?


Doe het volgende experiment om dat uit te zoeken:
Doe het volgende experiment om dat uit te zoeken:
Regel 23: Regel 25:
/*
/*
  * dirigent.ino
  * dirigent.ino
  * Wacht op indrukken van knop S2 en stuur dan continue IR pulsjes, met een snelheid van 10 per seconde
  * Wacht op indrukken van knop S2 en stuur dan continue IR pulsjes, met een snelheid van 1000 per seconde
* Deze pulsjes kunnen ontvangen worden door andere robots (zorg dat de zender en ontvanger elkaar goed zien!)
  */
  */
void setup()  
void setup()  
{
{
   pinMode(6,OUTPUT); // pen 6: IR led
   pinMode(6,OUTPUT); // pen 6: IR led (uitgang)
   pinMode(2,OUTPUT); // pen 2: rode LED
   pinMode(2,OUTPUT); // pen 2: rode LED (uitgang)
   pinMode(14,OUTPUT); // pen 14: groene LED  
   pinMode(14,OUTPUT); // pen 14: groene LED (uitgang)
   pinMode(5, INPUT_PULLUP); // schakelaar
   pinMode(5, INPUT_PULLUP); // schakelaar (ingang)
 
   digitalWrite(14,HIGH);
   digitalWrite(14,HIGH); // Zet groene led aan
   while ( digitalRead(5) == HIGH ); // Loop zolang de knop S2 NIET is ingedruk (knipper groene led)
   while ( digitalRead(5) == HIGH ); // Loop zolang de knop S2 NIET is ingedruk (groene led is aan) en doe niets
   digitalWrite(14,LOW);  
   digitalWrite(14,LOW); // Zet groene led uit
}
}
 
 
void loop()  
void loop()  
{
{
  delay(50);
   digitalWrite(2,HIGH); // zet rode LED UIT
   digitalWrite(2,HIGH); // zet rode LED UIT
   tone(6,36000,10);    // Stuur puls op de IR van 36khz en 5miliseconde lang
   tone(6,36000,1);    // Stuur puls op de IR van 36khz en 1miliseconde lang
   delay(45);
   delay(1); // wacht 1 milliseconde
   digitalWrite(2,LOW); // zet rode LED AAN
   digitalWrite(2,LOW); // zet rode LED AAN
}
}
Regel 53: Regel 55:
<syntaxhighlight>
<syntaxhighlight>
/*
/*
  * ontvanger2.ino
  * ontvanger.ino
  * IR ontvanger. Telt pulsjes als deze ontvangen worden via de IR ontvanger
  * IR ontvanger. Telt pulsjes die deze binnenkomen via de IR ontvanger
  * Met een wacht functie kan je wachten tot er een aantal pulsen ontvangen zijn
  * Met de wacht() functie kan je wachten tot er een aantal pulsen ontvangen zijn
* Verschillende microcontrollers kunnen nu exact even lang wachten als ze allemaal naar dezelfde zender kijken.
  *
  *
  */
  */
#include <Servo.h>    // zeg de computer dat we de servo functies willen gebruiken
#include <Servo.h>    // zeg de computer dat we de servo functies willen gebruiken, anders kan hij die niet vinden
   
   
Servo motorA;  // definieer een servo met de naam motorA  
Servo motorA;  // definieer een servo met de naam motorA  
volatile short int teller = 0; // Een teller variabele


// signaal(): Deze functie wordt aangeroepen als we een puls ontvangen via de IR, verhoog de teller waarde met 1
// Dit is een zogenaamde "interrupt" functie. Hij wordt autonmatisch aangeroepen als er een signaal binnenkomt via IR
// doordat hij met "attachInterrupt" verbonden is met een ingang.
void signaal()
{
teller = teller + 1; // tel 1 op bij de waarde van teller
}


// wacht tot de tellerwaarde een aantal pulsen hoger is geworden
// wacht tot er een aantal pulsen ontvangen is (iedere overgang van LAAG naar HOOG wordt geteld)
void wacht(unsigned short pulsen)
void wacht(int pulsen)
{
{
   unsigned short eind = teller + pulsen; // bereken de eindwaarde van teller (de huidige tellerwaarde + pulsen);
   while ( pulsen > 0 ) // Zolang we nog niet op nul zijn
  while(eind > teller); // wacht totdat er genoeg pulsen zijn ontvangen;  
  {
   // (ondertussen kan signaal() wel automatisch uitgevoerd worden als er een puls binnen komt.
    while( digitalRead(7) == LOW ); // wacht zolang IR ingang LAAG is 
    while( digitalRead(7) == HIGH ); // wacht zolang IR ingang HOOG is
    pulsen = pulsen - 1; // trek 1 af van de pulsen teller
   }
}
}
   
   
Regel 85: Regel 82:
   pinMode(7,INPUT_PULLUP); // IR sensor op pen 7 als ingang schakelen
   pinMode(7,INPUT_PULLUP); // IR sensor op pen 7 als ingang schakelen
   pinMode(2,OUTPUT); // rode LED op pen 2 als uitgang schakelen
   pinMode(2,OUTPUT); // rode LED op pen 2 als uitgang schakelen
  attachInterrupt(7, signaal, RISING); // Roep signaal functie automatisch aan, bij een pulsje van IR ontvanger (ingang 7)
   motorA.attach(13); // vebind servo met aansluitpen 13
   motorA.attach(13); // vebind servo met aansluitpen 13
}
}
Regel 93: Regel 89:
void loop()  
void loop()  
{
{
   wacht(250); // wacht totdat er 500 pulsjes ontvangen zijn
   wacht(250); // wacht totdat er 250 pulsjes ontvangen zijn
   digitalWrite(2,HIGH); // Rode led aan
   digitalWrite(2,HIGH); // Rode led aan
   motorA.write(40); // Zet de servo op stand 40
   motorA.write(40); // Zet de servo op stand 40
   wacht(100); // Wacht totdat er nog 200 pulsjes ontvangen zijn
   wacht(100); // Wacht totdat er nog 100 pulsjes ontvangen zijn
   motorA.write(80); // zet de servo op stand 80
   motorA.write(80); // zet de servo op stand 80
   digitalWrite(2,LOW); // Rode led uit
   digitalWrite(2,LOW); // Rode led uit
}
}
</syntaxhighlight>
</syntaxhighlight>

Huidige versie van 8 dec 2013 om 20:15

Beginnen | Hardware | Software | Voorbeeldprogramma | Inkscape & lasersnijden | Errors & Tips | Kekbot | [TrompBot Website] | Trompbots | Percussie & ritme | Fioretti programma


Een [dirigent] zorgt ervoor dat alle muzikanten in een orkest gelijk beginnen en in hetzelfde tempo spelen. Als we met ons robot orkest gaan spelen, moeten we ook zorgen dat iedereen op het zelfde moment start en in hetzelfe tempo speelt.

Probleem

Hebben wij ook een dirigen nodig bij onze robot orkesten? Robots zijn toch heel precies en doen altijd exact hoe ze geprogrammeerd zijn. Dus waarom zouden ze naar een dirigent moeten luisteren?

Doe het volgende experiment om dat uit te zoeken:

  • Zet het programmatje Led aan en uit in twee launchpad microcontrollers
  • Zet de twee launchpads naast elkaar en druk bij beide op de RESET (S1) knop.
  • Laat op hetzelfe moment beide reset knoppen los
  • Beide ledjes knipperen als het goed is nu even snel en gelijktijdig
  • Wacht ongeveer 2 minuten
  • Kijk nu of de ledjes nog steeds gelijktijdig knipperen. Ja? Of hebben we een probleem?

Wat gebeurt hier?

Iedere microcontroller heeft zijn eigen klok en die loopt op een vast tempo (hij telt 16miljoen keer per seconde), maar niet iedere klok loopt exact gelijk (je kent het probleem wel van je eigen horloge of wekker) sommige lopen een beetje sneller, andere lopen een beetje langzamer. Dus als je een tijdje wacht, dan zal de klok van de ene microcontroller iets voor gaan lopen, en de andere iets achter. Dan lopen ze dus uit de maat.

Oplossing

De oplossing is het maken van een dirigent die de andere robots in de maat kan houden. Hiervoor moeten de microcontrollers met elkaar kunnen praten dit kan bijvoorbeeld met de infrarood zender en ontvanger. Kijk hiervoor ook naar de voorbeeld programmas Verzenden en Ontvangen. Dat kan je gebruiken om alle microcontrollers gelijk te laten starten (net zoals bij de knop), maar dat lost het probleem nog niet op, want daarna kunnen ze alsnog uit de maat gaan lopen, omdat hun klokken niet even snel lopen.

Een aanpassing van dit programma kan gebruikt worden om (net als een dirigent) steeds de maat aan te geven.

/*
 * dirigent.ino
 * Wacht op indrukken van knop S2 en stuur dan continue IR pulsjes, met een snelheid van 1000 per seconde
 * Deze pulsjes kunnen ontvangen worden door andere robots (zorg dat de zender en ontvanger elkaar goed zien!)
 */
void setup() 
{
  pinMode(6,OUTPUT); // pen 6: IR led (uitgang)
  pinMode(2,OUTPUT); // pen 2: rode LED (uitgang)
  pinMode(14,OUTPUT); // pen 14: groene LED (uitgang)
  pinMode(5, INPUT_PULLUP); // schakelaar (ingang)
 
  digitalWrite(14,HIGH); // Zet groene led aan
  while ( digitalRead(5) == HIGH ); // Loop zolang de knop S2 NIET is ingedruk (groene led is aan) en doe niets
  digitalWrite(14,LOW); // Zet groene led uit
}
 
 
void loop() 
{
  digitalWrite(2,HIGH); // zet rode LED UIT
  tone(6,36000,1);     // Stuur puls op de IR van 36khz en 1miliseconde lang
  delay(1); // wacht 1 milliseconde
  digitalWrite(2,LOW); // zet rode LED AAN
}


De ontvanger

/*
 * ontvanger.ino
 * IR ontvanger. Telt pulsjes die deze binnenkomen via de IR ontvanger
 * Met de wacht() functie kan je wachten tot er een aantal pulsen ontvangen zijn
 * Verschillende microcontrollers kunnen nu exact even lang wachten als ze allemaal naar dezelfde zender kijken.
 *
 */
#include <Servo.h>    // zeg de computer dat we de servo functies willen gebruiken, anders kan hij die niet vinden
 
Servo motorA;  // definieer een servo met de naam motorA 


// wacht tot er een aantal pulsen ontvangen is (iedere overgang van LAAG naar HOOG wordt geteld)
void wacht(int pulsen)
{
  while ( pulsen > 0 ) // Zolang we nog niet op nul zijn
  {
    while( digitalRead(7) == LOW ); // wacht zolang IR ingang LAAG is   
    while( digitalRead(7) == HIGH ); // wacht zolang IR ingang HOOG is
    pulsen = pulsen - 1;  // trek 1 af van de pulsen teller 
  }
}
 
// setup: initialiseer de IO's en verbind de signaal functie met de ingang
void setup() 
{
  pinMode(7,INPUT_PULLUP); // IR sensor op pen 7 als ingang schakelen
  pinMode(2,OUTPUT); // rode LED op pen 2 als uitgang schakelen
  motorA.attach(13); // vebind servo met aansluitpen 13
}


// loop: wacht steeds op een aantal pulsjes, en zet de servo in een andere stand
void loop() 
{
  wacht(250); // wacht totdat er 250 pulsjes ontvangen zijn
  digitalWrite(2,HIGH); // Rode led aan
  motorA.write(40); // Zet de servo op stand 40
  wacht(100); // Wacht totdat er nog 100 pulsjes ontvangen zijn
  motorA.write(80); // zet de servo op stand 80
  digitalWrite(2,LOW); // Rode led uit
}