code question for self driving truck
gennarobasso81
Posts: 84
hello all,
I am having a hard time figuring out why i cant get a piece of code to work. any ideas would be welcomed.
quick sum up. I took apart my kids rc ford f150. two dc motors control the toy. using prop Activity Board, ping sensor, and two ir leds with detectors; i am trying to make a self driving car.
problem: everything seems to work except the motor control for steering. i wrote functions for everything and am running all sensors in their own cog.
i cute most of the code out to make it easier to read...but the section i am having trouble with is here.
the motor just spins continually. it should turn a little to left or right depending on the ir sensor...then self correct to start position once sensors are cleared of walls.
thanks in advance for looking at it
I am having a hard time figuring out why i cant get a piece of code to work. any ideas would be welcomed.
quick sum up. I took apart my kids rc ford f150. two dc motors control the toy. using prop Activity Board, ping sensor, and two ir leds with detectors; i am trying to make a self driving car.
problem: everything seems to work except the motor control for steering. i wrote functions for everything and am running all sensors in their own cog.
i cute most of the code out to make it easier to read...but the section i am having trouble with is here.
the motor just spins continually. it should turn a little to left or right depending on the ir sensor...then self correct to start position once sensors are cleared of walls.
thanks in advance for looking at it
#include "simpletools.h" // Include simpletools header #include "ping.h" // Include ping header #include "abdrive.h" int pdar(void); int irLeft(void); int irRight(void); void printer(void); //void mcDrive(void); void mcSteer(void); //void backup(void); unsigned int stack1[40 + 25]; int main() // Main function { cogstart(pdar, NULL, stack1, sizeof(stack1)); // Launch ping function into another cog cog_run(mcSteer, 128); // launch steering into cog //cog_run(mcDrive, 128); cog_run(irLeft, 128); cog_run(irRight, 128); printer(); // running this function on main cog } int pdar(void) { while(1) // Repeat indefinitely { int cmDist = ping_cm(15); // Get cm distance from Ping))) pause(200); // Wait 1/5 second return cmDist; } } int irLeft(void) { while(1) { int irLeft; // variable int irPin = 9; int detPin = 8; freqout(irPin, 1, 38000); // Left IR LED light irLeft = input(detPin); // Check left IR detector return irLeft; } } int irRight(void) { while(1) { int irRight; // variable int irPin = 12; int detPin = 11; freqout(irPin, 1, 38000); // Right IR LED light irRight = input(detPin); // Check right IR detector return irRight; } } void printer(void) { while(1) { int p = pdar(); int irR = irRight(); int irL = irLeft(); print("%c C.M. from Object = %d\n\n pirLeft = %d, irRight = %d", HOME, p, irL, irR); } } void mcSteer(void) // stearing wheel command set { set_outputs(5, 2, 0b0000); set_directions(5, 2, 0b1111); pwm_start(1000); int p = pdar(); int irL = irLeft(); int irR = irRight(); int right = 4; int left = 5; int turnSpeed = 100; int turnTime = 200; //(pin, pwm channel, 800/1000) while(1) { if(irL == 0 && irR == 0 && p > 0 && p <= 10) { do { pause(500); // Stops any motor control for 1/2 second while }while(irL == 0 && irR == 0 && p > 0 && p <= 25); // in use by mcDrive function. } if(irL == 0 && irR == 1) { int i = 0; do { do { i++; pwm_set(right, 1,turnSpeed); // turn right } while(i < turnTime); }while(irL==0); if(irL == 1) { int i = 0; do { i++; pwm_set(left, 1,turnSpeed); } while(i < turnTime); } } else if(irR == 0 && irL == 1) { int i = 0; do { do { i++; pwm_set(left, 1,turnSpeed); // turn left } while(i < turnTime); }while(irL==0); if(irL == 1) { int i = 0; do { i++; pwm_set(right, 1,turnSpeed); } while(i < turnTime); } } } }
Comments
I also removed your invocation to cogstart and replaced it with another cog_run call. No need to combine both cog_run and cogstart - pick one or the other. cog_run is easier, but requires more code space. But if you're already using it once, there's no harm in using it again, so you might as well since it is easier.
Here is the entire program i wrote...thanks again for the help. I have to rebuild the project....but i'll get there in a day or two. i'll post some pics