QC

Theremino: a theremin made with Arduino

Theremino is a theremin built with an Arduino UNO and two ultrasonic sensors.

Devices and components

Arduino Uno Rev3

Jumper wires (generic)

Speaker: 0.25 W, 8 ohms

Non-volatile digital potentiometer, 10 kohm

Half Size Seamless Breadboard

Ultrasonic sensor - HC-SR04 (generic)

Project description

What is a theremin?

About this project

The sensors

Voltage input.

Tension mass.

Trigger: Sends an ultrasonic pulse via a digital write to the program.

Echo: Receives the ultrasonic pulse when it bounces.

Volume (amplitude)

Tone (frequency)

Sound (output)

Video demo

Enclosure

Arduino Code Theremin

arduino

1/*
2 This projects is a theremin created with two ultrasonic sensors, one controls the frequency (tone) and the other controls the amplitude (volume).
3 This project is a fork of two projects:
4 - https://create.arduino.cc/projecthub/opus9/theremino-f72d32 (this project had library conflicts)
5 - https://create.arduino.cc/projecthub/jvmccall/ultrasonic-theremin-033d6f (this project had typo errors in the code and a mistake in the schema)
6 Resource on controlling similar potentiometer using SPI protocol, provides example code and electrical setup: http://www.learningaboutelectronics.com/Articles/MCP4131-digital-potentiometer-circuit.php
7*/
8
9/*
10 Potentiometer conecctions:
11 1 - Arduino pin ~9
12 2 - Speaker +
13 3 - GND
14 4 - 5V
15 5 - Arduino pin ~10
16 6 - Arduino pin 13
17 7 - Arduino pin ~11
18 8 - GND
19 More info https://app.ultralibrarian.com/details/23D04BE7-10A0-11E9-AB3A-0A3560A4CCCC/Microchip/MCP4161-103E-P
20*/
21
22// NewTone is used to avoid the timer incompatibiliy of Tone with NewPing. Download https://bitbucket.org/teckel12/arduino-new-tone/downloads/ and import .zip
23#include <NewTone.h>
24#include <NewPing.h>
25#include <SPI.h>
26
27#define MIN_DISTANCE 35
28
29NewPing sonar(5, 6, 35); // the first and the second number are the pins of the sensor of volume, the third is the maximum distance
30
31// For SPI
32byte address = 0x00;
33int CS= 10;
34
35int echo = 3;
36int trigger = 4;
37
38int distance;
39int PotValue;
40
41unsigned long TimeResponse;
42float distance2;
43float tone1;
44
45void setup() {
46 // set all the pins
47 Serial.begin(9600);
48 pinMode(trigger, OUTPUT); // tone sensor
49 pinMode(echo, INPUT); // tone sensor
50 pinMode (CS, OUTPUT);
51 SPI.begin();
52
53 // this has the speaker emit a start up sound from Low to High to Low
54 digitalPotWrite(255);
55
56 for (int i = 50; i <= 400; i++)
57 {
58 pinMode(9, OUTPUT);
59 NewTone(9,i);
60 delay(10);
61 }
62
63 delay(500);
64
65 for (int i = 400; i >= 50; i--)
66 {
67 pinMode(9, OUTPUT);
68 NewTone(9,i);
69 delay(10);
70 }
71}
72
73void loop() {
74 digitalWrite(trigger, HIGH);
75 delayMicroseconds(10); // creates a 10 microsecond pulse
76 digitalWrite(trigger, LOW);
77 TimeResponse = pulseIn(echo, HIGH); // records how long it took to receive echo of the pulse
78 distance2 = TimeResponse/58; // calculates distance in centimeters
79
80 if (distance2 < MIN_DISTANCE) {
81 // conversion of distance into a value for a sound
82 tone1 = 50.0*pow(2,(distance2/12.0)); // calculate frequency, range of about 50-360 Hz
83 pinMode(9, OUTPUT);
84 NewTone(9,tone1);
85 } else {
86 pinMode(9, OUTPUT); // this sets the sound to a high pitched noise when no distance is detected
87 NewTone(9,0);
88 }
89
90 distance = sonar.ping_cm(); // uses the library NewPing to calculate distance
91
92 // distance is converted to Potentiometer relevant values
93 int PotValue = map(distance, 0, 35, 240, 255); // only use a range of resistance which is very low otherwise the speaker is too quiet because it is only a 8 ohm speaker
94
95 if (distance == 0) // sets volume to max when no hand is detected or if hand is too far away
96 {
97 PotValue = 255;
98 }
99
100 digitalPotWrite(PotValue);
101 delay(10);
102}
103
104int digitalPotWrite(int value) {
105 digitalWrite(CS, LOW); // this uses SPI protocol to communicate with the potentiometer and sets the resistance
106 SPI.transfer(address);
107 SPI.transfer(value);
108 digitalWrite(CS, HIGH);
109}

