I'm building a robot and already I'm stuck in a rut :-?
I've managed to get some basic movements with the arduino and a Solarbotics L298 motor driver so the next step was to add a servo that will pan from left to right. I thought all I would have to do is copy n paste the servo code but I guess that's not the case.
Any help and simple explanation on how/why this is not working would be much appreciated!!
the problem with those braces is not that code is never executed, they prevent the code from compiling because the lines after the closing brace are not in a function
I got it up and working but found it to be a little too fast, I need it to go about half the speed that it was, it took me a few hours but finally got it figured it out. in the end I ended up doing the same thing that you would to an LED during PWM.
The problem I have now is that it runs the code in the order it was written, meaning it only pans after the motor commands and only does this once, then starts the loop all over again?
If someone can point me in the right direction it would be appreciated!
#include <Servo.h>
Servo servo1;
// Solarbotic L298 Motor Controller pins
int enablePin = 2;
int LeftMotorForward = 3;
int LeftMotorBackward = 5;
int RightMotorForward = 6;
int RightMotorBackward = 9;
int servoVal; //variable to make servo pan slowly (not sure if it needs to be here?)
void setup()
{
Serial.begin(9600);
pinMode(enablePin, OUTPUT);
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(RightMotorForward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
digitalWrite(enablePin, HIGH);
servo1.attach(10);
}
void loop()
{
// motor controller commands
Serial.print("forward");
forward();
delay(3000);
Serial.print("pause");
digitalWrite(enablePin, LOW);
delay(2000);
Serial.print("backwards");
backwards();
delay(3000);
Serial.print("pause");
digitalWrite(enablePin, LOW);
delay(2000);
// servo pan commands
Serial.println("looking left");
for(int x=40; x<=140; x++){ // pans 1 degree at a time till it reaches it's max limit
int servoVal = x; // the degrees can be changed to your liking!
servo1.write(x);
delay(10);
}
Serial.println("looking right!");
for(int x=140; x>=40; x--){ // pans from one limit to the other
int servoVal = x; // this creates a varible
servo1.write(x); // writes the value of the varible
delay(10);
}
}
// motor controller funtions
void forward() // might need to swap forward/reverse depending on your bot
{
digitalWrite(LeftMotorForward, LOW);
analogWrite(LeftMotorBackward, 200);
digitalWrite(RightMotorForward, LOW);
analogWrite(RightMotorBackward, 200);
digitalWrite(enablePin,HIGH);
}
void backwards() // might need to swap forward/reverse dending on your bot
{
analogWrite(LeftMotorForward, 200);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
analogWrite(RightMotorForward, 200);
digitalWrite(enablePin,HIGH);
}
so I'm back and now with a little more knowledge under my belt, thanks for the link grumpy mike!
BUT... for some reason I still can't get the proper outcome, I know grumpy has said it's because of my delay's and it actually makes "sense" that they are not needed but without them the pan does a very sharp move then that's it.
here's my assumption on what's going on:
~ I'm creating my "current time"
~ I'm subtracting my current time from my "previous time" (which at the moment is zero)
~ if the statement is true it runs "pan servo"
this is the problem...
~ "pan servo" runs it's full cycle from the min-max-min degrees
~ loop starts over again running the motors then pan
... what I need it to do is move 1 degree "tag it's time", wait 10 millis, move to the next degree, etc... all while the other programs are running (in other words the panning need to be done in the background).
... it seems like I need to replace "delay" with somthing like "previous time" so it will tag it's time in 10 millisecond increments? If you have a look in the program you can see that I tried that but I get the error:
"Ivalue required as left operand of assignment"
I'm stumped once again, but in a god way! any help with this would be appreciated.
here's my code, I took out the motor commands to minimize the clutter.
#include <Servo.h>
Servo servo1;
long servoDelay = 10; // intervals at which to pan servo (milliseconds)
unsigned long previousTime; //represents the timing of the "cycle"
void setup()
{
unsigned long currentTime = millis();
if(currentTime - previousTime > servoDelay){ // if the time exceeds 10 milliseconds run "panServo"
panServo();
previousTime = currentTime; // "resets" the loop time
}
}
// pan servo funtions
void panServo()
{
for(int x=40; x<=140; x++){
servo1.write(x);
//delay (10);
millis() = previousTime;
}
for(int x=140; x>=40; x--){
servo1.write(x);
//delay (10);
millis() = previousTime;
}
}
will simply do 100 "servo.write"s and 100 assignments to "millis()" (which is a function and therefore and illegal lvalue) without stopping.
It isn't surprising it sweeps from one end of the travel to the other.
You can't use a "for" loop for this sort of "blink-without-delay" application, you need to code the loop explicitly, kind-of turning it inside-out.