Question

Mise à jour 2:Il s'avère que l'ajout d'un pause(2) après avoir ouvert le port série, c'était tout ce dont il avait besoin.

Mise à jour: Je peux saisir manuellement le code Matlab dans la fenêtre de commande Matlab et cela mettra à jour les LED comme prévu, mais je ne peux pas appeler ma fonction qui le fait.Je vais essayer d'ajouter des délais, peut-être que le tampon Arduino ne peut pas suivre.

J'utilise un Arduino Uno avec le bouclier Sparkfun PWM pour contrôler 3 LED.J'ai écrit un croquis Arduino qui recherche une entrée série pour définir les valeurs des LED et un code Matlab qui prépare et envoie la sortie série.Voir tout le code ci-dessous.

Pour une raison quelconque, ce code, qui fonctionnait il y a plusieurs mois, ne fonctionne plus.J'utilise maintenant la version 2011b de Matlab et j'utilisais 2013a auparavant.Rien d'autre n'a changé.

Je pense que le problème vient de la communication série, car je peux la faire fonctionner en faisant fonctionner Matlab et Arduino IDE en même temps, en ouvrant le moniteur série dans Arduino IDE, puis en émettant la commande Matlab.Il définit les valeurs des LED comme vous le souhaitez.Afin d'envoyer une autre commande, je dois d'abord fermer et rouvrir le moniteur série Arduino.

Code 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

Code 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;
    }
  }  
}
Était-ce utile?

La solution

Afin d'engager l'Arduino sur le port série via Matlab, il semble qu'il faille un délai d'environ 2 secondes.L'ajout d'un délai avant de commencer à envoyer des données sur la ligne série a fait l'affaire.

Autres conseils

J'ai résolu ce problème en définissant mon propre terminateur série (j'ai utilisé ! comme terminateur).Et quand j'envoie une commande série, j'utilise ! comme terminateur.

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

puis dans mon code :

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

Je pense que le problème est que Matlab attend un terminateur.S'il n'y a pas de remplissage, le délai d'attente est exécuté et fixé à 2 secondes.C'est pourquoi l'exécution est possible après un délai supérieur au timeout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top