Dirigent

Uit TrompBot
Versie door Peter (overleg | bijdragen) op 8 dec 2013 om 17:38
Naar navigatie springen Naar zoeken springen

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 10 per seconde
 */
void setup() 
{
  pinMode(6,OUTPUT); // pen 6: IR led
  pinMode(2,OUTPUT); // pen 2: rode LED
  pinMode(14,OUTPUT); // pen 14: groene LED 
  pinMode(5, INPUT_PULLUP); // schakelaar
  
  digitalWrite(14,HIGH);
  while ( digitalRead(5) == HIGH ); // Loop zolang de knop S2 NIET is ingedruk (knipper groene led)
  digitalWrite(14,LOW); 
}


void loop() 
{
  delay(50);
  digitalWrite(2,HIGH); // zet rode LED UIT
  tone(6,36000,10);     // Stuur puls op de IR van 36khz en 5miliseconde lang
  delay(45);
  digitalWrite(2,LOW); // zet rode LED AAN
}