質問

アップデート2 :シリアルポートを開いた後にpause(2)を追加したことがわかりました。

update 手動でMATLABコードを手動で入力することができ、それは期待どおりのLEDを更新することはできません。おそらくArduinoバッファが続くことができない時間遅延を追加しようとします。

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

何らかの理由で数ヶ月前に作業していたこのコードは、作業をやめました。私は現在2011BバージョンのMATLABを使用しており、前に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;
    }
  }  
}
.

役に立ちましたか?

解決

MATLABを介してシリアルポートを介してArduinoをエンゲージするためには、~2秒の時間遅延が必要です。シリアル回線を介してデータを送信する前に遅延を追加しました。

他のヒント

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

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

それから私のコードで:

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

問題は、MATLABがターミネータを待っているということです。フルフィルがない場合よりも、タイムアウトが実行され、2秒に設定されます。それが、タイムアウトよりも大きい後に実行が可能な理由です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top