Arduino Programmieren

Herzlich Willkommen zum StartHardware Arduino Programmierkurs. Hier werden wir uns Schritt für Schritt dem Programmieren des Arduinos widmen und es geht sofort los!

Baue die folgende Schaltung dafür auf:

Arduino Programmieren Lernen

Wir haben nun einen Taster am digitalen Pin 8, eine rote LED am digitalen Pin 5 und eine grüne am digitalen Pin 6.

Überblick

Programm

Ein Programm besteht aus aufeinander folgenden Befehlen. Sie werden der Reihe nach von oben nach unten ausgeführt.

Befehle

Befehle sind Programmanweisungen, die bestimmte Funktionen auslösen. Der Befehl

pinMode(6,OUTPUT);

legt den digitalen Pin 6 als Output fest. Mit dem Befehl

digitalWrite(6, HIGH);

lassen sich so 5V+ auf den digitalen Pin 6 schalten. Jeder Befehl muss mit einem Semikolon enden!

Das probieren wir gleich aus. Lade das folgende Programm auf das Arduino:

void setup() {
  pinMode(6, OUTPUT);
}

void loop() {
  digitalWrite(6, HIGH);
}

Die grüne LED leuchtet auf.

Programmstruktur

Ein Arduino-Programm hat eine bestimmte Programstruktur. Im einfachsten Fall handelt es sich um die zwei Hauptmethoden setup() und loop(). Alles, was man in degeschweiften Klammern { } schreibt, gehört zu der jeweiligen Methode.

void setup() {
}

void loop() {
}

Während die setup()-Methode nur beim Programmstart ausgeführt wird, wird die loop()-Methode kontinuierlich wiederholt.

Lade das folgende Programm auf das Arduino:

void setup() {
  pinMode(6, OUTPUT);
}

void loop() {
  digitalWrite(6, HIGH);
  delay(1000);
  digitalWrite(6, LOW);
  delay(1000);
}

Der Befehl delay(1000); hält das Programm kurzzeitig an. Die Zahl in den runden Klammern gibt an, wie lange in Millisekunden das Programm angehalten werden soll. Hier sind es 1000 Millisekunden, also eine Sekunde.

Solche mit Befehlen übertragenen Werte nennt man Argumente. Bei delay(1000); ist das Argument also 1000, bei digitalWrite(6,HIGH); wären die Argumente 6 und HIGH.

Variablen

Nun haben wir in unserem Programm an drei Stellen eine 6 eingetragen. Wenn wir nun statt der grünen lieber die rote LED leuchten lassen wollten, müssten wir das also an drei Stellen ändern. Das ist nicht sehr komfortabel. Besser ist es, die Information über die Pinnummer in einer Variablen zu speichern.

Eine Variable ist ein kleiner Speicher, in den eine Information einer bestimmten Form passt. Die Form wird durch den so genannten Variablentyp bestimmt.

Variablentyp Bedeutung Beschreibung
long ganze Zahlen -2 Milliarden bis 2 Milliarden
float Fließkommazahl gebrochene Zahlen
char Character Alphanumerische Zeichen (Buchstaben, Zahlen, Sonderzeichen)

Bei der Pinnummer handelt es sich um eine ganze Zahl. Mit der Anweisung

int ledPin=6;

legen wir eine Variable vom Typ int an. Sie heißt ledPin und bekommt einen Wert von 6 zugewiesen. Überall, wo wir nun den Variablennamen angeben, wird er durch den Variablenwert ersetzt.

int ledPin=6;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

Nun lässt sich auch schnell ein Programm schreiben, dass die andere LED blinken lässt.

int ledPin=5;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

if-Abfrage

Um einen Taster auszulesen, können wir den Befehl digitalRead(); verwenden. Er liefert einen Wert zurück, den man auslesen und vergleichen kann. Zum Vergleichen lässt sich die if-Abfrage nutzen:

