En este tutorial veremos como crear un dispositivo de control de luces por comandos de voz, con un módulo de geeetech, diseñado para tal fin. Veremos como armar, este dispositivo en un pcb fabricado por PCBWay. Analizaremos los comandos hexadecimales, para su configuración, y el código fuente. Finalmente vamos a probar su funcionamiento.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagramas
Componentes electrónicos
Arduino Nano
El Arduino Nano es una placa pequeña, completa y compatible con la placa de pruebas basada en el ATmega328 (Arduino Nano 3.x). Tiene más o menos la misma funcionalidad del Arduino Duemilanove, pero en un paquete diferente. Solo carece de un conector de alimentación de CC y funciona con un cable USB Mini-B en lugar de uno estándar.
Microcontrolador | ATmega328 |
Arquitectura | AVR |
Tensión de funcionamiento | 5 V |
Memoria flash | 32 KB de los cuales 2 KB utiliza el gestor de arranque |
SRAM | 2 KB |
Velocidad de reloj | 16 MHz |
Pines analógicos IN | 8 |
EEPROM | 1 KB |
Corriente CC por pines de E / S | 40 mA (pines de E / S) |
Voltaje de entrada | 7-12 V |
Pines de E / S digitales | 22 (6 de los cuales son PWM) |
Salida PWM | 6 |
El consumo de energía | 19 mA |
Tamaño de PCB | 18 x 45 mm |
Peso | 7 g |
Diagrama de pines
Módulo de reconocimiento de voz
Comando del módulo de reconocimiento de voz
- 0x00–>Entra en modo de espera de algún comando
- 0x01 –>Eliminar las instrucciones del grupo 1
- 0x02 –>Eliminar las instrucciones del grupo 2
- 0x03 –>Eliminar las instrucciones del grupo 3
- 0x04–>Eliminar las instrucciones de los 3 grupos
- 0x11–>Comienza a grabar instrucciones del grupo 1
- 0x12–>Comienza a grabar instrucciones del grupo 2
- 0x13–>Comienza a grabar instrucciones del grupo 3
- 0x21–>Importar grupo 1 para la utilización de los comandos de voz
- 0x22–>Importar grupo 2 para la utilización de los comandos de voz
- 0x23–>Importar grupo 3 para la utilización de los comandos de voz
- 0x24–>Consulta los grupos grabados
- 0x31–>Cambia la velocidad a 2400 bps
- 0x32–>Cambia la velocidad a 4800 bps
- 0x33–>Cambia la velocidad a 9600 bps
- 0x34–>Cambia la velocidad a 19200 bps
- 0x35–>Cambia la velocidad a 38400bps
- 0x36–>Cambia a modo común
- 0x37–>Cambia a modo compacto
- 0xbb–>Información de la versión del módulo
Parámetros
- Voltaje: 4.5-5.5V
- Corriente: <40mA
- Interfaz digital: 5V TTL
- Interfaz análoga: conector del micrófono mono-canal de 3.5mm + interfaz pin del micrófono
- Tamaño: 30m mx 47.5m m
KIT
Este kit está compuesto de un módulo de reconocimiento de voz, un módulo usb serial, cables y un micrófono.
Pines macho
Ocho Pulsadores
Pines Hembra
Cables dupont hembra macho
Micrófono Electret
Módulo relay de 8 canales
Características
Permite controlar el encendido/apagado de equipos de alta potencia (electrodomésticos). Funciona perfectamente con Arduino, Pic o cualquier otro sistema digital.
Dentro de la gran variedad de proyectos que podemos realizar con Arduino, podemos llegar a desear controlar componentes de alto voltaje o alto amperaje, como bombillas o bombas de agua, los cuales no pueden ser manejados directamente con Arduino. En estos casos es necesario utilizar Relays o Reles, estos dispositivos permiten controlar cargas de alto voltaje con una señal pequeña.
El modulo posee 8 Relays de alta calidad, capaces de manejar cargas de hasta 250V/10A. Cada canal posee aislamiento eléctrico por medio de un optoacoplador y un led indicador de estado. Su diseño facilita el trabajo con Arduino, al igual que con muchos otros sistemas como Raspberry Pi, ESP8266 (NodeMCU y Wemos), Teensy y Pic. Este modulo Relay activa la salida normalmente abierta (NO: Normally Open) al recibir un “0” lógico (0 Voltios) y desactiva la salida con un “1” lógico (5 voltios). Para la programación de Arduino y Relays se recomienda el uso de timers con la función “millis()” y de esa forma no utilizar la función “delay” que impide que el sistema continue trabajando mientras se activa/desactiva un relay.
Entre las cargas que se pueden manejar tenemos: bombillas de luz, luminarias, motores AC (220V), motores DC, solenoides, electroválvulas, calentadores de agua y una gran variedad de actuadores más. Se recomienda realizar y verificar las conexiones antes de alimentar el circuito, también es una buena práctica proteger el circuito dentro de un case.
Datos técnicos
8 canales independientes
8 Relevadores (Relays) de 1 polo 2 tiros
El voltaje de la bobina del relé es de 5 VDC
Led indicador para cada canal (enciende cuando la bobina del relé esta activa)
Activado mediante corriente: el circuito de control debe proveer una corriente de 15 a 20 mA
Puede controlado directamente por circuito lógicos
Terminales de conexión de tornillo (clemas)
Terminales de entrada de señal lógica con headers macho de 0.1″.
Puede controlado directamente por circuito lógicos
Alimentación y consumo
La forma mas sencilla de alimentar este módulo es desde Vcc y GND de la placa Arduino, manteniendo el Jumper en su lugar, con lo que JD-Vcc = Vcc. Esta conexión tiene dos limitaciones importantes:
Se pierde la aislación eléctrica que brindan los optoacopladores, lo que aumenta la posibilidad de daño al Arduino si hay algún problema con las cargas de los relés.
La corriente consumida por las bobinas de los relés debe ser provista por la placa Arduino. Cada bobina consume unos 90 mA y las cuatro juntas suman 360 mA. Si a esto le sumamos los consumos que pueden tener otras salidas, estamos muy cerca de los 500 mA que puede suministrar un puerto USB. En este caso se debería alimentar al Arduino con una fuente externa, lo que aumenta el limite de corriente a 1 A (en el caso de la Arduino UNO).
La forma mas segura es remover el jumper y alimentar la placa de relés con dos fuentes: la de la placa Arduino conectada a Vcc y una segunda fuente, con el positivo a JD-Vcc y el negativo a GND, sin estar éste unido a la placa Arduino. Esta conexión tiene como ventajas:
Hay completa aislación entre la carga y el Arduino.
Todo el consumo de los relés es tomado de la segunda fuente y no del Arduino o el puerto USB.
Entradas
Las entradas a la placa pueden conectarse directamente a las salidas digitales de la placa Arduino. La única precaución a tener en cuenta es que cuando Arduino arranca al ser alimentado, los pines se configuran como entradas automáticamente y puede ocurrir que, por un brevísimo lapso de tiempo entre el arranque y la correcta configuración de estos pines como salidas, las entradas de control al módulo de relé queden en un estado indeterminado. Esto se puede evitar conectando en cada entrada un pull-up con una resistencia de 10K a Vcc, lo que asegura un estado ALTO durante el arranque.
PCB
Descargar PCB –> control de luces de 8 canales por bluetooth
Circuito
Código fuente
La velocidad del puerto serial está seteada a 9600bps, es esta la velocidad a la cual viene configurado el módulo de reconocimiento de voz.
Con
Serial.write(0xAA);
Serial.write(0x37);
Enviamos el comando serial AA 37 y cambiamos el módulo al modo compacto.
Con
Serial.write(0xAA);
Serial.write(0x21);
Enviamos el comando AA 21 y elegimos el grupo para trabajar en el módulo, recuerden que hay 3 grupos de 5 comandos de voz pero sólo se puede trabajar un grupo a la vez.
color(255,102,0); llamamos a la función color y le pasamos 3 parámetros que serán utilizados para dar la el voltaje a los 3 pines pwm conectados al les pwm.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
int led3 = 3; int led4 = 4; int led5 = 5; int led6 = 6; int led7 = 7; int led8 = 8; int led9 = 9; int led10 = 10; int led3estado = 0; int led4estado = 0; int led5estado = 0; int led6estado = 0; int led7estado = 0; int led8estado = 0; int led9estado = 0; int led10estado = 0; byte com = 0; int estadoBoton11 = 0; int estadoBoton12 = 0; int estadoBotonA5 = 0; int estadoBotonA0 = 0; int estadoBotonA1 = 0; int estadoBotonA2 = 0; int estadoBotonA3 = 0; int estadoBotonA4 = 0; int estado11 = 0; int estado12 = 0; int estadoA5 = 0; int estadoA0 = 0; int estadoA1 = 0; int estadoA2 = 0; int estadoA3 = 0; int estadoA4 = 0; //Pulsadores int botonPin11 =11; int botonPin12 =12; int botonPinA5 =A5; int botonPinA0 =A0; int botonPinA1 =A1; int botonPinA2 =A2; int botonPinA3 =A3; int botonPinA4 =A4; void setup() { Serial.begin(9600);//Velocidad a la que trabaja el módulo de reconocmiento de voz pinMode(led3, OUTPUT); // Establece el led3 como una salida pinMode(led4, OUTPUT); // Establece el led4 como una salida pinMode(led5, OUTPUT); // Establece el led5 como una salida pinMode(led6, OUTPUT); // Establece el led6 como una salida pinMode(led7, OUTPUT); // Establece el led6 como una salida pinMode(led8, OUTPUT); // Establece el led6 como una salida pinMode(led9, OUTPUT); // Establece el led6 como una salida pinMode(led10, OUTPUT); // Establece el led2 como una salida digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); digitalWrite(9,HIGH); digitalWrite(10,HIGH); delay(2000); //Pines como entradas para los pulsadores pinMode(botonPin11, INPUT_PULLUP); pinMode(botonPin12, INPUT_PULLUP); pinMode(botonPinA5, INPUT_PULLUP); pinMode(botonPinA0, INPUT_PULLUP); pinMode(botonPinA1, INPUT_PULLUP); pinMode(botonPinA2, INPUT_PULLUP); pinMode(botonPinA3, INPUT_PULLUP); pinMode(botonPinA4, INPUT_PULLUP); //Comando para cambiar al modo compacto Serial.write(0xAA); Serial.write(0x37); delay(1000); // Importa el grupo 1 Serial.write(0xAA); Serial.write(0x21); } void loop() // Correr una y otra vez { estadoBoton11 = digitalRead(botonPin11);//Leemos el pulsador para ver su estado estadoBoton12 = digitalRead(botonPin12);//Leemos el pulsador para ver su estado estadoBotonA5 = digitalRead(botonPinA5);//Leemos el pulsador para ver su estado estadoBotonA0 = digitalRead(botonPinA0);//Leemos el pulsador para ver su estado estadoBotonA1 = digitalRead(botonPinA1);//Leemos el pulsador para ver su estado estadoBotonA2 = digitalRead(botonPinA2);//Leemos el pulsador para ver su estado estadoBotonA3 = digitalRead(botonPinA3);//Leemos el pulsador para ver su estado estadoBotonA4 = digitalRead(botonPinA4);//Leemos el pulsador para ver su estado ///Botón 11 precionado/// if (estadoBoton11 == LOW) { //Leemos el estado del pin 3 led3estado = digitalRead(led3); // Si el led está apagado se cumple esta condición if (led3estado == LOW) { // Y enciende el led 3 digitalWrite(led3, HIGH); } else { // Por el contrario lo apaga digitalWrite(led3, LOW); } delay(350);//Delay antirrebote } ///Botón 12 precionado/// if (estadoBoton12 == LOW) { //Leemos el estado del pin 4 led4estado = digitalRead(led4); // Si el led está apagado se cumple esta condición if (led4estado == LOW) { // Y enciende el led 4 digitalWrite(led4, HIGH); } else { // Por el contrario lo apaga digitalWrite(led4, LOW); } delay(350);//Delay antirrebote } ///Botón A5 precionado/// if (estadoBotonA5 == LOW) { //Leemos el estado del pin 5 led5estado = digitalRead(led5); // Si el led está apagado se cumple esta condición if (led5estado == LOW) { // Y enciende el led 5 digitalWrite(led5, HIGH); } else { // Por el contrario lo apaga digitalWrite(led5, LOW); } delay(350);//Delay antirrebote } ///Botón A0 precionado/// if (estadoBotonA0 == LOW) { //Leemos el estado del pin 6 led6estado = digitalRead(led6); // Si el led está apagado se cumple esta condición if (led6estado == LOW) { // Y enciende el led 6 digitalWrite(led6, HIGH); } else { // Por el contrario lo apaga digitalWrite(led6, LOW); } delay(350);//Delay antirrebote } ///Botón A1 precionado/// if (estadoBotonA1 == LOW) { //Leemos el estado del pin 7 led7estado = digitalRead(led7); // Si el led está apagado se cumple esta condición if (led7estado == LOW) { // Y enciende el led 7 digitalWrite(led7, HIGH); } else { // Por el contrario lo apaga digitalWrite(led7, LOW); } delay(350);//Delay antirrebote } ///Botón A2 precionado/// if (estadoBotonA2 == LOW) { //Leemos el estado del pin 8 led8estado = digitalRead(led8); // Si el led está apagado se cumple esta condición if (led8estado == LOW) { // Y enciende el led 8 digitalWrite(led8, HIGH); } else { // Por el contrario lo apaga digitalWrite(led8, LOW); } delay(350);//Delay antirrebote } ///Botón A3 precionado/// if (estadoBotonA3 == LOW) { //Leemos el estado del pin 9 led9estado = digitalRead(led9); // Si el led está apagado se cumple esta condición if (led9estado == LOW) { // Y enciende el led 9 digitalWrite(led9, HIGH); } else { // Por el contrario lo apaga digitalWrite(led9, LOW); } delay(350);//Delay antirrebote } ///Botón A4 precionado/// if (estadoBotonA4 == LOW) { //Leemos el estado del pin 10 led10estado = digitalRead(led10); // Si el led está apagado se cumple esta condición if (led10estado == LOW) { // Y enciende el led 10 digitalWrite(led10, HIGH); } else { // Por el contrario lo apaga digitalWrite(led10, LOW); } delay(350);//Delay antirrebote } ////Lectura de datos desde módulo de reconocimiento de voz while(Serial.available()) { //Captura los caracteres del puerto serial y se los asigna a la variable "com" com = Serial.read(); //Se compara la variable "com" switch(com)//Estructura de control switch, case { case 0x11://Si el valor es 0x11 led3estado = digitalRead(led3);//Leemos el estado del pin 3 // Si el estado es igual a LOW if (led3estado == LOW) { // Enciende el led digitalWrite(led3, HIGH); } else { // Por el contrario lo apaga digitalWrite(led3, LOW); } break; case 0x12://Si el valor es 0x12 led4estado = digitalRead(led4);//Leemos el estado del pin 4 // Si el estado es igual a LOW if (led4estado == LOW) { // Enciende el led digitalWrite(led4, HIGH); } else { // Por el contrario lo apaga digitalWrite(led4, LOW); } break; case 0x13://Si el valor es 0x13 led5estado = digitalRead(led5);//Leemos el estado del pin 5 // Si el estado es igual a LOW if (led5estado == LOW) { // Enciende el led digitalWrite(led5, HIGH); } else { // Por el contrario lo apaga digitalWrite(led5, LOW); } break; case 0x14://Si el valor es 0x14 led6estado = digitalRead(led6);//Leemos el estado del pin 6 // Si el estado es igual a LOW if (led6estado == LOW) { // Enciende el led digitalWrite(led6, HIGH); } else { // Por el contrario lo apaga digitalWrite(led6, LOW); } break; case 0x15://Si el valor es 0x15 led7estado = digitalRead(led7);//Leemos el estado del pin 7 // Si el estado es igual a LOW if (led7estado == LOW) { // Enciende el led digitalWrite(led7, HIGH); } else { // Por el contrario lo apaga digitalWrite(led7, LOW); } break; } } } |
PROYECTO RECOMENDADO