Tri-Carevita Obstaculos
Tri-Carevita Obstaculos
Tri-Carevita Obstaculos
2) Diagrama de bloques
3) Diagrama de conexiones
4) Funcionamiento:
El Arduino Genuino Uno fue programado para que junto al puente H L298N podamos
comandar 2 motores para q giren en sentido horario o anti horario dependiendo como se
energizan las borneras del motor A (In1 e In2) o el motor B (In3 e In4)4, los pin ENA y ENB
tiene la finalidad de regular la velocidad de giro de los motores utilizando señales PWN.
Mientas que la distancia del móvil a un objeto sea mayor a 500cm o menor a 0cm enviara
una un mensaje por el puerto serial con el mensaje (---) indicando q el tiempo de espera
entre el móvil y el objeto mas cercado es un muy grande o no hay ningún objeto, de lo
contrario enviara una señal por el puerto serial indicando la distancia al objeto más cercano
en cm y prendera el led q se conecto en el terminal 13, aparte de q avanzar (por la
distribución de componentes y el peso de los mismo la velocidad del motor derecho tiene
un valor superior para compensar este problema).
Cuando la distancia al objeto es mayor 0cm y menor a 35cm el móvil de detendrá enviara
un mensaje q dice “alerta. . . . .” por el puerto serial para indicar q hay un objeto cerca, el
mismo girar para la derecha hasta no encontrar un objeto enfrente del a menos de 35cm y
avanzara hasta encontrar otro objeto en su camino y volverá a repetir este proceso.
5 Lista de componentes
1 Arduino Genuino Uno
1 L298N
1 sensor de ultrasonido HC-SR04
2 motor 6V 120rpm /140 mA
2 Ruedas de diámetro 65mm
Base del Auto, Resistencia de 1K, diodo led rojo 5mm
2 soportes en forma de L para las ruedas
1 soporte para sensor de ultrasonido
plaqueta de masa, 5v y 7,4v
18 tornillos
14 tuercas 8 arandelas
2 pilas de 3.7V y Soporte para 2 pilas
void setup() {
Serial.begin (9600); // inicializa el puerto serial
pinMode (IN1, OUTPUT); // Inicializa el pin 4 como salida digital.
pinMode (IN2, OUTPUT); // Inicializa el pin 5 como salida digital.
pinMode (ENA, OUTPUT); // Inicializa el pin 6 como salida digital.
pinMode (IN3, OUTPUT); // Inicializa el pin 7 como salida digital.
pinMode (IN4, OUTPUT); // Inicializa el pin 8 como salida digital.
pinMode (ENB, OUTPUT); // Inicializa el pin 9 como salida digital.
pinMode (ECHO, INPUT); // Inicializa el pin 11 como entrada (ECHO)
pinMode (TRIG, OUTPUT); // Inicializa el pin 12 como salida (TRIGER)
pinMode(13, OUTPUT); // Inicializa el pin 13 como salida
}
void loop() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH); // genera el pulso de TRIGER por 10ms
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duracion = pulseIn(ECHO, HIGH); //Lectura del sensor
distancia = (duracion/2) / 29; //Formula para calcular distancia en centímetros
if (distancia >= 500 || distancia <= 0){ // Si la distancia es mayor a 500cm o menor a
0cm
Serial.println("---"); // No mide nada
}else{
Serial.print(distancia); // Imprime el valor de la distancia en el monitor serial
Serial.println("cm"); // Imprime al lado de la distancia los centímetros "cm"
digitalWrite(13, 0); // Pin 13 en bajo
delay(400);
}
}
8) Hoja de Datos
Su rendimiento estable, alta precisión y su precio lo hace la mejor opción. Comparado con
otros módulos el HC-SR04 es más barato, sin sacrifica alcance, precisión y calidad.
Este sensor mide la distancia a la que se encuentran los objetos calculando el tiempo que
tarda una señal de ultrasonidos en ir y volver a un objeto.
Características
Voltaje de operación 5 V CD
Compatible con ARDUINO
Corriente en reposo: <2 mA
Ángulo Efectivo: <15 °
Distancia Efectiva: 2 cm - 500 cm
Resolución: 1cm
Compatible con ARDUINO
-Ángulo de detección: 20º. -4
pines (Vcc, Echo, Triger, Gnd.)
Básicamente un L298N consiste en dos puentes-H, uno para la salida A y otro para la salida
B.
MOTOR DE 6V 120/140 mA
PUENTE H L298N
La placa L298N incorpora electrónica que simplifica la conexión al puente H, agrupando las
conexiones en 3 pines accesibles (por cada salida) y eliminando la posibilidad de generar
un cortocircuito.
Dos de estos pines, IN1 e IN2 (IN3 e IN4 para la salida B), controlan el encendido de los
transistores de cada una de las dos ramas, encendiendo el ramal superior o inferior de la
misma.
El tercer pin (IEA/IEB) desactiva simultáneamente todos los transistores del puente-H,
desconectando la carga por completo.
Esquema montaje
La placa de conexión del L298N incorpora una entrada de voltaje, una serie de jumpers
para configurar el módulo, dos salidas A y B, y los pines de entrada que regulan la
velocidad y el sentido de giro.
La entrada de tensión proporciona el voltaje que alimentará a los motores. El rango de
entrada admisible es de 3V a 35V y se suministra mediante los 2 terminales izquierdos de
la clema de conexión entrada.
Si el jumper del regulador está cerrado activaremos el regulador de tensión del L298N, y en
V lógico tendremos una salida de 5V, que podremos usar para lo que queramos, por
ejemplo para alimentar una placa Arduino.
Para ello el módulo incorpora un regulador de voltaje que suministra la tensión necesaria
en Vlógico. Este regulador puede desactivarse quitando el jumper de la placa.
Desactivaremos el regulador cuando la tensión de alimentación sea inferior a 5V o superior
a 15V.
Si el quitamos el jumper desactivaremos el regulador, necesitaremos alimentar la parte
lógica del módulo, así que tendremos que meter una tensión de 5V por la conexión V
lógico para que el módulo funcione.
Por tanto: Si el regulador está activado (jumper cerrado) Vlógico es una salida de 5V que
podemos emplear para alimentar otros dispositivos.
No debemos introducir corriente en Vlógico con el regulador activado (jumper conectado) o
podemos dañar el módulo.
Por otro lado, tenemos las dos clemas de conexión A y B que suministran la salida a los
motores.
Por último, tenemos los pines de entrada que controlan la dirección y velocidad de giro.
Los pines IEA, IN1 e IN2 controlan la salida A.
Los pines IEB, IN3 e IN4 controlan la salida B.
Los pines IN1, IN2, y IN3 e IN4, controlan la dirección de giro, respectivamente, de la salida
A y B.
Los pines IEA y IEB desactivan la salida. Podemos conectarlos permanentemente mediante
el uso de un jumper, o conectar una señal PWM para controlar la velocidad de giro.
En el caso de querer usar ambas fases, y poder elegir tanto el sentido de giro como la
velocidad, y alimentar desde una fuente de 12V .
Datos y pinout del Arduino uno rev 3
Ampliar pines del Arduino
El proyecto Arduino, de origen italiano, pertenece a un movimiento denominado hardware de código
abierto (open source hardware), en el cual sus participantes plantean que así como existe el
software libre, el cual es compartido a nivel de código fuente para poder ser modificado, deberían
existir también plataformas de hardware con la misma filosofía, donde se comparten los detalles de
los diagramas de circuito para que los usuarios puedan introducir sus propias modificaciones.
Por tanto, la plataforma Arduino es un proyecto tanto de software libre como de Hardware abierto,
donde los autores hacen de conocimiento público todos los detalles de su implementación,
ayudándose asimismo de otros proyectos de software libre para su creación. Puede encontrarse
toda la información pertinente a la plataforma, así como descargar el software de desarrollo en el
sitio web: http://www.arduino.cc
El Arduino consta de una tarjeta de circuito relativamente pequeña, que incluye todos los
componentes básicos que requiere el microcontrolador, así como de una interface USB que le
permite conectarse a una PC para poder descargar los programas y proveer suministro eléctrico.
Asimismo, la plaqueta cuenta con la opción de alimentarse mediante un Jack de 5mm, al cual puede
conectarse un transformador de pared que tenga una salida de tensión entre 7 y 12V DC.El Arduino
cuenta con un total de 14 pines (numerados del 0 al 13) con capacidad de entrada y salida digital,
así como de 6 pines (numerados del A0 al A5) con capacidad de entrada analógica y también de
entrada y salida digital.
Adicionalmente, 6 de los pines digitales (denotados con un símbolo ~) permiten realizar salida
analógica por medio de modulación de ancho de pulso (también conocida como PWM), mientras
que 2 pines (denominados como TX y RX) permiten la comunicación serial mediante el puerto USB
o bien hacia un dispositivo externo.
Aparte de los pines de entradas y salidas, la plaqueta cuenta con varios pines que permiten
compartir su fuente de suministro hacia circuitos externos. Es así, que cuenta con un total de 3
conexiones de tierra (de las cuales al menos una debe ser conectada a la tierra del circuito externo),
una salida de 5V y una salida de 3.3V.
Finalmente, existen 3 pines adicionales que son: AREF (Referencia analógica), Vin (voltaje de
entrada sin regular), y RESET (reinicio), cuya función no es fundamental para la operación del
Arduino y que por tanto no se verán en esta guía introductoria.
Configuración: para conservar la configuración de los puertos después de cada reinicio (por corte
de suministro eléctrico o al desconectar y volver a conectar físicamente el cable USB), el chip
ATMEGA (el corazón de Arduino) contiene una pequeña memoria EEPROM.
Recursos: hay que tener presente los limitados recursos del procesador, con apenas 1KB de
SRAM, 16KB de espacio para el programa y 16MHz de velocidad de proceso.
Ahora veremos una presentación que explicara el hardware, sus especificaciones, pines o
terminales, botones y Microcontroladores. Los diferentes KITS o modelos .
INTRODUCCION A LA ELECTRONICA
LED (diodo emisor de luz): Es un diodo con la particularidad de que emite luz al circular la corriente
(y sólo emite cuando está polarizado correctamente). Los hay de distintos tipos
de luz, tonalidad y potencia, utilizándose como indicadores los más pequeños, y
para iluminación los de mayor potencia.
Para aumentar la ganancia se suelen conectar transistores en cascada, de modo que la salida de
uno sea la entrada de otro.
Por ejemplo para alguna aplicación determinada necesito alimentar un micro controlador con cinco
volt, para estos casos es útil incluir en el circuito un regulador de voltaje que garantice que nunca le
va a llegar mas de cinco volt al micro controlador, toda la tensión excedente suministrada por la
fuente sera absorbida por el regulador y disipada como calor, es muy importante también usar un
disipador de calor acorde al regulador que estemos utilizando..
1 – Tensión de entrada
2 – Masa
3 – Tensión de salida
Acá les dejo el diagrama de conexión de los componentes para su correcto funcionamiento, el
gráfico fue tomado directamente de la hoja de datos del fabricante, así que tenemos la certeza que
funciona correctamente.
Es importante que el capacitor de la rama de entrada sea por lo menos 3 veces mas grande que el
de la rama de salida.
Es importante respetar la configuración de la imagen anterior, así como también las proporciones de
los capacitores en la rama de entrada y en la rama de salida, para evitar dañar el circuito.
Los divisores de tensión son un circuito muy sencillo y que conviene que sea parte de vuestro
arsenal electrónico. Resuelven cantidad de problemas con una resistencia y un potenciómetro y son
ideales para tratar señales, que por exceso de tensión, quedarían fuera del alcance de tu Arduino.
De hecho en esta práctica vamos a montar un divisor de tensión con una resistencia y un LDR y
leeremos la caída de tensión en él. Nos va a servir como ejemplo de los divisores de tensión y
además nos servirá como señal de control para calcular la frecuencia a la que haremos vibrar el
buzzer.
Fíjate que el LDR R1, junto con R2 10KOHM forma un divisor de tensión. La lectura de A0
dependerá de la luz que incida en el LDR.
Circuito integrado (CI, IC, chip): es una pastilla pequeña de material semiconductor, de algunos
milímetros cuadrados de área, y que está protegida dentro de un encapsulado de plástico o
cerámica. Dentro de esa pastilla se combinan gran cantidad de componentes conectados entre sí.
Del circuito interno parten conductores que asoman al exterior en forma de terminales para hacer
las conexiones externas (alimentación, conexión a otros componentes o circuitos integrados).
El Atmega328 AVR 8-bit es un Circuito integrado de alto rendimiento que está basado un
microcontrolador RISC, combinando 32 KB ISP flash una memoria con la capacidad de leer-
mientras-escribe, 1 KB de memoria EEPROM, 2 KB de SRAM, 23 líneas de E/S de propósito
general, 32 registros de proceso general, tres temporizadores flexibles/contadores con modo de
comparación, interrupciones internas y externas, programador de modo USART, una interfaz serial
orientada a byte de 2 cables, SPI puerto serial, 6-canales 10-bit Conversor A/D (canales en TQFP y
QFN/MLF packages), "watchdog timer" programable con oscilador interno, y cinco modos de ahorro
de energía seleccionables por software. El dispositivo opera entre 1.8 y 5.5 voltios. Por medio de la
ejecución de poderosas instrucciones en un solo ciclo de reloj, el dispositivo alcanza una respuesta
de 1 MIPS, balanceando consumo de energía y velocidad de proceso .
Motores : Es difícil moverse por nuestro mundo sin tropezarte con motores eléctricos de todos los
tipos y tamaños. Desde los pequeños con los que arrancas el coche cada mañana a los muy
pequeños que mueven tu reproductor de CDs o DVS, al que hace girar el microondas con el que te
calientas el café al levantarte, estamos rodeados de
motores eléctricos.
Hay una relación muy estrecha entre la corriente eléctrica y los campos magnéticos que definen las
ecuaciones de Maxwell (Ya estamos otra vez) y resulta que cuando hacemos circular una corriente
por un conductor que está inmerso en un campo magnético, este se ve sometido a una fuerza
mecánica, que llamamos electromotriz y que podemos usar como principio básico de
funcionamiento de un motor eléctrico .
Desde un punto de vista práctico, si hacemos circular una corriente por un hilo que está entre los
polos de un imán, aparecerá una fuerza mecánica que se opondrá a los cambios de esta corriente e
intentara hacer girar el conductor para compensarlos.La fuerza que aparezca será proporcional a la
intensidad del campo magnético, y a el número de conductores que sean recorridos por la
corriente, (por eso lo que hacemos es arrollar espiras de cobre o devanados alrededor de un
núcleo, para que la fuerza aumente).Todos los motores eléctricos disponen de dos partes básicas:
El estator o parte inmóvil que por regla general incluye o bien imanes potentes fijos o generan un
campo variable mediante corriente alterna .
Claro que a medida que la fuerza electromotriz hace girar una fracción de vuelta el rotor, al final nos
encontraríamos que, llegaríamos a una posición de equilibrio, lo que no nos conviene en absoluto
porque se pararía el giro del motor.Por eso tenemos que complicar un poco más el asunto y
asegurarnos de que disponemos de múltiples grupos de espiras en distintas posiciones, de forma
que cuando un grupo alcance el equilibrio el otro tome el relevo y el motor siga girando.
Fijar se en los bloques negros marcados como + y – (Que llamamos escobillas) que se mantienen
estáticos mientras alimentamos con corriente eléctrica una pareja de espiras con devanados
opuestos. Cuando llegan al punto de equilibrio, desconectan ese juego de espiras y las escobillas
alimentan el siguiente juego de espiras durante una fracción de vuelta… y vuelta a empezar
De ese modo siempre hay un juego de espiras conductoras fuera de la posición de equilibrio que se
ve sometido a la fuerza electromotriz y obliga al motor a girar buscando un equilibrio (Como en el
caso de los imanes) al que nunca le permitimos llegar.En esta imagen izquierda podéis apreciar los
arrollamientos de hilo conductor, para un pequeño motor de corriente continua.
Motores DC : Un motor de corriente continua es un actuador consume una intensidad de corriente
elevada en su arranque, como el Arduino solo ouede suministrar por suus pines 40Ma , es que
necesitamos para poder gobernar un Motor DC O CC necesitaremos otro dispositivo enviarle mayor
corriente a dicho motor para vencer el par del motro en el Arranque . Con una circuiteria extra que
posea un rele, un transistor como el BD135 o TIP 120/12 un puente H (con un integrado seria el
L293D) .
Transisitores .
Una de las formas más simples y habituales de realizar esta adaptación es el empleo de
transistores. Existen dos grandes familias de transistores. Los transistores BJT (bipolar
junction transistor), que fueran los primeros en aparecer, y los transistores FET (field effect
transistor).
En esta entrada aprenderemos a usar transistores BJT para manejar cargas mayores a las
que podemos manejar con las salidas digitales o analógicas Arduino.
El modo activo es el modo empleado para amplificar señales (por ejemplo, para hacer un
amplificador de audio). En esta entrada no emplearemos este modo.
Los modos corte y saturación puede emplearse de forma conjunta para formar un
“interruptor” controlado eléctricamente. Son estos dos modos los que usaremos para
encender y apagar nuestra carga, consiguiendo un efecto similar a emplear un interruptor
físico, con la diferencia de que este “interruptor” estará controlado por una salida de
Arduino.
El estado en que funciona un transistor BJT depende de la corriente que circula por su base.
Por ese motivo se dice que un transistor BJT es un dispositivo controlado por intensidad
(por contra, las válvulas de vacío y los transistores FET son dispositivos controlados por
tensión)
ESQUEMA DE CONEXIÓN
Existe más de un forma de realizar la conexión del transistor. En esta entrada emplearemos
la configuración de emisor común, por ser la más simple para hacer conmutar el transistor.
Existen dos sub familias de transistores BJT, el tipo PNP y el tipo NPN. La diferencia entre
ambos es el tipo de uniones y semiconductores que se ha empleado en su fabricación.
Regla nemotécnica: Podéis usar la palabra “Pincha” (que abreviaremos como “PN”),
imaginando que la flecha es una aguja que pincha o no el interior del transistor. Si la flecha
“Pincha” es PNP. Si “No Pincha” es NPN
Ambos tipos de transistores, PNP y NPN, son similares en funcionamiento (o tienen unas
diferencias realmente leves), pero sí que influye en la ubicación en la que tenemos que
disponer el transistor BJT el montaje.
Regla nemotécnica: El transistor PNP (P) se pone en la parte “Positiva” del circuito. El
transistor NPN (N) se pone en la parte “Negativa” del circuito
La resistencia de la base sirve para regular la intensidad que atraviesa la base del transistor,
y la elección de su valor es crítica para el correcto funcionamiento del circuito. Calcularemos
el valor de esta resistencia a continuación.
No todos los modelos de transistor y todos los encapsulados asignan los mismos terminales
a cada pin. Por tanto, tendréis que consultar el patillaje en el Datasheet del dispositivo antes
de realizar el montaje.
Podéis realizar todos estos cálculos que aparecen en esta sección automáticamente
mediante la Calculadora de transistor BJT como interruptor
Para usar el transistor como conmutador vamos a usar las zonas de corte y saturación del
transistor, por lo que no tenemos que realizar cálculos en la región activa.
Por otro lado, en saturación, el transistor se comporta como un diodo entre colector y emisor
de tensión Vce, y un diodo entre base y emisor de tensión Vbe.
Por ejemplo, supongamos que queremos alimentar una carga de 200mA con una tensión
nominal de 12V, con un determinado transistor de cuyo Datasheet hemos obtenido que
hFe(min) = 100
Vce(sat) = 0.2
Vbe = 0.7
En el ejemplo asumiremos una hFe constante, pero en el mundo real la relación hFe varía
entre un transistor y otro del mismo modelo, debido a diferencias en el proceso fabricación.
Además, tiene dependencia con la temperatura de trabajo y con el punto de trabajo. Por tanto
en los Datasheet del componente observaréis curvas de dependencia de este factor.
Otra forma para asegurar la saturación del transistor es mayorar un poco la corriente de
base. En el ejemplo, Arduino tiene que proporcionar menos de 2 mA al transistor, por lo que
tenemos margen para aumentar un poco la corriente.
Elegiríamos la resistencia normalizada más cercana. En este ejemplo, en el que no
disponemos de más detalles sobre el transistor, una resistencia de base de 1k sería
razonable.
Por último, debemos comprobar que todos los elementos del sistema son capaces de
soportar la intensidad y potencia que los atraviesa (incluidas las resistencias y el propio
transistor)
Existe una gran variedad de transistores BJT que podemos usar en nuestros montajes de
Arduino. En general son componentes muy baratos. Su precio varía en función del modelo y
características, pero un precio habitual es 0.01 – 0.02€.
Entre los muchos modelos disponibles, algunos habituales son N2222, BC547, BC337, BC556
o el TIP41C.
Las cargas inductivas presentan una oposición a variaciones en la corriente que los
atraviesa, para lo cual generan una corriente inducida que se opone a las variaciones de
intensidad. Estas corrientes inducidas pueden dañar el transistor o incluso el pin de Arduino.
El diodo de flyback proporciona un camino de baja resistencia que permite disipar las
corrientes inducidas por las cargas inductivas, protegiendo el resto de dispositivos.
Por tanto, en el caso de cargas inductivas el montaje quedaría de la siguiente forma.
PAR DARLINGTON
Para obtener relaciones de amplificación mayores a las de un BJT podemos usar un par
Darlington, un dispositivo basado en los transistores BJT, ampliamente empleado en
electrónica.
En esencia, un par Darlington es un conjunto formado por dos BJT en un único integrado.
El comportamiento global de un par Darlington es similar a un BJT en el que los hFE se
multiplican, llegando a valores de 5000-20000.
Por contra, la tensión de base se suma por lo que los valores típicos de Vce son en torno a
1.4V.
Entre los muchos modelos disponibles, algunos habituales son el TIP140, el BC317, y el
integrado ULN2003, que dispone de 7 par Darlington en un único integrado.
Los transistores BJT son apropiados para salidas PWM, por lo que pueden ser controlados
con las salidas analógicas (PWM) de Arduino.
El resultado será una onda pulsada entre Vcc y GND, con la misma frecuencia que el PWM.
EJEMPLO DE CÓDIGO
El código a emplear es exactamente el mismo que el que vimos al ver las salidas digitales y
salidas analógicas PWM en Arduino, por lo que os referimos a los ejemplos de estas
entradas.
void setup(): Esta función es la primera que se ejecuta cuando el Arduino da inicio al programa, y
es efectuada una sola vez. Su propósito es llevar a cabo todas las tareas de inicialización (como la
configuración de los pines) antes que inicie el programa principal.
setup() se invoca una sola vez cuando el programa empieza. Se utiliza para inicializar los modos
de trabajo de los pins, o el puerto serie. Debe ser incluido en un programa aunque no haya
declaración que ejecutar. Así mismo se puede utilizar para establecer el estado inicial de las salidas
de la placa.
Declaración de las variables a utilizar por el programa. Configurar e inicializar los pines como
entrada o salida (pinMode) .Configuración de la comunicación en serie. Otras acciones que deban
ejecutarse solo una vez y al comienzo
void loop() :Esta otra función es ejecutada tras terminar la función setup(), y en caso que loop()
termine, esta es re-ejecutada continuamente por el Arduino hasta que se reinicie, se reprograme o
se apague el suministro. Su propósito es llevar a cabo el programa principal mientras el Arduino
permanezca operando.
loop() es la que contiene el programa que se ejecutará cíclicamente (de ahí el término
loop –bucle-).La función bucle (loop) siguiente contiene el código que se ejecutará continuamente
(lectura de entradas, activación de salidas, etc.). Ésta función es el núcleo de todos los programas
de Arduino y la que realiza la mayor parte del trabajo.
Programación en Arduino, comandos, referencias, funciones
void setup()
loop()
//Después de llamar a setup(), la función loop() hace precisamente lo que sugiere su //nombre, se
ejecuta de forma cíclica, lo que posibilita que el programa esté //respondiendo continuamente ante
los eventos que se produzcan en la placa.
void loop()
delay(1000);
función : Una función es un bloque de código que tiene un nombre y un conjunto de instrucciones
que son ejecutadas cuando se llama a la función. Son funciones setup() y loop() de las que ya se ha
hablado. Las funciones de usuario pueden ser escritas para realizar tareas repetitivas y para reducir
el tamaño de un programa.
instrucción;
{} entre llaves
Las llaves sirven para definir el principio y el final de un bloque de instrucciones. Se utilizan para los
bloques de programación
setup(),
type funcion()
instrucciones;
Una llave de apertura “{“ siempre debe ir seguida de una llave de cierre “}”, si no es así el programa
dará errores. El entorno de programación incluye una herramienta para comprobar el total de llaves.
Sólo tienes que hacer click en el punto de inserción de una llave abierta e inmediatamente se marca
el correspondiente cierre del bloque (llave cerrada).
; punto y coma
El punto y coma “;” se utiliza para separar instrucciones en el lenguaje de programación de Arduino.
Variables
Una variable puede ser declarada al inicio del programa antes de la parte de configuración setup(),
a nivel local dentro de las funciones, y, a veces, dentro de un bloque, como para los bucles del tipo
if.. for.., etc. En función del lugar de declaración de la variable así se determinará el ámbito de
aplicación, o la capacidad de ciertas partes de un programa para hacer uso de ella.
Una variable global es aquella que puede ser vista y utilizada por cualquier función y estamento de
un programa. Esta variable se declara al comienzo del programa, antes de setup().
Recordad que al declarar una variable global, está un espacio en memoria permanente en la zona
de static data y el abuso de variables globales supone un uso ineficiente de la memoria.
Una variable local es aquella que se define dentro de una función o como parte de un bucle. Sólo
es visible y sólo puede utilizarse dentro de la función en la que se declaró. Por lo tanto, es posible
tener dos o más variables del mismo nombre en diferentes partes del mismo programa que pueden
contener valores diferentes, pero no es una práctica aconsejable porque complica la lectura de
código.
En el reference de Arduino hay una muy buena explicación del ámbito de las variables:
http://arduino.cc/en/Reference/Scope
El modificador de variable static, es utilizado para crear variables que solo son visibles dentro de
una función, sin embargo, al contrario que las variables locales que se crean y destruyen cada vez
que se llama a la función, las variables estáticas mantienen sus valores entre las llamadas a las
funciones.
Además de usar este tipo de datos que son los que aparecen en el reference de Arduino
(https://www.arduino.cc/en/Reference/HomePage), es posible usar cualquier tipo de variable de C++
estándar con las limitaciones propias de cada micorcontrolador.
Nota: Es muy común que la omisión del “;” al final de una instrucción genere errores de compilación
que no siempre son tan fáciles de detectar. El texto de error puede ser obvio, y se referirá a la falta
de un punto y coma, o puede que no. Si se produce un error raro y de difícil detección lo primero
que debemos hacer es comprobar que los puntos y comas están colocados al final de las
instrucciones.
/*… */ bloque de comentarios
// línea de comentarios
Una línea de comentario empieza con // y terminan con la siguiente línea de código. Al igual que los
comentarios de bloque, los de línea son ignoradas por el programa y no ocupan espacio en la
memoria. Una línea de comentario se utiliza a menudo después de una instrucción, para
proporcionar más información acerca de lo que hace ésta o para recordarla más adelante.
Programar un microcontrolador con arduino es bastante simple, esta pensado para simplificar las
tareas mas complejas mediante librerías disponibles para el uso, utiliza un lenguaje de
programación que esta basado en C y C++, su sintaxis es muy similar.
La estructura de todo programa de arduino como dijimos antes cuenta con dos subrutinas
elementales denominadas void setup() y void loop(), en ellas se encierran bloques de código donde
se hacen declaraciones e instrucciones lógicas.
void setup() {
}
void loop() {
Funcion setup()
Se invoca una sola vez al comienzo del programa, en ella se setea el funcionamiento de los pines,
si serán de entrada o salida y que pines se utilizaran en el proyecto y muchas mas cuestiones.
void setup() {
pinMode(ledPin, OUTPUT);
Funcion loop()
Luego de ser invocada la función setup() se ejecuta la función loop(), en forma cíclica conteniendo
toda la lógica del programa en ejecución, todo las acciones deben ser programadas dentro de esta
función.
Por ejemplo el código que mostramos debajo pone un pin en uno durante un segundo, luego lo
pone en cero durante otro segundo y se vuelve a repetir infinitas veces, el código forma parte de la
sección de ejemplos del compilador de arduino
void loop() {
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
Como todo lenguaje de programación, existen saltos condicionales que se pueden utilizar según
sea el objetivo que se necesita cumplir, no es el objetivo de este articulo comentar para que sirve
cada uno, asumimos que el lector tiene un grado de conocimientos mínimos de lenguajes de
programación. Al igual que en C o C++ tenemos disponibles para nuestro uso los siguientes saltos
condicionales o controles de flujo.
If/Else
For
While
Do While
Cambien existen otros saltos condicionales conocidos como interrupciones, pueden ser
interrupciones externas debido al suceso de algún evento externo, esto es muy común y utilizado en
rebotica.
Funciones básicas arduino : Arduino cuenta con una infinidad de librerías y funciones disponibles
para nuestro uso, pero hay que conocer algunas que no podemos pasar por alto y necesitamos
conocer como punta pie inicial en este maravilloso mundo.
Función delay()
Es una función destinada a generar retardos, solo sirve para eso, en el ejemplo anterior la
utilizamos para conseguir un retardo de un segundo hasta producir el nuevo evento.
Esta función es muy útil pero no es recomendable utilizarla en algunas situaciones, si el proyecto
que estamos encarando tiene un complejidad elevada o manejamos interrupciones en nuestro
programa, yo recomiendo no utilizar, esta función al ser utilizada mueve unos registros internos del
microprocesador que son comunes a otras funcionalidades del programa, lo que puede ocurrir es
que esperemos que se comporte de una manera y haga algo totalmente diferente.
Estas dos funciones se utilizan para interactuar con los pines del arduino, una es para leer un pin y
la otra es para setearle algún valor al pin.
La función digitalWirite cuenta con dos argumentos, el primero es a que pin va destinado el evento y
el segundo es el valor que ese pin va a recibir.
La función digitalRead tan solo tiene un argumento, en el ponemos el numero del pin que queremos
leer. Como pueden ver es una función simple pero de las mas básicas y utilizadas al programar con
arduino.
int valor;
void setup() {
void loop() {
digitalWrite(13, 1);
valor = digitalRead(12);
La respuesta a los problemas de conexiones para evitar que un Arduino se queme es lo que
denominamos resistencia de pull up y resistencia de pull down.
Siempre que conectemos un pulsador a un pin tenemos que hacerlo de esta manera, es la forma
correcta de hacerlo y así nos evitamos muchos dolores de cabeza.
Que valor de resistencia poner : Bueno, solo falta entender cual es el valor de la resistencia que
tenemos que colocar como Pull Up o Pull Down, esto va a depender de la corriente máxima que el
pin pueda soportar, los pines digitales de arduino soportan una corriente máxima de hasta 40mA,
pero cuanto menor sea la corriente que le hagamos circular menos calor generaremos y mas tiempo
nos durara nuestro arduino, basándonos en la ley de Ohm yo elegí una resistencia que en función
de la tensión de entrada me garantice una corriente de no mas de 1mA, pero podemos elegir otra
mas pequeña para permitir que circule mas corriente, queda a criterio del diseñador, pero desde mi
punto de vista lo optimo es una resistencia de 4K7 como la que colocamos.
Es un ejemplo básico de leer el estado de un pin y mostrarlo en pantalla, útil para resumir todo lo
que estuvimos viendo.
int value = 0;
void setup() {
Serial.begin(9600);
pinMode(inputPin, INPUT);
void loop(){
if (value == HIGH) {
Serial.println("Encendido");
else {
Serial.println("Apagado");
delay(1000);
Pero lo importante de todo esto es que ya identificamos el estado del pulsador, en el ejemplo yo
solo lo muestro en pantalla pero podríamos realizar cualquier otra acción como encender un Led,
prender un motor etc.
A tener en cuenta : siempre utilizar resistencias de pull up o pull down en la entrada de un pin.Tener
presente la corriente máxima que el pin puede soportar para de esta manera decidir que resistencia
colocar.
Una señal eléctrica analógica es aquella en la que los valores de la tensión o voltaje varían
constantemente y pueden tomar cualquier valor. En el caso de la corriente alterna, la señal
analógica incrementa su valor con signo eléctrico positivo (+) durante medio ciclo y disminuye a
continuación con signo eléctrico negativo (–) en el medio ciclo siguiente.
Un sistema de control (como un microcontrolador) no tiene capacidad alguna para trabajar con
señales analógicas, de modo que necesita convertir las señales analógicas en señales digitales
para poder trabajar con ellas.
Valores. Que valor en voltios define 0 y 1. En nuestro caso es tecnología TTL (0 – 5V)
Resolución analógica: nº de bits que usamos para representar con una notación digital una señal
analógica:
http://arduino.cc/en/Reference/AnalogReadResolution
http://arduino.cc/en/Reference/AnalogWriteResolution
Arduino Uno tiene una resolución de 10 bits, es decir, unos valores entre 0 y 1023.
En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:
analogWrite() – escribe un valor analógico (onda PWM) al pin especificado. No en todos los pines
digitales se puede aplicar PWM. http://arduino.cc/en/Reference/AnalogWrite
Como hemos dicho Arduino Uno tiene entradas analógicas que gracias a los conversores analógico
digital puede entender ese valor el microcontrolador, pero no tiene salidas analógicas puras y para
solucionar esto, usa la técnica de PWM.
Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines
digitales. Arduino Uno no posee salidas analógicas puras, sin embargo el Arduino Due sí tiene
salidas analógicas puras mediante dos DAC. El arduino due, posee dos salidas analógicas puras
mediante dos conversores digital a analógico. Estos pines pueden usarse para crear salidas de
audio usando la librería correspondiente.
analogWrite() – escribe un valor analógico (onda PWM) al pin especificado. No en todos los pines
digitales se puede aplicar PWM. http://arduino.cc/en/Reference/AnalogWrite
La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width
modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de
trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir
información a través de un canal de comunicaciones o para controlar la cantidad de energía que se
envía a una carga.
El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el
período. duty cycle = (tiempo que la salida está a uno o HIGH)/ (periodo de la función)
Diferentes valores de una señal PWM:
En este ejemplo se ve cómo simular con PWM una onda sinusoidal analógica.
En Arduino la frecuencia de PWM es de 500Hz. Pero es un valor que puede modificarse en caso
que lo necesitemos.
En la actualidad existen muchos circuitos integrados en los que se implementa la modulación PWM,
por ejemplo para lograr circuitos funcionales que puedan controlar fuentes conmutadas, controles
de motores, controles de elementos termoeléctricos, choppers para sensores en ambientes ruidosos
y algunas otras aplicaciones.
Variables
Una variable puede ser declarada al inicio del programa antes de la parte de configuración setup(),
a nivel local dentro de las funciones, y, a veces, dentro de un bloque, como para los bucles del tipo
if.. for.., etc. En función del lugar de declaración de la variable así se determinará el ámbito de
aplicación, o la capacidad de ciertas partes de un programa para hacer uso de ella.
Una variable global es aquella que puede ser vista y utilizada por cualquier función y estamento de
un programa. Esta variable se declara al comienzo del programa, antes de setup().
Recordad que al declarar una variable global, está un espacio en memoria permanente en la zona
de static data y el abuso de variables globales supone un uso ineficiente de la memoria.
Una variable local es aquella que se define dentro de una función o como parte de un bucle. Sólo
es visible y sólo puede utilizarse dentro de la función en la que se declaró. Por lo tanto, es posible
tener dos o más variables del mismo nombre en diferentes partes del mismo programa que pueden
contener valores diferentes, pero no es una práctica aconsejable porque complica la lectura de
código.
En el reference de Arduino hay una muy buena explicación del ámbito de las variables:
http://arduino.cc/en/Reference/Scope
El modificador de variable static, es utilizado para crear variables que solo son visibles dentro de
una función, sin embargo, al contrario que las variables locales que se crean y destruyen cada vez
que se llama a la función, las variables estáticas mantienen sus valores entre las llamadas a las
funciones.
Además de usar este tipo de datos que son los que aparecen en el reference de Arduino
(https://www.arduino.cc/en/Reference/HomePage), es posible usar cualquier tipo de variable de C++
estándar con las limitaciones propias de cada micorcontrolador.
Conecte la tarjeta de circuito del Arduino a su PC mediante el cable USB provisto (no conecte
ningún componente externo aún). Inicie el entorno de desarrollo de Arduino haciendo doble click
sobre el archivo ejecutable llamado arduino.exe. Su docente dará indicaciones de la ubicación del
programa en caso de ser necesario o bien se puede encontrarse toda la información de Arduino ,
así como descargar el software de desarrollo en el sitio web: http://www.arduino.cc
Pero para poder ejecutar los programas de nuestro software debemos instalar el software de
Windows, además instalar o permitir al software de Arduino de acuerdo a la versión que usemos
del mismo y los archivos manejadores del Hardware ( drivers ) para ser reconocido por el sistema
operativo de nuestra Computadora personal .Además debemos instalar o descargar el software
Java para poder ejecutar nuestro programa .
Conectaremos la plaqueta al cable USB provisto y del otro extremo a un puerto USB de nuestra PC,
ahora debemos ir con el mouse al menú Herramientas hacer click y ver si nuestra plaqueta fue
detectada lo cual se veria Placa “Arduino /Genuino Uno “ y verías abajo el puerto de
comunicaciones al cual está conectado usualmente el COM 3 y en algunos casos puede ser el
COM1 .
Si voy a ejecutar un ejemplo de la lista o sea un programa para probar mi plaqueta , podría acudir a
una carpeta llamada Ejemplos en el menú Archivo y si hiciéramos Click con el mouse en
Ejemplos →01.Basics →Blink se abrirá otra pantalla que nos llevara al ejemplo
/* Blink Turns on an LED on for one second, then off for one second, repeatedly.
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
void loop() {
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
Otro ejemplo el Blink1 sería con una explicación de que hace cada instrucción y funcion:
//led programa 1
} //termina la configuración
El programa Blink y otros ejemplos están en el software recién descargado y son usados para
comenzar con el uso del Arduino para los que comienzan a usar Arduino, donde encontraremos
instrucciones que iremos viendo a continuación.
Comenzaremos por aprender el uso de 2 de los botones que hay debajo de la barra de Menu:
Estos botones son necesarios para probar que el programa (sketch) antes de enviar a la plaqueta
Arduino .
PUENTE H L293D :El integrado L293D incluye cuatro circuitos para manejar cargas de potencia
media, en especial pequeños motores y cargas inductivas, con la capacidad de controlar corriente
hasta 600 mA en cada circuito y una tensión entre 4,5 V a 36 V.
El integrado permite formar, entonces, dos puentes H completos, con los que se puede realizar el
manejo de dos motores. En este caso el manejo será bidireccional, con frenado rápido y con
posibilidad de implementar fácilmente el control de velocidad.Las salidas tienen un diseño que
permite el manejo directo de cargas inductivas tales como relés, solenoides, motores de corriente
continua y motores por pasos, ya que incorpora internamente los diodos de protección de
contracorriente para cargas inductivas.
Las entradas son compatibles con niveles de lógica TTL. Para lograr esto, incluso cuando se
manejen motores de voltajes no compatibles con los niveles TTL, el chip tiene patas de alimentación
separadas para la lógica (VCC1, que debe ser de 5V) y para la alimentación de la carga (VCC2, que
puede ser entre 4,5V y 36V).
Las salidas poseen un circuito de manejo en configuración "totem-pole" (término en inglés que se
traduce como "poste de tótem", nombre que, gráficamente, nos remite a un "apilamiento" de
transistores, como las figuras en los famosos totems indígenas).
En esta estructura, unos transistores en configuración Darlington conducen la pata de salida a tierra
y otro par de transistores en conexión seudo Darlington aporta la corriente de alimentación desde
VCC2. Las salidas tienen diodos incorporados en el interior del chip para proteger al circuito de
manejo de potencia de las contracorrientes de una carga inductiva.
Estos circuitos de salida se pueden habilitar en pares por medio de una señal TTL. Los circuitos de
manejo de potencia 1 y 2 se habilitan con la señal 1,2EN y los circuitos 3 y 4 con la señal 3,4EN.
Las entradas de habilitación permiten controlar con facilidad el circuito, lo que facilita la regulación
de velocidad de los motores por medio de una modulación de ancho de pulso. En ese caso, las
señales de habilitación en lugar de ser estáticas se controlarían por medio de pulsos de ancho
variable.
Las salidas actúan cuando su correspondiente señal de habilitación está en alto. En estas
condiciones, las salidas están activas y su nivel varía en relación con las entradas. Cuando la señal
de habilitación del par de circuitos de manejo está en bajo, las salidas están desconectadas y en un
estado de alta impedancia.
Por medio de un control apropiado de las señales de entrada y conectando el motor a sendas
salidas de potencia, cada par de circuito de manejo de potencia conforma un puente H completo,
como se ve en el diagrama de arriba, lado izquierdo.En la tabla de funcionamiento que sigue se
puede observar los niveles TTL que corresponden a cada situación de trabajo:
Ejemplo de circuito en forma de puente H (para control bidireccional del motor) y su tabla de
manejo
Disipador : Las patas centrales de la cápsula del
chip están pensadas para proveer el contacto
térmico con un dispador que permitirá lograr la
potencia máxima en el manejo del integrado. En
la figuras que siguen se observa la distribución de
pines afectados a esta disipación, el área de
cobre que se deja en el circuito impreso por
debajo y a los lados del chip, y el diseño del
disipador que propone el fabricante. La hoja de
datos aporta una curva que permite una variación
de estos tamaños según la potencia a manejar.
Si buscáis el manual del L293D, veréis que aunque el funciona a 5V internamente, puede conmutar
tensiones de hasta 36V para tus motores.
Asegurarte de que no sobrepasas la tensión máxima nominal de tus motores, es problema tuyo, así
que ojo que el chip lo aguanta, pero lo de tu motor es otra historia.
El patillaje del chip es así:veamos que son los diferentes pines del L293D:
El pin 16, Vss, son los 5V con los que alimentamos el chip y el pin 8, Vs, es la tensión con la que
alimentamos el motor.
Los pines del 1 al 7 controlan el primer motor y los pines 9 a 15 controlan el segundo motor.
El pin 1, Enable1, Activa el uso del motor 1. Con un valor HIGH, el motor puede girar dependiendo
del valor de I1 e I2. Si es LOW se para independientemente de los valores del resto de pines
Los pines 2 y 7 son los pines de control para el motor 1, e irán conectados a nuestros Arduino para
controlar el sentido de giro.
Los pines 3 y 6 son la salida a la que se conecta el motor 1, cuya polaridad se invierte en función los
valores de 2 y 7.
Podemos hacer una tabla para mostrar la lógica que sigue el giro del motor en función de los tres
pines:
ENABLE CONTROL PIN 2 CONTROL PIN 7 MOTOR STATUS
Por tanto tenemos que activar el pin enable para que el motor gire y después usamos los pines
Input1 e Input2 con valore opuestos para hacer girar el motor en una dirección o en la contraria.
¿Fácil no? Veamos cómo hacer el montaje con nuestros Arduinos.
1 10 Enable
2 9 Input 1
3 – Motor1 +
PIN L293D PIN ARDUINO DESCRIPCIÓN
6 – Motor1 –
7 8 Input 2
Esquema de protoboard :
Una vez que tenemos claras las conexiones, el diagrama de protoboard del chip L293D a
nuestroArduino será algo así:
Veamos el programa que vamos a usar para controlar este motor. Vamos a usar los 3 pines de la
tabla anterior. Arduino Pin 10 es el enable del Motor 1 y usamos los pines 8 y 9 para controlar el
sentido de giro.
void setup()
pinMode( i, OUTPUT);
void loop()
digitalWrite(I2, LOW);
delay(3000);
delay(1000);
digitalWrite(I2, HIGH);
delay(3000);
El programa no puede ser más sencillo. Activamos el Enable1 para arrancar Motor1, y luego
usamos I1 e I2 con valores invertidos. El motor arranca y lo paramos a los 3 segundos. A la de 1
segundo levantamos de nuevo el Enable1y al intercambiar los valores de I1 e I2 el giro del motor se
inicia y en la dirección contraria.
Características
Voltaje de operación 5 V CD
Resolución: 1cm
#define PIN_TRIG 8
#define PIN_ECO 7
void setup () {
Serial.begin (9600);
void loop(){
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
Serial.println("Fuera de rango");
else{
Serial.print(distancia);
Serial.println("cm");
delay(500);
}
Librería Para facilitar el uso de este sensor descarga librería sensor HC-SR04 .Una vez que
tengamos el sensor conectado, cargamos el siguiente código en nuestro Arduino y comprobamos
que las medidas recogidas son las correctas.
// incluimos la librerias:
#include <Ultrasonic.h>
void setup() {
void loop() {
En la siguiente imagen tenemos un panatallazo del monitor serial cuando está corriendo el
programa de test del sensor HC-SR04. En nuestro caso podemos comprobar como alternamos
medidas más cortas y con otras más largas.
Otra opcional esa futuro incluir ;
El código es muy básico (como has podido ver) y sin duda son muchas las mejoras que se
pueden realizar. Una de las que yo suelo utilizar consiste tomar varias medidas y hacer la
mediana de los valores obtenidos para conseguir un poco más de precisión. Eso lo dejo a tu
elección.
/*Pines a utilizar por Arduino. Puedes modificarlos los pines digitales que desees*/
int Trig = 4;
int Echo = 3;
void setup() {
/*
*/
delay(10);
delay(10);
/*
*/
delay(100);
void loop() {
ultrasonido (Dist);
delay (250);
}
/*Este programa presenta el codigo de un Movil Esquiva Objetos
*/
void setup() {
void loop() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
Else
digitalWrite(IN1,1);
digitalWrite(IN2,0);
digitalWrite(IN3,0);
digitalWrite(IN4,1);
analogWrite(ENA,120);
analogWrite(ENB,120);
delay(1000);
digitalWrite(IN1,0);
digitalWrite(IN2,0);
digitalWrite(IN3,1);
digitalWrite(IN4,0);
analogWrite(ENB,110);
delay(500);
Else
{
Serial.print(distancia); // Imprime el valor de la distancia en el monitor serial
digitalWrite(IN1,0);
digitalWrite(IN2,1);
digitalWrite(IN3,1);
digitalWrite(IN4,0);
analogWrite(ENB,110);
analogWrite(ENA,120);
delay(400);
}
¿Qué es un detector de obstáculos IR?
Los detectores de obstáculo suelen proporcionarse con una placa de medición estándar con el
comparador LM393, que permite obtener la lectura como un valor digital cuando se supera un
cierto umbral, que se regula a través de un potenciómetro ubicado en la placa.
Este tipo de sensores actúan a distancias cortas, típicamente de 5 a 20mm. Además la cantidad de
luz infrarroja recibida depende del color, material, forma y posición del obstáculo, por lo que no
disponen de una precisión suficiente para proporcionar una estimación de la distancia al
obstáculo.
También son útiles en otro tipo de aplicaciones como, por ejemplo, detectar la presencia de un
objeto en una determinada zona, determinar una puerta está abierta o cerrada, o si una máquina ha
alcanzado un cierto punto en su desplazamiento.
Al ser un sensor sencillo también podemos montarlo nosotros mismos. En general no
merece la pena ya que sólo los componentes nos costarían más, sin contar el tiempo
necesario y la calidad que podríamos obtener, por lo que lo normal es que usemos un
modelo comercial.
Esquema eléctrico
Finalmente, conectamos la salida digital del sensor a una entrada digital para leer el estado
del sensor.
3 void setup() {
6 }
7 void loop(){
8 int value = 0;
10 if (value == HIGH) {
11 Serial.println("Detectado obstaculo");
12 }
13 delay(1000);
14 }
15
16
En entradas anteriores hemos visto como usar las salidas digitales y las salidas analógicas
PWM de Arduino para realizar acciones en el mundo.
Sin embargo, las salidas en Arduino están limitadas tanto en tensión como en intensidad. La
tensión máxima que pueden suministrar será la tensión de alimentación (5V o 3,3V en
función del modelo). Por su parte, la intensidad máxima admisible es 40mA, siendo
recomendado un valor inferior a 20mA.
Más allá de encender una pequeña carga o ejecutar unos cuantos programas de ejemplo, lo
cierto es que en el mundo real esto no es suficiente para hacer funcionar la mayoría de
cargas, ni siquiera un pequeño motor DC o un relé.
Este comportamiento es habitual, en general, en todos los autómatas. La función de un
autómata no es proporcionar intensidad suficiente para realizar acciones. Su función es leer
entradas, realizar cálculos, comunicarse con otros autómatas y comandar acciones.
Los módulos HC-05 y HC-06 son módulos de Bluetooth que podemos usar para conectar
comunicar con Arduino por Bluetooth.
Mucha gente puede tener la impresión de que el Bluetooth es una tecnología anticuada, que
se usaba para trasmitir datos entre dispositivos, y que actualmente está en desuso. Nada
más lejos de la realidad.
Esto convierte a la tecnología Bluetooth en uno de los mejores medios para comunicarnos
de forma inalámbrica con Arduino. Por ejemplo, podemos emplearlo para controlar un robot
desde el móvil o Tablet, o recibir mediciones en un ordenador para registrarlas en un
servidor web.
Los dos módulos, HC-05 y HC-06, nos permiten conectar de forma sencilla un Arduino por
Bluetooth. La diferencia entre ambos módulos es que el HC-06 sólo permite recibir
comunicaciones (slave) mientras que el HC-05 puede recibirlas e iniciarlas (master and
server). Por tanto el módulo HC-05 es superior en características técnicas.
La comunicación Bluetooth es similar al uso del puerto serie normal, que vimos en esta
entrada. Por tanto, resulta muy versátil y muy sencillo de usar.
Esquema montaje
Utilizar el módulo de Bluetooth requiere el uso de un puerto serie de nuestra placa Arduino.
Por tanto, mientras usemos el módulo de Bluetooth no podremos usar el puerto serie en las
placas modelo Uno, Mini, y Nano. En el modelo Mega no tiene este problema, ya que
incorpora 4 puertos de serie.
Ejemplos de código
Como hemos dicho, el uso del módulo Bluetooth es idéntico al uso de puerto serie, que
vimos en esta entrada. Por tanto, todos los códigos de uso de puerto serie que vimos en esta
y otras entradas de este blog funcionan igualmente por Bluetooth.
Por ejemplo, el siguiente código envía un número a Arduino por Bluetooth y hace parpadear
el Led integrado en la pláca el número de veces que hemos enviado.
1 const int led = 13;
3 int option;
4 void setup(){
5 Serial.begin(9600);
6 pinMode(led, OUTPUT);
7 }
9 void loop(){
11 if (Serial.available()>0){
12 //leeemos la opcion
16 {
18 option -= '0';
19 for(int i=0;i<option;i++){
20 digitalWrite(led, HIGH);
21 delay(100);
22 digitalWrite(led, LOW);
23 delay(200);
24 }
25 }
26 }
27 }
ROBOT SEGUIDOR DE LUZ
#include <LEANTEC_ControlMotor.h>
ControlMotor control(2,3,7,4,5,6); //
MotorDer1,MotorDer2,MotorIzq1,MotorIzq2,PWM_Derecho,PWM_Izquierdo
#define GANANCIA 6 // Valor de ganancia para que le robot reaccione antes frente a los cambios
de luz
#define P_MUERTO 10 // Valor que tendrá que superar el cambio de luz para que gire el robot
+/- P_MUERTO
#define GIRO_MAX 60 // Máximo giró que realizará el sensor (entre 0 y 100), 100 sería parado
girando sobre su eje
int OFFSET_LDR1 = 0; // Ajusto el punto central del sensor para que los dos estén iguales
int OFFSET_LDR2 = 0; // Ajusto el punto central del sensor para que los dos estén iguales
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int sensores[4]; // Array donde se guardarán los valores
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void leer_sensores();
int calcula_diferencia();
void mostrar_valores();
//------------------------------------------------------------------------------------------
void setup(void){
Serial.begin(9600);
//**************************************************************************************************************//
//------------------------------------------------------------------------------------------
void loop(void)
mostrar_valores(); // Mostramos los valores por si tenemos que comprobar algún dato
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mostrar_valores(){
Serial.print(OFFSET_LDR1);
Serial.print(sensores[LDR1]);
Serial.print(sensores[LDR2]);
Serial.println(calcula_diferencia());
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void leer_sensores(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int calcula_diferencia(){
int valor; // En esta variable almacenamos el valor positivo o negativo del resultado de la función
if((valor > P_MUERTO) || (valor < -P_MUERTO)){// Si el valor cambia por encima de P_MUERTO
el robot cambiará de posición según la diferencia de un sensor a otros
valor *= GANANCIA; // Multiplicamos por el factor de ganancia para que el sensor gire
mas rápido antes un cambio de luz.
if (valor > GIRO_MAX) {valor= GIRO_MAX;} // Comprobamos que el giro a la izquierda no pase
del maximo permitido
}
INICIO
TIMBRE
VENTILADOR DE
TECHO
ARDUINO UNO R3
PLACA ARDUINO
Terminales digitales 0-1 E/S serie - TX/RX (verde oscuro).
Terminales digitales 2-13 (color verde).
Terminales de entrada analógica 0-5 (azul claro).