divendres, 4 de juliol del 2014

8bit Pseudo-Theremin (2): sensor d'ultrasons i buzzer

El primer pas per fer el meu pseudo-theremin de 8 bits consisteix en recollir el valor del sensor de distàncies d'ultrasons i convertir-lo en un to per al brunzidor. Per fer-ho només m'ha sigut necessari combinar els meus dos anteriors tutorials sobre aquests sensors.

Esquema de connexió

El codi no es especialment complicat d'entendre. La clau està en fer servir la funció map per fer una regla de tres entre la distancia i el to i després invertir-lo perquè sigui més agut com més aprop s'estigui del sensor.

/*
 Translate HC-SR04 Ping distance sensor into buzzer tone.
 
 Author: Ferran Recio
 This code is part of the project 8bit pseudo-theremin (http://laveudet.blogspot.com.es/2014/07/pseudo-theremin-8bits-part-0.html)
 
 Code based on:
 
 HC-SR04 Ping distance code by ScottC here: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html
 buzzer tutorial here:  http://arduino.cc/en/Tutorial/Tone
 
 on 04 Jul 2014.
 */


#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int buzzer = 11;//buzzer pin

int buzztone = 0;

//buzzer tone range
int maxbuzztone = 4978;
int minbuzztone = 1;

//distance range
int maximumRange = 100; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
 
 pinMode(buzzer, OUTPUT);   // sets the pin as outpu
}

void loop() {
/* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it. */ 
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 
 if (distance >= maximumRange || distance <= minimumRange){
 /* Send a negative number to computer and Turn LED ON 
 to indicate "out of range" */
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH);
 
 noTone(buzzer);
 }
 else {
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 //Serial.println(distance);
 digitalWrite(LEDPin, LOW); 
 
 buzztone = map(distance, minimumRange, maximumRange, minbuzztone, maxbuzztone);
 buzztone = maxbuzztone - buzztone;
 Serial.println(buzztone);
 tone(buzzer,buzztone);
 }
 
 //Delay 50ms before next reading.
 delay(25);
}

El so de moment es força horrible, però espero anar-ho polint. A continuació poso un vídeo del que fa (el vídeo és d'una versió anterior a invertir el to, pel que sona més greu com més aprop):

 Vídeo de com funciona