Offline
Newbie
Karma: 0
Posts: 5
|
 |
« on: January 26, 2013, 06:44:16 am » |
hello everyone, I am trying to make a line following robot. I use continuous rotation servos, the problem is that the servos won't stop turning once started. This is because the code doesn't check the sensor output after the first time. Thanks a lot! I used this sensor: http://dx.com/p/arduino-line-hunting-sensor-module-118057and these servos: http://www.ebay.com/itm/clear-up-Spring-RC-SM-S4306R-360-Degree-Continuous-Rotation-Robot-Servo-SMS4306R-/350696583715?pt=US_Character_Radio_Control_Toys&hash=item51a7253223#include <Servo.h> int sensorpin = 3; int speed0 = 91; int speed1 = 61; int speed2 = 111; int speed3 = 71; Servo leftwheel; Servo rightwheel;
void setup() { leftwheel.attach(8); rightwheel.attach(9); }
void loop() { while(sensorpin == HIGH){ leftwheel.write(speed1); rightwheel.write(speed2); }
while(sensorpin != HIGH){ leftwheel.write(speed3); rightwheel.write(speed3); } }
I already tried: continue, goto, return, break, while, if, if else, swith case
|
|
|
|
« Last Edit: January 26, 2013, 08:13:55 am by giedow »
|
Logged
|
|
|
|
|
Global Moderator
UK
Offline
Brattain Member
Karma: 138
Posts: 19067
I don't think you connected the grounds, Dave.
|
 |
« Reply #1 on: January 26, 2013, 07:01:49 am » |
The usual advice is to use the writeMicroseconds method on the Servo objects to find the stop point, but it may drift with load or battery state.
|
|
|
|
« Last Edit: January 26, 2013, 08:03:11 am by AWOL »
|
Logged
|
Pete, it's a fool looks for logic in the chambers of the human heart.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #2 on: January 26, 2013, 07:21:49 am » |
How would you write that in the code?
And thank you!
|
|
|
|
|
Logged
|
|
|
|
|
East Anglia (UK)
Online
Edison Member
Karma: 49
Posts: 1432
May all of your blinks be without delay
|
 |
« Reply #3 on: January 26, 2013, 07:27:35 am » |
Where did you get these numbers ? int speed0 = 91; int speed1 = 61; int speed2 = 111; int speed3 = 71; Your comments say that the servos will be stopped with the speed value set to speed1, speed2 or speed3. It is very unlikely that they are all true bearing in mind the range of values this implies (61, 111 and 71)
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
UK
Offline
Brattain Member
Karma: 138
Posts: 19067
I don't think you connected the grounds, Dave.
|
 |
« Reply #4 on: January 26, 2013, 07:38:16 am » |
|
|
|
|
|
Logged
|
Pete, it's a fool looks for logic in the chambers of the human heart.
|
|
|
|
Temple, Texas
Offline
Sr. Member
Karma: 14
Posts: 354
|
 |
« Reply #5 on: January 26, 2013, 07:50:53 am » |
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #6 on: January 26, 2013, 08:15:05 am » |
I got these numbers just by trying without the sensor, my mistake(I copy/pasted that and forgot to delete the text)
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #7 on: January 26, 2013, 08:22:30 am » |
Thanks AWOL and johncc I got it to work #include <Servo.h> int sensorpin = 3; int speed0 = 91; int speed1 = 61; int speed2 = 111; int speed3 = 71; Servo leftwheel; Servo rightwheel;
void setup() { pinMode(3,INPUT); leftwheel.attach(8); rightwheel.attach(9); leftwheel.writeMicroseconds(50); rightwheel.writeMicroseconds(50); }
void loop() { if ( digitalRead(sensorpin)!=HIGH){ leftwheel.write(speed1); rightwheel.write(speed2); }
else if ( digitalRead(sensorpin)==HIGH){ leftwheel.write(speed3); rightwheel.write(speed3); } }
|
|
|
|
|
Logged
|
|
|
|
|
Temple, Texas
Offline
Sr. Member
Karma: 14
Posts: 354
|
 |
« Reply #8 on: January 26, 2013, 08:35:45 am » |
That's great! Fiddle and learn!
|
|
|
|
|
Logged
|
|
|
|
|
Seattle, WA USA
Online
Brattain Member
Karma: 316
Posts: 35542
Seattle, WA USA
|
 |
« Reply #9 on: January 26, 2013, 09:20:39 am » |
Considering that digitalRead() can only return HIGH or LOW, if the value is not HIGH, is there any possible way that the value can be anything other than LOW?
If you come to the correct conclusion that there is not, then explain why you need to test for HIGH.
The if/else if(/else) construct is used to test multiple conditions when there could be more than two. The if/else construct is preferred when there are only 2 possible conditions (as in the case of digitalRead).
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #10 on: January 26, 2013, 09:40:46 am » |
hadn't thought about that
|
|
|
|
|
Logged
|
|
|
|
|
|