motore cofano
Dependencies: mbed X-NUCLEO-IHM05A1
Diff: Exercise_IHM05A1.cpp
- Revision:
- 11:196c4677e0ca
- Parent:
- 10:2622d1ab5984
diff -r 2622d1ab5984 -r 196c4677e0ca Exercise_IHM05A1.cpp --- a/Exercise_IHM05A1.cpp Sat Nov 17 14:19:06 2018 +0000 +++ b/Exercise_IHM05A1.cpp Mon Nov 19 11:45:23 2018 +0000 @@ -43,10 +43,20 @@ /* Component specific header files. */ #include "L6208.h" - +#include "SampledSound.h" +#include "Clacson.h" DigitalIn myButton(USER_BUTTON); DigitalIn Input (PC_0); - +AnalogIn InWave(PA_0); +Serial pc(USBTX, USBRX); +//DigitalOut myRele(PC_3); +DigitalOut LedAD (PC_2) ;//bianche telecamere +DigitalOut LedAS (PC_3) ;//bianche telecamere +DigitalOut LedPD (PC_10) ;//rosse +DigitalOut LedPS (PC_12) ;//rosse +AnalogOut OutWave(PA_4); // pin di output per la forma d'onda analogica +DigitalOut myD2(PA_10);//pin di output proveniente dal raspberry +DigitalOut led2(LED2); // LED su scheda /* Definitions ---------------------------------------------------------------*/ #ifdef TARGET_NUCLEO_F334R8 #define VREFA_PWM_PIN D11 @@ -58,8 +68,99 @@ #define VREFA_PWM_PIN D3 #define VREFB_PWM_PIN D9 #endif +#define NUMSAMPLE 300 +// ticker per la generazione dell'onda con DAC +Ticker SampleOutTicker; -Serial pc(SERIAL_TX, SERIAL_RX); +void my_error_handler(uint16_t error) +{ + /* Printing to the console. */ + pc.printf("Error %d detected\r\n\n", error); + + /* Infinite loop */ + while (true) { + } +} + + + +// ticker per l'acquisizione dell'onda con ADC +Ticker SamplingTicker; + +// carattere in arrivo dal PC ed equivalente numerico +volatile char cReadChar; +volatile int nReadChar; + +// flag che diventa true quando si vuole fermare l'acquisizione +volatile bool bStop; + +// valore letto dall'ADC e corrispondente in tensione +volatile unsigned short usReadADCLux; +volatile float fReadVoltage; + +// valore di temperatura letto dall'ADC +volatile float fLux; + +// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC +void CalculateSinewave(void); +// funzione di generazione suono della frequenza e ampiezza selezionate +void SoundGenerate(double fFrequency); + +// carattere in arrivo dal PC + +volatile char CReadMusic; + +uint32_t nProva; + +// indice nell'array dei campioni da porre in output da DAC per Marimba +volatile uint32_t nSampleSoundIndex; + +// Periodo di generazione campioni in output DeltaT = T/NumSample +double fDeltaT; +// amplificazione per il dato da spedire sull'ADC +volatile double fAmp; +//volatile double fAmpNew; +// flag per bloccare la generazione del segnale +volatile int bGenerate = false; + +// frequenza segnale da generare +volatile double fFreq; +//flag che diventa true se bisogna fermare la generazione di suoni + +// periodo della sinusoide da generare +double fPeriod; +// tipo di suono da generare: 0=Sine, 1= Square +char cSoundWave; + +// nota corrispondente al tasto premuto +volatile char cKeyToPlay= '\0'; + + +//********************************************************************** +// generazione suoni con i sample da file di campioni in SoundSample.h +//********************************************************************** +void SampleOut() +{ + + // genera campioni fino al raggiungimento del numero di campioni nel file Sound.h + if((nSampleSoundIndex < nSampleNum) && (bGenerate == true)) + { + // mette in output un campione della forma d'onda moltiplicato per l'amplificazione fAmp + OutWave.write_u16(naInputSoundWave[nSampleSoundIndex]*fAmp); + // incrementa l'indice del campione in output, nSampleNum è il numero dei campioni nle file Sound.h + nSampleSoundIndex++; + } + else + { + // se è stato generato il numero di campioni del file oppure bGenerate = false, ferma la generazione di suoni + bGenerate = false; + } +} + +// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC +void CalculateSinewave(void); +// funzione di generazione suono della frequenza e ampiezza selezionate +void SoundGenerate(double fFrequency); /* Variables -----------------------------------------------------------------*/ @@ -110,20 +211,98 @@ * @note If needed, implement it, and then attach it: * + motor->attach_error_handler(&my_error_handler); */ -void my_error_handler(uint16_t error) -{ - /* Printing to the console. */ - pc.printf("Error %d detected\r\n\n", error); - - /* Infinite loop */ - while (true) { - } -} /* Main ----------------------------------------------------------------------*/ int main() { + //inizializza variabili + bGenerate= false; + bStop= true; + cReadChar= 0; + //nSampleOutIndex= 0; + //nSampleOutCount= 0; + nSampleSoundIndex= 0; + + //imposta il funzionamento del pulsante come "PullDown": Aperto = '0'. L'altra modalità di funzionamento è PullUp + myButton.mode(PullUp); + + // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto + pc.baud(921600); //921600 bps + + // test dei LED + led2=1; // Blu + wait_ms(500); + led2=0; + + pc.printf("\r\nHallo Amaldi Students - Exercise 12 \r\n"); + pc.printf("\n\r*** Sampled Sound Generator ***\n\r"); + + // fissa l'amplificazione da 0 a 1 + fAmp = 1.0; + + // attende la pressione di tasti sulla marimba + while(true) + { + if(myButton == 0) + { + while(myButton != 1){}; // attendi che il tasto sia rilasciato + fFreq=nSamplePerSec/nUnderSampleFactor;// campioni per secondo da generare = nSamplePerSec/nUnderSampleFactor + pc.printf("--- Sound Generation ---\n\r"); + pc.printf("--- Clacson ---\n\r"); + if (myD2 == 1) + { + bGenerate = true; // flag true quando è attiva la generazione di suoni + nSampleSoundIndex =0; //inizializza indice dell'array + fDeltaT = (1.0/fFreq); // fFreq dipende dal periodo di campionamento e dal fattore di sottocampionamento + SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia generazione + } + else + { + bGenerate = false; // arresta la generazione di suoni + } + } + } // while + // periodo di campionamento + int nDeltaT; + + + // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto + pc.baud(921600); //921600 bps + // messaggio di benvenuto + pc.printf("\r\nHey Bro! Say Goodbye to your Sister !\r\n"); + pc.printf("Enter Acquisition Time, DeltaT[sec]= [1 - 9]: \r\n"); + // pc.printf("\r\n*** Bluetooth Temp Acquisition ***\r\n"); + + // inizializza variabili + bStop=true; + //myRele = 0x00; // spegni il relè + + + + LedAD =0x00 ; + LedAS =0x00 ; + LedPD =0x00 ; + LedPS =0x00 ; + wait(1); + LedAD =0x01 ; + LedAS =0x01 ; + LedPD =0x01 ; + LedPS =0x01 ; + wait(1); + LedAD =0x00 ; + LedAS =0x00 ; + LedPD =0x00 ; + LedPS =0x00 ; + wait(1); + LedAD =0x01; + wait_ms(500); + LedAS =0x01 ; + wait_ms(500); + LedPD =0x01 ; + wait_ms(500); + LedPS =0x01 ; + wait(1); // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto pc.baud(921600); //921600 bps //pc.baud(9600); //256000 bps