Per creare un Theremin semplice e intuitivo utlizzando gli strumenti di arduino è importante possedere alcune conoscenze di base del linguaggio C, ma non c'è da spaventarsi. Quello che ci serve non è difficile: ecco qui presentato, infatti, il codice che ci permetterà di suonare canzoni “economicamente”, con l'utilizzo del solito arduino.
/* http://www.dreamsincode.com/blog/2010/10/19/arduino-basicspiezo-sounder/ */ #define CICALINO 11 #define DURATA 5000 //durata della li in millesecondi #define PAUSA 100 #define TRIGGER 2 #define ECHO 3 //char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; // nomi inglesi delle note /* http://www.autistici.org/2000-maniax/texts/Le%20frequenze%20delle%20note%20musicali%20%E2%80%94%20Ulisse.htm le frequenze riportate sono moltiplicate per 10, per evitare l'uso di numeri in lizione floating point */ String note[] = { "do", "do#" , "re" , "re#" , "mi", "fa", "fa#" , "sol", "sol#" , "la", "la#" , "si", "DO" }; unsigned int freq[] = {2616,2772,2937,3111,3296,3492,3700,3920,4153,4400,4662,4939,5233}; int suona(int i, unsigned long durata ){ //funzione che permette al “piezo” (amplificatore per arduino) di produrre il suono richiesto Serial.print("suono la nota: "); Serial.println(note[i]); unsigned long int li=5000000/freq[i]; //unsigned int rip=freq[i]*durata/10000; digitalWrite(CICALINO,HIGH); delayMicroseconds(li); digitalWrite(CICALINO,LOW); delayMicroseconds(li); } void setup() { pinMode(CICALINO,OUTPUT); pinMode(TRIGGER,OUTPUT); pinMode(ECHO,INPUT); Serial.begin(115200); Serial.begin(115200); } void loop() { unsigned long ritardo, distanza; digitalWrite(TRIGGER, LOW); //Il processo qui illustrato permette di calcolare la distanza della nostra delay(1); //mano in ogni istante digitalWrite(TRIGGER, HIGH); delayMicroseconds(1); digitalWrite(TRIGGER, LOW); ritardo = pulseIn(ECHO, HIGH); Serial.print("ritardo: "); Serial.println(ritardo); //distanza = (ritardo/2)/29.1; sconsigliabile: usa un'operazione in floating point. //distanza = (ritardo/2)*10/291; distanza = (ritardo>>1)*10/340; Serial.print("distanza: "); Serial.println(distanza); //unsigned long time; unsigned long durata=DURATA; //unsigned long int li; // larghezza impulso //unsigned int rip; // numero di ripetizioni // unsigned long int i,j; //ogni 5 cm si produce una nota diversa if (distanza>0 && distanza<=5) { //produce il “DO” suona(12, durata); } if (distanza>5 && distanza<=10) { //produce il “si” suona(11, durata); } if (distanza>10 && distanza<=15) { //produce il “la” suona(9, durata); } if (distanza>15 && distanza<=20) { //produce il “sol” suona(7, durata); } if (distanza>20 && distanza<=25) { //produce il “fa” suona(5, durata); } if (distanza>25 && distanza<=30) { //produce il “mi” suona(4, durata); } if (distanza>30 && distanza<=35) { //produce il “re” suona(2, durata); } if (distanza>35 && distanza<=40){ //produce il “do” suona(0, durata); } }