Arduino über VisualBasic.NET Programm Anweisungen geben

vor 6 Wochen 23 Stunden von Fujitsu313

Hey Leute,

ich bins mal wieder ;)

Diesmal ist es kein Hardwarefehler^^, ich würde gerne ein Programm in VisualBasic.NET schreiben, mit dem ich dem Arduino spezielle Anweisungen geben kann. Wenn meine 8x8 LED-Matrix fertig ist die mit 4 TLC's und einem Arduino Serial gesteuert wird, würde ich gerne über ein VB.NET Programm dem Arduino eingespeicherte Programme starten bzw etwas ausführen.

Ich hab mir das ganze vorgestellt, dass das VB Programm über den Serialport dem Arduino eine Zahlenfolge oder Zeichenfolge gesendet wird, zb 101110 oder LED1-An oder so irgendwas. Der Arduino lässt das ganze durch eine IF-Schleife oder so laufen und wenn der Wert True ist, passiert das und das, was eben deklariert wurde..

Ich hoff ich spreche nicht in all zu großen Rätseln

Gruß Jonas ;)

Ähnliche Posts

23 Antworten auf “Arduino über VisualBasic.NET Programm Anweisungen geben”


Darstellungsoptionen

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

    Hat wirklich keiner eine Idee? :(

    Antworten quote

  1. Fujitsu313 sagt:

    Wuhu, hab alles hinbekommen, wenn wer was willen, werde es dann hier posten auf Anfrage ;)

    Neues Problem, wie kann ich jede LED einzeln ansteuern? Ich hab ne LED-Matrix mit 64 LEDs und 4 TLC5940, was muss ich da genau an Arduino-Code schreiben? Das in VB bekomm ich gebacken, kenn ich schon länger als Assembler.

    Antworten quote

  1. schmittchen_tom sagt:

    Servus,

    für die TLC´s gibt es ja eine Bibliothek. Da gibt es ein Befehl um nur ein Ausgang vom TLC zuschalten (TLC.set(channel,PWM); ). Ich würde also so vorgehen, dass ich den channel über die serial schick (die Pulseite auch) und im Arduino wird die dann eingesetzt.

    Antworten quote

  1. Fujitsu313 sagt:

    Wie meinst du das genau. kannst du mir mal einen Codebeispiel oder so etwas geben?

    Antworten quote

  1. schmittchen_tom sagt:

    Die Bibliothek kennst du, oder nicht? Hier der Link. http://www.arduino.cc/playground/Learning/TLC5940 bzw. http://code.google.com/p/tlc5940arduino/downloads/detail?name=Tlc5940_r0...

    Ein Code Beispiel hab ich leider nicht. Hab leider auch kein TLC mehr zu verfügung mit dem i jetzt schnell testen könnte. Hast du dir bereits Werte über die Serial ans Arduino geschickt? Wenn nicht, dann schau dir einmal die Beispiele mit Arduino Processing Kommunikation an. Anschliessend kannst du die Werte die du dir über das Processing schickst einfach auf den TLC spielen (mit der Funktion Tlc.set(channel,PWM). Channel steht für den Ausgang und PWM ist die grayscale.

    Antworten quote

  1. Fujitsu313 sagt:

    Die Library kenn ich, hab sie aber noch nicht benutzt, hab damit nur meine 4 TLC's getestet.

    Ich hab dem Arduino bisher nur 1 oder 0 geschickt für An und Aus. Das ganze mit VB.NET

    Antworten quote

  1. schmittchen_tom sagt:

    Ah ok,
    VB.net kenn i überhaupt nicht. Aber du kannst ja bereits mit 0 und 1 zwischen dem Ausgang 0 und 1 schalten. Dafür musst du ja dann nicht einmal deinen VB Code umändern.

    Müsste irgendwas in dem Stil sein:

    tlc.clear;
    if (Serial.available()) {
    channel = Serial.read();
    Tlc.set(channel, 4095);
    }
    tlc.update;

    theoretisch müsstest du so zwischen denn zwei ersten Kanälen umschalten können.

    Antworten quote

  1. Fujitsu313 sagt:

    So sieht das bei mir aus. Jetzt muss ich das ganze an den TLC anpassen. Dann brauch ich ja eig 128 zahlen oder? Jeweils zwei für eine LED 1 mal an und 1 mal aus.

    const int ledPin = 13;
    char incomingByte;

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

    void loop() {

    if (Serial.available() > 0) {

    incomingByte = Serial.read();

    if (incomingByte == '1') {

    digitalWrite(ledPin, HIGH);
    Serial.write(incomingByte);
    delay(100);
    }

    if (incomingByte =='0') {

    digitalWrite(ledPin, LOW);
    Serial.write(incomingByte);
    delay(100);
    }

    }
    }

    Antworten quote

  1. schmittchen_tom sagt:

    if (incomingByte == '1') {
    tlc.clear;
    tlc.set(0,0); //schaltet led 0 aus
    tlc.set(1,4095); //schaltet led1 an
    tlc.update //erst jetzt werden die "Zahlen" an den Tlc geschickt.
    }

    und das ganze dann noch einmal für "0".

    Somit kannst du (ziemlich) sicher zwischen LED 0 und 1 hin und her schalten. Bei 128 LEDs musst du 128 Zahlen schicken.
    Ich würde jedoch immer drei Zahlen schicken. Die erste Nummer sagt dem Arduino (diese ist immer die gleiche Nummer), dass ein neuer Wert kommt, anschliessend schickst du die LED Nummer und dann die Helligkeitsstufe. Dies kannst du dann sofort in dein Tlc.set einsetzen. Wenn dann wieder die erste Nummer kommt, dann weiss das Arduino, dass jetzt neue Werte kommen.
    Kenne mich jedoch selbst nur äusserst schlecht damit aus, um dir da weiter zu helfen. Wenn ich über das Wochenende zeit hab, dann versuch ich die Codes aufzutreiben.

    Antworten quote

  1. Fujitsu313 sagt:

    Okay vielen Dank schonmal. Morgen hab ich wieder den ganzen Tag Zeit, dann schau ich auch mal wieder.

    Antworten quote

  1. Fujitsu313 sagt:

    So ich hab jetzt mal den code für 3 leds geschrieben. wenn es jemand ausprobieren will, kann er auch den serial monitor nehmen...

    Mein Problem ist jetzt aber, wenn LED 1 an ist und ich noch LED 2 dazu schalte geht LED 1 aus und nur noch LED 2 leuchtet....

    char incomingByte;

    #include "Tlc5940.h"

    void setup()
    {
    Serial.begin(9600);
    Tlc.init();
    }

    void loop()
    {
    int direction = 1;
    for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) {

    Tlc.clear();

    if (Serial.available() > 0) {

    incomingByte = Serial.read();

    if (incomingByte == '1') {

    Tlc.set(0, 4095);
    Serial.write(incomingByte);
    delay(75);
    }

    if (incomingByte =='65') {

    Tlc.set(0, 0);
    Serial.write(incomingByte);
    delay(75);
    }

    if (incomingByte == '2') {

    Tlc.set(1, 4095);
    Serial.write(incomingByte);
    delay(75);
    }

    if (incomingByte =='66') {

    Tlc.set(1, 0);
    Serial.write(incomingByte);
    delay(75);
    }

    if (incomingByte == '3') {

    Tlc.set(2, 4095);
    Serial.write(incomingByte);
    delay(75);
    }

    if (incomingByte =='67') {

    Tlc.set(2, 0);
    Serial.write(incomingByte);
    delay(75);
    }

    Tlc.update();
    delay(75);
    }

    }

    }

    Antworten quote

  1. Fujitsu313 sagt:

    Okay ich bekomms irwie nicht hin...

    Antworten quote

  1. schmittchen_tom sagt:

    Servus,
    ich glaub das liegt an der Tlc clear Funktion. Damit wird der IC jedes mal wieder auf "null" gestellt. Probier einmal ohne tlc.clear. Da kann dir jedoch blühen, dass dein Tlc irgendwann Fehler macht weil er zuviele Werte hat.

    Ich würde an deiner Stelle probieren, mir einen Zahl zu schicken. Diese setzt du dann einmal als variable in dein tlc.set ein:

    if (Serial.available() > 0) {

    x= Serial.read();
    Tlc.set(x, 4095);
    tlc.update;

    Weiss aber nicht ob das genau so hinhaut, sollte aber nachdem Prinzip funktionieren.
    Damit wird dein Code wesentlich kleiner und übersichtlicher. Den clear Befehl würde ich dann nur in im void setup einmal aufrufen. Theoretisch müsstest du so die Lampen einmal alle anschalten können, ohne das einen ausgeht.

    Antworten quote

  1. Fujitsu313 sagt:

    Sers Tom,

    Ich werd das ganze erstmal mit TLC.clear im void.setup(); betreiben, aber ich hab da schon wieder ein Problem, wie sende ich denn zb 65 an den Arduino, das funktioniert irgendwie nicht.

    Gruß

    Antworten quote

  1. Fujitsu313 sagt:

    Mal wieder eine zu große Hürde für mich, irwie bekomm ichs nich richtig gebacken^^....

    Antworten quote

  1. schmittchen_tom sagt:

    Hey,
    ja dass du bei 65 ein Problem hast leuchtet mir ein. Das Arduino weiss ja nicht genau wieviele "Ziffern" du ihm schickst. Daher würde ich die raten bevor du die eigentliche Zahl schickst, schickst du dem Arduino den Wert 255. Dadurch weiss dein Arduino dass nun ein neuer Wert kommt. Daher kannst du ihm einfacher eine 65 schicken, da er solange speichert bis er die nächste 255 kriegt. Wie man das genau macht kann ich dir derzeit leider auch nicht sagen.

    Tom

    Antworten quote

  1. Fujitsu313 sagt:

    Sers,

    Ja das weiß ich auch nicht, müssen wir mal warten bis einer der Pros ein paar Antworten parat hat ;)

    Jonas

    Antworten quote

  1. Fujitsu313 sagt:

    Wie kann ich denn dem Arduino klar machen, dass ich ihm auch 2 un 3 stellige Zahlen sende?

    Antworten quote

  1. schmittchen_tom sagt:

    Hey,

    soweit ich weiss geht das eben am besten in dem du ihm mitteilst dass die Daten nun angefangen werden zu übertragen und dann enden. Hab leider kein Plan wie man das programmiert. Denk mir, dass es so geht (zB.: mit 255 als Anfagswert)

    x=Serial.read
    if x= 255 dann speichere die Werte bis zum nächsten 255
    (oder einem anderem Endwert)

    Anschliessend die Werte zusammen addieren (bei einer 3 stelligen Zahl: (x1*100)+(x2*10)+x3= dein Wert.
    Hatte bis jetzt leider absolut keinen Zeit zum zusammen suchen. Wenn ich etwas find, werde ich es sofort posten.

    Antworten quote

  1. Fujitsu313 sagt:

    Hey,

    Okay, vielen Dank. Gäbe es nicht auch die Möglichkeit das ganze als Byte oder Hex-Dezimale zu senden. (Ich weiß jetzt nicht genau wie das heißt ;) ) Würde das vllt auch als String funktionieren, also LEDaAn oder so. Wäre das im Prinzip auch möglich?

    Antworten quote

  1. Fujitsu313 sagt:

    Okay ich hab mir das so überlegt, entweder die zahlen von 0-63 für LED an und von 64-127 für LED aus oder ich schicke dem Arduino 1 Byte ( also eine 8 Bit Zahl ). Leider hab ich keine Idee wie ich diese dem Arduino sende, bzw ihm klar mache was jetzt kommt. Ich habe ja auch das Problem, dass ich dem Arduino keine mehrstellige Zahl senden kann.

    8 Bits wären ja wenn ich richtig gerechnet habe 256 Zustände
    7 Bits wären genau 128 Zustände, das wäre sogar noch besser...

    Ahh ich glaub ich kenne mein Problem, es hat irgendwas mit ASCII zu tun...

    Antworten quote

  1. Fujitsu313 sagt:

    Soo ich hab hier mal nen Code gefunden, mit dem das alles funzt:

    Funktioniert aber nur mit dreistelligen Zahlen, also 001 oder 064 oder 128.


    int incomingByte;
    char Data[4];
    int i;

    #include "Tlc5940.h"

    void setup()
    {
    Serial.begin(9600);
    Tlc.init();
    Tlc.clear();
    }

    void loop(){

    do {
    // Wenn Daten verfügbar 3 Zeichen in Data schreiben
    if (Serial.available()) {
    Data[i] = Serial.read();
    i++;
    }
    } while (i<3);

    // Abschließende Null für gültigen String
    Data[i] = 0;

    incomingByte = atof(Data); // Wert von String zu Zahl wandeln
    i=0;

    if (incomingByte >= 0 && incomingByte < 64) { // schaltet die LED ein
    Tlc.set(incomingByte, 4095);
    Serial.print("Led: ");
    Serial.print(incomingByte);
    Serial.println(" an");
    //delay(75); //Ich hab mal die Delays rausgenommen, dass alles schneller läuft
    Tlc.update();
    //delay(75); //Kann man machen muss man ber nicht...
    }
    if (incomingByte >= 64 && incomingByte < 128) { // schaltet das LED aus
    Tlc.set((incomingByte-64), 0);
    Serial.print("Led: ");
    Serial.print(incomingByte-64);
    Serial.println(" aus");
    //delay(75); //Ich hab mal die Delays rausgenommen, dass alles schneller läuft
    Tlc.update();
    //delay(75); //Kann man machen muss man ber nicht...
    }
    if (incomingByte < 0 || incomingByte >=128) { // unzulässiger Wert macht nichts und gibt Warnung an Terminal aus
    Serial.println("Warnung unzulaessiger Wert");
    }

    }

    Antworten quote

  1. Fujitsu313 sagt:

    Soo ich hab hier mal nen Code gefunden, mit dem das alles funzt:

    Funktioniert aber nur mit dreistelligen Zahlen, also 001 oder 064 oder 128.


    int incomingByte;
    char Data[4];
    int i;

    #include "Tlc5940.h"

    void setup()
    {
    Serial.begin(9600);
    Tlc.init();
    Tlc.clear();
    }

    void loop(){

    do {
    // Wenn Daten verfügbar 3 Zeichen in Data schreiben
    if (Serial.available()) {
    Data[i] = Serial.read();
    i++;
    }
    } while (i<3);

    // Abschließende Null für gültigen String
    Data[i] = 0;

    incomingByte = atof(Data); // Wert von String zu Zahl wandeln
    i=0;

    if (incomingByte >= 0 && incomingByte < 64) { // schaltet die LED ein
    Tlc.set(incomingByte, 4095);
    Serial.print("Led: ");
    Serial.print(incomingByte);
    Serial.println(" an");
    //delay(75); //Ich hab mal die Delays rausgenommen, dass alles schneller läuft
    Tlc.update();
    //delay(75); //Kann man machen muss man ber nicht...
    }
    if (incomingByte >= 64 && incomingByte < 128) { // schaltet das LED aus
    Tlc.set((incomingByte-64), 0);
    Serial.print("Led: ");
    Serial.print(incomingByte-64);
    Serial.println(" aus");
    //delay(75); //Ich hab mal die Delays rausgenommen, dass alles schneller läuft
    Tlc.update();
    //delay(75); //Kann man machen muss man ber nicht...
    }
    if (incomingByte < 0 || incomingByte >=128) { // unzulässiger Wert macht nichts und gibt Warnung an Terminal aus
    Serial.println("Warnung unzulaessiger Wert");
    }

    }

    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.
V_deokassette:
Inhalt abgleichen