Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando
-- Tutorial de iniciación a Arduino --
Volver al índice del tutorial
____________________________
49BM.- Teclado 4x4, bus I2C. Pantalla LCD. Sensor de humedad y temperatura. Infrarojo. RadioFrecuencia. Reloj. Lluvia. I2C. INT_Hall. ArduinoI2C-Humo. LDR-PWM. Motores y Bluetooth. Servo RF. RFID.
- Nuestro proyecto va así:
- Teclado 4x4 con módulo I2C.
- Pantalla LCD.
- Sensor de Temperatura y Humedad.
- Infrarojo.
- Radio Frecuencia. Emisor y Receptor.
- Sensor de ultrasonido.
- Sensor de lluvia.
- Módulo I2C con sensores de inclinación, magnetismo y movimiento.
- Sensor de efecto Hall con Interrupción.
- Sensor de Humo con envío de información mediante I2C
- LDR para PWM.
- Bluetooth, motores y Android.
- Servo dirigido desde RF.
- Ahora le pondremos un lector de tarjetas magnéticas RFID.
- Vamos a añadir a nuestro proyecto lector de tarjetas magnéticas en el segundo Arduino.
- Convendría echarle un vistazo al tutorial del Servo:
48.- Módulo Lector inductivo RFID-RC522 RF .
- Al pasar una tarjeta magnética por un lector, indicará si es válida o no.
_______________________
- Teclados y LED.
'A' - 'B' |
Modifica la temperatura máxima para encender el LED13 |
LED13 |
'B' |
Visualiza la Humedad en LCD. |
LED13 |
'C' |
Visualiza la Temperatura en LCD. |
LED13 |
'#' |
Fin de entrada de datos para la opción 'A' |
|
Mando de infrarojo |
Teclas '1' y '2' del mando de infrarojo. |
LED7 |
'D' |
Distancia ultrasonido por Radio Frecuencia en LCD. |
|
PulsadorA
PulsadorB |
|
LED5
LED6
Mover Servo |
'*' |
Visualiza la hora en LCD. |
|
'A' - 'C' |
Modifica la lluvia máxima para encender el LED4 |
LED4 |
'0' |
Visualiza la lluvia en LCD. |
|
|
Sensor de inclinación, el magnético o el de movimiento. (I2C) |
LED12 |
|
Sensor de efecto Hall (Interrupción) |
LED17 (es el terminal A3 funcionando como Digital) |
'1' |
Visualiza humo en LCD. (I2C) |
|
'2' |
Visualiza valor LDR-PWM |
LED10 PWM |
______________________________________________________
- Conexionado.
- Conectamos el lector de tarjeta magnética de esta manera.
- En el módulo localizamos los terminales:
SDA, SCK, MOSI, MISO, GND, RST y 3,3V y los conectamos según la figura.
- Observa que SCK, MOSI y MISO están conectadas al conector ICSP.
- La alimentación es a 3,3V
- En el Arduino utilizamos los terminales 8 y 9.
- [Puedes ver las conexiones con más detalles en el tutorial: 48.- Módulo Lector inductivo RFID-RC522 RF aunque ahí utilicé los terminales 9 y 10 del Arduino]
______________________________________________________
- Comentarios.
1.- Cada tarjeta viene con un código distinto de fábrica. Debemos ir a este tutorial: 48.- Módulo Lector inductivo RFID-RC522 RF
y leer la parte que comenta el ejemplo Dumpinfo. Esto es una aplicación que esté en la carpeta examples de la librería
rfid-master.zip
- Cargamos esta aplicación en nuestro Arduino, conectamos el módulo RFID y pasamos la tarjeta por el módulo.
- En el Monitor Serie, obtendremos una indicación de que ese número de Tarjeta está Autorizada.
- Ese será el número correspondiente a nuestra tarjeta.
- Ese número lo debemos insertar en el código:
String autorizados = "04345334,03021203,34567876,A0460B7F";
- En este código he tomado para cuatro números. Deja como están los otros tres números.
2.- Cuando pasemos la tarjeta en el Monitor Serie nos debe indicar que la tarjeta está autorizada.
3.- Además se deberá encender un LED durante 2 segundos.
4.- Fíjate que el LED está conectado a un pin de entrada Analógica, concretamente A0 (pero va a funcionar como salida digital).
[Esto ya lo vimos en el tutorial de Interrupciones y sensor Hall, tomamo el A3 del primer Arduino para el LED17]
5.- Esos pines "analógicos" también pueden funcionar como digitales, y tienen como números:
A0 = 14
A1 = 15
A2 = 16
A3 = 17
A4 = 18
En nuestro caso solo utilizaremos el A0, es decir el 14, de tal manera que lo declararemos así:
#define PIN_A0 14 // La 14 es la entrada Analógica A0
pinMode(PIN_A0, OUTPUT);
digitalWrite(PIN_A0, HIGH);
delay(2000);
digitalWrite(PIN_A0, LOW);
______________________________________________________
- Código para el Arduino Emisor.
Teclado_LCD_humedad_ir_rfe_BT_RFID.ino |
// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com
#include <VirtualWire.h>
#include <Wire.h>
// Bluetooth
#include <SoftwareSerial.h>
SoftwareSerial I2CBT(2,3);
// El TX del módulo BT va al pin 2 del Arduino
// El RX del módulo BT va al pin 3 del Arduino
// Ultrasonido.
int Trigger = 11;
int Echo = 10;
long microsegundos;
long duracion;
#define pulsadorA 4
#define pulsadorB 5
int valorA, valorB;
char A, B;
int distancia;
String str="";
// Humo
const int pin_humo = A2;
String humo;
String enviar_humo;
// RF
const int pin_de_transmision = 7; // RF
/// Bluetooth
char val;
// Conexiones del Motor A
int enA = 6; //9; // El terminal 9 da problemas en enA y enB
int in1 = 13;
int in2 = 12;
// Conexiones del Motor B
// NO CONECTAR ESTOS TERMINALES
int enB = 6;
int in3 = 0; //5;
int in4 = 1; //4;
///////////////////////
// Tarjeta RFID
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 8 // Arduino Uno
#define RST_PIN 9 // Arduino Uno
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Escribimos los códigos de las tarjetas autorizadas.
// Son 8 caracteres separados por coma, sin espacio. Todos juntos.
int total=4; // Total de tarjetas autorizadas
String autorizados = "04345334,03021203,34567876,A0460B7F";
String UID;
String dosbytes;
#define PIN_A0 14 // La 14 es la entrada Analógica A0
void setup()
{
// Bluetooth interrupcion.
I2CBT.begin(9600);
attachInterrupt(0, int_bluetooth, CHANGE); // 0 es la interrupción 0, es decir el terminal 2
// Inicializa IO y ISR
vw_set_tx_pin(pin_de_transmision);
vw_setup(2000); // Bits por segundo
pinMode(pulsadorA, INPUT);
pinMode(pulsadorB, INPUT);
pinMode(Trigger, OUTPUT);
pinMode(Echo, INPUT);
Serial.begin(9600);
// Bus I2C otro Arduino.
Wire.begin(2); // Este Esclavo es el número 2
Wire.onRequest(requestEvent); // Cuando el Maestro le hace una petición,
// realiza el requestEvent
//// Bluetooth
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
analogWrite(enA, 90);
analogWrite(enB, 90);
// Tarjeta RFID
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
pinMode(PIN_A0, OUTPUT);
}
void loop()
{
bluetooth_comprueba();
ultrasonido();
sensor_humo();
tarjeta_rfid();
delay(20);
valorA = digitalRead(pulsadorA);
valorB = digitalRead(pulsadorB);
// A y B son los valores de los botones.
if (valorA == HIGH) {
A='0';
} else {
A='1';
}
if (valorB == HIGH) {
B='0';
} else {
B='1';
}
// str es el valor de la distancia con 4 caracteres.
// String str="";
str = "0000" + String(distancia); // Pasa el entero a String
str = str.substring(str.length()-4); // Siempre 4 caracteres
char msg[6] = {A, B, str[0], str[1],str[2], str[3]};
vw_send((uint8_t *)msg, 6); // Send: Aquí envía 6 elementos.
// Si está A y B en alto y la distancia en 546, enviará:
// 1 1 0 5 4 6
vw_wait_tx(); // Espera que termine el mensaje
delay(100);
}
/////////////////////////////////////////////
///////////FUNCION ULTRASONIDO //////////////
void ultrasonido(){
digitalWrite(Trigger, LOW);
delayMicroseconds(2);
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);
delayMicroseconds(2);
duracion = pulseIn(Echo, HIGH);
distancia = duracion / 29 / 2;
//Serial.println(String(distancia));
delay(20);
}
/////////////////////////////////////////////
///////////////// HUMO ///////////
void sensor_humo(){
int lee_humo = analogRead(pin_humo);
enviar_humo = "000" + String(map(lee_humo, 100, 500, 0, 10));
//// Funcion enviar datos por I2C al otro Arduino.
// Esto es lo que envía cuando le hace la petición.
}
void requestEvent()
{
// Wire.write(str.substring(str.length()-3).c_str()); // Envía 3 bytes
Wire.write(enviar_humo.substring(enviar_humo.length()-3).c_str()); // Envía 3 bytes
}
/////////////////////////////////////////////
///// Interrupcion Bluetooth
void int_bluetooth() {
val=I2CBT.read();
}
/////////////////////////////////////////////
///// Tarjeta RFID
void tarjeta_rfid() {
UID="";
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) return;
// Código de la tarjeta introducida UID
for (byte i = 0; i < mfrc522.uid.size; i++) {
dosbytes = String(mfrc522.uid.uidByte[i],HEX);
if (dosbytes.length() == 1){dosbytes = "0" + dosbytes; };
UID = UID + dosbytes;
}
Serial.println("UID = " + UID);
Serial.println();
// Consulta si la tarjeta introducida se encuentra en
// el grupo de autorizados.
for(int i = 0; i < total; i++){
Serial.println(autorizados.substring(9*i,9*i+8));
if (UID == autorizados.substring(9*i,9*i+8)){
Serial.println("La tarjeta introducida esta en el grupo de AUTORIZADO");
digitalWrite(PIN_A0, HIGH);
delay(2000);
digitalWrite(PIN_A0, LOW);
}
}
mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
}
|
- bluetooth_comprueba.ino
bluetooth_comprueba.ino |
void bluetooth_comprueba() {
//if( Serial.available() ) {
//val = Serial.read();
// Avanza Motor A
if( val == '1' )
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
}
// Avanza Motor A y B
if( val == '2' )
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
}
// Avanza Motor B
if( val == '3' )
{
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
}
// Parar A
if( val == '4' )
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
// Parar A y B
if( val == '5' )
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// Parar B
if( val == '6' )
{
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// Retrocede A
if( val == '7' )
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
// Retrocede A y B
if( val == '8' )
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
// Retrocede B
if( val == '9' )
{
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
if( val == 'A' )
{
analogWrite(enA, 100);
analogWrite(enB, 100);
}
if( val == 'B' )
{
analogWrite(enA, 110);
analogWrite(enB, 110);
}
if( val == 'C' )
{
analogWrite(enA, 150);
analogWrite(enB, 150);
}
if( val == 'D' )
{
analogWrite(enA, 200);
analogWrite(enB, 200);
}
if( val == 'E' )
{
analogWrite(enA, 250);
analogWrite(enB, 250);
}
//}
}
|
______________________________________________________
- Comentarios.
- El proyecto
______________________________________________________
________________________________
|