Frage

Aktualisierung 2:Es stellt sich heraus, dass a hinzugefügt wird pause(2) nach dem Öffnen der seriellen Schnittstelle war alles was es brauchte.

Update: Ich kann den Matlab-Code manuell in das Matlab-Befehlsfenster eingeben und es werden die LEDs wie erwartet aktualisiert, aber ich kann meine Funktion, die dies tut, nicht aufrufen.Ich werde versuchen, Zeitverzögerungen hinzuzufügen, vielleicht kann der Arduino-Puffer nicht mithalten.

Ich verwende ein Arduino Uno mit dem Sparkfun PWM Shield, um 3 LEDs zu steuern.Ich habe eine Arduino-Skizze geschrieben, die nach serieller Eingabe sucht, um die LED-Werte einzustellen, und Matlab-Code, der die serielle Ausgabe vorbereitet und sendet.Sehen Sie sich den gesamten Code unten an.

Aus irgendeinem Grund funktioniert dieser Code, der vor einigen Monaten funktioniert hat, nicht mehr.Ich verwende jetzt die Version 2011b von Matlab und habe zuvor 2013a verwendet.Sonst hat sich nichts geändert.

Ich glaube, das Problem liegt bei der seriellen Kommunikation, da ich es zum Laufen bringen kann, indem Matlab und Arduino IDE gleichzeitig ausgeführt werden, der serielle Monitor in Arduino IDE geöffnet und dann der Matlab-Befehl ausgegeben wird.Es stellt die LED-Werte wie gewünscht ein.Um einen weiteren Befehl zu senden, muss ich zuerst den seriellen Arduino-Monitor schließen und wieder öffnen.

Matlab-Programmierung:

function [] = displayColor(RGB)

s1 = serial('/dev/tty.usbmodem1411','BaudRate',9600);

fopen(s1)

messageRed = bitshift(1,12)+RGB(1);
messageGreen = bitshift(2,12)+RGB(2);
messageBlue = bitshift(3,12)+RGB(3);
fwrite(s1,messageRed,'uint16','sync');
fwrite(s1,messageGreen,'uint16','sync');
fwrite(s1,messageBlue,'uint16','sync');
updateMessage = 0;
fwrite(s1,updateMessage,'uint16','sync');

fclose(s1)

end

Arduino-Code:

#include "Tlc9540.h"
int newVal = 0;

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

void loop(){

updateChannel();  

}

int updateChannel()
{

int B;
int code;
int value;

  if (Serial.available())
  {
    //Read First Byte
    B = Serial.read();
    //Blocking - waiting for second byte
    while (!Serial.available()){}
    B+=Serial.read()<<8;
    code = (B&(B1111<<12))>>12;
    value = B&4095;
    switch (code)
    {
      case 0:
        Tlc.update();
        break;
      case 1:
        Tlc.set(0,value);
        Serial.print(Tlc.get(0));
        break;
      case 2:
        Tlc.set(1,value);
        Serial.print(Tlc.get(1));
        break;
      case 3:
        Tlc.set(2,value);
        Serial.print(Tlc.get(2));
        break;
    }
  }  
}
War es hilfreich?

Lösung

Um das Arduino über die serielle Schnittstelle über Matlab zu aktivieren, scheint es eine Zeitverzögerung von ~ 2 Sekunden zu benötigen.Das Hinzufügen einer Verzögerung vor dem Senden von Daten über die serielle Leitung hat den Trick gemacht.

Andere Tipps

Ich habe dieses Problem gelöst, indem ich meinen eigenen seriellen Terminator eingestellt habe (ich habe verwendet ! als Terminator).Und wenn ich einen seriellen Befehl sende, benutze ich ! als Terminator.

set(arduino,'Terminator','!'); % setting my terminator

dann in meinem Code:

test_free = 'mode=free,axis=1,dir=1,speed=50,pos=13245!';
fprintf(arduino,test_free);

Ich denke, das Problem ist, dass Matlab auf einen Terminator wartet.Als wenn es nicht erfüllt ist, wird das Timeout ausgeführt und auf 2 Sekunden gesetzt.Deshalb ist die Ausführung nach einer Verzögerung möglich, die größer als das Timeout ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top