befehle an Arduino senden

vor 1 Jahr 5 Wochen von twinflyer

Hi Leute......
ich hab es jetzt endlich gewagt einen LED-Cube zu bauen :)
funktioniert auch alles bestens, und der Würfel blinkt munter sein eingestelltes Programm runter.
Jetzt möchte ich ein 2. Programm für den Würfel schreiben, bei dem ich per PC befehle wie z.B. ein, ebene1, reihe2, led3, an den arduino senden und er schaltet dann die entsprechende LED ein/aus, je nach befehl.
Ich hatte mir das so vorgestellt:

Dem Arduino bringe ich bei welcher befehl was bewirken soll, so könnte ich z.B. auch ganze "Bilder" per PC ein und ausschalten.

Das alles wäre auch kein Problem wenn ich wüsste wie man daten an den arduino sendet, und der arduino diese dann ausließt.

Gibt es vllt. irgendwo ein Tutorial zu diesem Thema oder kann mir jemand kurz erklären wie ich soetwas anstelle.

Wäre wirklich dankbar dafür, sodass ich endlich sachen per PC beeinflusen kann :)

Gruss Max

Ähnliche Posts

9 Antworten auf “befehle an Arduino senden”


Darstellungsoptionen

Wähle hier deine bevorzugte Anzeigeart für Kommentare und klicke auf „Einstellungen speichern“ um die Änderungen zu übernehmen.
  1. Jan II sagt:

    Das ist nicht so schwierig: Du kannst dem Arduino über die serielle Schnittstelle (die in diesem Fall über die USB-Verbindung emuliert wird) Daten übergeben. Dazu musst du im Programm eine solche Verbindung per Serial.begin(geschwindigkeit) initialisieren, für geschwindigkeit einfach 9600 eingeben, das ist die Standard-Datenrate. Serial.print(befehl) sendet Daten an die Schnittstelle, Serial.read liest einen Byte von der Schnittstelle (d.h., der Arduino liest Daten - somit kannst du entsprechende Reaktionen darauf programmieren). Mehr dazu auch im Buch "Getting Started with Arduino" oder unter http://arduino.cc/en/Reference/Serial. Viel Erfolg.

    __________________

    Hier nicht klicken!

    Antworten quote

  1. Daniel sagt:

    Ist zwar nicht für die Ardunio-Plattform, sondern für den Standard-GCC aber eventuell hilft es ja.

    Pastebin

    Antworten quote

  1. twinflyer sagt:

    danke euch 2 für die Hilfe.
    Leider funktioniert die Sache nicht wie sie sollte....soll heißen, es funktioniert einfach garnichts.
    Ich wollte in meinem LED-Cube versuchen jede LED einzen ein und auszuschalten.
    Das hat nicht funktioniert, desshalb habe ich versucht eine einzelne LED mit den Befehlen "1" und "0" zu schalten, leider hat auch das nicht funktioniert.

    Dürfen in den Befehlen auch Leerzeichen enthalten sein?

    Wie auch immer...ich werde auch nächste woche wenn ich wieder zuhause bin mal meinen Quellcode schicken, vllt. hilft das ja weiter.

    Gruss max

    Antworten quote

  1. Jan II sagt:

    Es gibt keine eingebauten Befehle! Die musst du schon selbst programmieren, nach dem Motto:

    val = Serial.read();

    if (val == soundso) {
    soundso;
    }

    (ohne gewähr)

    __________________

    Hier nicht klicken!

    Antworten quote

  1. Benni sagt:

    Über die Arduino-IDE Konsole können Daten (Text/Zahlen) damit gesendet werden. Das Ende wird mit ";" markiert, so kann man das Empfangene weiterverwenden!

    Einmal bitteschön:

    char incomingByte;             
    char buffer[80];
    int count = 0;
     
     
    void setup() {
      Serial.begin(9600);
    }
     
    void clear_buffer(char *buffer, char length);
     
     
    void loop(){
      if (Serial.available () > 0)
        {
          incomingByte = Serial.read();
          // 10 = return
          // 13 = LineFeed
          // 59 = ;
          if (incomingByte == 10 || incomingByte == 59)
            {
    // Mach was mit buffer! val = atoi(buffer) etc.
    //          Serial.println(buffer);  //debug
              clear_buffer(buffer,80);
              count = 0;
            }
          else {
              buffer[count] = incomingByte;
              count++;
            }
        }
    }
     
    void clear_buffer(char *buffer, char length) {
      char ctr;
      for(ctr = 0; ctr <= (length-1); ctr++) {
        buffer[ctr] = 0;
      }
    }

    Antworten quote

  1. twinflyer sagt:

    Sorry.....ich war lange nichtmehr aktiv, ich hatte einfach keine Zeit!

    Also ich hab jetzt nochmal versucht eine einzelne LED über die Befehle 1 und 0 zu schalten. Die LED hängt an pin 13.

    ***********************************

    char val;
    int led = 13;

    void setup() {
    Serial.begin(9600);
    pinMode (led, OUTPUT);

    }

    void loop()
    {
    val = Serial.read();
    if (val == 1);
    {
    digitalWrite(led, HIGH);
    }
    if (val == 0);
    {
    digitalWrite(led, LOW);
    }
    }

    ***********************************

    So sieht das ganze Momentan aus, es lässt sich auch wunderbar hochladen, ohne Fehler.
    Das Problem: Die LED leutet dauerhaft, ich kann sie nicht schalten.
    wenn ich "0" eingebe und denen klicke passiert nichts, wenn ich "0;" eingebe passiert auch nichts.
    Was ist falsch ?
    muss ich etwas anderes eingeben und senden, oder stummt der Quellcode nicht ?

    Ich hoffe ich bekomme nocheinmal Hilfe.....wäre echt cool wenn ich sacher per PC steuern könnt :)

    Gruss Max

    [EDIT]
    Ich habe jetzt eunfach mal noch ein Serial.println befehl mit eingebracht um zu sehen was passiert.
    Der Serial Monitor zeigt jetzt immer:

    Die LED ist jetzt an!
    Die LED ist jetzt aus!
    die LED ist jetzt an!
    die LED ist jetzt aus!

    Und die LED Blinkt oO
    Irgendwas kann da ja nicht stimmen.

    Gruss Max

    [EDIT]
    So..ich hab jetzt das Bsp. von Benni benutz, und jetzt kann ich die LED schalten :D.
    Blöderweise schaltet sie sich nach seht kurzer Zeit selbstständig wieder aus, sodass es nur ein kurzes aufblitzen gibt, das wars dann.
    Ich kann eingeben was ich will, solang ein ";" am ende ist blinkt die LED auf.....also doch nich so richtiges Schalten.

    Antworten quote

  1. Peter Ikier sagt:

    Zunächst mal solltest du überprüfen, ob auf der Seriellen überhaupt ein Zeichen für dich bereitliegt:

    if (Serial.available() > 0) {
      // ...
    }

    Nur wenn das der Fall ist liefert Serial.read() einen vernünftigen Wert.
    Dann solltest du die Werte nicht als Zahlen betrachten, sondern als Bytes - und diese Bytes wiederum als Zeichen.

    Dann lautet deine Abfrage z.B so:

    int inByte = Serial.read();
    switch (inByte)
    {
      case '0': // hier wird das gelesene Byte mit dem Zeichen '0' verglichen, nicht mit der Zahl 0
        digitalWrite(led, LOW);
      break;
      case '1':
        digitalWrite(led, HIGH); 
      break;
      default:
        // mach gar nichts
      break;
    }

    Die Case-Anweisung kannst du jetzt um weitere Zeichen ergänzen, z.B. um 'x' um die LED umzuschalten ((zu toggeln).

    Gruß
    pi

    Antworten quote

  1. Peter Ikier sagt:

    Zunächst mal solltest du überprüfen, ob auf der Seriellen überhaupt ein Zeichen für dich bereitliegt:

    if (Serial.available() > 0) {
      // ...
    }

    Nur wenn das der Fall ist liefert Serial.read() einen vernünftigen Wert.
    Dann solltest du die Werte nicht als Zahlen betrachten, sondern als Bytes - und diese Bytes wiederum als Zeichen.

    Dann lautet deine Abfrage z.B so:

    int inByte = Serial.read();
    switch (inByte)
    {
      case '0': // hier wird das gelesene Byte mit dem Zeichen '0' verglichen, nicht mit der Zahl 0
        digitalWrite(led, LOW);
      break;
      case '1':
        digitalWrite(led, HIGH); 
      break;
      default:
        // mach gar nichts
      break;
    }

    Die Case-Anweisung kannst du jetzt um weitere Zeichen ergänzen, z.B. um 'x' um die LED umzuschalten ((zu toggeln).

    Gruß
    pi

    Antworten quote

  1. twinflyer sagt:

    juhuuuuuuuuuuu vielen Dank für deine Hilfe, jetzt funktioniert alles so wie ich es wollte, und das experimentieren kann beginnen......aber auch erst morgen ;)

    Gute Nacht und Adiö.....

    Max

    Antworten quote

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Array
CAPTCHA
Diese Frage hat den Zweck zu testen, ob man ein menschlicher Benutzer ist und um automatisierten Spam vorzubeugen.
Spr_che:
Inhalt abgleichen