int ledPin=5;
int buttonPin=8;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (digitalRead(buttonPin)==HIGH){
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Um den Befehl digitalRead(); nutzen zu können, muss der entsprechende Pin vorher als Input deklariert worden sein: pinMode(buttonPin, INPUT);

Die Konstruktion if (digitalRead(buttonPin)==HIGH) prüft, ob der ausgelesene Zustand des Tasters gleich HIGH ist. In unserer Beispielschaltung wird HIGH ausgegeben, wenn der Pin irgendwie eine Verbindung zum 5V+ hat. Ist der Taster gedrückt, besteht diese. Das doppelte Gleichheitszeichen ist zwingend erforderlich! Ist die Bedingung in den Klammern der if-Abfrage richtig, also wahr, wird der Teil in den geschweiften Klammern ausgeführt. Ist er nicht wahr, wird der Teil ausgeführt, der hinter else steht.

For-Schleife

Manchmal möchte man bestimmte Vorgänge ein paar Mal wiederholen. Dafür bietet sich die for-Schleife an:

int greenPin=6;
int redPin=5;
int buttonPin=8;

void setup() {
  pinMode(greenPin, OUTPUT);
  pinMode(redPin, OUTPUT);
}

void loop() {
  for (int i=0; i<3; i=i+1){
    digitalWrite(greenPin, HIGH);
    delay(250);
    digitalWrite(greenPin, LOW);
    delay(250);
  }

  for (int i=0; i<6; i=i+1){
    digitalWrite(redPin, HIGH);
    delay(250);
    digitalWrite(redPin, LOW);
    delay(250);
  }

}

Dieses Programm lässt erst die grüne LED dreimal blinken, dann die rote sechs mal. Die Konstruktion for (int i=0; i<3; i=i+1){ } wiederholt alles in den geschweiften Klammern, solange die Fortsetzungsbedingung i<3 wahr ist. Bei i handelt es sich um eine Zählervariable, die beim Start angelegt und auf 0 gesetzt wird: int i=0. Bei jedem Schleifendurchlauf wird i um 1 erhöht: i=i+1. (Normaler Weise schreibt man dies verkürzt durch i++).

Methoden

Dieser Programmtext ist noch relativ lang und lässt sich durch das Anlegen einer eigenen Methode verkürzen. Immer wenn man gleiche Befehlsfolgen wiederholen will, bietet sich das an:

int greenPin=6;
int redPin=5;
int buttonPin=8;

void setup() {
  pinMode(greenPin, OUTPUT);
  pinMode(redPin, OUTPUT);
}

void blinken(int thePin, int wiederholungen){
  for (int i=0; i<wiederholungen; i=i+1){
    digitalWrite(thePin, HIGH);
    delay(250);
    digitalWrite(thePin, LOW);
    delay(250);  
  }
}

void loop() {
  blinken(greenPin,3);
  blinken(redPin,6);
}

Die Methode void blinken() { } lässt eine LED eine bestimmte Anzahl oft blinken. Sie benötigt zwei Informationen: Welche LED soll blinken? Wie oft soll sie blinken? Beide Informationen sind ganzzahlig und werden in den runden Klammern als Argumente angelegt blinken(int thePin, int wiederholungen). Innerhalb der Methode kann man nun die Variablen thePin und wiederholungen verwenden.

Aus der loop()-Methode rufen wir die blinken()-Methode zweimal auf und übergeben jeweils die LED und die Anzahl der Widerholungen.

blinken(greenPin,3);
blinken(redPin,6);

Damit sind wir erstmal am Ende dieses Schnelleinstiegs angekommen. Ich hoffe, die Ausführungen waren verständlich und ich würde mich natürlich sehr über Kommentare dazu freuen.

19 Kommentare zu „Arduino Programmieren

  1. Tolle Seite,

    als Blutjunger Anfänger Senior bitte die Frage:
    habe zufällig einen „Arduino Uno“ und einen „Rasperry pi Sero“ (ohne Zubehör und Anleitung) günstig erstanden bzw. als Geschenk von Heise für ein Kurz Abo bekommen. Ist es möglich beide irgendwie zu verbinden zum experimentieren ?

    Wäre sehr dankbar für dementsprechende und weitere Hinweise.

    Schöne Grüße
    wowo

    1. Hallo Wowo,

      also erstmal Glückwunsch zu den schönen Dingen. Man kann das Arduino-Board natürlich schon an den Raspberry Pi anschließen, aber wie so oft stellt sich die Frage nach dem Warum. Wenn Du eine Projektidee hast, kannst Du gucken, wie das am Besten umsetzbar ist. Um beide zu verbinden, würde ich das Arduino-Board per USB an den Pi anschließen und die »Serielle Kommunikation« zum Datenaustausch verwenden. Ich empfehle Dir aber, Dir ein gutes Buch zum Raspberry Pi zu besorgen. In Raspberry Pi: Das umfassende Handbuch* werden die wichtigsten Themen gut erklärt. Das Raspberry Pi ist eine ganz andere Baustelle, als das Arduino Board.

      Liebe Grüße

      Stefan

      *Affiliate-Link

  2. Sehr schöne und informative Seite. Mal eine Frage : Im obigen Beispiel werden die LED’s direkt, also ohne Treiber an die Pins des Arduino und somit an den Mikrocontroller gehängt. Schafft dieser das powermäßig denn auf Dauer, die LED’s direkt zu treiben ?
    Ich hab‘ das vor Urzeiten mal so gelernt, das man beim ansteuern von LED’s diese immer über Treiber, z.B. einen Transistor oder entsprechenden IC laufen lassen sollte. Wie ist das beim Arduino ?

    1. Hallo Thomas, also das hat Du eigentlich schon richtig gelernt. Da die LEDs aber inklusive Vorwiderstand nur ca. 20mA benötigen und der Chip des Arduino-Boards (ATMEGA328) bis zu 40mA liefern kann, geht das schon. Der Chip ist wirklich super robust. Liebe Grüße

  3. Ich habe Deine Methode zum Blinken mal mit meinen „eigenen“ Variablen abgetippt, aber hier springt das Programm nicht zur nächsten LED, wenn die erste dreimal geleuchtet hat.
    Ich habe alles verglichen. Und kopiere ich Deinen Code und lasse diesen ausführen, funktioniert alles, wie es soll …
    Ich bin verwirrt 😀

  4. Ich bin begeistert! Endlich mal schön Schritt für Schritt der Programmaufbau, das Konzept erklärt, sodass ich noch Hoffnung habe, das C(++) auch für Normalos zu verstehen ist. Ich brenne auf die Folge-Kapitel.
    Ihr schreibt oben mehrfach:
    digitalWrite(6, HIGH);
    delay(1000);
    digitalWrite(6, HIGH);
    delay(1000);
    Ich glaube, „LOW“ ist in der unteren Reihe als Argument nötig, um das Blinken hinzubekommen.

  5. Super Klasse erklärt!! Einfach, strukturiert und ohne jegliches „Angeberwissen“. So macht das Spaß! Endlich versteht man es, nicht wie im Unterricht. Wenn es noch mehr davon gibt, bitte bescheid geben!!

    1. Eigentlich nicht. Der »Plus« kommt ja aus den digitalen Pins. Auf welcher Seite der Vorwiderstand ist, ist meines Wissens nach nicht relevant. LG

  6. Könnten Sie mir verraten wie man eine Formel eingibt, in der dann eine Variable drinsteht, die von einem Ultraschall sensor definiert wird?

    Es soll ein Ultraschall Sensor eine Entfernung messen und danach den Wert in die Formel einsetzten, die dann einen Winkel daraus berechnet (Formel habe ich bereits). Dieser Winkelsoll an einen Servo geschickt werden, der diesen dann einstellt.
    Grüsse xx_arduinofan_xx

    1. Hi arduinofan – inzwischen wirst Du es auch woanders erfahren haben: Der „IF-Abfrage“-Teil oben ist der Schlüssel für Deinen Sensor.
      if (digitalRead(buttonPin)==HIGH){
      Die Bedingung muss sich „nur“ auf Deinen Sensor beziehen statt auf den Taster. Allerdings ist es ja so, dass der IR-Sensor ja in einem gewissen Bereich die Entfernungen messen kann. „10“ oder „105“ usw. würden wir als cm-Messungen erwarten, oder?
      Wenn es nicht um „ein“ oder „aus“ geht, „ja“ oder „nein“, „0“ oder „1“, muss Ardi mit einem analogen Wert umgehen. Das ist dann oft ein Wert zwischen 0 und 1023. Versuch’s mal damit:

      int ledPin=5; // die LED an Pin 5 soll unter Umständen (Bedingung!) leuchten
      int SensorAnalog=A1; // neben + und – hast Du einen dritten Pin, der Werte an den Pin A1 liefern kann. Verbine sie mit einem Kabel.
      int Wert1; // der am PIN A1 ankommende Messwert muss in einer Variablen gespeichert werden. Hier wird dafür „Platz reserviert“

      void setup() {
      pinMode(A1, INPUT);
      pinMode(ledPin, OUTPUT);
      }

      void loop() {
      if (serialRead(A1)<512){
      digitalWrite(ledPin, HIGH);
      } else {
      digitalWrite(ledPin, LOW);
      }
      }

Schreibe einen Kommentar

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

Ich akzeptiere

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.