Tri-Carevita Obstaculos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 87

TRI-CAR

https://youtu.be/OG5RQnMbqs8 video edubasica


Tu mensaje se ha convertido en unos y
ceros y se ha enviado a través del ether.
TRI-CAR

1) Descripción general de proyecto:

Gracias a la implementación de Arduino, un sensor de distancia junto a 2 motores


pequeños, hemos armado un auto q funciona de manera independiente y el cual evita
chocarse contra obstáculos q se puede encontrar a una cierta distancia del mismo
cambiando la dirección a la q anda.

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.

Mediante el sensor de ultrasonido HC-SR04 comandado por el Arduino Genuino UNO,


emitimos una onda de radio frecuencia q al impactar con los objetos rebota y es recibido
por el mismo sensor, el tiempo que pasa desde que se emite hasta que recibe la onda se
guarda en una variable y al saber a la velocidad de la onda viaja podemos calcular la
distancia y guardarla en otra variable. De esta manera estamos sensando en tiempo real
de la distancia de nuestro móvil al objeto más cercano.

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

Bateria 18650 Caracteristicas

Gerber es un formato de archivo que contiene la información necesaria para la fabricación de la


placa de circuito impreso o PCB. Se pueden crear con distintos programas de diseño electrónico
como PCB Wizard, Eagle, DipTrace, Protel, KiCad o Altium Designer. El estándar más común hoy
en día es el RS-274X,1aunque existen otros menos frecuentes.
El formato de archivo Gerber fue desarrollado por Gerber Systems Corp., fundada por Joseph
Gerber. El formato de archivo Gerber es ahora propiedad de Ucamco a través de la adquisición de
Barco ETS, una compañía que previamente adquiridos Gerber Systems Corp.23 Ucamco lleva a
cabo revisiones de la especificación de tiempo en tiempo.456
La especificación actual de formato de archivo Gerber es la revisión 2015.10 de noviembre de 2015.
Se puede descargar libremente desde la página de descarga Ucamco.7
Hay dos versiones:
https://youtu.be/Z3favHrSwq4 VIDEO INGLES
 Extended Gerber, o RS-274X, la versión actual, en uso común hoy en día.
 Standard Gerber, o RS-274-D, la versión anterior. Está incompleta y obsoleta, es sustituida por
RS-274X.61
 Gerber fue creado por Gerber Systems Corporation, el mayor fabricante de impresoras
utilizadas en este trabajo. El formato se estandarizó en 1980 por la Electronic Industries
Association que recibió una descripción técnica de RS-274-D.
 Es un formato diseñado para el control de las impresoras de transparencias (fotolito). Estas
impresoras (también conocidas como fotoplotter) son de hecho máquinas de control
numérico computarizado (CNC) que se mueven en un plano. Hay una intensa fuente de luz y
un volante de varias posiciones que varía la forma del haz de luz. En cada posición de la
rueda existen formas de aberturas cuadradas, elípticas, circulares, etc., y varios tamaños
para cada una de las formas. La luz modulada con la forma se condensa en el fotolito a
través de lentes.
 El archivo en cuestión está en texto plano con el listado de movimientos de la fuente de luz
abierta o cerrada (códigos G) y utilizando una de las formas / aberturas (códigos D)
disponible, entre muchos otros comandos.
 En 1991, el formato se amplió para incluir los códigos de "apertura", que permite a un
expediente con la descripción de Gerber en un circuito completo e independiente, sin
necesidad de archivos adicionales con información acerca de la forma y el tamaño de cada
apertura, una lista de los agujeros, tolerancias, etc.
6) Planos del prototipo

7) Código con documentación


Copiar el codigo en el notepad o Wordpad de Windows y nombrar al archivo
” tricar.ino”
/*Este programa presenta el código de un Móvil Esquiva Objetos */
int IN1 = 2; // Input1 conectada al pin 2 de Arduino
int IN2 = 4; // Input2 conectada al pin 4 de Arduino
int ENA = 3; // ENA conectada al pin 3 de Arduino
int IN3 = 7; // Input3 conectada al pin 7 de Arduino
int IN4 = 8; // Input4 conectada al pin 8 de Arduino
int ENB = 6; // ENB conectada al pin 6 de Arduino
int ECHO = 11; // ECHO al Arduino pin 11 de Arduino
int TRIG = 12; // TRIG al Arduino pin 12 de Arduino
long duracion, distancia;

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

// Si la distancia esta en el rango de 1 a 10 el móvil retrocederá y girara


if (distancia <= 35 && distancia >= 1)
{
digitalWrite(13, 1); // Pin 13 en alto
Serial.println("Alarma....."); // Imprime la palabra Alarma en el monitor serial
// Código para retroceder
digitalWrite(IN1,1);
digitalWrite(IN2,0);
digitalWrite(IN3,0);
digitalWrite(IN4,1);
analogWrite(ENA,120);
analogWrite(ENB,120);
delay(1000);
// Código para girar
digitalWrite(IN1,0);
digitalWrite(IN2,0);
digitalWrite(IN3,1);
digitalWrite(IN4,0);
analogWrite(ENB,120);
delay(500);
}else{

// Si la distancia se encuentra entre 0 y 500 el móvil avanzara en línea recta


// Código para que el móvil avance en línea recta
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(IN1,0);
digitalWrite(IN2,1);
digitalWrite(IN3,1);
digitalWrite(IN4,0);
analogWrite(ENB,120);
analogWrite(ENA,130);

delay(400);
}
}
8) Hoja de Datos

