Zum Inhalt springen

Lektion 20 – Mein digitales Haustier 2/2

    Lass uns jetzt unser digitales Haustier programmieren. Ein bisschen Arbeit steht uns noch bevor.

    Wir müssen unserem digitalen Haustier drei Sachen beibringen. Es soll mit den Augen (also den LEDs) zwinkern können. Es soll schnurren, wenn es gestreichelt wird. Und es soll meckern, wenn man es nicht beachtet. Fangen wir mit dem Augenzwinkern an.

    Augenzwinkern

    Das Augenzwinkern ist ja eigentlich nichts anderes, als das Blinken einer LED, wie wir es am Anfang unseres Kurses besprochen haben. Beide LEDs sind jeweils an einem eigenen Pin angeschlossen, sodass wir die Befehle pinMode und digitalWrite doppelt brauchen. Der Code könnte am einfachsten so aussehen:

    int ledPin1 = 10;
    int ledPin2 = 11;
    
    void setup() {
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);
    }
     
    void loop() {
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      delay(5000);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      delay(50);
    }

    Jetzt blinken die LEDs natürlich immer in der gleichen Geschwindigkeit. Das ist leider etwas langsam. Wenn wir das Augenzwinkern per Zufall auslösen könnten, wäre das bestimmt spannender. Zum Glück gibt es einen Zufalls-Befehl. Er heißt random().


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Info: random();

    Der random(maximal)-Befehl erzeugt eine Zufallszahl zwischen 0 und der als Argument übergebenen Zahl maximal. Dabei wird maximal aber nicht erreicht. Wenn man also schreibt random(5), dann können die zufälligen Zahlen nur 0, 1, 2, 3 und 4 sein.

    Wenn wir uns eine zufällige Zahl zwischen 0 und 500 ausgeben lassen, könnten wir jetzt sagen, dass die Augen immer dann blinzeln (LED aus) sollen, wenn diese zufällige Zahl gleich eins ist. Das passiert ja in zufälligen, also unregelmäßigen Abständen. Jetzt müssen wir noch am Ende unseres Programmes ein kleines delay einbauen, damit die zufälligen Zahlen nicht einfach so schnell hintereinander generiert werden, dass die Augen ständig blinken.

    int ledPin1 = 10;
    int ledPin2 = 11;
    
    void setup() {
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);  
    }
     
    void loop() {
      // LEDs für Augen einschalten
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      
      // Augenzwinkern
      if (random(500)==1){
        digitalWrite(ledPin1, LOW);
        digitalWrite(ledPin2, LOW);
        delay(50);
      }
      
      delay(10);
    }

    Schnurren

    Das digitale Haustier soll schnurren, wenn es gestreichelt wird. Um festzustellen, ob es gestreichelt wird, werden wir einen Lichtsensor in das digitale Haustier einbauen.
    Wenn du es streichelst, verdeckt deine Hand einfallendes Licht und das können wir mit dem Sensor registrieren.

    Wenn das Arduino-Board startet, müssen wir herausfinden, wie viel Licht im digitalen Haustier ist. Den Wert lesen wir einfach in die Variable lichtNormal mit lichtNormal=analogRead(sensorPin); aus.

    Die Variable sensorSchwelle sagt, ab welcher Helligkeitsdifferenz das Haustier schnurren soll. Das passiert mit if(analogRead(sensorPin)>lichtNormal+sensorSchwelle){…}. Es kann sein, dass du den Wert noch anpassen musst. Probiere einfach ein paar andere Werte, wenn es nicht so gut klappt mit dem Schnurren.

    Hier ist der Code (ohne Augenzwinkern):

    int sensorPin = 0;
    int sensorSchwelle = 20;
    
    int speakerPin = 9;
    
    int lichtNormal;  
    
    void setup() {
      lichtNormal = analogRead(sensorPin);
    }
     
    void loop() {
      // Schnurren
      if (analogRead(sensorPin)>lichtNormal+sensorSchwelle){
        tone(speakerPin,0.001);
      } else {
        noTone(speakerPin);
      }
    
      delay(10);
    }

    Meckern

    Damit das digitale Haustier nun auch auf sich aufmerksam machen kann, soll es eine kleine Melodie abspielen, wenn es nicht beachtet wird. Das machen wir wie bei dem Augenzwinkern mit dem random-Befehl. Allerdings soll das nur passieren, wenn man es gerade nicht streichelt. Wir müssen also zwei Bedingungen verknüpfen. Das geht in der if-Abfrage, indem wir das doppelte & Zeichen verwenden (&&).

    int sensorPin = 0;
    int sensorSchwelle = 20;
    
    int speakerPin = 9;
    
    int lichtNormal;  
     
    void setup() {
      lichtNormal = analogRead(sensorPin);
    }
     
    void loop() {
    
      // Meckern
      if ((random(10000)==1)&&(analogRead(sensorPin)<lichtNormal+100)){
        tone(speakerPin,1200);
        delay(100);
        tone(speakerPin,800);
        delay(200);
        tone(speakerPin,1000);
        delay(200);
        tone(speakerPin,1200);
        delay(100);
      }  
      
      delay(10);
    }

    Ob dein digitales Haustier meckern können muss, kannst du natürlich selbst entscheiden.

    Der komplette Code für dein digitales Haustier sieht dann so aus:

    int ledPin1 = 10;
    int ledPin2 = 11;
    
    int sensorPin = 0;
    int sensorSchwelle = 20;
    
    int speakerPin = 9;
    
    int lichtNormal;  
     
    void setup() {
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);
      
      lichtNormal = analogRead(sensorPin);
    }
     
    void loop() {
      // LEDs für Augen einschalten
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      
      // Augenzwinkern
      if (random(500)==1){
        digitalWrite(ledPin1, LOW);
        digitalWrite(ledPin2, LOW);
        delay(50);
      }
      
      // Schnurren
      if (analogRead(sensorPin)>lichtNormal+sensorSchwelle){
        tone(speakerPin,0.001);
      } else {
        noTone(speakerPin);
      }
      
      // Meckern
      if ((random(10000)==1)&&(analogRead(sensorPin)<lichtNormal+100)){
        tone(speakerPin,1200);
        delay(100);
        tone(speakerPin,800);
        delay(200);
        tone(speakerPin,1000);
        delay(200);
        tone(speakerPin,1200);
        delay(100);
      }  
      
      delay(10);
    }

    Das war jetzt wirklich schwierig. Lass uns basteln!

    Lade Dir die Bastelbogen-Datei herunter: Download

    Anleitung

    Bastelbögen Anleitung Schritt für SchrittDrucke die Bastelbögen auf Kartonpapier aus.

    bastelanleitung2Nimm den ersten Bogen und schneide entlang aller durchgezogenen Linien.

    bastelanleitung3Falze entlang aller gestrichelten Linien. Das geht besonders gut, wenn man diese Kanten vorher vorsichtig einritzt.

    bastelanleitung4Schneide den zweiten Bogen aus.

    bastelanleitung5Denke auch an den Ausschnitt in der Mitte.

    bastelanleitung6Nun falze wieder entlang der gestrichelten Kanten.

    bastelanleitung7Jetzt kannst Du die Löcher für die Augen machen. Sei hier besonders vorsichtig.

    bastelanleitung8Nun klebe die ersten Klebeflächen wie auf dem Bild gezeigt zusammen. Dafür geht ein Klebestift oder flüssiger Alleskleber.

    bastelanleitung9Klebe jetzt das Rückteil an.

    bastelanleitung10Schließe nun die Form.

    bastelanleitung11Klebe jetzt die Ohren des Haustieres an. Am besten nimmst Du einen Bleistift und drückst die Klebflächen von innen an.

    bastelanleitung13Nun integrieren wir die Elektronik. Stelle das Papiermodell einfach auf das Breadboard. Die Kabel können durch den Ausschnitt geführt werden.

    bastelanleitung14Stecke die LEDs in die Löcher der Augen. Biege dafür die Beinchen der LEDs nach unten. (Falls Deine Kabel zu kurz geworden sind, stelle etwas unters Breadboard, damit es höher steht.)

    bastelanleitung15Klebe die Beinchen mit einem Klebestreifen fest.

    bastelanleitung17Du kannst das digitale Haustier natürlich noch schön bemalen. Wenn Du es jetzt streichelst, sollte es schnurren.

    Herzlichen Glückwunsch!

    Du hast das Ende unseres Kurses erreicht. Ich hoffe, es hat Dir Spaß gemacht und dass Du weiter am Ball bleibst. Es gibt noch so viel zu entdecken. Hier geht es bald mit neuen Tutorials weiter und bis dahin alles Gute!

    Dein StartHardware.org-Team

    6 Gedanken zu „Lektion 20 – Mein digitales Haustier 2/2“

    1. Ich danke Euch für diese Erklärungen und habe alles beim nachvollziehen am Ardurino Board gelernt und verstanden, schön wäre eine Zusammenfassung des Sketch, oder gibt es ein Buch in so einer Art,

    2. Hallo, ich bin heute ebenfalls auf diese Tutorials-Seite gestoßen und habe gleich mal alles durchgelesen. Dabei habe ich einen (vermeintlichen?) Fehler entdeckt: Muss man im Setup nicht eine Funktion randomSeed(irgendeinWert); verwenden?

    3. Hallo,

      bin heute auf ihre Webseite gestoßen. Find diese sehr gut gelungen :-) Machen Sie weiter so.

      Jedoch habe ich eine Frage. Haben Sie mit der Split Funktion gearbeitet?

      Würde mich über eine Rückmeldung freuen.

      Mit freundlichen Grüßen
      Patrick Walther

      1. Hallo Patrick,

        vielen Dank für die netten Worte. Mit der Split-Funktion habe ich in den Tutorials eigentlich nicht gearbeitet. Meinst Du in diesem Beispiel?

        Liebe Grüße

        Stefan

    Schreibe einen Kommentar

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

     

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