2013-11-30 3 views
2

Я пытаюсь преобразовать код arduino в код matlab. Код предназначен для солнечного трекера, который использует четыре LDR, которые подключены таким образом, чтобы сервомотор двигался, поэтому средние значения на LDR будут равны нулю. Я нашел его здесь: http://www.instructables.com/id/Arduino-Solar-Tracker/Преобразование кода arduino в код matlab

Я использую его для нашего проекта, но мы должны использовать Matlab и иметь графический интерфейс.

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. Я не уверен, что это потому, что что-то не так с кодом. Я даже удалил код паузы, но это не помогает. Кроме того, я использовал tic toc для тестирования, потому что я не знаю, что заменить «цикл пустоты». Для графического интерфейса я хотел бы, чтобы программа работала непрерывно до тех пор, пока не будет нажата кнопка останова, а задержка (скорость) сервомотора и допустимость LDR будут варьироваться с помощью ползунков. У меня возникла проблема с возвратом значений ползунка в основную программу.

ответ

0

Кажется, что вы перенесли свой код с микроконтроллера на свой рабочий стол.

Верно ли это?

Если это так, я считаю, что проблема MATLAB. Я не думаю, что это хорошо, когда дело доходит до драйверов, таких как чтение напряжений и отправка команд в IO.

М Сценарии интерпретируются и замедляются по своей природе.

Интересно, использует ли код в своей реализации массивы. Массивы и динамическое распределение памяти большие нет в MATLAB, так как они запускают ваш код намного медленнее.