cannon ball
Dependencies: SerialDriver Servo mbed-rtos mbed
Fork of Nucleo_ServoKnob by
main.cpp
- Committer:
- Malek0512
- Date:
- 2015-04-07
- Revision:
- 2:a5e166306da7
- Parent:
- 1:dee6f3e0db9b
- Child:
- 3:bc919a54f665
File content as of revision 2:a5e166306da7:
/****************************************************** * Project CONNONBALL using NUCLEO STM32F401RE Year 2015 * @author Malek MAMMAR * @mail malek.mammar@gmail.com *******************************************************/ #include "mbed.h" #include "Servo.h" #include "SerialDriver.h" /* --> myservo.calibrate(0.00095, 90.0); // Calibrate the servo Le 0.00095 est l'ecart max entre la valeur 1.5ms qui correspond a une angle de 90 degrés : Pour ce deplacer de 0 à 180 degré on set le range a de 1.5-0.95 ms à 1.5+0.95 ms. La fonction position permet de positionner de facon relative a 1.5ms (90°) donc les valeurs permise sont de l'ordre -90 et +90 RMQ un simple position(0) permet de mettre le servo a l'angle 90°, position(-90°) = -90°, position(0°) = 0°, position(+90°) = +90° La fonction write(percent) est identique mais en terme de pouventages avec write(0)=-90°, write(0.5%) = 90°, write(1)=+90° */ Servo steering(D5); Servo throttle(D6); //Serial usb(USBTX, USBRX); SerialDriver usb(USBTX, USBRX, 1024, 512); DigitalOut led(LED1); unsigned char steeringUSB = 95; unsigned char throttleUSB = 91; unsigned int time_data_check = 0; unsigned int time_data_check_last = 0; #define DEBUG 1 #define signal 255 #define throttle_stop_ms 1.5 #define steering_right_deg 0 Timer timer; void setup (); void loop(); void loopTest(); //A test for understanding how the servos work void emergencyCall(); void releaseSignal(); //Waits for the pc signal value void writeThrottle(float value); void writeSteering(float value); int main() { setup(); while(1) loop(); } void setup () { usb.baud(115200); steering.calibrate(0.0005, 90.0); //!\\ Calibrate the servo : essayer 45.0° a la place de 90.0° led = false; releaseSignal(); //waits for the release signal from the pc timer.start(); time_data_check = timer.read_ms(); } void loop() { if (usb.readable()) { if (DEBUG) led = true; steeringUSB = usb.getc(); //writeSteering(steeringUSB); steering.position(steeringUSB - 95); usb.putc(steeringUSB); //time_data_check_last = time_data_check; //time_data_check = timer.read_ms(); if (DEBUG) { //wait_ms(2000); led = false; } //} //if (usb.readable()) { if (DEBUG) led = true; throttleUSB = usb.getc(); writeThrottle(throttleUSB); usb.putc(throttleUSB); time_data_check_last = time_data_check; time_data_check = timer.read_ms(); if (DEBUG) { // wait_ms(2000); led = false; } } //steering.position(steeringUSB - 95); //writeThrottle(throttleUSB); //emergencyCall(); if(DEBUG){ //wait_ms(2000); } wait_ms(50); } void emergencyCall() { int deltaTime = 10000; //(DEBUG)? 10000 : 4000; if (time_data_check_last - time_data_check > deltaTime) { led = true; while (1) { throttleUSB = 91; //steeringUSB = 95; writeThrottle(throttleUSB); //steering.write_ms(steering_right_ms); //throttle.write_ms(steering_right_deg); if (usb.readable() && usb.getc()==255) { //Release signal led = false; wait_ms(1000); time_data_check_last = timer.read_ms(); return; } } } } void writeSteering(float value) { //Par rapport au code arduino : 40 à 96 (gauche) et de 96 à 140 (vers la droite) //float _steeringRange = 140 - 40; //write((steering/_steeringRange) + 0.5); //ratio de l'angle + 0.5 pour l'adapter a la fonction write ci dessus steering.position(value - 96); //96 correspond a un angle droit des roues (code arduino), ce qui correspond ici a 0° } void writeThrottle(float value) { //Par rapport au code arduino : point mort à 91 et pour la vitesse min = 40 et max = 180 //on utilise les valeur 86, 88, 89 // Throttle pulsewidth : for a pulsewitdh >=1.5 ms or <0.75 ms the car stops //float _throttleRange = 90-20; //? not sure about the range yet if (value == 91) throttle.write_ms(1.5); else if (value == 90) throttle.write_ms(1.49); else if ( value == 89 ) throttle.write_ms(1.48); else if ( value == 88 ) throttle.write_ms(1.47); else if ( value == 86 ) throttle.write_ms(1.46); } void releaseSignal() { while (1) { if (usb.readable() && usb.getc()==255) { //Release signal led = false; return; } } } void loopTest() { /* //Test de la direction : les valeurs sont comprises entre 1.0 (gauche) et 2.0 (droite) for(val=1.0; val<=2.0; val+=0.1){ steering.write_ms(val); wait_ms(1000); } //Test de l'acceleration : les valeurs sont comprises entre 0.75 (rapide) a 1.49 (lentement). //Sachant qu'au-dessous de 1.0 (ie < 1.0) la vitesse semble être deja a son max. //Remarque : l'appel a pwm.pulsewidth_ms() n'induit peut être pas le même comprtement --> se limiter a pwm.pulsewith(x/1000) for(val=1.5; val<=1.0; val-=0.01){ throttle.write_ms(val); wait_ms(1000); } */ }