motore cofano

Dependencies:   mbed X-NUCLEO-IHM05A1

Revision:
11:196c4677e0ca
Parent:
10:2622d1ab5984
--- 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