Voorbeeldprogramma: verschil tussen versies
Regel 130: | Regel 130: | ||
Sluit de servo aan op aansluitpen 13 van de Launchpad, en druk op de linker schakelaar. De servo moet nu tussen twee posities bewegen. | Sluit de servo aan op aansluitpen 13 van de Launchpad, en druk op de linker schakelaar. De servo moet nu tussen twee posities bewegen. | ||
<syntaxhighlight> | <syntaxhighlight> | ||
// beweeg-schakelaar.ino: Beweeg een servo tussen twee posities | |||
// als je op de schakelaar drukt | |||
#include <Servo.h> // zeg de computer dat we de servo functies willen gebruiken | |||
Servo motor1; // definieer een servo met de naam motor1 | |||
void setup() | |||
{ | |||
motor1.attach(13); // vebind servo met aansluitpen 13 | |||
pinMode(5, INPUT_PULLUP); | |||
} | |||
void loop() | |||
{ | |||
if ( digitalRead(5) == HIGH ) // als de schakelaar HOOG is (niet ingedrukt): | |||
{ | |||
motor1.write(30); // beweeg naar 30 graden stand | |||
} | |||
else // anders: | |||
{ | |||
motor1.write(120); // beweeg naar 120 graden stand | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Versie van 3 okt 2012 19:18
Beginnen | Hardware | Software | Voorbeeldprogramma | Inkscape & lasersnijden | Errors & Tips | Kekbot | [TrompBot Website] | Trompbots | Percussie & ritme | Fioretti programma
De Microcontroller wordt in de taal C++ geprogrammeerd. Deze taal heeft een aantal regels die je in de gaten moet houden om een goed programma te maken. Die regels zijn net zoiets als de spelling en gramatica van de Nederlandse of Engelse taal. Ze regelen hoe de taal moet gebruiken. Als je een programma maakt wat niet volgens de regels is, zal de computer het niet begrijpen en een foutmelding geven. Je moet dan je programma veranderen. Lees de regels dus eerst goed, en houd je er aan! Hieronder staan een paar programma's om te beginnen.
Een aantal voorbeeldprogramma's staan hier:
De basis
Dit is een leeg programma. Het doet niets, maar is wel een correct programma (zonder spelfouten).
//leeg.ino: Een leeg programma, dit doet niets
void setup()
{
// Hier komen de opdrachten die 1 keer gedaan moeten worden bij het aanzetten
}
void loop()
{
// Hier komen de opdrachten die elke keer gedaan moeten worden
}
tip: Als er op een regel twee forward slashes staan (dat ziet er zo uit: //) dan wordt alles daarna tot het einde van de regel niet gelezen door de computer. Dat is makkelijk want zo kan je commentaar in je programma zetten zodat je zelf nog weet wat je had bedoeld.
Led aan en uit
Een programma wat een lampje laat knipperen is de basis voor iedere programmeur. Het laat zien dat alles werkt:
// knipper.ino: knipper de groene led, aan en uit, met 1 seconde ertussen.
// Voer deze instructie 1x uit bij het aanzetten
void setup()
{
pinMode(14, OUTPUT); // Schakel aansluiting (pin) nummer 14 als uitgang. Deze aansluiting is verbonden met de LED
}
// Blijf deze functie herhalen, zoalang de microcontroller aan staat
void loop()
{
digitalWrite(14, HIGH); // zet pin 14 uitgang HOOG (aan)
delay(1000); // Wacht 1 seconden (1000 milliseconden)
digitalWrite(14, LOW); // zet pin 14 uitgang LAAG (aan)
delay(1000); // Wacht 1 seconden (1000 milliseconden)
}
Dan nog een: Dit is een variatie op het eerste programma, maar maakt een wat langer patroon
// knipper2.ino: Maak een knipper patroon
// Voer deze instructie 1x uit bij het aanzetten
void setup()
{
pinMode(14, OUTPUT); // Schakel aansluiting (pin) nummer 14 als uitgang. Deze aansluiting is verbonden met de LED
}
// Blijf deze functie herhalen, zoalang er spanning op de microcontroller staat
void loop()
{
digitalWrite(14, HIGH);
delay(100);
digitalWrite(14, LOW);
delay(100);
digitalWrite(14, HIGH);
delay(200);
digitalWrite(14, LOW);
delay(200);
digitalWrite(14, HIGH);
delay(200);
digitalWrite(14, LOW);
delay(1000);
}
Schakelaar inlezen
Als je de linker schakelaar S2 indrukt, dan gaat het rode lampje uit.
// schakelaar.ino - lees een schakelaar in, en schake led aan en uit
void setup()
{
pinMode(5, INPUT_PULLUP); // drukknop, als input
pinMode(2, OUTPUT); // LED als output
}
void loop()
{
if ( digitalRead(5) == HIGH ) // als de schakelaar HOOG is (niet ingedrukt)
{
digitalWrite(2, HIGH); // zet dan de uitgang HOOG (lamp aan)
}
else // anders
{
digitalWrite(2, LOW); // zet de uitgang LAAG (lamp uit)
}
}
Een servo besturen
Sluit de servo aan op de uitgang 13 van de Launchpad. Als je het programma start gaat de servo bewegen tussen twee posities (90 graden uit elkaar)
met een wachttijd van 1 seconde tussen de bewegingen. Meer informatie over de Servo
functies vind je op de Servo pagina.
// beweeg.ino: Beweeg een servo tussen twee posities
#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
void setup()
{
motorA.attach(13); // vebind servo met aansluitpen 13
}
void loop()
{
motorA.write(30); // beweeg naar 30 graden stand
delay(1000); // Wacht 1 seconden (1000 milliseconden)
motorA.write(120); // beweeg naar 120 graden stand
delay(1000); // Wacht 1 seconden (1000 milliseconden)
}
De servo besturen met een schakelaar
Sluit de servo aan op aansluitpen 13 van de Launchpad, en druk op de linker schakelaar. De servo moet nu tussen twee posities bewegen.
// beweeg-schakelaar.ino: Beweeg een servo tussen twee posities
// als je op de schakelaar drukt
#include <Servo.h> // zeg de computer dat we de servo functies willen gebruiken
Servo motor1; // definieer een servo met de naam motor1
void setup()
{
motor1.attach(13); // vebind servo met aansluitpen 13
pinMode(5, INPUT_PULLUP);
}
void loop()
{
if ( digitalRead(5) == HIGH ) // als de schakelaar HOOG is (niet ingedrukt):
{
motor1.write(30); // beweeg naar 30 graden stand
}
else // anders:
{
motor1.write(120); // beweeg naar 120 graden stand
}
}
Een functie
Een functie is een manier om 1x iets te schrijven, en meerdere keren te gebruiken. Hier een voorbeeld van een morse code
Eerst worden functies gemaakt voor de punt en de streep van de morse code, en vervolgens worden deze functies gebruikt in de morse_s()
en morse_o()
functie, die in het hoofdprogramma loop()
aangeroepen worden om het woord SOS te maken.
// functie.ino - voorbeeld van het gebruik van functies, stuur een morse code (http://nl.wikipedia.org/wiki/Morse)
// Bij het aanzetten: schakel aansluitpen 2 (rode lampje) als uitgang
void setup()
{
pinMode(2, OUTPUT);
}
// geef een korte flits op de rode lamp
void punt()
{
digitalWrite(2, HIGH);
delay(200);
digitalWrite(2, LOW);
delay(200);
}
// geef een lange flits op de rode lamp
void streep()
{
digitalWrite(2, HIGH);
delay(600);
digitalWrite(2, LOW);
delay(200);
}
// stuur de letter "S"
void morse_s()
{
punt();
punt();
punt();
delay(600);
}
// stuur de letter "O"
void morse_o()
{
streep();
streep();
streep();
delay(600);
}
// stuur de de hele tijd de morse-code "SOS" (HELP!) via het lampje
void loop()
{
morse_s();
morse_o();
morse_s();
delay(1400);
}
Een herhaling
Een herhaling is een manier om een functie een aantal keer uit te voeren. Dat doe je met het for()
commando.
Het for()
commando gebruik je zo: for( begin; test; ophogen; ) commando;
.
In het begin
stuk maak je geheugen aan voor een teller. In het test
stuk controleer je of je nog door moet gaan. Als dit waar
is, dan wordt het commando nog
een keer uitgevoerd. Als het niet waar
is stop de herhaling. Bij het ophogen
stuk kan je ieder keer de waarde van de variabele veranderen.
// forlooop.ino
//
void setup()
{
pinMode(2,OUTPUT); // groene led is een uitgang
}
// deze loop
void loop()
{
// 10 keer snel knipperen
for(int teller=0; teller<10; teller = teller + 1 )
{
digitalWrite(2, HIGH); // groen aan
delay(100);
digitalWrite(2, LOW); // groen uit
delay(100);
}
// 5 keer langzaam kipperen
for(int teller=0; teller<5; teller = teller + 1 )
{
digitalWrite(2, HIGH); // groen aan
delay(200);
digitalWrite(2, LOW); // groen uit
delay(200);
}
}
Een afloop
Een afloop is een manier om verschillende dingen achter elkaar te doen. Het wordt vaak gebruikt in robots.
// afloop.ino
int stap; // de stap variabele
void setup()
{
stap = 1; // we beginnen met stap = 0
pinMode(2,OUTPUT); // groene led is een uitgang
pinMode(5, INPUT_PULLUP); // de schakelaar is een ingang
pinMode(14,OUTPUT); // rode led is een uitgang
Serial.begin(9600);
}
void loop()
{
switch( stap ) // doe iets, afhankelijk van de waarde van stap
{
case 1: // als stap 1 is dan:
digitalWrite(2, HIGH); // groen aan
digitalWrite(14, HIGH); // rood aan
stap = 2; // de volgende keer is stap 2
break; // stop en ga verder na het einde van de switch }
case 2: // als stap 2 is dan:
digitalWrite(2, LOW); // groen uit
stap = 3; // de volgende keer is stap 3
break; // stop en ga verder na het einde van de switch }
case 3: // als stap 3 is dan:
if ( digitalRead(5) == LOW ) // als we op de linker knop drukken dan:
stap = 4; // ga naar stap 4
else
stap = 1; // de volgende keer is stap 1
break;
case 4: // als stap 4 is dan:
digitalWrite(14, LOW); // rood uit
delay(4000); // wacht
stap = 1; // de volgende keer is stap 1
break;
default: // als stap een andere waarde heeft dan 1 van de eerder case waarden, dan:
stap = 1;
}
delay(500); // wacht 1/2 seconde
Serial.print("Stap is: ");
Serial.println(stap);
}
Berichten sturen naar de computer
Met Serial kan je berichten sturen naar de computer
Berichten sturen via infrarood licht
Met IR kan je berichten sturen met onzichtbaar infrarood licht. Dit kan je gebruiken om verschillende robots met elkaar te laten praten.
Verzenden
Dir programma verstuurt een IR signaal als je op de linker knop drukt. Het rode ledje gaat uit als je drukt.
/*
* irstuur.ino
* Stuur een puls naar de IR led als je op de knop drukt
*/
void setup()
{
pinMode(6,OUTPUT); // IR led
pinMode(2,OUTPUT); // rode LED
pinMode(5, INPUT_PULLUP); // schakelaar
}
void loop()
{
if ( digitalRead(5) == LOW ) // Als je op de linker knop drukt
{
digitalWrite(2,LOW); // zet rode LED UIT
tone(6,36000,1); // Stuur puls op de IR van 36khz en 1miliseconde lang
delay(1); // Wacht 1 miliseconde
}
else // Anders (als knop niet ingedrukt is):
{
digitalWrite(2,HIGH); // zet rode LED AAN
}
}
Ontvangen - Simpel
Als er IR signaal ontvangen wordt, gaat de rode led aan. Kijk met een afstandsbediening (of andere launchpad die staat te zenden) of je signaal ontvangt.
/*
* ir.ino
* Simpele IR ontvanger: de rode led gaat aan als IR signaal ontvangen wordt
* het nummer van de knop wordt niet ingelezen (alleen IR AAN/UIT)
*/
void setup()
{
pinMode(7,INPUT_PULLUP); // IR sensor
pinMode(2,OUTPUT); // rode LED
}
void loop()
{
if ( digitalRead(7) == HIGH )
digitalWrite(2, LOW);
else
digitalWrite(2, HIGH);
}
Ontvangen - Met uitlezen van de knop
Dir programma leest de IR sensor uit, en kijkt welke knop er ingedrukt wordt. Hij stuurt de waarde van de knop naar de PC via de Serial poort. Het rode ledje gaat knipperen als er een code ontvangen is. Hij maakt daarvoor gebruik van de
IRremote
Bibliotheek. Je kan hiermee met de afstandsbediending meerdere knoppen herkennen.
/*
* irdump.ino
* ontvang IR signalen, en laat de code zien op het scherm.
* Open het serial window (ctrl+shift+m). Zorg dat de seriele poort goed staat en de jumpers 'horizontaal' staan.
* Richt een afstandsbediending van een TV op de ontvanger en druk op een knop.
* De rode led knippert als er iets ontvangen wordt
*/
#include <IRremote.h>
IRrecv irrecv(7); // maak een IR ontvanger, verbonden met pin 7
decode_results results; // geheugen voor het ontvangen van codes
void setup()
{
Serial.begin(9600); // zet communicatiesnelheid met pc
irrecv.enableIRIn(); // Start de ontvanger
pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
}
void loop() {
if (irrecv.decode(&results)) { // als er een code ontvangen is,
digitalWrite(2,LOW); // Geef een flits op de led
delay(100); //
digitalWrite(2,HIGH); //
Serial.print("IR code: "); // schrijf naar scherm
Serial.println(results.value, HEX); // laat de code dan zien
irrecv.resume(); // ontvang volgende code
}
}
Ontvangen - l ed knippert afhankelijk van de toets
Dir programma leest de IR sensor uit, en kijkt welke knop er ingedrukt wordt. Als je een 1 indrukt gaat de led 1x kinpperen, als je een 2 indrukt gaat de led 2x knipperen enzovoort. Je kunt in de funkties doKey1 .. doKey9 je eigen code toevoegen!
/*
* infraroodToets.ino
* ontvang IR signalen, en laat de code zien op het scherm.
* Open het serial window (ctrl+shift+m). Zorg dat de seriele poort goed staat en de jumpers 'horizontaal' staan.
* Richt een afstandsbediending van een TV op de ontvanger en druk op een knop.
* De rode led knippert het aantal keren van de toets die ingedrukt wordt
*/
#include <IRremote.h>
IRrecv irrecv(7); // maak een IR ontvanger, verbonden met pin 7
decode_results results; // geheugen voor het ontvangen van codes
void setup()
{
Serial.begin(9600); // zet communicatiesnelheid met pc
irrecv.enableIRIn(); // Start de ontvanger
pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
}
void loop() {
if (irrecv.decode(&results)) { // als er een code ontvangen is,
Serial.print("IR code: "); // schrijf naar scherm
Serial.println(results.value, HEX); // laat de code dan zien
int key = results.value % 16; // haal het laatste cijfer op van de code
Serial.print("key: "); // schrijf toets naar scherm
Serial.println(key);
switch (key){
case 1:
doKey1();
break;
case 2:
doKey2();
break;
case 3:
doKey3();
break;
case 4:
doKey4();
break;
case 5:
doKey5();
break;
case 6:
doKey6();
break;
case 7:
doKey7();
break;
case 8:
doKey8();
break;
case 9:
doKey9();
break;
default:
break;
}
irrecv.resume(); // ontvang volgende code
}
}
void doKey1(){
flashLed(1);
}
void doKey2(){
flashLed(2);
}
void doKey3(){
flashLed(3);
}
void doKey4(){
flashLed(4);
}
void doKey5(){
flashLed(5);
}
void doKey6(){
flashLed(6);
}
void doKey7(){
flashLed(7);
}
void doKey8(){
flashLed(8);
}
void doKey9(){
flashLed(9);
}
void flashLed(int nr){
Serial.print("Flashled: "); // schrijf naar scherm
Serial.println(nr); // laat de code dan zien
for (int i = 0; i < nr; i++){
digitalWrite(2,HIGH); // Geef een flits op de led
delay(100); //
digitalWrite(2,LOW); //
delay(100); //
}
}