En la segunda parte de este tutorial, se configura un Arduino Leonardo, para medir distancia por ultrasonido, mostrar la distancia en un LDC (pantalla de cristal líquido) y la transmisión de datos por I2C, del proyecto que integra Arduino y Pic con Raspberry Pi midiendo y controlado variables físicas a través de WebSockets.
Instrucciones en video:
Código Fuente en: /charlesrct/Tornado-RasberryPi
Instrucciones en video:
Prueba de funcionamiento:
Este código es implementado en un Arduino Leonardo.
En el circuito implementado se utiliza un LCD 16*2, un Arduino Leonardo (configurado como esclavo I2C) y el sensor de ultrasonido HC-SR04.
Clic en la imagen para ampliarla. (Creado en Fritzing)
Descargar circuito: http://fritzing.org/projects/arduino-ultrasonido
En el editor de Arduino digitar el siguiente código:
Primero se importan las librerías encargadas de la comunicación I2C y del LCD.
#include <Wire.h> #include <LiquidCrystal.h>
Se asigna la dirección 0x04 al Arduino para que se comunique con el Raspberry Pi, se configuran los pines "trig" y "echo" para disparar y escuchar el eco del ultrasonido y se define la variable "distance" para almacenar el valor de la distancia en cm.
#define SLAVE_ADDRESS 0x04 int number = 0; //Led que indica la recepcion de un dato. int led = 13; //Pines para ultrasonido. int trig = 7; int echo = 8; //var para guardar la ditancia int distance;
Se configuran los pines del Arduino para controlar el LCD, se configuran los pines como entrada o salida, se inicia el LCD, se inicia el Arduino como esclavo para la comunicación I2C y se definen las interrupciones para recepción y transmisión de datos. (Funciones "reciveData" y "senData").
// initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 1, 0); void setup() { //Conf. pines del sensor ultrasonido pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(led, OUTPUT); // set up the LCD's number of columns and rows: lcd.begin(16, 2); // initialize i2c as slave Wire.begin(SLAVE_ADDRESS); // define callbacks for i2c communication Wire.onReceive(receiveData); Wire.onRequest(sendData); } void loop() { delay(100); sonar(); lcd.setCursor(0, 0); lcd.print("num= "); lcd.print(number); } // callback for received data void receiveData(int byteCount) { while (Wire.available()) { number = Wire.read(); if (number == 1) { digitalWrite(led, HIGH); // set the LED on } else { digitalWrite(led, LOW); // set the LED off } } } // callback for sending data void sendData() { Wire.write(distance); }
Cuando se recibe un dato se muestra en el LCD y cuando se transmite se envía el valor que contiene la variable "distance" para que sea enviado vía WebSockets a las páginas web de los clientes conectados.
La función "sonar()" pone en alto, durante 15 micro segundos, el pin "trig" del sensor HC-SR04 para iniciar la transmisión de los pulsos de ultrasonido. Luego espera que retornen los pulsos mientras miden el tiempo y lo almacenan para multiplicarlo por 0,01657 y obtener la distancia en centímetros. Si el valor es mayor a 500cm se asume que no hay obstáculos o que se encuentra a más de 5m de distancia. La menor distancia medida en la práctica fue de 4cm.
void sonar() { //Disparo de 15uSeg digitalWrite(trig, HIGH); delayMicroseconds(15); digitalWrite(trig, LOW); //medimos el pulso de entrada distance = pulseIn(echo, HIGH); lcd.setCursor(0, 1); distance = distance * 0.01657; //Convertimos el tiempo en distancia cm if (distance < 500) { lcd.print(distance); lcd.print("cm "); } else { lcd.print(" "); } }
Resultados
Clic en las imágenes para ampliarlas.
No hay comentarios.:
Publicar un comentario