Amaldi Robot Finale rev 2.0

Dependencies:   mbed X-NUCLEO-IHM05A1

Committer:
francesco01
Date:
Sat Nov 24 15:46:05 2018 +0000
Revision:
15:d7126015fe69
Parent:
14:8e890b00c826
modifiche motorino

Who changed what in which revision?

UserRevisionLine numberNew contents of line
francesco01 14:8e890b00c826 1 /*modifca pin led gialli
francesco01 14:8e890b00c826 2 modifica soglia luminsità*/
francesco01 14:8e890b00c826 3
francesco01 14:8e890b00c826 4
pinofal 12:00ce5d30b82c 5 /* mbed specific header files. */
pinofal 12:00ce5d30b82c 6 #include "mbed.h"
pinofal 12:00ce5d30b82c 7
pinofal 12:00ce5d30b82c 8 /* Component specific header files. */
pinofal 12:00ce5d30b82c 9 #include "L6208.h"
pinofal 12:00ce5d30b82c 10
pinofal 12:00ce5d30b82c 11 // numero di campioni che compongono un periodo della sinusoide in Output sull'ADC
pinofal 12:00ce5d30b82c 12 #define SAMPLESINENUM 45 // consigliabile avere multipli di 45
pinofal 12:00ce5d30b82c 13
pinofal 12:00ce5d30b82c 14 // numero di campioni acquisiti su cui effettuare la media di luminosità
pinofal 12:00ce5d30b82c 15 #define NUMLIGHTSAMPLE 100
pinofal 12:00ce5d30b82c 16
pinofal 12:00ce5d30b82c 17 // parametri dell'onda coseno da generare
pinofal 12:00ce5d30b82c 18 #define PI (3.141592653589793238462)
pinofal 12:00ce5d30b82c 19 #define AMPLITUDE 32767 //(1.0) // x * 3.3V
pinofal 12:00ce5d30b82c 20 #define PHASE (PI/2) // 2*pi è un periodo
pinofal 12:00ce5d30b82c 21 #define OFFSET 32767 //(0x7FFF)
pinofal 12:00ce5d30b82c 22
pinofal 12:00ce5d30b82c 23 // Parametro di soglia per la luce. Accendi Luci se la luminosità scende sotto SOGLIALUCI
francesco01 14:8e890b00c826 24 #define SOGLIALUCI (1.85)
pinofal 12:00ce5d30b82c 25
pinofal 12:00ce5d30b82c 26 // Definizione Parametri per il motore
pinofal 12:00ce5d30b82c 27 #ifdef TARGET_NUCLEO_F334R8
pinofal 12:00ce5d30b82c 28 #define VREFA_PWM_PIN D11
pinofal 12:00ce5d30b82c 29 #define VREFB_PWM_PIN D9
pinofal 12:00ce5d30b82c 30 #elif TARGET_NUCLEO_F302R8
pinofal 12:00ce5d30b82c 31 #define VREFA_PWM_PIN D11
pinofal 12:00ce5d30b82c 32 #define VREFB_PWM_PIN D15 // HW mandatory patch: bridge manually D9 with D15
pinofal 12:00ce5d30b82c 33 #else
pinofal 12:00ce5d30b82c 34 #define VREFA_PWM_PIN D3
pinofal 12:00ce5d30b82c 35 #define VREFB_PWM_PIN D9
pinofal 12:00ce5d30b82c 36 #endif
pinofal 12:00ce5d30b82c 37
pinofal 12:00ce5d30b82c 38 // definizioni funzioni di default su scheda
pinofal 12:00ce5d30b82c 39 Serial pc(SERIAL_TX, SERIAL_RX); // seriale di comunicazione con il PC
pinofal 12:00ce5d30b82c 40 DigitalIn myButton(USER_BUTTON); // pulsante Blu sulla scheda
pinofal 12:00ce5d30b82c 41 DigitalOut led2(LED2);// LED verde sulla scheda
pinofal 12:00ce5d30b82c 42
pinofal 12:00ce5d30b82c 43 // pin A2 di output per la forma d'onda analogica dedicata al suono
pinofal 12:00ce5d30b82c 44 AnalogOut OutWave(PA_4);
pinofal 12:00ce5d30b82c 45
pinofal 12:00ce5d30b82c 46 // pin A1 di input per la forma d'onda analogica dedicata alla luminosità
pinofal 12:00ce5d30b82c 47 AnalogIn InWaveLight(PA_1);
pinofal 12:00ce5d30b82c 48
pinofal 12:00ce5d30b82c 49 // Pin di tipo In-Out per la gestione del segnale Sig del Sensore di prossimità a ultrasuoni
pinofal 12:00ce5d30b82c 50 DigitalInOut myProx (PC_0, PIN_OUTPUT, PullNone, 0);
pinofal 12:00ce5d30b82c 51 // Timer per il calcolo dei tempi del sensore di prossimità
pinofal 12:00ce5d30b82c 52 Timer myTimer;
pinofal 12:00ce5d30b82c 53
pinofal 12:00ce5d30b82c 54 // tempo inizio intermedio e fine del timer che misura la distanza con il sensore ultrasuoni
pinofal 12:00ce5d30b82c 55 int nTimerStart, nTimer, nTimerStop;
pinofal 12:00ce5d30b82c 56
pinofal 12:00ce5d30b82c 57 // distanza in cm dell'ostacolo
pinofal 12:00ce5d30b82c 58 double fDistance;
pinofal 12:00ce5d30b82c 59
pinofal 12:00ce5d30b82c 60 // Buffer contenente la sinusoide da porre in output.
pinofal 12:00ce5d30b82c 61 unsigned short usaSine[SAMPLESINENUM];
pinofal 12:00ce5d30b82c 62
pinofal 12:00ce5d30b82c 63 // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
pinofal 12:00ce5d30b82c 64 void CalculateSinewave(void);
pinofal 12:00ce5d30b82c 65
pinofal 12:00ce5d30b82c 66
pinofal 12:00ce5d30b82c 67 // Periodo di generazione campioni in output DeltaT = T/NumSample
pinofal 12:00ce5d30b82c 68 double fDeltaT;
pinofal 12:00ce5d30b82c 69 // amplificazione per il dato da spedire sull'ADC
pinofal 12:00ce5d30b82c 70 double fAmp;
pinofal 12:00ce5d30b82c 71
pinofal 12:00ce5d30b82c 72 // frequenza segnale audio da generare
pinofal 12:00ce5d30b82c 73 double fFreq;
pinofal 12:00ce5d30b82c 74
pinofal 12:00ce5d30b82c 75 // periodo della sinusoide audio da generare
pinofal 12:00ce5d30b82c 76 double fPeriod;
pinofal 12:00ce5d30b82c 77
pinofal 12:00ce5d30b82c 78 // indice per i cicli
pinofal 12:00ce5d30b82c 79 int nIndex;
pinofal 12:00ce5d30b82c 80
pinofal 12:00ce5d30b82c 81 // numero di campioni di onda sonora già generati
pinofal 12:00ce5d30b82c 82 int nSampleCount;
pinofal 12:00ce5d30b82c 83
pinofal 12:00ce5d30b82c 84
pinofal 12:00ce5d30b82c 85 // valore medio della Luminosità su NUMACQUISIZIONI acquisizioni
pinofal 12:00ce5d30b82c 86 double fAvgLight;
pinofal 12:00ce5d30b82c 87
pinofal 12:00ce5d30b82c 88 // valore numerico, di tensione e di luce letto dall'ADC
pinofal 12:00ce5d30b82c 89 volatile unsigned short usReadADC;
pinofal 12:00ce5d30b82c 90 volatile float fReadVoltage;
pinofal 12:00ce5d30b82c 91
pinofal 12:00ce5d30b82c 92 // valore di luminosità letto dall'ADC
pinofal 12:00ce5d30b82c 93 volatile float fLight;
pinofal 12:00ce5d30b82c 94
pinofal 12:00ce5d30b82c 95 // Output Digitali usati per i LED
pinofal 12:00ce5d30b82c 96 DigitalOut LedWAD (PC_2);
pinofal 12:00ce5d30b82c 97 DigitalOut LedWAS (PC_3);
pinofal 13:459e008582b3 98 DigitalOut LedWPD (PH_0);
pinofal 12:00ce5d30b82c 99 DigitalOut LedWPS (PA_0) ;
francesco01 14:8e890b00c826 100 DigitalOut LedYAD (PC_9);
francesco01 14:8e890b00c826 101 DigitalOut LedYAS (PC_8);
pinofal 13:459e008582b3 102 DigitalOut LedRPD (PA_13);
pinofal 13:459e008582b3 103 DigitalOut LedRPS (PA_14) ;
francesco01 15:d7126015fe69 104 DigitalOut OutA (PB_0);
francesco01 15:d7126015fe69 105 DigitalOut OutB (PC_1);
pinofal 13:459e008582b3 106
pinofal 12:00ce5d30b82c 107 // Input/Output Digitali usati per interfaccia RPI
pinofal 12:00ce5d30b82c 108 DigitalIn InLightSwitchRPI (PB_9); // accende e spegne le Luci rosse e gialle = GPIO20
pinofal 12:00ce5d30b82c 109 DigitalIn InMotorSwitchRPI (PB_8); // accende e spegne il motore = RPI GPIO16
pinofal 12:00ce5d30b82c 110 DigitalIn InFutureUse0RPI (PB_7); // usi futuri 0 di comunicazione = RPI GPIO13
pinofal 12:00ce5d30b82c 111 DigitalIn InFutureUse1RPI (PB_2); // usi futuri 1 di comunicazione = RPI GPIO25
pinofal 13:459e008582b3 112 DigitalIn InFutureUse2RPI (PC_15); // usi futuri 2 di comunicazione = RPI GPIO12
pinofal 12:00ce5d30b82c 113
pinofal 12:00ce5d30b82c 114 /****************************************************************************/
pinofal 12:00ce5d30b82c 115 /* Initialization parameters of the motor connected to the expansion board. */
pinofal 12:00ce5d30b82c 116 /****************************************************************************/
pinofal 12:00ce5d30b82c 117 l6208_init_t init =
pinofal 12:00ce5d30b82c 118 {
pinofal 12:00ce5d30b82c 119
pinofal 12:00ce5d30b82c 120 1500, //Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes
pinofal 12:00ce5d30b82c 121 20, //Acceleration current torque in % (from 0 to 100)
pinofal 12:00ce5d30b82c 122 1500, //Deceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes
pinofal 12:00ce5d30b82c 123 30, //Deceleration current torque in % (from 0 to 100)
pinofal 12:00ce5d30b82c 124 1500, //Running speed in step/s or (1/16)th step/s for microstep modes
pinofal 12:00ce5d30b82c 125 50, //Running current torque in % (from 0 to 100)
pinofal 12:00ce5d30b82c 126 20, //Holding current torque in % (from 0 to 100)
pinofal 12:00ce5d30b82c 127 STEP_MODE_1_16, //Step mode via enum motorStepMode_t
pinofal 12:00ce5d30b82c 128 FAST_DECAY, //Decay mode via enum motorDecayMode_t
pinofal 12:00ce5d30b82c 129 0, //Dwelling time in ms
pinofal 12:00ce5d30b82c 130 FALSE, //Automatic HIZ STOP
pinofal 12:00ce5d30b82c 131 100000 //VREFA and VREFB PWM frequency (Hz)
pinofal 12:00ce5d30b82c 132 };
pinofal 12:00ce5d30b82c 133
pinofal 12:00ce5d30b82c 134 /* Motor Control Component. */
pinofal 12:00ce5d30b82c 135 L6208 *motor;
pinofal 12:00ce5d30b82c 136
pinofal 12:00ce5d30b82c 137
pinofal 12:00ce5d30b82c 138 //****************************
pinofal 12:00ce5d30b82c 139 // Create the sinewave buffer
pinofal 12:00ce5d30b82c 140 //****************************
pinofal 12:00ce5d30b82c 141 void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
pinofal 12:00ce5d30b82c 142 {
pinofal 12:00ce5d30b82c 143 // variabile contenente l'angolo in radianti
pinofal 12:00ce5d30b82c 144 double fRads;
pinofal 12:00ce5d30b82c 145 // indici per i cicli
pinofal 12:00ce5d30b82c 146 int nIndex;
pinofal 12:00ce5d30b82c 147 // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
pinofal 12:00ce5d30b82c 148 double fDeltaF;
pinofal 12:00ce5d30b82c 149 // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
pinofal 12:00ce5d30b82c 150 double fAngle;
pinofal 12:00ce5d30b82c 151
pinofal 12:00ce5d30b82c 152 fDeltaF = 360.0/SAMPLESINENUM;
pinofal 12:00ce5d30b82c 153 for (nIndex = 0; nIndex < SAMPLESINENUM; nIndex++)
pinofal 12:00ce5d30b82c 154 {
pinofal 12:00ce5d30b82c 155 fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
pinofal 12:00ce5d30b82c 156 fRads = (PI * fAngle)/180.0; // Convert degree in radian
pinofal 12:00ce5d30b82c 157 //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
pinofal 12:00ce5d30b82c 158 usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
pinofal 12:00ce5d30b82c 159 }
pinofal 12:00ce5d30b82c 160 }
pinofal 12:00ce5d30b82c 161
pinofal 12:00ce5d30b82c 162 /********************************************************/
pinofal 12:00ce5d30b82c 163 /* Funzione avviata all'inizio come saluto e Benvenuto */
pinofal 12:00ce5d30b82c 164 /********************************************************/
pinofal 12:00ce5d30b82c 165 void WelcomeMessage()
pinofal 12:00ce5d30b82c 166 {
pinofal 12:00ce5d30b82c 167 }
pinofal 12:00ce5d30b82c 168
pinofal 12:00ce5d30b82c 169 /********************************************************************/
pinofal 12:00ce5d30b82c 170 /* brief This is an example of user handler for the flag interrupt.*/
pinofal 12:00ce5d30b82c 171 /* param None */
pinofal 12:00ce5d30b82c 172 /* retval None */
pinofal 12:00ce5d30b82c 173 /* note If needed, implement it, and then attach and enable it: */
pinofal 12:00ce5d30b82c 174 /* + motor->attach_flag_irq(&my_flag_irq_handler); */
pinofal 12:00ce5d30b82c 175 /* + motor->enable_flag_irq(); */
pinofal 12:00ce5d30b82c 176 /* To disable it: */
pinofal 12:00ce5d30b82c 177 /* + motor->DisbleFlagIRQ(); */
pinofal 12:00ce5d30b82c 178 /*********************************************************************/
pinofal 12:00ce5d30b82c 179 void my_flag_irq_handler(void)
pinofal 12:00ce5d30b82c 180 {
pinofal 12:00ce5d30b82c 181 pc.printf(" WARNING: \"FLAG\" interrupt triggered:\r\n");
pinofal 12:00ce5d30b82c 182 motor->disable();
pinofal 12:00ce5d30b82c 183 pc.printf(" Motor disabled.\r\n\n");
pinofal 12:00ce5d30b82c 184 }
pinofal 12:00ce5d30b82c 185
pinofal 12:00ce5d30b82c 186 /***************************************************************
pinofal 12:00ce5d30b82c 187 * brief This is an example of error handler.
pinofal 12:00ce5d30b82c 188 * param[in] error Number of the error
pinofal 12:00ce5d30b82c 189 * retval None
pinofal 12:00ce5d30b82c 190 * note If needed, implement it, and then attach it:
pinofal 12:00ce5d30b82c 191 * + motor->attach_error_handler(&my_error_handler);
pinofal 12:00ce5d30b82c 192 **************************************************************/
pinofal 12:00ce5d30b82c 193 void my_error_handler(uint16_t error)
pinofal 12:00ce5d30b82c 194 {
pinofal 12:00ce5d30b82c 195 /* Printing to the console. */
pinofal 12:00ce5d30b82c 196 pc.printf("Error %d detected\r\n\n", error);
pinofal 12:00ce5d30b82c 197
pinofal 12:00ce5d30b82c 198 /* Infinite loop */
pinofal 12:00ce5d30b82c 199 while (true)
pinofal 12:00ce5d30b82c 200 {}
pinofal 12:00ce5d30b82c 201 }
pinofal 12:00ce5d30b82c 202
pinofal 12:00ce5d30b82c 203 /********/
pinofal 12:00ce5d30b82c 204 /* Main */
pinofal 12:00ce5d30b82c 205 /********/
pinofal 12:00ce5d30b82c 206 int main()
pinofal 12:00ce5d30b82c 207 {
pinofal 12:00ce5d30b82c 208 // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pinofal 12:00ce5d30b82c 209 pc.baud(921600); //921600 bps
pinofal 12:00ce5d30b82c 210 //pc.baud(9600); //256000 bps
pinofal 12:00ce5d30b82c 211 pc.printf("*** Test Motor ***\n\r");
pinofal 12:00ce5d30b82c 212
pinofal 12:00ce5d30b82c 213 /* Initializing Motor Control Component. */
pinofal 12:00ce5d30b82c 214 motor = new L6208(D2, D8, D7, D4, D5, D6, VREFA_PWM_PIN, VREFB_PWM_PIN);
pinofal 12:00ce5d30b82c 215 if (motor->init(&init) != COMPONENT_OK)
pinofal 12:00ce5d30b82c 216 {
pinofal 12:00ce5d30b82c 217 exit(EXIT_FAILURE);
pinofal 12:00ce5d30b82c 218 }
pinofal 12:00ce5d30b82c 219
pinofal 12:00ce5d30b82c 220 /* Attaching and enabling an interrupt handler. */
pinofal 12:00ce5d30b82c 221 motor->attach_flag_irq(&my_flag_irq_handler);
pinofal 12:00ce5d30b82c 222 motor->enable_flag_irq();
pinofal 12:00ce5d30b82c 223
pinofal 12:00ce5d30b82c 224 /* Attaching an error handler */
pinofal 12:00ce5d30b82c 225 motor->attach_error_handler(&my_error_handler);
pinofal 12:00ce5d30b82c 226
pinofal 12:00ce5d30b82c 227 /* Printing to the console. */
pinofal 12:00ce5d30b82c 228 pc.printf("Motor Control Application Example for 1 Motor\r\n");
pinofal 12:00ce5d30b82c 229
pinofal 12:00ce5d30b82c 230 //----- run the motor BACKWARD
pinofal 12:00ce5d30b82c 231 pc.printf("--> Running the motor backward.\r\n");
pinofal 12:00ce5d30b82c 232 motor->run(StepperMotor::BWD);
pinofal 12:00ce5d30b82c 233
pinofal 12:00ce5d30b82c 234
pinofal 12:00ce5d30b82c 235 //----- Soft stop required while running
pinofal 12:00ce5d30b82c 236 pc.printf("--> Soft stop requested.\r\n");
pinofal 12:00ce5d30b82c 237 motor->soft_stop();
pinofal 12:00ce5d30b82c 238
pinofal 12:00ce5d30b82c 239
pinofal 12:00ce5d30b82c 240 //----- Change step mode to full step mode
pinofal 12:00ce5d30b82c 241 motor->set_step_mode(StepperMotor::STEP_MODE_FULL);
pinofal 12:00ce5d30b82c 242 pc.printf(" Motor step mode: %d (0:FS, 1:1/2, 2:1/4, 3:1/8, 4:1/16).\r\n", motor->get_step_mode());
pinofal 12:00ce5d30b82c 243
pinofal 12:00ce5d30b82c 244 /* Get current position of device and print to the console */
pinofal 12:00ce5d30b82c 245 pc.printf(" Position: %d.\r\n", motor->get_position());
pinofal 12:00ce5d30b82c 246
pinofal 12:00ce5d30b82c 247 /* Set speed, acceleration and deceleration to scale with normal mode */
pinofal 12:00ce5d30b82c 248 motor->set_max_speed(init.maxSpeedSps>>4);
pinofal 12:00ce5d30b82c 249 motor->set_acceleration(motor->get_acceleration()>>4);
pinofal 12:00ce5d30b82c 250 motor->set_deceleration(motor->get_deceleration()>>4);
pinofal 12:00ce5d30b82c 251 /* Print parameters to the console */
pinofal 12:00ce5d30b82c 252 pc.printf(" Motor Max Speed: %d step/s.\r\n", motor->get_max_speed());
pinofal 12:00ce5d30b82c 253 pc.printf(" Motor Min Speed: %d step/s.\r\n", motor->get_min_speed());
pinofal 12:00ce5d30b82c 254 pc.printf(" Motor Acceleration: %d step/s.\r\n", motor->get_acceleration());
pinofal 12:00ce5d30b82c 255 pc.printf(" Motor Deceleration: %d step/s.\r\n", motor->get_deceleration());
pinofal 12:00ce5d30b82c 256
pinofal 12:00ce5d30b82c 257 //----- move of 200 steps in the FW direction
pinofal 12:00ce5d30b82c 258 pc.printf("--> Moving forward 200 steps.\r\n");
pinofal 12:00ce5d30b82c 259 motor->move(StepperMotor::FWD, 200);
pinofal 12:00ce5d30b82c 260
pinofal 12:00ce5d30b82c 261 //+++++++++++++ INIZIO Genera Sinusoide ++++++++++++++++++
pinofal 12:00ce5d30b82c 262 fFreq = 440.0; // frequenza in Hz del tono da generare
pinofal 12:00ce5d30b82c 263 fAmp = 1.0; // coefficiente per il quale viene moltiplicato l'ampiezza massima del tono da generare
pinofal 12:00ce5d30b82c 264 fDeltaT = 1.0/(fFreq*SAMPLESINENUM); // intervallo di tempo tra un campione e l'altro, per generare la frequenza desiderata
pinofal 12:00ce5d30b82c 265 CalculateSinewave(AMPLITUDE, (AMPLITUDE*fAmp), (PI/2.0)); // generazione della sinusoide con valori nominali
pinofal 12:00ce5d30b82c 266 //+++++++++++++ FINE Genera Sinusoide +++++++++++++++++++++
pinofal 12:00ce5d30b82c 267
francesco01 15:d7126015fe69 268
pinofal 12:00ce5d30b82c 269 while(true)
pinofal 12:00ce5d30b82c 270 {
francesco01 15:d7126015fe69 271 if(myButton==0)
francesco01 15:d7126015fe69 272 {
francesco01 15:d7126015fe69 273 //Ferma motore
francesco01 15:d7126015fe69 274 OutA=0;
francesco01 15:d7126015fe69 275 OutB=0;
francesco01 15:d7126015fe69 276 pc.printf("OutA OutB = 00\r\n");
francesco01 15:d7126015fe69 277 wait_ms(2000);
francesco01 15:d7126015fe69 278
francesco01 15:d7126015fe69 279
francesco01 15:d7126015fe69 280 // Ruota Left
francesco01 15:d7126015fe69 281 OutA=0;
francesco01 15:d7126015fe69 282 OutB=1;
francesco01 15:d7126015fe69 283 pc.printf("OutA OutB = 01\r\n");
francesco01 15:d7126015fe69 284 wait_ms(2000);
francesco01 15:d7126015fe69 285 //Ferma motore
francesco01 15:d7126015fe69 286 OutA=0;
francesco01 15:d7126015fe69 287 OutB=0;
francesco01 15:d7126015fe69 288 pc.printf("OutA OutB = 00\r\n");
francesco01 15:d7126015fe69 289 wait_ms(2000);
francesco01 15:d7126015fe69 290 }
francesco01 15:d7126015fe69 291 else
francesco01 15:d7126015fe69 292 {
francesco01 15:d7126015fe69 293 //Ferma motore
francesco01 15:d7126015fe69 294 OutA=1;
francesco01 15:d7126015fe69 295 OutB=0;
francesco01 15:d7126015fe69 296 pc.printf("OutA OutB = 10\r\n");
francesco01 15:d7126015fe69 297 wait_ms(2000);
francesco01 15:d7126015fe69 298
francesco01 15:d7126015fe69 299 // Ruota Right
francesco01 15:d7126015fe69 300 OutA=1;
francesco01 15:d7126015fe69 301 OutB=1;
francesco01 15:d7126015fe69 302 pc.printf("OutA OutB = 11\r\n");
francesco01 15:d7126015fe69 303 wait_ms(2000);
francesco01 15:d7126015fe69 304
francesco01 15:d7126015fe69 305 OutA=1;
francesco01 15:d7126015fe69 306 OutB=0;
francesco01 15:d7126015fe69 307 pc.printf("OutA OutB = 10\r\n");
francesco01 15:d7126015fe69 308 wait_ms(2000);
pinofal 12:00ce5d30b82c 309 }
francesco01 15:d7126015fe69 310
pinofal 12:00ce5d30b82c 311
pinofal 12:00ce5d30b82c 312 //++++ INIZIO Ciclo Principale ++++
pinofal 12:00ce5d30b82c 313 while (true)
pinofal 12:00ce5d30b82c 314 {
pinofal 12:00ce5d30b82c 315 //++++++++++++++ INIZIO Pilotaggio Motore su comando da Raspberry+++++++++++++
pinofal 12:00ce5d30b82c 316 if(InMotorSwitchRPI==1)
pinofal 12:00ce5d30b82c 317 {
francesco01 15:d7126015fe69 318 //Ferma motore
francesco01 15:d7126015fe69 319 OutA=0;
francesco01 15:d7126015fe69 320 OutB=0;
francesco01 15:d7126015fe69 321 pc.printf("OutA OutB = 00\r\n");
francesco01 15:d7126015fe69 322 wait_ms(2000);
francesco01 15:d7126015fe69 323
francesco01 15:d7126015fe69 324
francesco01 15:d7126015fe69 325 // Ruota Left
francesco01 15:d7126015fe69 326 OutA=0;
francesco01 15:d7126015fe69 327 OutB=1;
francesco01 15:d7126015fe69 328 pc.printf("OutA OutB = 01\r\n");
francesco01 15:d7126015fe69 329 wait_ms(2000);
francesco01 15:d7126015fe69 330 //Ferma motore
francesco01 15:d7126015fe69 331 OutA=0;
francesco01 15:d7126015fe69 332 OutB=0;
francesco01 15:d7126015fe69 333 pc.printf("OutA OutB = 00\r\n");
francesco01 15:d7126015fe69 334 wait_ms(2000);
pinofal 12:00ce5d30b82c 335 }
pinofal 12:00ce5d30b82c 336 else
pinofal 12:00ce5d30b82c 337 {
francesco01 15:d7126015fe69 338 //Ferma motore
francesco01 15:d7126015fe69 339 OutA=1;
francesco01 15:d7126015fe69 340 OutB=0;
francesco01 15:d7126015fe69 341 pc.printf("OutA OutB = 10\r\n");
francesco01 15:d7126015fe69 342 wait_ms(2000);
francesco01 15:d7126015fe69 343
francesco01 15:d7126015fe69 344 // Ruota Right
francesco01 15:d7126015fe69 345 OutA=1;
francesco01 15:d7126015fe69 346 OutB=1;
francesco01 15:d7126015fe69 347 pc.printf("OutA OutB = 11\r\n");
francesco01 15:d7126015fe69 348 wait_ms(2000);
francesco01 15:d7126015fe69 349
francesco01 15:d7126015fe69 350 OutA=1;
francesco01 15:d7126015fe69 351 OutB=0;
francesco01 15:d7126015fe69 352 pc.printf("OutA OutB = 10\r\n");
francesco01 15:d7126015fe69 353 wait_ms(2000);
pinofal 12:00ce5d30b82c 354 }
pinofal 12:00ce5d30b82c 355 //++++++++++++++ FINE Pilotaggio Motore +++++++++++++
pinofal 12:00ce5d30b82c 356 //++++++++++++++ INIZIO Accensione LED da comando Raspberry +++++++
pinofal 12:00ce5d30b82c 357 if(InLightSwitchRPI ==1)
pinofal 12:00ce5d30b82c 358 {
pinofal 13:459e008582b3 359
pinofal 12:00ce5d30b82c 360 // accendi i LED di abbellimento
pinofal 13:459e008582b3 361 //led2=1;
pinofal 13:459e008582b3 362 LedYAD = 1;
pinofal 13:459e008582b3 363 LedYAS = 1;
pinofal 13:459e008582b3 364 LedRPD = 1;
pinofal 13:459e008582b3 365 LedRPS = 1;
pinofal 13:459e008582b3 366
francesco01 14:8e890b00c826 367
pinofal 12:00ce5d30b82c 368 }
pinofal 12:00ce5d30b82c 369 else
pinofal 12:00ce5d30b82c 370 {
pinofal 13:459e008582b3 371
pinofal 12:00ce5d30b82c 372 // spegni i LED di abbellimento
pinofal 13:459e008582b3 373 //led2=0;
pinofal 13:459e008582b3 374 LedYAD = 0;
pinofal 13:459e008582b3 375 LedYAS = 0;
pinofal 13:459e008582b3 376 LedRPD = 0;
pinofal 13:459e008582b3 377 LedRPS = 0;
francesco01 14:8e890b00c826 378
pinofal 13:459e008582b3 379
pinofal 12:00ce5d30b82c 380 }
pinofal 12:00ce5d30b82c 381 //++++++++++++++ INIZIO Accensione LED da comando Raspberry +++++++
pinofal 13:459e008582b3 382
pinofal 13:459e008582b3 383 //++++++++++++ INIZIO Misura della Luminosità e accensione LED Bianchi ++++++++++++++
pinofal 12:00ce5d30b82c 384 // inizializza il valore medio della Luminosità
pinofal 12:00ce5d30b82c 385 fAvgLight=0.0;
pinofal 12:00ce5d30b82c 386 for(nIndex=0; nIndex < NUMLIGHTSAMPLE; nIndex++)
pinofal 12:00ce5d30b82c 387 {
pinofal 12:00ce5d30b82c 388 // acquisisce dato da ADC
pinofal 12:00ce5d30b82c 389 usReadADC = InWaveLight.read_u16();
pinofal 12:00ce5d30b82c 390 fReadVoltage=(usReadADC*3.3)/65535.0; // converte in Volt il valore numerico letto dall'ADC
pinofal 12:00ce5d30b82c 391 //fReadVoltage=InWave.read(); // acquisisce il valore dall'ADC come valore di tensione in volt
pinofal 12:00ce5d30b82c 392 fLight= fReadVoltage; //ATTENZIONE Visualizza il valore grezzo letto dall'ADC
pinofal 12:00ce5d30b82c 393 fAvgLight+=fLight;
pinofal 12:00ce5d30b82c 394 }
pinofal 12:00ce5d30b82c 395 // calcola valore medio su NUMSAMPLE acquisizioni
pinofal 12:00ce5d30b82c 396 fAvgLight/= NUMLIGHTSAMPLE;
pinofal 12:00ce5d30b82c 397 // Accendi LED Bianchi se illuminazione è sottosoglia
pinofal 12:00ce5d30b82c 398 if(fAvgLight < SOGLIALUCI)
pinofal 12:00ce5d30b82c 399 {
pinofal 13:459e008582b3 400
pinofal 13:459e008582b3 401 // Accendi LED Bianchi
pinofal 13:459e008582b3 402 //led2 = 1;
pinofal 13:459e008582b3 403 LedWAD = 1;
pinofal 13:459e008582b3 404 LedWAS = 1;
pinofal 13:459e008582b3 405 LedWPD = 1;
pinofal 13:459e008582b3 406 LedWPS = 1;
pinofal 13:459e008582b3 407
pinofal 12:00ce5d30b82c 408 }
pinofal 12:00ce5d30b82c 409 else
pinofal 12:00ce5d30b82c 410 {
pinofal 13:459e008582b3 411
pinofal 13:459e008582b3 412 // Spegni LED Bianchi
pinofal 13:459e008582b3 413 //led2 = 0;
pinofal 13:459e008582b3 414 LedWAD = 0;
pinofal 13:459e008582b3 415 LedWAS = 0;
pinofal 13:459e008582b3 416 LedWPD = 0;
pinofal 13:459e008582b3 417 LedWPS = 0;
pinofal 13:459e008582b3 418
pinofal 12:00ce5d30b82c 419 }
pinofal 12:00ce5d30b82c 420
pinofal 12:00ce5d30b82c 421 // invia il dato al PC
pinofal 12:00ce5d30b82c 422 //pc.printf("\n\r--- Digital= %d [Volt]; Brightness= %.2f ---\n\r", usReadADC, fAvgLight);
pinofal 12:00ce5d30b82c 423 //++++++++++++ FINE Misura della Luminosità e accensione LED ++++++++++++++
pinofal 12:00ce5d30b82c 424
pinofal 12:00ce5d30b82c 425
pinofal 12:00ce5d30b82c 426 //++++++++++++++ INIZIO Acquisisci distanza ostacoli +++++++++
pinofal 12:00ce5d30b82c 427 //inizializza misura di distanza
pinofal 12:00ce5d30b82c 428 fDistance=0.0;
pinofal 12:00ce5d30b82c 429 // Fissa come Output il pin myProx
pinofal 12:00ce5d30b82c 430 myProx.output();
pinofal 12:00ce5d30b82c 431 // Poni 'L' sul Pin e mantienilo per qualche microsecondo
pinofal 12:00ce5d30b82c 432 myProx.write(0);
pinofal 12:00ce5d30b82c 433 wait_us(5);
pinofal 12:00ce5d30b82c 434 // Poni 'H' sul Pin e mantienilo per qualche microsecondo
pinofal 12:00ce5d30b82c 435 myProx.write(1);
pinofal 12:00ce5d30b82c 436 wait_us(10);
pinofal 12:00ce5d30b82c 437 // Poni 'L' sul Pin e mantienilo per qualche microsecondo
pinofal 12:00ce5d30b82c 438 myProx.write(0);
pinofal 12:00ce5d30b82c 439 // Attendi assestamento e Fissa come Input il pin myProx
pinofal 12:00ce5d30b82c 440 wait_us(5);
pinofal 12:00ce5d30b82c 441 myProx.input();
pinofal 12:00ce5d30b82c 442
pinofal 12:00ce5d30b82c 443 // misura il tempo per cui il pin rimane alto. E' il tempo necessario al suono per raggiungere l'ostacolo e ritornare sul sensore
pinofal 12:00ce5d30b82c 444 nTimer =0;
pinofal 12:00ce5d30b82c 445 /*
pinofal 12:00ce5d30b82c 446 myTimer.start(); // avvia il timer per verificare la presenza del sensore
pinofal 12:00ce5d30b82c 447 while((myProx ==0) && (nTimer <=50000)) // esci se il senore risponde oppure se passano oltre 10ms
pinofal 12:00ce5d30b82c 448 {
pinofal 12:00ce5d30b82c 449 // misura il tempo passato
pinofal 12:00ce5d30b82c 450 nTimer=myTimer.read_us();
pinofal 12:00ce5d30b82c 451 }
pinofal 12:00ce5d30b82c 452 */
pinofal 12:00ce5d30b82c 453 while(myProx ==0)
pinofal 12:00ce5d30b82c 454 {}
pinofal 12:00ce5d30b82c 455 myTimer.stop(); // in ogni caso ferma il timer
pinofal 12:00ce5d30b82c 456 // vai avanti solo se il sensore ha risposto
pinofal 12:00ce5d30b82c 457 //if(nTimer <= 50000) // se è passato più tempo il sensore non è presente
pinofal 12:00ce5d30b82c 458 {
pinofal 12:00ce5d30b82c 459 myTimer.start();
pinofal 12:00ce5d30b82c 460 nTimerStart = myTimer.read_us();
pinofal 12:00ce5d30b82c 461 while(myProx == 1)
pinofal 12:00ce5d30b82c 462 {}
pinofal 12:00ce5d30b82c 463 myTimer.stop();
pinofal 12:00ce5d30b82c 464 nTimerStop = myTimer.read_us();
pinofal 12:00ce5d30b82c 465
pinofal 12:00ce5d30b82c 466
pinofal 12:00ce5d30b82c 467 // velocità del suono = 343 [m/s] = 0.0343 [cm/us] = 1/29.1 [cm/us]
pinofal 12:00ce5d30b82c 468 // tempo di andata e ritorno del segnale [us] = (TimerStop-TimerStart)[us]; per misurare la distanza bisogna dividere per due questo valore
pinofal 12:00ce5d30b82c 469 // distanza dell'ostacolo [cm] = (TimerStop-TimerStart)/2 [us] * 1/29.1[cm/us]
pinofal 12:00ce5d30b82c 470 fDistance = (nTimerStop-nTimerStart)/58.2;
pinofal 12:00ce5d30b82c 471 // invia il dato al PC
pinofal 12:00ce5d30b82c 472 //pc.printf("\n\r The Distance was = %.2f [cm]\n\r", fDistance);
pinofal 12:00ce5d30b82c 473
pinofal 12:00ce5d30b82c 474 }
pinofal 12:00ce5d30b82c 475 //++++++++++++++ FINE Acquisisci distanza ostacoli +++++++++
pinofal 12:00ce5d30b82c 476
pinofal 12:00ce5d30b82c 477 //++++++++++++++ INIZIO Suona Clacson +++++++++
pinofal 12:00ce5d30b82c 478 //escludi le misure oltre il max
pinofal 12:00ce5d30b82c 479 if((fDistance <= 50.0) && (fDistance >= 3))
pinofal 12:00ce5d30b82c 480 {
pinofal 12:00ce5d30b82c 481 // visualizza il valore misurato
pinofal 12:00ce5d30b82c 482 printf("The Distance was %f [cm]\n\r", fDistance);
pinofal 12:00ce5d30b82c 483
pinofal 12:00ce5d30b82c 484 // SUONA IL CLACSON se l'ostacolo si trova ad una distanza inferiore ad una soglia minima
pinofal 12:00ce5d30b82c 485 if(fDistance < 22)
pinofal 12:00ce5d30b82c 486 {
pinofal 12:00ce5d30b82c 487 // INIZIO generazione tono
pinofal 12:00ce5d30b82c 488 nIndex=0;
pinofal 12:00ce5d30b82c 489 //Genera il suono del clacson
pinofal 12:00ce5d30b82c 490 for(nSampleCount=0; nSampleCount<7000; nSampleCount++)
pinofal 12:00ce5d30b82c 491 {
pinofal 12:00ce5d30b82c 492 OutWave.write_u16(usaSine[nIndex]); //max 32767
pinofal 12:00ce5d30b82c 493 //OutWave.write_u16(32767); //uscita analogica per scopi diagnostici
pinofal 12:00ce5d30b82c 494 wait(fDeltaT);
pinofal 12:00ce5d30b82c 495 // genera ciclicamente
pinofal 12:00ce5d30b82c 496 nIndex++;
pinofal 12:00ce5d30b82c 497 if(nIndex >= SAMPLESINENUM)
pinofal 12:00ce5d30b82c 498 {
pinofal 12:00ce5d30b82c 499 nIndex=0;
pinofal 12:00ce5d30b82c 500 }
pinofal 12:00ce5d30b82c 501 // a metà genera un wait per doppio clacson
pinofal 12:00ce5d30b82c 502 if(nSampleCount == 2000)
pinofal 12:00ce5d30b82c 503 {
pinofal 12:00ce5d30b82c 504 wait_ms(100);
pinofal 12:00ce5d30b82c 505 }
pinofal 12:00ce5d30b82c 506
pinofal 12:00ce5d30b82c 507 }
pinofal 12:00ce5d30b82c 508 //assicurati di inviare 0 come ultimo campione per spegnere l'amplificatore e non dissipare inutilmente corrente
pinofal 12:00ce5d30b82c 509 OutWave.write_u16(0);
pinofal 12:00ce5d30b82c 510
pinofal 12:00ce5d30b82c 511 } // if(fDistance < soglia) suona clacson
pinofal 12:00ce5d30b82c 512
pinofal 12:00ce5d30b82c 513 } // if( (fDistance < Max) && (fDistance > Min))
pinofal 12:00ce5d30b82c 514 //++++++++++++++ FINE Suona Clacson +++++++++
pinofal 12:00ce5d30b82c 515 wait_ms(100); // se effettuata la misura dai tempo prima di misurare nuovamente
pinofal 12:00ce5d30b82c 516
pinofal 12:00ce5d30b82c 517 }
pinofal 12:00ce5d30b82c 518 //++++ FINE Ciclo Principale ++++
pinofal 12:00ce5d30b82c 519 }
francesco01 15:d7126015fe69 520 }