Robot that currently does nothing
Dependencies: 4DGL-uLCD-SE SDFileSystem ShiftBrite mbed-rtos mbed wave_player Motor
main.cpp@8:cde09ae38be7, 2017-03-16 (annotated)
- Committer:
- jplager3
- Date:
- Thu Mar 16 01:28:27 2017 +0000
- Revision:
- 8:cde09ae38be7
- Parent:
- 7:df218a6a1a01
- Child:
- 9:37bb5f0e2975
Successful independent control of both motors.; Issue: Left motor runs at max speed for ~1s on startup and idk why.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jplager3 | 0:ada50658d850 | 1 | #include "mbed.h" |
jplager3 | 0:ada50658d850 | 2 | #include "rtos.h" |
jplager3 | 0:ada50658d850 | 3 | #include "uLCD_4DGL.h" |
jplager3 | 0:ada50658d850 | 4 | //#include "ShiftBrite.h" |
jplager3 | 0:ada50658d850 | 5 | #include "SDFileSystem.h" |
jplager3 | 0:ada50658d850 | 6 | #include "wave_player.h" |
jplager3 | 8:cde09ae38be7 | 7 | #include "Motor.h" |
jplager3 | 0:ada50658d850 | 8 | |
jplager3 | 0:ada50658d850 | 9 | Mutex mutex; // |
jplager3 | 0:ada50658d850 | 10 | Mutex mutex2; // |
jplager3 | 0:ada50658d850 | 11 | DigitalOut led1(LED1); |
jplager3 | 0:ada50658d850 | 12 | DigitalOut led2(LED2); |
jplager3 | 0:ada50658d850 | 13 | DigitalOut led3(LED3); |
jplager3 | 0:ada50658d850 | 14 | DigitalOut led4(LED4); |
jplager3 | 0:ada50658d850 | 15 | Thread thread1; |
jplager3 | 0:ada50658d850 | 16 | Thread thread2; |
jplager3 | 0:ada50658d850 | 17 | Thread thread3; |
jplager3 | 0:ada50658d850 | 18 | Thread thread4; |
jplager3 | 0:ada50658d850 | 19 | SPI spi(p11, p12, p13); |
jplager3 | 0:ada50658d850 | 20 | uLCD_4DGL uLCD(p28, p27, p30); |
jplager3 | 0:ada50658d850 | 21 | SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card |
jplager3 | 0:ada50658d850 | 22 | AnalogOut DACout(p18); //must be p18 |
CRaslawski | 5:6ca141fc6c4e | 23 | AnalogIn IR(p20); |
jplager3 | 0:ada50658d850 | 24 | FILE *wave_file = NULL; //global bc its gotta be changed by Main while running in child thread |
CRaslawski | 6:21c5a7cf63de | 25 | FILE *wave_file2 = NULL; |
jplager3 | 0:ada50658d850 | 26 | wave_player waver(&DACout); //create wave_player object for speaker |
jplager3 | 8:cde09ae38be7 | 27 | //create objects for Motor Control |
jplager3 | 8:cde09ae38be7 | 28 | //PwmOut motorL(p21); // doesnt seem to work |
jplager3 | 8:cde09ae38be7 | 29 | //Motor Left(p21, p12, p11); //, p6, p5, 1); // pwm, fwd, rev, can brake |
jplager3 | 8:cde09ae38be7 | 30 | Motor Left(p21, p14, p13); // green wires. pwm, fwd, rev, add ", 1" for braking |
jplager3 | 8:cde09ae38be7 | 31 | Motor Right(p22, p12, p11); // red wires |
jplager3 | 0:ada50658d850 | 32 | void LCD_thread1() { |
jplager3 | 0:ada50658d850 | 33 | while(1){ |
jplager3 | 0:ada50658d850 | 34 | mutex.lock(); |
jplager3 | 0:ada50658d850 | 35 | uLCD.filled_circle(64, 64, 12, 0xFF0000); |
jplager3 | 0:ada50658d850 | 36 | mutex.unlock(); |
jplager3 | 0:ada50658d850 | 37 | wait(.5); |
jplager3 | 0:ada50658d850 | 38 | mutex.lock(); |
jplager3 | 0:ada50658d850 | 39 | uLCD.filled_circle(64, 64, 12, 0x0000FF); |
jplager3 | 0:ada50658d850 | 40 | mutex.unlock(); |
jplager3 | 0:ada50658d850 | 41 | wait(.5); |
jplager3 | 0:ada50658d850 | 42 | } |
jplager3 | 0:ada50658d850 | 43 | } |
jplager3 | 0:ada50658d850 | 44 | void sound_thread(){ |
CRaslawski | 4:589e4a2028a7 | 45 | while(1) { |
CRaslawski | 4:589e4a2028a7 | 46 | //FILE *wave_file; |
CRaslawski | 4:589e4a2028a7 | 47 | wave_file=fopen("/sd/vacuum.wav","r"); |
CRaslawski | 4:589e4a2028a7 | 48 | if (wave_file == NULL){ |
CRaslawski | 6:21c5a7cf63de | 49 | led1=led4 = 1; // if file read error, outside LEDs are on |
CRaslawski | 6:21c5a7cf63de | 50 | led2=led3 = 0; |
CRaslawski | 4:589e4a2028a7 | 51 | } |
CRaslawski | 4:589e4a2028a7 | 52 | waver.play(wave_file); |
CRaslawski | 4:589e4a2028a7 | 53 | fclose(wave_file); |
jplager3 | 0:ada50658d850 | 54 | } |
jplager3 | 0:ada50658d850 | 55 | } |
CRaslawski | 5:6ca141fc6c4e | 56 | |
CRaslawski | 6:21c5a7cf63de | 57 | void beep(){ |
CRaslawski | 6:21c5a7cf63de | 58 | wave_file2=fopen("/sd/beep.wav","r"); |
CRaslawski | 6:21c5a7cf63de | 59 | if(wave_file2 == NULL) { |
CRaslawski | 6:21c5a7cf63de | 60 | led1=led4 = 0; // if file read error, inside LEDs are on |
CRaslawski | 6:21c5a7cf63de | 61 | led2=led3 = 0; |
CRaslawski | 6:21c5a7cf63de | 62 | } |
CRaslawski | 6:21c5a7cf63de | 63 | waver.play(wave_file2); |
CRaslawski | 6:21c5a7cf63de | 64 | fclose(wave_file2); |
CRaslawski | 6:21c5a7cf63de | 65 | } |
CRaslawski | 6:21c5a7cf63de | 66 | |
jplager3 | 0:ada50658d850 | 67 | int main() { |
jplager3 | 8:cde09ae38be7 | 68 | Left.speed(0.0); |
jplager3 | 8:cde09ae38be7 | 69 | Right.speed(0.0); |
jplager3 | 0:ada50658d850 | 70 | //thread1.start(IR_thread); // read in IR data |
jplager3 | 0:ada50658d850 | 71 | thread2.start(LCD_thread1); |
jplager3 | 0:ada50658d850 | 72 | //thread3.start(Motor_thread); |
jplager3 | 0:ada50658d850 | 73 | thread4.start(sound_thread); |
jplager3 | 0:ada50658d850 | 74 | |
CRaslawski | 5:6ca141fc6c4e | 75 | while(1){ |
jplager3 | 8:cde09ae38be7 | 76 | //motor testing |
jplager3 | 8:cde09ae38be7 | 77 | //motorL.write(.8); |
jplager3 | 8:cde09ae38be7 | 78 | |
jplager3 | 8:cde09ae38be7 | 79 | for(float i=0.5;i>0.0;i-=0.1){ |
jplager3 | 8:cde09ae38be7 | 80 | Left.speed(i); |
jplager3 | 8:cde09ae38be7 | 81 | Right.speed(-i); |
jplager3 | 8:cde09ae38be7 | 82 | wait(0.75); |
jplager3 | 8:cde09ae38be7 | 83 | } |
jplager3 | 8:cde09ae38be7 | 84 | |
CRaslawski | 5:6ca141fc6c4e | 85 | //IR testing |
CRaslawski | 5:6ca141fc6c4e | 86 | if(IR>0.3 && IR<0.5) { |
CRaslawski | 5:6ca141fc6c4e | 87 | led1=1; |
CRaslawski | 5:6ca141fc6c4e | 88 | led2=led3=led4=0; |
CRaslawski | 5:6ca141fc6c4e | 89 | } else if (IR>0.5 && IR< 0.7) { |
CRaslawski | 5:6ca141fc6c4e | 90 | led1=led2=1; |
CRaslawski | 5:6ca141fc6c4e | 91 | led3=led4=0; |
CRaslawski | 5:6ca141fc6c4e | 92 | } else if (IR>0.7 && IR<0.9) { |
CRaslawski | 5:6ca141fc6c4e | 93 | led1=led2=led3=1; |
CRaslawski | 5:6ca141fc6c4e | 94 | led4=0; |
CRaslawski | 6:21c5a7cf63de | 95 | } else if(IR>0.9){ //collision threshold seems to be the same from IR=0.8 to IR=0.95 |
CRaslawski | 6:21c5a7cf63de | 96 | led1=led2=led3=led4=1; |
CRaslawski | 6:21c5a7cf63de | 97 | fclose(wave_file); |
CRaslawski | 6:21c5a7cf63de | 98 | thread4.terminate(); |
CRaslawski | 6:21c5a7cf63de | 99 | thread4.start(beep); |
CRaslawski | 6:21c5a7cf63de | 100 | /* reverse motors and turn Roomba here |
CRaslawski | 6:21c5a7cf63de | 101 | * |
CRaslawski | 6:21c5a7cf63de | 102 | * |
CRaslawski | 6:21c5a7cf63de | 103 | * |
CRaslawski | 6:21c5a7cf63de | 104 | * |
CRaslawski | 6:21c5a7cf63de | 105 | */ |
jplager3 | 8:cde09ae38be7 | 106 | //motorL.write(.5); |
jplager3 | 7:df218a6a1a01 | 107 | // write reverse values to the motors for N rotations |
jplager3 | 7:df218a6a1a01 | 108 | // execute turn by stopping one wheel, and turning the other (trial and error to find exact rotation?) |
jplager3 | 7:df218a6a1a01 | 109 | // jump back to normal behavior |
CRaslawski | 6:21c5a7cf63de | 110 | wait(5); //wait for beeping to finish |
CRaslawski | 6:21c5a7cf63de | 111 | fclose(wave_file2); |
CRaslawski | 6:21c5a7cf63de | 112 | thread4.terminate(); |
CRaslawski | 6:21c5a7cf63de | 113 | thread4.start(sound_thread); |
CRaslawski | 5:6ca141fc6c4e | 114 | } else led1=led2=led3=led4=0; |
jplager3 | 0:ada50658d850 | 115 | } |
jplager3 | 0:ada50658d850 | 116 | // use mutex to lock getc(), printf(), scanf() |
jplager3 | 0:ada50658d850 | 117 | // don't unlock until you've checked that it's readable() |
jplager3 | 0:ada50658d850 | 118 | } |