2

更新 2pause(2) :シリアル ポートを開いた後に追加するだけで十分であることが判明しました。

更新: Matlab コマンド ウィンドウに手動で Matlab コードを入力すると、期待どおりに LED が更新されますが、それを行う関数を呼び出すことができません。時間遅延を追加してみます。おそらく Arduino バッファが追いつかないでしょう。

Arduino Uno と Sparkfun PWM シールドを使用して 3 つの LED を制御しています。LED値を設定するためのシリアル入力を探すArduinoスケッチと、シリアル出力を準備して送信するMatlabコードを作成しました。以下のすべてのコードを参照してください。

数か月前に機能していたこのコードが、何らかの理由で機能しなくなりました。現在、Matlab の 2011b バージョンを使用しており、以前は 2013a を使用していました。他に何も変わっていません。

問題はシリアル通信にあると思います。Matlab と Arduino IDE を同時に実行し、Arduino IDE でシリアル モニターを開き、Matlab コマンドを発行することで動作させることができるからです。必要に応じて LED 値を設定します。別のコマンドを送信するには、最初に Arduino シリアル モニターを閉じてから再度開く必要があります。

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

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;
    }
  }  
}
4

2 に答える 2

0

独自のシリアル ターミネータ (ターミネータとして使用) を設定することで、この問題を解決しました!。そして、シリアルコマンドを送るときは!ターミネータとして使います。

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

次に私のコードで:

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

問題は、matlab がターミネータを待っていることだと思います。満タンでない場合よりもタイムアウトが実行され、2 秒に設定されます。そのため、タイムアウトよりも大きな遅延の後に実行が可能です。

于 2015-06-23T13:30:05.977 に答える
0

Matlab を介してシリアル ポート経由で Arduino を使用するには、約 2 秒の時間遅延が必要なようです。シリアル回線を介してデータの送信を開始する前に遅延を追加すると、うまくいきました。

于 2014-03-09T16:38:20.460 に答える