ARDUINO GENUINO UNO


SENSOR DE ULTRASONIDO HC-SR04

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.

La plataforma Arduino es lo que se conoce como un entrenador de microcontrolador (pequeñas


computadoras contenidas en un solo circuito integrado), para la cual hace uso de herramientas de
software en PC para su programación. De tal forma que la programación del Arduino puede
realizarse en un lenguaje de alto nivel como lo es C++, permitiendo manipular elementos de
hardware externos con relativa facilidad, pues tanto el hardware como el entorno de desarrollo de
software han sido diseñados considerando la facilidad de uso como una prioridad.

La tarea de compilación de programas en Arduino es llevada a cabo mediante una versión


modificada de gcc (el compilador de C usado en GNU/Linux) la cual ha sido adaptada
especialmente para poder generar programas específicamente para el microcontrolador AVR que
posee el Arduino. La invocación de dicho compilador es automática, bastando solamente con hacer
un click para compilar los programas.

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

Plataforma de hardware del Arduino.

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

Resistencia : Es la propiedad de un elemento que hace que se oponga al paso de la corriente.


Todos los materiales ofrecen resistencia al paso de la corriente. En el caso de un conductor ésta es
pequeña, en cambio la que presenta un
aislante es "muy grande". Se fabrican
resistores o resistencias, con el objetivo
de proporcionar diferentes valores
de resistencia a los circuitos que las utilicen. La unidad de medida es el ohm.

Diodo : es un semiconductor de 2 terminales por el que circula la corriente en un solo sentido de


positivo a negativo y en inversa se opone o bloquea el paso de la corriente en el otro sentido .Esto
hace que el diodo tenga dos posibles posiciones: una a favor de la corriente (polarización directa) y
otra en contra de la corriente (polarización inversa).2

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.

Transistor: El transistor es un semiconductor de tres terminales en donde la circulación de la


corriente a través de dos de ellos (colector y emisor) depende de la corriente que pasa por el tercero
(base). Un transistor bipolar está conformado por dos uniones PN enfrentadas,
resultando en los transistores NPN y PNP. Expresado de forma sencilla, la corriente
entre colector y emisor varía en proporción a la corriente que circula por la base,
logrando así que una corriente pequeña controle una corriente más grande. La
proporción entre la corriente ambas corrientes se denomina ganancia. Cuando esta
variación se hace gradual, se aplica, por ejemplo, a circuitos amplificadores, y se habla
de electrónica analógica. En otras circunstancias no se desea una corriente
proporcionada sino que el transistor funcione en saturación, es decir que rápidamente
deje circular, o no, toda la corriente que admite cuando se cumple la condición de tener
una señal en la base. En este caso se comienza a hablar de electrónica digital.

Para aumentar la ganancia se suelen conectar transistores en cascada, de modo que la salida de
uno sea la entrada de otro.

¿QUE ES UN REGULADOR DE VOLTAJE?

Básicamente podemos pensar en un regulador de voltaje como un dispositivo electrónico que se


alimenta de una cantidad de tensión determinada y es capaz de entregar una cantidad menor y
acondicionada para un equipo determinado.

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..

REGULADOR DE VOLTAJE 7805

Es un dispositivo electrónico que tiene la


capacidad de regular voltaje positivo de 5V a 1,5A de
corriente, en la mayoría de los desarrollos con arduino
o con programadores Pic estamos obligados a
garantizar una fuente de tensión constante, eso
disminuye la posibilidad de dañar nuestro circuito debido
a oscilaciones en los niveles de tensión, la forma mas
practica y simple de lograr esto es mediante el
Regulador de voltaje 7805, es un dispositivo con 3 pines.

1 – Tensión de entrada

2 – Masa

3 – Tensión de salida

DIAGRAMA DE CONEXIÓN REGULADOR DE VOLTAJE 7805

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.

Fotoresistor ; Un LDR, cuyas


siglas se originan de su nombre en
inglés light-dependent resistor, es
un componente electrónico cuya
resistencia disminuye con el
aumento de intensidad de luz
incidente y viceversa, que también
es comúnmente conocido como
fotorresistor. El valor de resistencia
eléctrica de un LDR es bajo cuando
hay luz incidiendo en él (del orden
de 50-100Ω) y muy alto cuando
está a oscuras (1 MΩ
aproximadamente).

Vamos a ser capaces de controlar el brillo de un LED dependiendo de


la cantidad de luz que incide sobre el LDR, es decir, cuando la luz sea
máxima el LED permanece apagado, y a medida que la luz ambiente
vaya disminuyendo, el LED irá brillando con mayor intensidad, hasta
que en ausencia de luz el brillo del LED sea máximo.Hay que tener en
cuenta que debemos de ajustar el valor máximo que el LDR nos va a
ofrecer en su salida (conectada al pin analógico A0) cada vez que
ejecutamos el programa, puesto que es directamente proporcional a la
cantidad de luz máxima que hay en la habitación donde se encuentre y
esta no es la misma en todos los casos. Para ello, a través del monitor
serie del IDE de Arduino, vamos a poder comprobar en cada momento
el valor que tiene la salida del LDR y así poder ajustar sus valores
propios (máximo y mínimo) mediante programación. Siempre
pondremos un valor por debajo del valor máximo que el LDR nos ofrece en su salida.
El valor mínimo que el LDR ofrece en su salida, que se obtiene tapando la célula del LDR y este
valor solo es necesario ajustarlo una vez para cada LDR diferente que vayamos a utilizar, puesto
que ninguno es igual a otro al 100%.

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 555 es un circuito integrado pequeño y de muchas aplicaciones. Incorpora dentro de sí dos


