domingo, 4 de noviembre de 2018

Barrera con Ultrasonido y Leds

En este caso crearemos una barrera con ultrasonido y dos led (rojo y verde). La barrera permanece cerrada y el led rojo prendido, al detectar la llegada de un coche el ultrasonido, levanta la barrera, apaga el led rojo y prende el led verde.
Se utilizó una caja de remedios para colocar el servo, los led y el ultrasonido, todo conectado al protoboard y este al arduino.




Programación

int trigPin = 8;
int echoPin = 9;
long duration; //tiempo de ida/vuelta
int cm = 0; //Para almacenar el valor obtenido en cm valor=0

#include <Servo.h>
Servo myservo; 

void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
myservo.attach(10);
pinMode(7, OUTPUT); 
pinMode(6, OUTPUT); 
}

void loop()
{
digitalWrite(13, HIGH); 
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH); 
duration=duration/2;

cm = duration/ 29;
if (cm >  5 ) 
{delay(1000);
myservo.write (0);
digitalWrite(6, HIGH); 
digitalWrite(7, LOW);
}
else 
{myservo.write (90);
digitalWrite(7, HIGH); 
digitalWrite(6, LOW);
delay(200);

Serial.print("DistanciaSerial.println(cm)");
delay(100);
}
}

Graba el proyecto con el nombre de barrera

Ultrasonido

¿CÓMO FUNCIONA UN SENSOR DE ULTRASONIDOS?

El sensor se basa simplemente en medir el tiempo entre el envío y la recepción de un pulso sonoro. Sabemos que la velocidad del sonido es 343 m/s en condiciones de temperatura 20 ºC, 50% de humedad, presión atmosférica a nivel del mar. Transformando unidades resulta

343 \frac{m}{s} \cdot{} 100 \frac{cm}{m} \cdot{} \frac{1}{1000000} \frac{s}{\mu s} = \frac{1}{29.2} \frac{cm}{\mu s}

Es decir, el sonido tarda 29,2 microsegundos en recorrer un centímetro. Por tanto, podemos obtener la distancia a partir del tiempo entre la emisión y recepción del pulso mediante la siguiente ecuación.

Distancia(cm)= \frac {Tiempo(\mu s)}{29.2 \cdot 2}

El motivo de divir por dos el tiempo (además de la velociad del sonido en las unidades apropiadas, que hemos calculado antes) es porque hemos medido el tiempo que tarda el pulso en ir y volver, por lo que la distancia recorrida por el pulso es el doble de la que queremos medir.
sensor-ultrasonico-explicacion
Lo que vamos a realizar es un proyecto donde al detectar un objeto el ultrasonido a menos de 5 cm prenderá un led.

Diagrama



Programación

//Declaramos los pines
 const int led = 11;
const int trig = 9;
const int echo = 8; //Declaramos algunas variables long tiempo; long distancia;
void setup() {
 pinMode(led,OUTPUT);
pinMode(trig, OUTPUT); //Activación del pin trig como salida: para el pulso ultrasónico pinMode(echo, INPUT); //Activación del pin echo como entrada: tiempo del rebote del ultrasonido
 }
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(5); //Par cuestión de estabilización del sensor
digitalWrite(trig, HIGH); //Enviamos el pulso ultrasónico
delayMicroseconds(10);
tiempo = pulseIn(8, HIGH); /Función para medir la longitud del pulso entrante. Mide el tiempo transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote./
distancia = int(0.017*tiempo); //Fórmula para calcular la distancia obtenida en cm if(distancia <= 5){
digitalWrite(led,HIGH); //Si el sensor mide una distancia más pequeña o igual a 5cm, enciende el LED
}
else{
digitalWrite(led,LOW); //Sinó, apaga el LED
 }
 }

Graba el proyecto como ultrasonido

Servomotor y Potenciometro

De esta manera en al utilizar el potenciometro nos permitirá girar para izquierda o derecha y de esa manera el servo aumentará o disminuirá el ángulo.

#include <Servo.h>
Servo servomotor;
int angulo = 90;   //Variable para el ángulo, inicia en 90°
int aumentar = 22;  //Pin para el pulsador de aumentar el angulo
int disminuir = 23; //Pin para el pulsador de disminuir el angulo
void setup() {
  servomotor.attach(6);  //Pin PWM 6 del Arduino
  pinMode(disminuir, INPUT);
  pinMode(aumentar, INPUT);
  servomotor.write(angulo);  //Posiciona el servo inicialmente en la mitad (90°)
}
void loop() {
  //Aumenta el angulo mientras se mantenga presionado
  if (digitalRead(aumentar) == LOW)
  {
    angulo++;
    if (angulo >= 180)
    {
      angulo = 180;      //El angulo no aumenta mas alla de 180 grados
    }
  }
  //Disminuye el angulo mientras se mantenga presionado
  if (digitalRead(disminuir) == LOW)
  {
    angulo--;
    if (angulo <= 0)
    {
      angulo = 0;      //El angulo no disminuye mas alla de 0 grados
    }
  }
  servomotor.write(angulo);  //Manda el ángulo al servo dependiendo del pulsador presionado
  delay(10);
}

Graba el proyecto como servo2

Servomotor

