Translate

domingo, 9 de marzo de 2014

Raspberry Pi y Arduino Ultrasonido por I2C "Segunda Parte"

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:


Prueba de funcionamiento: 


Código Fuente en:  /charlesrct/Tornado-RasberryPi

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)

NOTA: En el Arduino Leonardo, los pines 2 y 3 están internamente conectados con los pines SCL y SDA, por este motivo se utilizan los pines 0, 1, 4 y 5 para el LCD.

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. 

En el próximo tutorial se modifica el programa en Python del Raspberry Pi para recibir y enviar mensajes como maestro en la comunicación I2C y se conecta con el montaje implementado en esta tutorial. 

No hay comentarios.:

Publicar un comentario