Converting an arduino code to matlab code

4.1k views Asked by At

I'm trying to convert an arduino code into matlab code. The code is for a solar tracker that uses four LDRs that are connected in such a way that the servo motor will move so the average readings on the LDR will be zero. I found it here: http://www.instructables.com/id/Arduino-Solar-Tracker/

I'm using it for our project but we are required to use matlab and have a GUI.

Arduino Code:

#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); 
}

SO far, this is the MATLAB code that I was able to workout:

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

My problem is that the servos move very slowly in matlab. I'm not sure if this is because somthing is wrong with the code. I have even removed the pause code but it doesn't help. Also, I only used the tic toc for testing because I do not know what to replace the "void loop". For the GUI, I would want the program to run continuously until a stop button is pressed, and the delay(speed) of the servo and the tolerance of the LDRs will be varied using sliders. I'm having problem on returning the values of the slider to the main program.

1

There are 1 answers

0
Makketronix On

It seemed that you moved your code from your micro controller to your desktop.

Is that correct?

If that is the case, I believe MATLAB is the problem. I don't think it is good when it comes to drivers, like reading voltages and sending commands to IO.

M Scripts are interpreted and are slower by their nature.

I wonder if the code uses arrays in its implementation. Arrays and dynamic memory allocation are big no no in MATLAB as they run your code much slower.