8bit pseudo-theremin (3): afegir un potenciometre per marcar el tempo
El primer pas del 8bit Theremin convertia la distancia en notes del brunzidor. Tot i això, el so era força molest perquè arribava a notes molt agudes i perquè l'espera entre notes era de només 25 milisegons.
El següent pas és afegir un potenciòmetre per tal d'indicar l'espera entre tons. O sigui, el tempo.
Esquema del cablejat
En aquest cas, el codi recull el valor del potenciòmetre i el fa servir de cara a l'espera entre execucions de la funció loop. A més, s'han polit els distàncies i el rang de tons del brunzidor.
/* Translate HC-SR04 Ping distance sensor into buzzer tone with a potentiometer tempo 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 potenPid = A1; int buzzerPin = 10; int buzztone = 0; //buzzer tone range int maxbuzztone = 2500;//4978; int minbuzztone = 1; int maximumRange = 30; // Maximum range needed int minimumRange = 1; // Minimum range needed long duration, distance; // Duration used to calculate distance int delayval = 25; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(LEDPin, OUTPUT); // Use LED indicator (if required) pinMode(buzzerPin, OUTPUT); // sets the pin as output } 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){ digitalWrite(LEDPin, LOW); noTone(buzzerPin); } else { digitalWrite(LEDPin, HIGH); buzztone = map(distance, minimumRange, maximumRange, minbuzztone, maxbuzztone); buzztone = maxbuzztone - buzztone; tone(buzzerPin,buzztone); } //pillem el delay delayval = analogRead(potenPid); delay(delayval+1); }
A continuació poso un vídeo de com funciona:
Cap comentari:
Publica un comentari a l'entrada