Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Trying to make loop works.

Asked by Aliff on 5 Mar 2013

I need to make a loop keep running until a condition in the code is met to break the loop.

I was thinking of using a while loop like this:

 while (Y<60);
       motorX_down;
 end
 while(Y>60);
       motorX_up
 end
 if (Y==60);
       motor_stop;
 end

I use this code to control my motors according to the feedback from the image processing. My objective is to make the camera move so that its center is the same as the detected object coordinate. I had the image processing part done and can get the detected object coordinate in X and Y.

Then arduino will move the motor to adjust the camera.

Now my frame size 160x120 with X:80 and Y:60 as the center.

motorX_up will make the camera move up. motorX_down will make the camera move down. motor_stop will stop the camera.

So far i'm only trying to make the camera move vertically only to test it.

But when I run the code, the motor move only down :( So maybe I thought I had the while loop wrong.

0 Comments

Aliff

1 Answer

Answer by Honglei Chen on 5 Mar 2013

Because you never update Y in your first loop so it keeps going down. You need to update Y value in the loop, for example

Y = Some_function_to_generate_Y;
while Y~=60
  if Y < 60
     motorX_down;
  else
     motorX_up;
  end
  Y = Some_function_to_generate_Y;
end

5 Comments

Honglei Chen on 5 Mar 2013

I can't comment on what you are trying to do here, but your while loop is on vid.FrameAcquired. Once you do

data1 = getdata(vid,1);

I think you need to increase the vid.FrameAcquired by 1. Otherwise your count never goes over 200.

Aliff on 5 Mar 2013

The while loop is okay except for that. But from this code here X and Y can only be generated with this code:

     for object=1:length(stats)
         bb=stats(object).BoundingBox;
         bc=stats(object).Centroid;
         rectangle('Position',bb,'EdgeColor','Y','LineWidth',2);
         plot(bc(1),bc(2),'-m+');
         a=text(bc(1)+15,bc(2), strcat('X:', num2str(round(bc(1))), 'Y:', num2str(round(bc(2)))));
         set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow');
         X=num2str(round(bc(1)));
         Y=num2str(round(bc(2)));
end

This for loop always update its center coordinate, so maybe I could use the code to move the motors inside this loop?

Honglei Chen on 5 Mar 2013

Sounds reasonable but you are really the best person to answer that as I don't know your algorithm.

Honglei Chen

Contact us