Los servomotores nos permiten seleccionar los grados en el que va a ir girando. Para este proyecto y ver como funciona realizaremos la siguiente conexión.

Programación


#include <Servo.h>
Servo servomotor;
void setup() {
  servomotor.attach(6); //Pin PWM 6 del Arduino
}
void loop() {
  //Aumenta el angulo en +1 hasta llegar a 180 grados
  for (int posicion = 0; posicion <= 180; posicion++)
  {
    servomotor.write(posicion);
    delay(10);
  }
  //Disminuye el angulo en -1 hasta llegar a 0 grados
  for (int posicion = 180; posicion >= 0; posicion--)
  {
    servomotor.write(posicion);
    delay(10);
  }
}


Graba el proyecto como servo

Música Can Can


Otro ejemplo de programación donde sonará la música del  can can, eso sí, no es un parlante por lo tanto no se escuchará con buena calidad de sonido.
Utilizaremos la misma conexión que utilizamos para el proyecto 5 del zumbador. 

int noteFreqArr[] = {
49.4, 52.3, 55.4, 58.7, 62.2, 65.9, 69.9, 74, 78.4, 83.1, 88, 93.2,
98.8, 105, 111, 117, 124, 132, 140, 148, 157, 166, 176, 186,
198, 209, 222, 235, 249, 264, 279, 296, 314, 332, 352, 373,
395, 419, 444, 470, 498, 527, 559, 592, 627, 665, 704, 746,
790, 837, 887, 940, 996, 1050, 1110, 1180, 1250, 1320, 1400, 1490,
1580, 1670, 1770, 1870, 1990, 2100};

void setup() {
pinMode(4, OUTPUT); // set a pin for buzzer output
}

void playNote(int noteInt, long length, long breath = 20) {
length = length - breath;
buzz(4, noteFreqArr[noteInt], length);
if(breath > 0) { //take a short pause or 'breath' if specified
delay(breath);
}
}

void loop() {
//main course
playNote(24,500);
playNote(17,1000);
playNote(19,250);
playNote(22,250);
playNote(21,250);
playNote(19,250);
playNote(24,500);
playNote(24,500);
playNote(24,250);
playNote(26,250);
playNote(21,250);
playNote(22,250);
playNote(19,500);
playNote(19,500);
playNote(19,250);
playNote(22,250);
playNote(21,250);
playNote(19,250);
playNote(17,250);
playNote(29,250);
playNote(28,250);
playNote(26,250);
playNote(24,250);
playNote(22,250);
playNote(21,250);
playNote(19,250);
playNote(17,1000);
playNote(19,250);
playNote(22,250);
playNote(21,250);
playNote(19,250);
playNote(24,500);
playNote(24,500);
playNote(24,250);
playNote(26,250);
playNote(21,250);
playNote(22,250);
playNote(19,500);
playNote(19,500);
playNote(19,250);
playNote(22,250);
playNote(21,250);
playNote(19,250);
playNote(17,250);
playNote(24,250);
playNote(19,250);
playNote(21,250);
playNote(17,250);
delay(250);
}

void buzz(int targetPin, long frequency, long length) {
long delayValue = 1000000/frequency/2; // calculate the delay value between transitions
//// 1 second's worth of microseconds, divided by the frequency, then split in half since
//// there are two phases to each cycle
long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing
//// multiply frequency, which is really cycles per second, by the number of seconds to
//// get the total number of cycles to produce
for (long i=0; i < numCycles; i++){ // for the calculated length of time...
digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphram
delayMicroseconds(delayValue); // wait for the calculated delay value
digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphram
delayMicroseconds(delayValue); // wait again for the calculated delay value
}
}

Led, botón y zumbador


Realiza las conexiones necesarias para que  al prender el botón se prenda el led y el zumbador  haga sonido y al volver a presionar el botón se apaga el led y el zumbador deja de hacer sonido.


Graba el proyecto como union

Usando un buzzer con Arduino



De lo que hablaremos será de los buzzer o también conocidos como zumbador, el cual es un transductor electro acústico que produce un sonido o zumbido continuo o intermitente de un mismo tono, es usado como mecanismo de señalización o aviso, y son utilizados en múltiples sistemas como en autos (sonido que producen los coches al poner la marcha atrás) o en electrodomésticos. Este consta de dos componentes, un electroimán y una lámina metálica de acero.

Ya definido esto veremos los pines del buzzer.

Antes de ir al circuito necesitaremos una resistencia de 100 ohms y el buzzer. Una vez obtenidos los materiales pasaremos al circuito. Aclaración, se puede realizar la misma conexión, sin utilizar una resistencia, ya que el zumbador no lo requiere.


Ahora veamos el código:

1.  int buzzer = 4; // define la variable buzzer para el zumbador
2.  void setup()
3.  {
4.       pinMode(buzzer, OUTPUT);   // define el buzzer como pin de salida (output)
5.  }
6.   
7.  void loop()
8.  {
9.       analogWrite(buzzer,128); //emite sonido
10.      delay(500); //espera medio segundo
11.      digitalWrite(buzzer, LOW); //deja de emitir
12.      delay(500);//espera medio segundo
13. }

Graba el proyecto como zumbador