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
Cap comentari:
Publica un comentari a l'entrada