comparadores de voltaje, un flip flop, una etapa de salida de corriente,
divisor de voltaje resistor y un transistor de descarga. Dependiendo
de cómo se interconecten estas funciones utilizando componentes
externos es posible conseguir que dicho circuito realice un gran número de
funciones tales como la del multivibrador astable y la del circuito monoestable.
Tiene diversas aplicaciones, como: control de sistemas secuenciales, divisor de frecuencias y de
modulación por ancho de pulso, temporizador, generación de tiempos de retraso y repetición de
pulsos, etc.
Microcontrolador: es un circuito integrado que reúne en sí mismo todos los elementos de una
pequeña computadora, incluyendo unidad de procesamiento y memoria. Como tal depende de un
conjunto de órdenes que se almacenan en la memoria para su arranque y funcionamiento. Estas
instrucciones se escriben en un lenguaje de programación. Luego, el programa creado se traduce
en lenguaje de máquina mediante un software compilador, dejándolo listo para cargarse.

La plataforma Arduino, en sus diferentes variantes, se trata de un microcontrolador acoplado a una


plaqueta con entradas y salidas preparadas para conectar elementos electrónicos
externos, una fuente de alimentación y una PC mediante la cual cargar los
programas. Es un proyecto tanto de Software Libre como de Hardware Abierto, por lo
que dispone de multitud de aplicaciones compartidas por los usuarios en la web.

El ATmega328p es un chip microcontrolador creado por Atmel y pertenece a la serie megaAVR.

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.

Y como siempre es preferible empezar por el principio


vamos a comenzar con los motores de corriente
continua y viendo cómo podemos controlarlos.

Estoy seguro, de que todos estaréis familiarizados con


el hecho de que los imanes tienen un polo positivo y
otro negativo y que mientras que los polos opuestos
se atraen, los iguales se repelen.

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 .

El rotor, en el que disponemos espiras o arrollamientos de hilos de cobre alrededor de un núcleo,


para que la fuerza que se ejerce sobre el rotor se multiplique proporcionalmente a este número

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.

En un transistor también tenemos tres terminales, denominados Emisor, Colector, y Base. El


“contacto eléctrico” que nos interesa se realiza entre el emisor y el colector, mientras que la
base es el elemento que controla la cantidad de electricidad que atraviesa el componente.

Modos de funcionamiento en un BJT

Un transistor BJT tiene tres modos de funcionamiento.

Corte: En este modo el transistor se comporta como si el colector y el emisor estuvieran


desconectados, por lo que decimos que es similar a tener un circuito abierto

Saturación: En este modo, el transistor se comporta como si el colector y el emisor


estuvieran conectados por un diodo de pequeña tensión. Por eso decimos que es similar a
tener un cortocircuito, con una cierta caída de tensión

Activo: En este modo, la corriente entre el colector y el emisor es proporcional a la


intensidad de la base

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.

CALCULO DEL TRANSITOR BJT

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.

De esta forma, el cálculo se simplifica y se reduce a calcular la resistencia de base necesaria


para que en el punto de trabajo deseado el transistor conmute entre corte y saturación.

En un transistor BJT, la intensidad que atraviesa el colector Ic es proporcional a la intensidad


en su base Ib. Esta relación se denomina hFe (a veces Beta). Valores típicos son entre 100 a
200.

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.

Aplicando la ley de Ohm al dispositivo, calculamos que su equivalente es una resistencia de


60 Ohm.

Por tanto, podemos calcular la intensidad que circula por el colector.

La intensidad requerida en la base es la intensidad de colector reducida a un factor de


hFe(min, por lo que

Por tanto, la resistencia de base necesaria es inferior a

Elegimos la resistencia normalizada inferior y comprobaríamos mirando las curvas del


Datasheet que la tensión de base es suficiente para llevar al transistor a saturación.

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.

Podéis elegir la resistencia normalizada más cercana con la Calculadora de resistencias


normalizadas

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)

Algunos modelos de transistores permiten disipar potencias mayores acoplando un


disipador externo.

Modelos de BJT en Arduino

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.

CONECTAR CARGAS INDUCTIVAS

Al conectar cargas inductivas, bobinas, electroimán, motores, relés, debemos poner un


dispositivo de protección adicional, el diodo de Flyback.

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.

Igualmente, existen múltiples modelos de par Darlington. Su precio es superior al de un


transistor BJT, pero siguen siendo dispositivos baratos. El rango habitual es de 0,10 a 0,20€.

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.

TRANSISTORES BJT EN PWM

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.

Únicamente deberemos comprobar que la frecuencia de conmutación del transistor elegido


es superior a la frecuencia del PWM que apliquemos.

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.

La etapa de transistor únicamente nos permite adaptar la tensión y la corriente de salida a


valores superiores a los que podríamos proporcionar directamente con las salidas de
Arduino
Estructura de un programa en Arduino

Un programa de Arduino (conocido en inglés como sketch), usa primordialmente la sintaxis de


