A sorta-kinda Theremin using two Sharp IR rangers, my A2D I2C adapters, and my simple pwm/sound/beep library. Demo video: http://www.youtube.com/watch?v=6HEsA3RBoPc

Dependencies:   Beep mbed

Committer:
shimniok
Date:
Wed Jul 31 23:08:05 2013 +0000
Revision:
0:08f8dd6fd2e9
Working revision, updated documentation with youtube video

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:08f8dd6fd2e9 1 #include "mbed.h"
shimniok 0:08f8dd6fd2e9 2 #include "Beep.h"
shimniok 0:08f8dd6fd2e9 3
shimniok 0:08f8dd6fd2e9 4 /**
shimniok 0:08f8dd6fd2e9 5 * Pseudo Theremin using Sharp IR Rangers + my A2D I2C adapters
shimniok 0:08f8dd6fd2e9 6 *
shimniok 0:08f8dd6fd2e9 7 * Demo Video: http://www.youtube.com/watch?v=6HEsA3RBoPc
shimniok 0:08f8dd6fd2e9 8 * A2D adapters: https://code.google.com/p/bot-thoughts-sharpi2c/
shimniok 0:08f8dd6fd2e9 9 *
shimniok 0:08f8dd6fd2e9 10 * One ranger controls pitch, the other on/off.
shimniok 0:08f8dd6fd2e9 11 * Simple PWM sound generation is used. The output pin p22 feeds
shimniok 0:08f8dd6fd2e9 12 * into a simple common-emitter BJT amplifier on my breadboard.
shimniok 0:08f8dd6fd2e9 13 */
shimniok 0:08f8dd6fd2e9 14 DigitalOut myled(LED1);
shimniok 0:08f8dd6fd2e9 15 I2C i2c(p28, p27); // sda, scl
shimniok 0:08f8dd6fd2e9 16 Serial pc(USBTX, USBRX); // tx, rx
shimniok 0:08f8dd6fd2e9 17 Timer t;
shimniok 0:08f8dd6fd2e9 18 Beep buzzer(p22);
shimniok 0:08f8dd6fd2e9 19
shimniok 0:08f8dd6fd2e9 20 #define PITCH 0x26
shimniok 0:08f8dd6fd2e9 21 #define PITCHR (PITCH<<1)|1
shimniok 0:08f8dd6fd2e9 22 #define PITCHW (PITCH<<1)
shimniok 0:08f8dd6fd2e9 23 #define VOLUME 0x27
shimniok 0:08f8dd6fd2e9 24
shimniok 0:08f8dd6fd2e9 25 int main() {
shimniok 0:08f8dd6fd2e9 26 int p = 0;
shimniok 0:08f8dd6fd2e9 27 int v = 0;
shimniok 0:08f8dd6fd2e9 28
shimniok 0:08f8dd6fd2e9 29 i2c.frequency(100000);
shimniok 0:08f8dd6fd2e9 30 pc.baud(115200);
shimniok 0:08f8dd6fd2e9 31 pc.printf("Hello world!\n");
shimniok 0:08f8dd6fd2e9 32 t.start();
shimniok 0:08f8dd6fd2e9 33 t.reset();
shimniok 0:08f8dd6fd2e9 34
shimniok 0:08f8dd6fd2e9 35 while(1) {
shimniok 0:08f8dd6fd2e9 36 char data[3];
shimniok 0:08f8dd6fd2e9 37 float range = 0.0;
shimniok 0:08f8dd6fd2e9 38
shimniok 0:08f8dd6fd2e9 39 pc.printf("%8u ", t.read_ms());
shimniok 0:08f8dd6fd2e9 40
shimniok 0:08f8dd6fd2e9 41 if ( i2c.read(VOLUME<<1, data, 2) != 0) {
shimniok 0:08f8dd6fd2e9 42 pc.printf("~0x%02x ", VOLUME);
shimniok 0:08f8dd6fd2e9 43 } else {
shimniok 0:08f8dd6fd2e9 44 v = data[0]<<8 | data[1];
shimniok 0:08f8dd6fd2e9 45 pc.printf("%03u %03u v=%u ", data[0], data[1], v);
shimniok 0:08f8dd6fd2e9 46 }
shimniok 0:08f8dd6fd2e9 47
shimniok 0:08f8dd6fd2e9 48 if ( i2c.read(PITCHR, data, 2) != 0) {
shimniok 0:08f8dd6fd2e9 49 pc.printf("~0x%02x", PITCH);
shimniok 0:08f8dd6fd2e9 50 } else {
shimniok 0:08f8dd6fd2e9 51 p = data[0]<<8 | data[1];
shimniok 0:08f8dd6fd2e9 52 if (v > 2300){
shimniok 0:08f8dd6fd2e9 53 range = 500 + 500 * powf(4187.8 / p, 1.1060);
shimniok 0:08f8dd6fd2e9 54 buzzer.beep(int(range));
shimniok 0:08f8dd6fd2e9 55 } else {
shimniok 0:08f8dd6fd2e9 56 buzzer.nobeep();
shimniok 0:08f8dd6fd2e9 57 }
shimniok 0:08f8dd6fd2e9 58 pc.printf("%03u %03u p=%u r=%f", data[0], data[1], p, range);
shimniok 0:08f8dd6fd2e9 59 }
shimniok 0:08f8dd6fd2e9 60 pc.printf("\n");
shimniok 0:08f8dd6fd2e9 61
shimniok 0:08f8dd6fd2e9 62 wait(0.005);
shimniok 0:08f8dd6fd2e9 63 }
shimniok 0:08f8dd6fd2e9 64 }