2

arduino コードを matlab コードに変換しようとしています。このコードは、LDR の平均読み取り値がゼロになるようにサーボ モーターが移動するように接続された 4 つの LDR を使用するソーラー トラッカー用です。ここで見つけました:http://www.instructables.com/id/Arduino-Solar-Tracker/

プロジェクトに使用していますが、matlab を使用して GUI を使用する必要があります。

Arduino コード:

#include <Servo.h> // include Servo library 

Servo horizontal; // horizontal servo
int servoh = 90;     // stand horizontal servo

Servo vertical;   // vertical servo 
int servov = 90;     // stand vertical servo

// LDR pin connections
//  name  = analogpin;
int ldrlt = A0; //LDR top left
int ldrrt = A1; //LDR top rigt
int ldrld = A2; //LDR down left
int ldrrd = A3; //ldr down rigt
int spd = A4; //speed
int tole = A5; //tolerance


void setup()
{
  Serial.begin(9600);
// servo connections
// name.attacht(pin);
  horizontal.attach(9); 
  vertical.attach(10);
}

void loop() 
{
  int lt = analogRead(ldrlt); // top left
  int rt = analogRead(ldrrt); // top right
  int ld = analogRead(ldrld); // down left
  int rd = analogRead(ldrrd); // down rigt

  int dtime = analogRead(spd)/20; // read potentiometers  
  int tol = analogRead(tole)/4;

  int avt = (lt + rt) / 2; // average value top
  int avd = (ld + rd) / 2; // average value down
  int avl = (lt + ld) / 2; // average value left
  int avr = (rt + rd) / 2; // average value right

  int dvert = avt - avd; // check the difference of up and down
  int dhoriz = avl - avr;// check the diffirence of left and right

  if (-1*tol > dvert || dvert > tol) // check if the difference is in the tolerance else change vertical angle
  {
  if (avt > avd)
  {
    servov = ++servov;
     if (servov > 180) 
     { 
      servov = 180;
     }
  }
  else if (avt < avd)
  {
    servov= --servov;
    if (servov < 0)
  {
    servov = 0;
  }
  }
  vertical.write(servov);
  }

  if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
  {
  if (avl > avr)
  {
    servoh = --servoh;
    if (servoh < 0)
    {
    servoh = 0;
    }
  }
  else if (avl < avr)
  {
    servoh = ++servoh;
     if (servoh > 180)
     {
     servoh = 180;
     }
  }
  else if (avl = avr)
  {
    // nothing
  }
  horizontal.write(servoh);
  }
   delay(dtime); 
}

これまでのところ、これは私がワークアウトできた MATLAB コードです。

clear all;clc;

c=arduino('COM31');     %Create Arduino Object

servoAttach(c,9);       %Horizontal Servo
servoAttach(c,10);      %Vertical Servo

servoStatus(c,9);
servoStatus(c,10);

servoh=90;   %Horizontal Servo initial position
servov=90;   %Vertical Servo initial position

tic
while toc < 60

lt=c.analogRead(0)
rt=c.analogRead(1)
ld=c.analogRead(2)
rd=c.analogRead(3)
spd=c.analogRead(4)/20
tol=c.analogRead(5)/4

avt = (lt + rt) / 2; % average value top
avd = (ld + rd) / 2; % average value down
avl = (lt + ld) / 2; % average value left
avr = (rt + rd) / 2; % average value right

dvert = avt - avd;  % check the diffirence of up and down
dhoriz = avl - avr; % check the diffirence of left and right


%check if the diffirence is in the tolerance else change vertical angle
if (-1*tol > dvert || dvert > tol) 
    if (avt > avd)
        servov = servov+1;
        if servov > 180; 
            servov = 180;
        end
        servoWrite(c,10,servov);
    end

    else if (avt < avd)
        servov = servov-1;
        if (servov < 0)
            servov = 0;
        end
        servoWrite(c,10,servov);
    end

   %servoWrite(c,10,servov);
end


%check if the diffirence is in the tolerance else change horizontal angle  
if (-1*tol > dhoriz || dhoriz > tol) 
    if (avl > avr)  
        servoh = servoh-1;
        if (servoh < 0)
            servoh = 0;
        end
        servoWrite(c,9,servoh);
    end

    else if (avl < avr)
        servoh = servoh+1;
        if (servoh > 180)
            servoh = 180;
        end
        servoWrite(c,9,servoh);
    end

  %servoWrite(c,9,servoh);

end

end

私の問題は、サーボがmatlabで非常にゆっくり動くことです。これがコードに問題があるためかどうかはわかりません。一時停止コードも削除しましたが、役に立ちません。また、「void ループ」を何に置き換えればよいかわからないため、テスト用に tic toc のみを使用しました。GUI の場合、停止ボタンが押されるまでプログラムを実行し続け、サーボの遅延 (速度) と LDR の許容範囲をスライダーで変更します。スライダーの値をメイン プログラムに返す際に問題が発生しています。

4

1 に答える 1

0

コードをマイクロ コントローラーからデスクトップに移動したようです。

あれは正しいですか?

その場合、MATLAB に問題があると思います。電圧の読み取りやIOへのコマンドの送信など、ドライバーに関しては良くないと思います。

M スクリプトは解釈され、その性質上遅くなります。

コードの実装で配列が使用されているのだろうか。配列と動的メモリ割り当ては、コードの実行速度が大幅に低下するため、MATLAB では重要ではありません。

于 2014-03-22T03:07:33.180 に答える