Theramin

Dependencies:   mbed HC_SR04_Ultrasonic_Library

Committer:
glanier9
Date:
Sat Mar 06 18:40:19 2021 +0000
Revision:
0:0c8930416cda
Final version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
glanier9 0:0c8930416cda 1 //Theremin style demo using HC-SR04 Sonar and a speaker
glanier9 0:0c8930416cda 2 // moving a hand away/towards sonar changes audio frequency
glanier9 0:0c8930416cda 3 #include "mbed.h"
glanier9 0:0c8930416cda 4 #include "ultrasonic.h"
glanier9 0:0c8930416cda 5
glanier9 0:0c8930416cda 6 DigitalOut audio(p26); //output to speaker amp or audio jack
glanier9 0:0c8930416cda 7 DigitalOut led(LED1);
glanier9 0:0c8930416cda 8 DigitalOut led2(LED2);
glanier9 0:0c8930416cda 9
glanier9 0:0c8930416cda 10 Timeout cycle;
glanier9 0:0c8930416cda 11
glanier9 0:0c8930416cda 12 volatile int half_cycle_time = 1;
glanier9 0:0c8930416cda 13
glanier9 0:0c8930416cda 14 //two calls to this interrupt routine generates a square wave
glanier9 0:0c8930416cda 15 void toggle_interrupt()
glanier9 0:0c8930416cda 16 {
glanier9 0:0c8930416cda 17 if (half_cycle_time>22000) audio=0; //mute if nothing in range
glanier9 0:0c8930416cda 18 else audio = !audio; //toggle to make half a square wave
glanier9 0:0c8930416cda 19 led = !led;
glanier9 0:0c8930416cda 20 cycle.detach();
glanier9 0:0c8930416cda 21 //update time for interrupt activation -change frequency of square wave
glanier9 0:0c8930416cda 22 cycle.attach_us(&toggle_interrupt, half_cycle_time);
glanier9 0:0c8930416cda 23 }
glanier9 0:0c8930416cda 24 void newdist(int distance)
glanier9 0:0c8930416cda 25 {
glanier9 0:0c8930416cda 26 //update frequency based on new sonar data
glanier9 0:0c8930416cda 27 led2 = !led2;
glanier9 0:0c8930416cda 28 half_cycle_time = distance<<3;
glanier9 0:0c8930416cda 29 }
glanier9 0:0c8930416cda 30 //HC-SR04 Sonar module
glanier9 0:0c8930416cda 31 ultrasonic mu(p6, p7, .07, 1, &newdist);
glanier9 0:0c8930416cda 32 //Set the trigger pin to p6 and the echo pin to p7
glanier9 0:0c8930416cda 33 //have updates every .07 seconds and a timeout after 1
glanier9 0:0c8930416cda 34 //second, and call newdist when the distance changes
glanier9 0:0c8930416cda 35
glanier9 0:0c8930416cda 36 int main()
glanier9 0:0c8930416cda 37 {
glanier9 0:0c8930416cda 38 audio = 0;
glanier9 0:0c8930416cda 39 led = 0;
glanier9 0:0c8930416cda 40 cycle.attach(&toggle_interrupt, half_cycle_time);
glanier9 0:0c8930416cda 41 mu.startUpdates();//start measuring the distance with the sonar
glanier9 0:0c8930416cda 42 while(1) {
glanier9 0:0c8930416cda 43 //Do something else here
glanier9 0:0c8930416cda 44 mu.checkDistance();
glanier9 0:0c8930416cda 45 //call checkDistance() as much as possible, as this is where
glanier9 0:0c8930416cda 46 //the class checks if dist needs to be called.
glanier9 0:0c8930416cda 47 }
glanier9 0:0c8930416cda 48 }
glanier9 0:0c8930416cda 49