Pregunta

Actualización 2:Resulta de añadir un pause(2) después de abrir el puerto serie fue todo lo que se necesitaba.

Actualización: Soy capaz de introducir manualmente el código de Matlab en la ventana de comandos de Matlab y actualizar los LEDs como se esperaba, pero no puedo llamar a mi función que lo hace.Voy a tratar de agregar los retrasos de tiempo, tal vez el Arduino búfer no se puede mantener.

Estoy usando un Arduino Uno con el Sparkfun PWM escudo de control de 3 LEDs.He escrito un sketch de Arduino, que busca el serial de entrada para configurar el LED de valores, y código de Matlab que prepara y envía la salida serial.Ver todo el código a continuación.

Por alguna razón este código, en el que estaba trabajando hace varios meses, ha dejado de funcionar.Estoy usando 2011b versión de Matlab ahora, y estaba usando 2013a antes.Nada más ha cambiado.

Creo que el problema es con la comunicación serial, como puedo conseguir un trabajo por tener Matlab y Arduino IDE que se ejecutan al mismo tiempo, abrir el monitor serial de Arduino IDE, a continuación, enviar el comando de Matlab.Se establece el LED de valores como desee.Con el fin de enviar otro comando tengo que cerrar y volver a abrir el monitor serial de Arduino.

Código de Matlab:

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

Código de Arduino:

#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;
    }
  }  
}
¿Fue útil?

Solución

Para activar el arduino sobre el puerto serie a través de MATLAB, parece necesitar un retraso de tiempo de ~ 2 segundos.Agregar un retraso antes de comenzar a enviar datos sobre la línea de serie hizo el truco.

Otros consejos

He resuelto el problema mediante la configuración de mi propia serie terminator (he usado ! como terminator).Y cuando tengo que enviar una serie de comandos, yo uso ! como terminator.

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

luego, en mi código:

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

Creo que el problema es que matlab está a la espera de un terminator.Que si no hay cumplimiento, el tiempo de espera se ejecuta y se establece a 2 seg.Es por eso que la ejecución es posible después de un retraso mayor que el tiempo de espera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top