——
DonLucElectronics #DonLuc #Synthesizer #UltrasonicSynth #Mozzi #Arduino #ArduinoProMini #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
Volume Sound
Volume the degree of loudness or the intensity of a sound. The volume of a sound is how loud or quiet the sound is. Sounds are vibrations that travel through the air. Volume, or loudness, is related to the strength, intensity, pressure, or power of the sound. Amplified vibrations result in louder sounds. There are a few ways of varying the volume.
I am using the Mozzi audio library to implement a simple synthesizer and using a potentiometer to control the amplitude of a sinewave with Mozzi sonification library. To convey the volume level. Volume it to an 8 bit range for efficient calculations.
DL2207Mk04
1 x Arduino Pro Mini 328 – 5V/16MHz
2 x HC-SR04 Ultrasonic Sensor
3 x 1M Ohm Potentiometer
3 x Knob
1 x Audio Jack 3.5mm
1 x SparkFun Audio Jack Breakout
1 x SparkFun USB Mini-B Breakout
1 x SPDT Slide Switch
1 x JST Jumper 2 Wire Connector
1 x JST Jumper 3 Wire Connector
1 x Insignia Speakers
1 x SparkFun Solderable Breadboard – Large
1 x SparkFun FTDI Basic Breakout – 5V
1 x SparkFun Cerberus USB Cable
Arduino Pro Mini 328 – 5V/16MHz
Ech – Digital 13
Tri – Digital 12
EcR – Digital 11
TrR – Digital 10
SPK – Digital 9
CAP – Analog A0
CAH – Analog A1
CAV – Analog A2
VIN – +5V
GND – GND
——
DL2207Mk04p.ino
/* ***** Don Luc Electronics © *****
Software Version Information
Project #22: Synthesizer - Volume - Mk07
22-07
DL2207Mk04p.ino
1 x Arduino Pro Mini 328 - 5V/16MHz
2 x HC-SR04 Ultrasonic Sensor
3 x 1M Ohm Potentiometer
3 x Knob
1 x Audio Jack 3.5mm
1 x SparkFun Audio Jack Breakout
1 x SparkFun USB Mini-B Breakout
1 x SPDT Slide Switch
1 x JST Jumper 2 Wire Connector
1 x JST Jumper 3 Wire Connector
1 x Insignia Speakers
1 x SparkFun Solderable Breadboard - Large
1 x SparkFun FTDI Basic Breakout - 5V
1 x SparkFun Cerberus USB Cable
*/
// Include the Library Code
// Mozzi
#include <MozziGuts.h>
// Oscillator
#include <Oscil.h>
// Table for Oscils to play
#include <tables/cos2048_int8.h>
// Smoothing Control
#include <Smooth.h>
// Maps unpredictable inputs to a range
#include <AutoMap.h>
// Desired carrier frequency max and min, for AutoMap
const int MIN_CARRIER_FREQ = 22;
const int MAX_CARRIER_FREQ = 440;
// Desired intensity max and min, for AutoMap, note they're inverted for reverse dynamics
const int MIN_INTENSITY = 700;
const int MAX_INTENSITY = 10;
// Desired mod speed max and min, for AutoMap, note they're inverted for reverse dynamics
const int MIN_MOD_SPEED = 10000;
const int MAX_MOD_SPEED = 1;
// Maps unpredictable inputs to a range
AutoMap kMapCarrierFreq(0,1023,MIN_CARRIER_FREQ,MAX_CARRIER_FREQ);
AutoMap kMapIntensity(0,1023,MIN_INTENSITY,MAX_INTENSITY);
AutoMap kMapModSpeed(0,1023,MIN_MOD_SPEED,MAX_MOD_SPEED);
// Set the input for the knob to analog pin 0
const int KNOB_PIN = A0;
// Set the analog input for fm_intensity
int LDR1_PIN;
// Set the analog input for mod rate
int LDR2_PIN;
// Table for Oscils to play
Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aCarrier(COS2048_DATA);
Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aModulator(COS2048_DATA);
Oscil<COS2048_NUM_CELLS, CONTROL_RATE> kIntensityMod(COS2048_DATA);
// Harmonics (Brightness)
int iModRatio = A1;
int mod_ratio;
// Carries control info from updateControl to updateAudio
long fm_intensity;
// Smoothing for intensity to remove clicks on transitions
float smoothness = 0.95f;
Smooth <long> aSmoothIntensity(smoothness);
// Trigger pin 12 to pitch distance sensor
const int iTrigPitch = 12;
// Echo Receive pin 13 to pitch distance sensor
const int iEchoPitch = 13;
// Define the useable range of the pitch sensor
const int pitchLowThreshold = 45;
const int pitchHighThreshold = 2;
// Stores the distance measured by the distance sensor
float distance = 0;
// Trigger pin 10 to rate distance sensor
const int iTrigRate = 10;
// Echo Receive pin 13 to pitch distance sensor
const int iEchoRate = 11;
// Define the useable range of the pitch sensor
const int rateLowThreshold = 45;
const int rateHighThreshold = 2;
// Stores the distance measured by the distance sensor
float rate = 0;
// Volume
// Set the input for the knob to analog pin 2
const int iVolKnob = A2;
// To convey the Volume level from updateControl() to updateAudio()
byte bVolume;
// Mini Speaker
int SPK = 9;
// Software Version Information
String sver = "22-07";
void loop() {
// Audio Hook
audioHook();
}
getHC-SR04.ino
// HC-SR04 Ultrasonic Sensor
// Setup HC-SR04
void setupHCSR04() {
// The trigger iTrig Pitch will output pulses of electricity
pinMode(iTrigPitch, OUTPUT);
// The echo iEcho will measure the duration of pulses coming back from the distance sensor
pinMode(iEchoPitch, INPUT);
// The trigger iTrig Rate will output pulses of electricity
pinMode(iTrigRate, OUTPUT);
// The echo iEcho will measure the duration of pulses coming back from the distance sensor
pinMode(iEchoRate, INPUT);
}
// Distance
float isDistance() {
// Variable to store the time it takes for a ping to bounce off an object
float echoTime;
// Variable to store the distance calculated from the echo time
float calculatedDistance;
// Send out an ultrasonic pulse that's 10ms long
digitalWrite(iTrigPitch, HIGH);
delayMicroseconds(10);
digitalWrite(iTrigPitch, LOW);
// Use the pulseIn command to see how long it takes for the
// pulse to bounce back to the sensor
echoTime = pulseIn(iEchoPitch, HIGH);
// Calculate the distance of the object that reflected the pulse
// (half the bounce time multiplied by the speed of sound)
calculatedDistance = echoTime * 0.034 / 2;
// Send back the distance that was calculated
return calculatedDistance;
}
// Rate
float isRate() {
// Variable to store the time it takes for a ping to bounce off an object
float echoTime;
// Variable to store the distance calculated from the echo time
float calculatedDistance;
// Send out an ultrasonic pulse that's 10ms long
digitalWrite(iTrigRate, HIGH);
delayMicroseconds(10);
digitalWrite(iTrigRate, LOW);
// Use the pulseIn command to see how long it takes for the
// pulse to bounce back to the sensor
echoTime = pulseIn(iEchoRate, HIGH);
// Calculate the distance of the object that reflected the pulse
// (half the bounce time multiplied by the speed of sound)
// cm = 58.0
calculatedDistance = echoTime * 0.034 / 2;
// Send back the distance that was calculated
return calculatedDistance;
}
getMozzi.ino
// Mozzi
// Update Control
void updateControl(){
// Variable to store the distance measured by the sensor
distance = isDistance();
// Low Threshold
if ( distance >= pitchLowThreshold) {
// pitchLowThreshold
distance = pitchLowThreshold;
}
// High Threshold
if ( distance < pitchHighThreshold){
// pitchHighThreshold
distance = pitchHighThreshold;
}
// Variable to store the distance measured by the sensor
rate = isRate();
// Low Threshold
if ( rate >= rateLowThreshold) {
// rateLowThreshold
rate = rateLowThreshold;
}
// High Threshold
if ( rate < rateHighThreshold){
// rateHighThreshold
rate = rateHighThreshold;
}
// Map
distance = map(distance, 45, 2, 0, 1023);
rate = map(rate, 45, 2, 0, 1023);
// Read the knob
// Value is 0-1023
int knob_value = mozziAnalogRead(KNOB_PIN);
// Read the mod_ratio
// Value is 0-1023
mod_ratio = mozziAnalogRead(iModRatio);
// Map
mod_ratio = map(mod_ratio, 0, 1023, 2, 15);
// Map the knob to carrier frequency
int carrier_freq = kMapCarrierFreq(knob_value);
// Calculate the modulation frequency to stay in ratio
int mod_freq = carrier_freq * mod_ratio;
// Set the FM oscillator frequencies
aCarrier.setFreq(carrier_freq);
aModulator.setFreq(mod_freq);
// Read the light dependent resistor on the width
LDR1_PIN = distance;
int LDR1_value = LDR1_PIN;
int LDR1_calibrated = kMapIntensity(LDR1_value);
// Calculate the fm_intensity
// Shift back to range after 8 bit multiply
fm_intensity = ((long)LDR1_calibrated * (kIntensityMod.next()+128))>>8;
// Read the light dependent resistor on the speed
LDR2_PIN = rate;
int LDR2_value= LDR2_PIN;
// Use a float here for low frequencies
float mod_speed = (float)kMapModSpeed(LDR2_value)/1000;
kIntensityMod.setFreq(mod_speed);
// Read the variable resistor for volume
// Value is 0-1023
int iVolValue = mozziAnalogRead(iVolKnob);
// map it to an 8 bit range for efficient calculations in updateAudio
bVolume = map(iVolValue, 0, 1023, 155, 1);
}
// Update Audio
int updateAudio()
{
// Update Audio
long modulation = aSmoothIntensity.next(fm_intensity) * aModulator.next() * bVolume;
return aCarrier.phMod(modulation);
}
setup.ino
// Setup
void setup() {
// Setup HC-SR04
setupHCSR04();
// Delay
delay( 200 );
// Mozzi Start
startMozzi();
}
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc


