domingo, 27 de febrero de 2011

Ejemplo 2: Alarma

.





Veámos otro ejemplo, esta vez una ALARMA. Para ello disponemos de 2 placas Arduino con sus respectivas tarjetas CAN, un sensor magnético para detectar si la puerta/ventana esta abierta y un altavoz.



(click para ampliar)


El Arduino + Altavoz emula la estación BASE, la cual recibe la información del resto de dispostivos de la red con información como temperaturas, estado de luces, estado de puertas/ventanas, ...
El segundo Arduino con el sensor emula uno de los dispositivos que podría haber en cada habitación, el cual podría controlar luces, registrar temperatura, registrar estado puertas/ventanas de la habitación,....

El dispositivo que dispone del sensor de ventana/puerta abierta, manda el mensaje con ID=0x100 y usa el primer byte de los 8 disponibles en un mensaje CAN, para enviar el estado del sensor.
La estación BASE (Arduino con altavoz), monitoriza el bus, saca por puerto serie todos los mensajes leidos y activa la alarma. Para activar la alarma, la ID recibida deber ser 0x100 y en el primer byte (byte 0) se encuentra el estado del sensor ("1"=CERRADO "0"=ABIERTO).

La velocidad del bus es 1 Mbps !!!

El sensor funciona igual que un interruptor, cuando esta enfrentado a la parte magnética está "cerrado" y cuando esta fuera del alcance esta "abierto". Para facilitar el montaje, he usado uno de los pines como salida de alimentación (pin 7=GND), pero podría ir conectado directamente a masa.
Para el pin de entrada del sensor (pin 6), se activa la resistencia de PULL UP que dispone el micro, por lo que cuando esta "abierto" la entrada lee HIGH y cuando esta "cerrado" LOW.
El altavoz va conectado al pin 5 y a masa. 

A continuación se expone el código, que se puede ver lo sencillo que se trata de disponer una red con varios dispositivos gracias al bus CAN con la librería desarrollada:




// ----------------------------------------------
// SECUDUINO
// http://secuduino.blogspot.com/
// By Igor Real
// 26/Feb/2011
// ----------------------------------------------

#include <can.h>

void setup()
{
Serial.begin(115200);
Serial.println("Empezamos...");
CAN.begin(1);

//Pin 7 OUTPUT (Sensor)
pinMode(7,OUTPUT);
digitalWrite(7,LOW);

//Pin 6 INPUT and R pull up ON (Sensor)
pinMode(6,INPUT);
digitalWrite(6,HIGH);


}

void loop()
{


CAN_TxMsg.id=0x200;    //Device with speaker sends ID=200, Device with sensor sends=ID=100
CAN_TxMsg.header.rtr=0;
CAN_TxMsg.header.length=8;
CAN_TxMsg.data[0]=digitalRead(6);
CAN_TxMsg.data[1]=0x00;
CAN_TxMsg.data[2]=0x00;
CAN_TxMsg.data[3]=0x00;
CAN_TxMsg.data[4]=0x00;
CAN_TxMsg.data[5]=0x00;
CAN_TxMsg.data[6]=0x00;
CAN_TxMsg.data[7]=0x00;

CAN.send(&CAN_TxMsg);

if (CAN.CheckNew())
{

CAN.ReadFromDevice(&CAN_RxMsg);

//Print message via Serial Port
Serial.print(CAN_RxMsg.id,HEX);
Serial.print(" => ");
Serial.print(CAN_RxMsg.data[0],HEX);
Serial.print(" - ");
Serial.print(CAN_RxMsg.data[1],HEX);
Serial.print(" - ");
Serial.print(CAN_RxMsg.data[2],HEX);
Serial.print(" - ");
Serial.print(CAN_RxMsg.data[3],HEX);
Serial.print(" - ");
Serial.print(CAN_RxMsg.data[4],HEX);
Serial.print(" - ");
Serial.print(CAN_RxMsg.data[5],HEX);
Serial.print(" - ");
Serial.print(CAN_RxMsg.data[6],HEX);
Serial.print(" - ");
Serial.println(CAN_RxMsg.data[7],HEX);

//Byte 0 => Info from the other board with the sensor status
if (CAN_RxMsg.id=0x100 && CAN_RxMsg.data[0])
{
analogWrite(5,200);
}else
{
analogWrite(5,0);
}
}

delay(400);
}






A continuación, el video funcionado:








No hay comentarios:

Publicar un comentario