Go Down

Topic: Servo control with ultrasonic sensors (Read 1 time)previous topic - next topic

Undermentioned

Aug 15, 2014, 06:15 pm
Hi please help me with this, I need my robot to turn right but when i do a serial read there is always about a 2cm difference in the readings of my HC-sro4 sensors so if you could perhaps tell me how i can change the below so it will only turn if the difference between the 2 sensors are say more than 5cm or something like that.

Code: [Select]
`if(cm > cm1) //If Left receiving senors is greater than the Right receiving senor turn right{Rightservo.write(50); //set right motor speed and direction}`

AWOL

#1
Aug 15, 2014, 06:36 pm
Code: [Select]
`abs (cm - cm)`
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Undermentioned

#2
Aug 15, 2014, 06:49 pm
Awol could you please explain a little more to me, don't know how to implement that.

Robin2

#3
Aug 15, 2014, 07:33 pm
Do you want to turn left when one distance A is bigger than distance B and turn right when distance B is bigger than distance A?

If one device always measures more than the other by a constant amount then you should just correct that by subtracting that amount. Then the two values can be compared directly.

What @Awol referred to is the abs() function which returns the absolute value of a number by ignoring the negative sign. But if the first paragraph, above, is correct then I think you need the sign to tell you which way to turn.

If you do need to test for a difference greater than 5 you could do

Code: [Select]
`if (cmA - cmB >= 5) {   // turn one way}if (cmB - cmA >= 5) {   // turn the other way}`

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

Undermentioned

#4
Aug 15, 2014, 07:46 pm
Thank you robin you are correct and it works perfectly.

Undermentioned

#5
Aug 22, 2014, 06:11 pm
Hi guys I cant seem to get this right i need to add a perimeter to the below code so that if the difference is >= 10cm and both senors value are less than say 200cm initiate the action but if its  more than 200cm don't initiate the action.

Please how would i do that?

Code: [Select]
`if(cm1 - cm >= 10 ) //Turn left{Rightservo.write(109);Leftservo.write(103);}`

Thanks

Robin2

#6
Aug 22, 2014, 06:28 pm
Deal with the GO / NO GO test first as that simplifies the code.

Code: [Select]
`if (cm > 200 && cm1 > 200) {  // do nothing}else {  // do the other stuff}`

If your code was in a function I would just have
Code: [Select]
`void robotTurn() {   if (cm > 200 && cm1 > 200) {     return;   }   // do the other stuff}...R`
Two or three hours spent thinking and reading documentation solves most programming problems.

Undermentioned

#7
Aug 23, 2014, 02:07 pm
Hi Robin thank you for your help.

This is what i have for my control of the servos, I cant seem to get that (else) to work as u suggested sorry still learning.

Code: [Select]
`if(cm > 100 && cm < 200 && cm1 > 100 && cm1 < 200) //Go forward if distance is greater than 100cm.{Rightservo.write(180); //Go forward = 180Leftservo.write(0); //Go forward = 0}if(cm > 10 && cm < 100 && cm1 > 10 && cm1 < 100) //Stop both servos if to close.{Rightservo.write(101); //StopLeftservo.write(103); //Stop}if(cm - cm1 >= 10 ) //Turn right if sensor1 value minus sensor2 value is more than 10cm.{Rightservo.write(116);Leftservo.write(0);}if(cm1 - cm >= 10 ) //Turn left if sensor2 value minus sensor1 value is more than 10cm.{Rightservo.write(180);Leftservo.write(88);}`

Robin2

#8
Aug 23, 2014, 03:16 pm
I think if you have an IF ELSE sequence that starts with the highest distance it will be easier

Code: [Select]
`if (cm > 200 && cm1 > 200) {   // do nothing ?}else if (cm > 100 && cm1 > 100) {    Rightservo.write(180); //Go forward = 180    Leftservo.write(0); //Go forward = 0}else if (cm > 10 && cm1 > 10) { // not sure this is the right test     Rightservo.write(101); //Stop     Leftservo.write(103); //Stop}`

However this sequence can't deal with the situation where a turn is needed.

Having to test two separate distances every time makes the code very inconvenient. It might be easier to test for differences first and make a turn and if there is no need for a turn just use one of the distance sensors to decide to move or stop. Something like this

Code: [Select]
`if (cm1 - cm2 >= 10) {   // turn right}else if (cm - cm1 >= 10) {   // turn left}else if (cm > 100) {   // move forward}else {    // stop}`

I think if you do it like this it will also be clearer if you have captured all the possible situations.

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

Undermentioned

#9
Aug 23, 2014, 03:43 pm
Yes its been messing me around haha.

The problem arises when my Ping sensor is off or out of view of my receiving sensors the serial readings are up and down but the one receiving sensor is +- constant at 295cm and the other receiving is constant +- 350cm or so.

so what i would like it do to is when my ping sensor is off stop both servos.

Can i do something like this
Code: [Select]
`if (cm1 - cm2 > 10 && < 30) {   // turn right}`

Robin2

#10
Aug 23, 2014, 09:10 pm
Yes, but not with that code. It would need to be

Code: [Select]
`if (cm1 - cm2 > 10 && cm1 - cm2 < 30) {   // turn right}`

And it might be better to do this

Code: [Select]
`diff = cm1 - cm2;if (abs(diff) > 30) {   // do nothing}else if (diff >= 10) {   // turn one way}else if (diff <= -10) {   // turn the other way}else if (cm1 >   // etc etc for the forward moves`

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

AWOL

#11
Aug 24, 2014, 10:54 am
Have a look at the rest of your code.
See how other variables are declared.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Undermentioned

#12
Aug 24, 2014, 11:25 am
This is what i got but it doesnt work with const int.

Code: [Select]
`#include <Servo.h>  //Cm is the left sensor from the back //Cm1 is the right sensors from the backServo Rightservo; // create servo object named myservo to control a servo/ Right servoServo Leftservo; //create servo object named myservo1 to control a servo/ Left servoint pos = 0;const int trigPin = 7;//Sender sensor1const int echoPin = 8;//Receiving sensor 1 //Left sensor from frontconst int echoPin1 = 4;//Receiving sensor 2 //Right sensor from front`

AWOL

#13
Aug 24, 2014, 02:10 pm
What do you imagine "const" might be an abbreviation of?
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Undermentioned

#14
Aug 24, 2014, 03:29 pm
Constant, makes sense now got it sorted thanks awol.

Go Up

Please enter a valid email to subscribe