C/C++ para definir todas las operaciones que llevara a cabo el microcontrolador, con la diferencia
de que los programas no hacen uso de la función main() para especificar su inicio, sino que utilizan
dos funciones : setup y loop .

La estructura básica del lenguaje de programación de Arduino se compone de al menos dos


partes. Estas dos partes necesarias, llamadas “funciones”, encierran bloques que contienen
declaraciones e instrucciones. Ambas funciones son necesarias para que el programa trabaje y son:

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() es la función encargada de establecer la configuración y se ejecutará una única vez al


comienzo del programa.

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.

La función de configuración (setup) es la primera función a ejecutar en el programa, se ejecuta sólo


una vez, y se utiliza para:

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()

pinMode(pin, OUTPUT); // configura el 'pin' como salida

digitalWrite(pin, HIGH); // pone el ‘pin’ en estado HIGH

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()

digitalWrite(pin, HIGH); // pone en uno (on, 5v) el 'pin'

delay(1000); // espera un segundo (1000 ms)

digitalWrite(pin, LOW); // pone en cero (off, 0v.) el 'pin'

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.

type nombre Función(parámetros)

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(),

loop(), if.., etc.

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.

int x = 13; /* declara la variable 'x' como tipo entero de valor 13 */

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.

Los tipos de variables en Arduino son:

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

Los bloques de comentarios, o comentarios multilínea


son áreas de texto ignorados por el programa que se
utilizan para las descripciones del código o
comentarios que ayudan a comprender el
programa. Comienzan con /* y terminan con */ y pueden
abarcar varias líneas.

/* esto es un bloque de comentario no se debe olvidar


cerrar los comentarios estos deben estar
equilibrados */

Debido a que los comentarios son ignorados por el


compilador y no ocupan espacio en la memoria de Arduino
pueden ser utilizados con generosidad. También pueden
utilizarse para "comentar" bloques de código con el
propósito de anotar informaciones extra y hacerlo más comprensible para cualquiera.

// 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.