Arduino Code Theremin

arduino

1/*
2 This projects is a theremin created with two ultrasonic sensors, one controls the frequency (tone) and the other controls the amplitude (volume).
3 This project is a fork of two projects:
4 - https://create.arduino.cc/projecthub/opus9/theremino-f72d32 (this project had library conflicts)
5 - https://create.arduino.cc/projecthub/jvmccall/ultrasonic-theremin-033d6f (this project had typo errors in the code and a mistake in the schema)
6 Resource on controlling similar potentiometer using SPI protocol, provides example code and electrical setup: http://www.learningaboutelectronics.com/Articles/MCP4131-digital-potentiometer-circuit.php
7*/
8
9/*
10 Potentiometer conecctions:
11 1 - Arduino pin ~9
12 2 - Speaker +
13 3 - GND
14 4 - 5V
15 5 - Arduino pin ~10
16 6 - Arduino pin 13
17 7 - Arduino pin ~11
18 8 - GND
19 More info https://app.ultralibrarian.com/details/23D04BE7-10A0-11E9-AB3A-0A3560A4CCCC/Microchip/MCP4161-103E-P
20*/
21
22// NewTone is used to avoid the timer incompatibiliy of Tone with NewPing. Download https://bitbucket.org/teckel12/arduino-new-tone/downloads/ and import .zip
23#include <NewTone.h>
24#include <NewPing.h>
25#include <SPI.h>
26
27#define MIN_DISTANCE 35
28
29NewPing sonar(5, 6, 35); // the first and the second number are the pins of the sensor of volume, the third is the maximum distance
30
31// For SPI
32byte address = 0x00;
33int CS= 10;
34
35int echo = 3;
36int trigger = 4;
37
38int distance;
39int PotValue;
40
41unsigned long TimeResponse;
42float distance2;
43float tone1;
44
45void setup() {
46 // set all the pins
47 Serial.begin(9600);
48 pinMode(trigger, OUTPUT); // tone sensor
49 pinMode(echo, INPUT); // tone sensor
50 pinMode (CS, OUTPUT);
51 SPI.begin();
52
53 // this has the speaker emit a start up sound from Low to High to Low
54 digitalPotWrite(255);
55
56 for (int i = 50; i <= 400; i++)
57 {
58 pinMode(9, OUTPUT);
59 NewTone(9,i);
60 delay(10);
61 }
62
63 delay(500);
64
65 for (int i = 400; i >= 50; i--)
66 {
67 pinMode(9, OUTPUT);
68 NewTone(9,i);
69 delay(10);
70 }
71}
72
73void loop() {
74 digitalWrite(trigger, HIGH);
75 delayMicroseconds(10); // creates a 10 microsecond pulse
76 digitalWrite(trigger, LOW);
77 TimeResponse = pulseIn(echo, HIGH); // records how long it took to receive echo of the pulse
78 distance2 = TimeResponse/58; // calculates distance in centimeters
79
80 if (distance2 < MIN_DISTANCE) {
81 // conversion of distance into a value for a sound
82 tone1 = 50.0*pow(2,(distance2/12.0)); // calculate frequency, range of about 50-360 Hz
83 pinMode(9, OUTPUT);
84 NewTone(9,tone1);
85 } else {
86 pinMode(9, OUTPUT); // this sets the sound to a high pitched noise when no distance is detected
87 NewTone(9,0);
88 }
89
90 distance = sonar.ping_cm(); // uses the library NewPing to calculate distance
91
92 // distance is converted to Potentiometer relevant values
93 int PotValue = map(distance, 0, 35, 240, 255); // only use a range of resistance which is very low otherwise the speaker is too quiet because it is only a 8 ohm speaker
94
95 if (distance == 0) // sets volume to max when no hand is detected or if hand is too far away
96 {
97 PotValue = 255;
98 }
99
100 digitalPotWrite(PotValue);
101 delay(10);
102}
103
104int digitalPotWrite(int value) {
105 digitalWrite(CS, LOW); // this uses SPI protocol to communicate with the potentiometer and sets the resistance
106 SPI.transfer(address);
107 SPI.transfer(value);
108 digitalWrite(CS, HIGH);
109}

Downloadable files

Arduino Theremin Circuit Design

Arduino Theremin Circuit Design




Note: Content and images are from: https://projecthub.arduino.cc/, with some modifications.
If you want it removed due to copyright reasons, please leave a comment. Thank you.
I want to share this article more widely so that everyone knows about Arduino and your project.

Easy remote control

Remotely control an LED with ease. Devices and components Arduino Nano 33 BLE with headers Box 525 Resistors precision 1% - 17 values Breadb...