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