Existen más instrucciones que aprenderemos durante las próximas clases .

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() {

// put your setup code here, to run once:

}
void loop() {

// put your main code here, to run repeatedly:

La subrutina setup() es la encargada de recoger la configuración y arametrizaciones estáticas del


programa mientras que loop() es la que contienen las sentencias lógicas del programa.

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() {

// set the digital pin as output:

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

// the loop function runs over and over again forever

void loop() {

digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(13, LOW); // turn the LED off by making the voltage LOW

delay(1000); // wait for a second


}

Controles de flujo y saltos condicionales

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.

Comento algunos de los motivos para no utilizar la función delay.

No puedes hacer otra cosa mientras se esta ejecutando.

Es incompatible con las interrupciones.

Aumenta el consumo del proyecto.


No se pueden detectar eventos externos (interrupciones) e internos (interrupciones por timer)

Función digitalWrite y digitalRead

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);

Conexiones correctas con pulsadores

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.

Como se ve en la imagen a la configuración anterior solo le agregamos un resistencia que luego


veremos de que valor tenemos que colocar, esto nos soluciona el problema de de indeterminación y
el de alta intensidad de corriente en transitorios, en el caso del Pull Up cuando el pulsador esta
abierto el pin esta recibiendo un uno logico y una intensidad de corriente controlada por la
resistencia que incluimos, en este caso hablamos de una intensidad de corriente en el orden de los
1mA, que es una corriente muy menor a la máxima permitida por el pin.
Cuando el pulsador esta cerrado ya no se produce un cortocircuito, por que existe una caída de
tensión en la resistencia que agregamos, de esta manera la corriente que le llega al pin es mucho
menor que si no ponemos el resistor.En el caso de la configuración de Pull Down el concepto
funciona de la misma manera, solo que cuando el pulsador esta abierto estamos leyendo un cero y
cuando el pulsador esta cerrado estamos leyendo un uno lógico.

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.

const int inputPin = 2;

int value = 0;
void setup() {

Serial.begin(9600);

pinMode(inputPin, INPUT);

void loop(){

value = digitalRead(inputPin); //lectura digital de pin

//Envio al puerto serie el estado del pin

if (value == HIGH) {

Serial.println("Encendido");

else {

Serial.println("Apagado");

delay(1000);

Como se puede ver en el código cuando hacemos el digitalRead(inputPin) obtenemos el estado


actual del pin, si esta encendido o apagado al pulsarlo dependera del tipo de configuración utilizada
Pull Up o Pull Down.

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.

Entradas y salidas analógicas. PWM

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.

La señal digital obtenida de una analógica tiene dos propiedades fundamentales:

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

En el caso de un arduino Uno, el valor de 0 voltios analógico es expresado en digital como


B0000000000 (0) y el valor de 5V analógico es expresado en digital como B1111111111 (1023). Por
lo tanto todo valor analógico intermedio es expresado con un valor entre 0 y 1023, es decir, sumo 1
en binario cada 4,883 mV.

Arduino Uno tiene una resolución de 10 bits, es decir, unos valores entre 0 y 1023.

Diferencia entre señales analógicas y digitales:

Entradas Analógicas en Arduino

Los microcontroladores de Arduino contienen en la placa un conversor analógico a digital de 6


canales. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023. Los pines
analógicos de Arduino también tienen todas las funcionalidades de los pines digitales. Por lo tanto,
si necesitamos más pines digitales podemos usar los pines analógicos. La nomenclatura para los
pines analógicos es A0, A1, etc…

En arduino los pines analógicos se definen y tienen las propiedades siguientes:


http://arduino.cc/en/Tutorial/AnalogInputPins

En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:

analogReference() – configura la referencia de voltaje usada para la entrada analógica.


http://arduino.cc/en/Reference/AnalogReference

analogRead() – lee el valor del pin analógico especificado.


http://arduino.cc/en/Reference/AnalogRead

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

Otras funciones interesantes con entradas/salidas analóicas:

map(value, fromLow, fromHigh, toLow, toHigh): http://arduino.cc/en/Reference/Map

constrain(x, a, b): http://arduino.cc/en/Reference/Constrain


Salidas Analógicas. PWM

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.

Algunos pines digitales pueden usarse como salidas analógicas 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.

La función para hacer una salida PWM en un pin es:

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.

Definición de PWM en la web de Arduino: http://arduino.cc/en/Tutorial/PWM

Para ampliar un poco más de información sobre PWM ver: http://rufianenlared.com/que-es-pwm/

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.

Los tipos de variables en Arduino son:

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.

Descarga de programas en el Arduino.

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 .

Una vez que hicimos esto podríamos abrir el software de Arduino .

Ahora comenzaremos a explicar cómo ejecutar un programa y probar su funcionamiento con


nuestra tarjeta Arduino pera antes debemos aprender como conectar nuestro hardware y cómo
hacer para utilizar el software .

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 este programa abrirá una nueva ventana y veremos :

/* Blink Turns on an LED on for one second, then off for one second, repeatedly.

…….by Arturo Guadalupi */

// 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);

// the loop function runs over and over again forever

void loop() {

digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW

delay(1000); // wait for a second

Otro ejemplo el Blink1 sería con una explicación de que hace cada instrucción y funcion:

//led programa 1

void setup() { //comienza la configuración

pinMode(13, OUTPUT); //configura el pin 13 como de salida

} //termina la configuración

void loop() { //comienza el bucle principal del programa

digitalWrite(13, HIGH); //envía 5V al pin (salida) 13

delay (500); //espera 500 ms pin 13 con 5V

digitalWrite(13, LOW); //envía 0V al pin (salida) 13

delay (100); //espera 100 ms pin 13 con 0V


}

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:

Verificar ( la compilación Subir (el programa

del programa ) a la plaqueta )

Estos botones son necesarios para probar que el programa (sketch) antes de enviar a la plaqueta
Arduino .

Existen otros 3 botones: Nuevo, Abrir y salvar (


guardar ). Para manejar el mencionado sketch
como haríamos en Word, Excel u otros programas
que conocemos.

Ahora veremos una presentación para explicar


las instrucciones que utilizaremos en nuestros
programas .Luego de lo explicado, visto y
comprobado en nuestros plaquetas Arduino.

TP 1 ARDUINO USO CON MOTOR DC :


int motorPin = 5;
void setup(){
pinMode(motorPin, OUTPUT);
}

void loop(){
digitalWrite(motorPin, HIGH);
delay(1000);
digitalWrite(motorPin, LOW);
delay(1000);
}

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.

Los circuitos individuales se pueden usar de manera


independiente para controlar cargas de todo tipo y, en el caso de
ser motores, manejar un único sentido de giro. Pero además,
cualquiera de estos cuatro circuitos sirve para configurar la mitad de
un puente H.

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.

En el diagrama de arriba hay pines equivalentes para el motor 2 y cuales son.

Los pines 4, 5,12 y 13 van a GND.

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

LOW – – Motor parado

HIGH HIGH LOW Gira adelante

HIGH LOW HIGH Gira al revés

HIGH HIGH HIGH Motor parado

HIGH LOW LOW Motor parado

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.

Hagamos un resumen de conexiones

PIN L293D PIN ARDUINO DESCRIPCIÓN

1 10 Enable

2 9 Input 1

3 – Motor1 +
PIN L293D PIN ARDUINO DESCRIPCIÓN

4,5, 12,13 GND GND

6 – Motor1 –

7 8 Input 2

8 Vin Alimentación del motor

16 5V Alimentación del L293D

Vamos con el esquema de protoboard.

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.

#define E1 10 // Enable Pin for motor 1

#define I1 8 // Control pin 1 for motor 1

#define I2 9 // Control pin 2 for motor 1

void setup()

for (int i = 8 ; i<11 ; i++) // Inicializamos los pines

pinMode( i, OUTPUT);

void loop()

{ digitalWrite(E1, HIGH); // Activamos Motor1

digitalWrite(I1, HIGH); // Arrancamos

digitalWrite(I2, LOW);

delay(3000);

digitalWrite(E1, LOW); // Paramos Motor 1

delay(1000);

digitalWrite(E1, HIGH); // Activamos Motor1

digitalWrite(I1, LOW); // Arrancamos con cambio de direccion

digitalWrite(I2, HIGH);

delay(3000);

digitalWrite(E1, LOW); // Paramos Motor 1


delay(1000);

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.

Sensor de Ultrasonido HC-SR04

Su rendimiento estable, alta precisión y su precio lo hacen 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.)

#define PIN_TRIG 8

#define PIN_ECO 7
void setup () {

Serial.begin (9600);

pinMode (PIN_TRIG, OUTPUT);

pinMode (PIN_ECO, INPUT);

void loop(){

long duracion, distancia;

digitalWrite(PIN_TRIG, LOW);

delayMicroseconds(2);

digitalWrite(PIN_TRIG, HIGH);

delayMicroseconds(10);

digitalWrite(PIN_TRIG, LOW);

duracion = pulseIn(PIN_ECO, HIGH);

distancia = (duracion/2) / 29;

if(distancia >= 500 || distancia<=0){

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>

Ultrasonic sensor(9,8,30000); // (Trig PIN,Echo PIN, microsegundos max "distancia máxima")


30000us = 5 metros

int distancia=0;//Declaramos la variable donde guardaremos la distancia

void setup() {

Serial.begin(9600);//Inicializamos el puerto serie

void loop() {

distancia=sensor.Ranging(CM); // Medimos la distancia y la guardamos en la variable

Serial.print("Distancia ");// Imprimimos la palabra distancia en el monitor serial

Serial.print(distancia);// Imprimimos la variable distancia

Serial.println(" cm");//Imprimimos las letras cm y saltamos de linea.

delay (2000);//Esperamos 2 segundos para repetir el proceso.

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 ;

Este sensor es direccional, por lo que se podria montar


sobre un servo de forma que podemos girar para “mirar”
hacia los lados y poder así medir la distancia a la que se
encuentran los obstáculos a cada lado para elegir el mejor camino.
Código Del Sensor Ultrasónico HC-SR04

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.

Si utilizas un código diferente, se te ocurre alguna mejora o simplemente quieres contar tu


experiencia o tus dudas con este sensor ultrasónico, deja un comentario

/*Pines a utilizar por Arduino. Puedes modificarlos los pines digitales que desees*/

int Trig = 4;

int Echo = 3;

int Dist;//Variable en la que se almacenar el valor correspondiente a la distancia

void setup() {

pinMode (Trig, OUTPUT);

pinMode (Echo, INPUT);

//Este módulo calcula y devuelve la distancia en cm del sensor ultrasónico arduino.

/*

Puedes poner el código del módulo directamente en el loop o utilizar el módulo


para reducir el número de líneas de código del loop o reutilizar el código

*/

void ultrasonido (int &Distancia) {

//Para estabilizar el valor del pin Trig se establece a LOW

digitalWrite (Trig, LOW);

delay(10);

//Se lanzan los 8 pulsos

digitalWrite (Trig, HIGH);

delay(10);

digitalWrite (Trig, LOW);

/*

Se mide el tiempo que tarda la señal en regresar y se calcula la distancia.

Observa que al realizar pulseIn el valor que se obtiene es tiempo, no distancia

Se está reutilizando la variable Distancia.

*/

Distancia = pulseIn (Echo, HIGH);

Distancia = Distancia / 58;

delay(100);

void loop() {

ultrasonido (Dist);

delay (250);

}
/*Este programa presenta el codigo de un Movil Esquiva Objetos

*La lectura de la distancia del sensor ultrasonido se restringe en el rango de 0 *a 500 cm . Si


la distancia se encuentra entre 35 y 0 el movil avanzara en linea *recta . Si la distancia esta en
el rango de 1 a 10 el movil retrocedera y girara

*/

int IN1 = 4; // Input1 conectada al pin 4 de Arduino

int IN2 = 2; // Input2 conectada al pin 2 de Arduino

int ENA = 6; // ENA conectada al pin 6 de Arduino

int IN3 = 7; // Input3 conectada al pin 7 de Arduino

int IN4 = 8; // Input4 conectada al pin 8 de Arduino

int ENB = 9; // ENB conectada al pin 9 de Arduino

int ECHO = 11; // ECHO al Arduino pin 11 de Arduino

int TRIG = 10; // TRIG al Arduino pin 10 de Arduino

long duracion, distancia;

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 2 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 10 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 centimetros

if (distancia >= 200 || distancia <= 0){

// Si la distancia es mayor a 200cm 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 centimetros "cm"

digitalWrite(13, 0); // Pin 13 en bajo

// Si la distancia esta en el rango de 1 a 35 el movil retrocedera y girara

if (distancia <= 35 && distancia >= 1)


{

digitalWrite(13, 1); // Pin 13 en alto

Serial.println("Alarma....."); // Imprime la palabra Alarma en el monitor serial

// Codigo para retroceder

digitalWrite(IN1,1);

digitalWrite(IN2,0);

digitalWrite(IN3,0);

digitalWrite(IN4,1);

analogWrite(ENA,120);

analogWrite(ENB,120);

delay(1000);

// Codigo para girar

digitalWrite(IN1,0);

digitalWrite(IN2,0);

digitalWrite(IN3,1);

digitalWrite(IN4,0);

analogWrite(ENB,110);

delay(500);

// Si la distancia se encuentra entre 0 y 500 el movil avanzara en linea recta

// Codigo para que el movil avance en linea recta

Else

{
Serial.print(distancia); // Imprime el valor de la distancia en el monitor serial

Serial.println("cm"); // Imprime al lado de la distancia los centimetros "cm"

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?

Un detector de obstáculos infrarrojo es un


dispositivo que detecta la presencia de un
objeto mediante la reflexión que produce
en la luz. El uso de luz infrarroja (IR) es
simplemente para que esta no sea visible
para los humanos.

Constitutivamente son sensores sencillos.


Se dispone de un LED emisor de luz
infrarroja y de un fotodiodo (tipo BPV10NF o
similar) que recibe la luz reflejada por un
posible obstáculo.

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.

Pese a esta limitación son ampliamente utilizados para la detección de obstáculos en


pequeños vehículos o robots. Su bajo coste hace que sea frecuente ubicarlos en el perímetro, de
forma que detectemos obstáculos en varias direcciones.

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.

Los sensores de obstáculos infrarrojos son realmente baratos. Podemos encontrar


detectores infrarrojos, incluida la placa de medición, por 0,30€ en vendedores
internacionales de eBay y AliExpress.

Esquema eléctrico

El montaje es sencillo. Alimentamos el módulo a través de Vcc y GND conectándolos,


respectivamente, a la salida de 5V y GND en Arduino.

Finalmente, conectamos la salida digital del sensor a una entrada digital para leer el estado
del sensor.

Opcionalmente, calibramos el umbral de disparo acercando un objeto al detector de


obstáculos y regulando la salida digital con el potenciómetro. Si queréis saltaros este paso,
dejar el potenciómetro en un valor medio.
Ejemplos de código

El código es igualmente sencillo. Simplemente leemos el estado de la entrada digital, tal y


como vimos en la entrada Entradas digitales en Arduino.

Si el sensor se dispara, ejecutamos las acciones necesarias.

1 const int sensorPin = 9;

3 void setup() {

4 Serial.begin(9600); //iniciar puerto serie

5 pinMode(sensorPin , INPUT); //definir pin como entrada

6 }

7 void loop(){

8 int value = 0;

9 value = digitalRead(sensorPin ); //lectura digital de pin

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.

Para realizar las acciones los procesadores delegan en etapas de amplificación o


controladores (drivers), que actúan como adaptadores entre el nivel de potencia empleado en
el controlador y el requerido por el actuador.

Conectar Arduino por Bluetooth con los módulos HC-05 ó HC-06

¿Qué es un módulo HC-05 ó HC-06?

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.

Bluetooth tiene la enorme ventaja de estar integrado de fábrica en la mayoría de dispositivos.


Portátiles, Tablets, y Smartphones llevan integrado Bluetooth. Además, su uso es
independiente del sistema operativo (Windows, Linux, Mac o Android).

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.

Incluso es posible programar Arduino de forma inalámbrica a través de Bluetooth, como


veremos en una entrada posterior.

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.

¿Cómo funcionan los módulos HC-05 y HC-06?

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.

La diferencia principal es que, en lugar de un conectar un cable, tendremos que emparejar el


módulo con nuestro dispositivo. El proceso de emparejado depende del sistema operativo (y
la versión del mismo) pero es, en general, un proceso sencillo.
Para establecer la comunicación desde
el dispositivo, podemos usar el propio
Serial Monitor del Arduino IDE.
También encontraremos en todos los
sistemas (Windows, Linux, Mac, o
Android) encontraremos aplicaciones
para establecer la comunicación por el
puerto serie.

Por último, resulta muy sencillo


integrar en nuestros programas el uso
del puerto serie (y por tanto del
Bluetooth), en una gran variedad de lenguajes de programación, incluidos Java, C#, VB .Net,
o Python, que disponen de funciones específicas para ellos.

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.

Mientras estemos cargando un nuevo programa en la placa Arduino tenemos que


desconectar el módulo Bluetooth, dado que la programación se realiza a través del puerto
serie.

Si realmente necesitamos ambas comunicaciones podemos emplear la librería SoftSerial


para establecer una comunicación de puerto serie por cualquier pareja de pins digitales,
aunque ello supondrá un coste adicional de tiempo de proceso en Arduino.

La conexión es sencilla. Alimentamos mediante Vcc y GND. Posteriormente conectamos el


TXD (pin de transmisión) y RXD (pin de recepción) a los opuestos de la placa Arduino (cada
TXD a un RXD). Así quedarían las conexiones del módulo, con los pines de Arduino.
Mientras que el esquema visto desde Arduino queda así.

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(){

10 //si existe información pendiente

11 if (Serial.available()>0){

12 //leeemos la opcion

13 char option = Serial.read();

14 //si la opcion esta entre '1' y '9'

15 if (option >= '1' && option <= '9')

16 {

17 //restamos el valor '0' para obtener el numero enviado

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

// Incluimos la librería de los motores

#include <LEANTEC_ControlMotor.h>

// Configuramos los pines que vamos a usar

ControlMotor control(2,3,7,4,5,6); //
MotorDer1,MotorDer2,MotorIzq1,MotorIzq2,PWM_Derecho,PWM_Izquierdo

#define PIN_LDR1 2 // Define el pint de LDR 1

#define PIN_LDR2 3 // Define el pint de LDR 2

#define PIN_FL1 0 // Define el pint de IR 1 (Este sensor no se usa en este programa)

#define PIN_FL2 1 // Define el pint de IR 2 (Este sensor no se usa en este programa)

#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 VELOCIDAD 255 // Velocidad a la que se desplazará el robot

#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 OFFSET_FL1 = 0; // (Este sensor no se usa en este programa)

int OFFSET_FL2 = 0; // (Este sensor no se usa en este programa)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Estos valores de abajo no es necesario cambiarlos

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int sensores[4]; // Array donde se guardarán los valores

#define LDR1 0 // Define la posición en el ARRAY donde se guardará el valor de la LDR 1

#define LDR2 1 // Define la posición en el ARRAY donde se guardará el valor de la LDR 2

#define FL1 2 // Define la posición en el ARRAY donde se guardará el valor de la IR 1 (Este


sensor no se usa en este programa)

#define FL2 3 // Define la posición en el ARRAY donde se guardará el valor de la IR 2 (Este


sensor no se usa en este programa)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void leer_sensores();

int calcula_diferencia();

void mostrar_valores();

//----------------------------- Configuramos Ardunio ---------------------------------------

//------------------------------------------------------------------------------------------

void setup(void){

// Iniciamos el puerto de comunicación

Serial.begin(9600);

//********************************* Calibramos los sensores


****************************************************//

leer_sensores(); // Leemos sensores con los OFFSET a 0

if(sensores[LDR1] > sensores[LDR2]){ // Comprobamos si LDR1 es mayor que LDR2

OFFSET_LDR1 = 0; // Como LDR1 es mayor, sumamos a LDR2

OFFSET_LDR2 = sensores[LDR1]-sensores[LDR2]; // Sumamos a LDR2 la diferencia para que


esten igualadas las dos
}

else{ // Si hemos llegado aquí, es porque LDR2 o igual que LDR1

OFFSET_LDR2 = 0; // Como LDR2 es mayor, sumamos a LDR1

OFFSET_LDR1 = sensores[LDR2]-sensores[LDR1]; // Sumamos a LDR1 la diferencia para que


esten igualadas las dos

//**************************************************************************************************************//

//--------------------------- Arrancamos el programa ---------------------------------------

//------------------------------------------------------------------------------------------

void loop(void)

leer_sensores(); // Leemos los sensores con los OFFSET ya calculados

mostrar_valores(); // Mostramos los valores por si tenemos que comprobar algún dato

control.Motor(VELOCIDAD,calcula_diferencia()); // Movemos el robot a la velocidad seleccionada


y el giro calculado

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Mostramos los valores por el monitor

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void mostrar_valores(){

Serial.print(" OFF_1 = " ); // Imprimimos el OFFSET del LDR1

Serial.print(OFFSET_LDR1);

Serial.print(" OFF_2 = " ); // Imprimimos el OFFSET del LDR2


Serial.print(OFFSET_LDR2);

Serial.print(" LDR_1 = " ); // Imprimimos el valor del LDR1

Serial.print(sensores[LDR1]);

Serial.print(" LDR_2 = " ); // Imprimimos el valor del LDR2

Serial.print(sensores[LDR2]);

Serial.print(" DIF = " ); // Imprimimos la diferencia entre el sensor 1 y el sensor 2

Serial.println(calcula_diferencia());

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Leemos los sensores y ajustamos los OFFSET

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void leer_sensores(){

sensores[LDR1]=analogRead(PIN_LDR1)+OFFSET_LDR1; // Leemos y guardamos el valor


del sensor con el OFFSET incluido

if(sensores[LDR1]<0){sensores[LDR1] = 0;} // Comprobamos que con el OFFSET no sea


menor de 0

else if(sensores[LDR1] > 1023){sensores[LDR1] = 1023;} // Comprobamos que con el OFFSET no


sea mayor de 0

sensores[LDR2]=analogRead(PIN_LDR2)+OFFSET_LDR2; // Leemos y guardamos el valor


del sensor con el OFFSET incluido

if(sensores[LDR2]<0){sensores[LDR2] = 0;} // Comprobamos que con el OFFSET no sea


menor de 0

else if(sensores[LDR2] > 1023){sensores[LDR2] = 1023;} // Comprobamos que con el OFFSET no


sea mayor de 0

sensores[FL1]=analogRead(PIN_FL1)+OFFSET_FL1; // Leemos y guardamos el valor del


sensor con el OFFSET incluido

if(sensores[FL1]<0){sensores[FL1] = 0;} // Comprobamos que con el OFFSET no sea


menor de 0
else if(sensores[FL1] > 1023){sensores[FL1] = 1023;} // Comprobamos que con el OFFSET no
sea mayor de 0

sensores[FL2]=analogRead(PIN_FL2)+OFFSET_FL2; // Leemos y guardamos el valor del


sensor con el OFFSET incluido

if(sensores[FL2]<0){sensores[FL2] = 0;} // Comprobamos que con el OFFSET no sea


menor de 0

else if(sensores[FL2] > 1023){sensores[FL2] = 1023;} // Comprobamos que con el OFFSET no


sea mayor de 0

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Calculamos la diferencia que hay de un sensor a otro

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int calcula_diferencia(){

int valor; // En esta variable almacenamos el valor positivo o negativo del resultado de la función

valor = sensores[LDR1]-sensores[LDR2]; // Restamos el valor de la LDR 1 al valor de la LDR 2, la


dirección se calcula viendo si el valor es positivo o negativo.

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

if(valor < -GIRO_MAX){valor = -GIRO_MAX;} // Comprobamos que el giro a la derecha no pase


del maximo permitido

else { // Si el cambio es menor al punto muerto, el robot no gira

valor = 0; // Dejamos que el robot sigua recto


}

return valor; // Devolvemos el valor

}
INICIO

TIMBRE
VENTILADOR DE

TECHO

LUZ DE GARAGE PIN 10 LED Y PIN ENTRADA DIGITAL 8

ARDUINO UNO R3

MICROCONTROLADOR ATMEGA 328 P

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).

También podría gustarte