Roboter mit ARDUINO – Teil 2

Date: 26. April 2015 Posted by: owerner In: Informatik

Zunächst sollten die Sus die Programmierung der digitalen Ein- und Ausgängen kennen lernen.

Dazu haben wir ein Programm geschrieben, das die onboard LED an PIN 13 blinken lässt – man könnte in diesem Zusamenhang sagen – das klassische hello-world-Programm:

/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
int zitrone=1000;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(zitrone); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(zitrone); // wait for a second
zitrone=zitrone-100;
if (zitrone<0) {
zitrone=1000;
}
Serial.println(zitrone);
}

Es handelt sich hier um ein modifiziertes Beispielprogramm, bei dem einfach nur die Pause zwischen den einzelnen Blinkzeichen verändert wurde.

Unsereem Bausatz lagen ein Breadbord und Kabelstücke in verschiedenen Längen bei. Die Hardware unserer Experimente ist relativ einfach aufgebaut: an ein Bein (z.B. die Annode) wird ein 220 Ohm Widerstand angelötet. Damit ist auf jeden Fall ein Pol der LED gekennzeichnet und die Stromstärke wird soweit begrenzt, dass weder LED noch Controller Schaden nehmen können.

Das vorherige Programm wurde in ein Lauflicht umgewandelt:

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
int zitrone=100;
 
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  for (int pin=13; pin>4; pin--)
    {pinMode(pin, OUTPUT);}
    Serial.begin(9600);  
}
 
// the loop routine runs over and over again forever:
void loop() {
  for (int pin=13; pin>6; pin--){
    digitalWrite(pin, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(zitrone);               // wait for a second
    digitalWrite(pin, LOW);    // turn the LED off by making the voltage LOW
    delay(zitrone);               // wait for a second 
  }
  for (int pin=6; pin<13; pin++)
  {
    digitalWrite(pin, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(zitrone);               // wait for a second
    digitalWrite(pin, LOW);    // turn the LED off by making the voltage LOW
    delay(zitrone);               // wait for a second
  }
}

Das letzte Programm mit LED sollte digital zählen. Die Entwicklung des Algorithmus stellete die Sus vor einige Schwierigkeiten – nach einigen Vorarbeiten an der Tafel, konnten zumindest die SuS mit Vorkenntnissen das Program selbständig umsetzen:

 

int zahl=0;
void setup () {
for (int pin=2; pin<=13; pin++){
pinMode (pin,OUTPUT);
//Serial.begin (9600);
}
}
void loop() {
for (int n=0; n<11;n++){
zahl=n;
if (zahl-8>=0){
digitalWrite(13,HIGH);
zahl=zahl-8;}
if (zahl-4>=0){
digitalWrite(12,HIGH);
zahl=zahl-4;}
if (zahl-2>=0){
digitalWrite(11,HIGH);
zahl=zahl-2;}
if (zahl-1>=0){
digitalWrite(10,HIGH);}
delay (200);
for (int pin=10; pin<=13; pin++){digitalWrite(pin,LOW);}
}
}

Hier trat ein interessanter Fehler auf: Ich hatte empfohlen die LED bei PIN 0 beginnend zu stecken. Dabei wird dann allerdings der Schreib- und Lese-Pin belegt, d.h. der Arduino lässt sich nicht mehr programmieren.

 

Das letzte Programm zum Thema digitale Ein-/Ausgabe war das Auswerten von Tasterereignissen:

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, INPUT);
  Serial.begin(9600);
 
}
 
 
void loop() 
{
  boolean inp;
  Serial.println(digitalRead(12));
  inp=digitalRead(12);
  if (inp==LOW)
    {for (int i=1; i<=5; i++)
      {
        digitalWrite(13,HIGH);
        delay (100);
        digitalWrite(13,LOW);
        delay(100);
      }
      delay(20);}
  else
    {digitalWrite(13,LOW);
      delay(20);}
 
 
}

 

Ich finde es sehr wichtig, dass man in die Programme auch immer die serielle Kommunikation einbaut – Es hilft beim Debuggen, denn es stellt sich jedesmal die Frage, ist das auftretende Problem ein Hard-/ oder Softwarefehler.

Im Teil 3 werde ich mich dann mit dem Einlesen analoger Werte beschäftigen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.