Cuadernillo Sistemas Programables
Cuadernillo Sistemas Programables
DE
ACTIVIDADES
“SISTEMAS
PROGRAMABLES”
“Ingeniería en Sistemas
Computacionales”
1
CONTENIDO
Introducción
UNIDAD 1. SENSORES
UNIDAD 2. Actuadores
UNIDAD 3. Microcontroladores
UNIDAD 6. Interfaces
2
INTRODUCCIÓN
La tecnología ha avanzado de forma rápida y considerable, existen muchos procesos
automatizados programados para resolver necesidades específicas o que forman parte de
otros procesos, la diversidad de productos de sistemas de automatización para hogares ofrece
soluciones como la reducción y optimización del consumo energético.
El presente cuadernillo tiene como finalidad mostrar un conjunto de prácticas con el hardware
Arduino que guíen al lector a la comprensión y fabricación de distintos sistemas programables
para su aplicación en las diferentes necesidades cotidianas. Se hace empleo de sensores en la
unidad 1, y de actuadores como el motor y el servomotor en la unidad 2, en la unidad 3 se
programan diversos ejemplos de circuitos que emplean microcontrolador, en la unidad 4 se
hacen uso de las estructuras de control que permite el lenguaje C++, en la unidad 5 se conoce
el funcionamiento de los puertos de comunicación particularmente USB, y en la 6 se hacen
prototipos que ofrecen interfaz de comunicación.
3
COMPETENCIA DE LA ASIGNATURA:
Aplica microcontroladores en el diseño de interfaces hombre—máquina y máquina - máquina de
sistemas programables
UNIDAD I
UNIDAD II
UNIDAD III
UNIDAD IV
4
• Utiliza lenguajes ensambladores en la programación del microcontrolador.
• Programa microcontroladores utilizando puertos de E/S.
• Construye y comprueba circuitos con microcontrolador.
UNIDAD V
UNIDAD VI
5
Primeros pasos
Para entender el funcionamiento del hardware Arduino es necesario, realizar algunas prácticas que
permiten su manipulación.
6
NOTA: En caso de no detecta el puerto, desconectar y volver a conectar el Arduino.
Opciones Arduino
Son básicamente 2 botones los más utilizados en el IDE Arduino:
El primer botón permite compilar y revisar el código fuente, y el segundo permite subir el programa a
la placa arduino.
Es muy común utilizar solo el segundo botón que compila y sube a la placa al mismo tiempo.
7
“SENSORES” Práctica 1.
Encendiendo un foco
Objetivo
Materiales:
• 1 Arduino nano/uno
• 2 cables macho - hembra
• 1 Resistencia 330 Ohms (algunos proveedores escriben 330 R)
• 1 foco led
Diagrama de conexión:
GND Arduino – Cable negro se conecta a la pata corta del foco (cátodo - negativo)
Pin 13 Arduino – Cable rojo se conecta a una resistencia de 330ohms (la resistencias no tiene
polaridad por lo cual puede conectase en cualquier dirección) y el otro extremo de la resistencia
va a la pata larga del foco (ánodo - positivo).
Nota: Tanto el Arduino UNO y NANO cuentan con la misma cantidad de puertos de entrada y
salida digitales (13 en total) y analógicas (6); la ubicación de ellos cambia, solo es cuestión de
localizarlos.
8
Explicación teórica
Los focos led mas comunes son de 5mm, pero existen mas pequeños de 3 mm y mas grandes de
10mm. Estos focos son desde el punto de vista electrónico DIODOS emisores de LUZ.
Cuenta con 2 pines, uno mas lardo que otro. El más largo es POSITIVO (ánodo) y el corto es
negativo (cátodo). Si realizas la conexión de forma inversa, no encenderá.
La corriente normal que requieren esta entre 20 a 30 mA, y su consumo de voltaje es de 1.8 a
2.4V dependiente del color. Para más detalle puedes consultar el datasheet correspondiente.
https://components101.com/diodes/5mm-round-led
Una vez armado el circuito eléctrico mediante el protoboard y el arduino. Debemos ahora escribir
las instrucciones necesarias para que el foco realice la funcionalidad deseada, esta actividad se
realiza en el IDE Arduino.
int led1; // antes de la función setup() podemos utilizar esta zona para
//declarar variables
int led2;
void setup()
{
// aquí realizamos la configuración inicial de variables
}
void loop()
{
//el código que se va a repetir de forma indefinida
}
Donde setup permite la configuración de carga del programa; el código dentro de esta función se
9
ejecutará UNA SOLA VEZ cada vez que se encienda el dispositivo Arduino.
Y la función loop es aquella función que se repetirá indefinidamente miles o millones de veces
según la velocidad del procesador. Es por ello importante codificar adecuadamente los programas
para aprovechar dicha funcionalidad.
Código
int led = 13; // Declaramos una variable que indica que puerto arduino usaremos
void setup() {
// Indicamos que el puerto 13 será salida de voltaje
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH); // Mandamos voltaje al puerto 13 (ENCENDEMOS)
delay(1000); // detenemos el loop por 1000 milisegundos (1 segundo)
digitalWrite(led, LOW); // Quitamos el voltaje al puerto 13 (APAGAMOS)
delay(1000); // detenemos el loop por 1 segundo
}
Resultado
- Un foco que enciende y apaga cada segundo, si por la función delay el funcionamiento del
loop es tan rápido que el foco nunca se vería encendido.
10
Prácticas propuestas
11
“SENSORES” Práctica 2.
Presionando un botón
Objetivo
Probar el funcionamiento de un botón y realizar la lectura cuanto éste es presionado, para realizar
alguna operación especifica.
Materiales:
• 1 Arduino nano/uno
• Cables dupont Macho-hembra
• 1 Resistencia 4.7 KiloOhms (4k7)
• 1 botón
Diagrama de conexión:
DIAGRAMA 1. Probando el botón sin código ( el pulsador o botón funciona como un apagador que
permite el paso de corriente mientras esta presionado)
12
DIAGRAMA 2. Lectura del bóton mediante Arduino
Explicación teórica
Existen dos formas de conectar el botón para la lectura del valor, a continuación se muestra el
diagrama eléctrico correspondiente, para más detalle del funcionamiento consulta la siguiente
página: https://www.luisllamas.es/leer-un-pulsador-con-arduino/
13
Dependiendo de la conexión se leerá el valor de HIGH (presionado) y de LOW (sin presionar) o la
Inversa.
La función Serial.begin (permite visualizar en pantalla mediante el monitor serial los valores
escritos por Serial.println() )
Código
int inputPin = 2;
int value = 0;
void setup() {
Serial.begin(9600);
pinMode(inputPin, INPUT);
}
void loop(){
value = digitalRead(inputPin); //lectura digital de pin
//mandar mensaje a puerto serie en función del valor leido
if (value == HIGH) {
14
Serial.println("Encendido");
}
else {
Serial.println("Apagado");
}
delay(1000);
}
Resultado
15
Prácticas propuestas
16
“SENSORES” Práctica 3.
Leyendo la intensidad de luz
Objetivo
Realizar la lectura del valor de la intensidad de la iluminación mediante una fotoresistencia
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de entre 10 a 22 KiloOhms (10k a 22k)
• 1 foco led
• 1 botón
Diagrama de conexión:
Explicación teórica
Puedes consultar en estas páginas el funcionamiento:
https://www.luisllamas.es/medir-nivel-luz-con-arduino-y-fotoresistencia-ldr/
https://aprendiendoarduino.wordpress.com/tag/fotoresistencia/
17
Es importante recordar que no es recomendable esta tocando con los dedos la parte superior de
la fotoresistencia pues va perdiendo sensibilidad, para hacer pruebas cubrirlo con ropa o algún
material oscuro.
El sensor no tiene polaridad es indistinto su forma de conexión.
El rango de valores va de 100 ohms a 1MegaOmh o más dependiendo del modelo.
Cuando los datos son leídos por el arduino, el valor devuelto siempre ira de 1 a 1024, para obtener
el valor de resistencia tendría que aplicarse una regla de 3.
Código
void setup() {
Serial.begin(9600);
}
void loop() {
int valor = analogRead(A0);
Serial.println(valor);
delay(500);
}
Resultado
Se deberá mostrar el valor devuelto por sensor en el monitor serie
18
Prácticas propuestas
1. Encender un foco led cuando haya oscuridad (poner una barrera o distancia entre el led y la
fotoresistencia para no ciclar la lectura)
2. Conectar 4 focos LED, realizar la lectura de la intensidad de luz (valor):
a. Apagar todos los focos cuando haya mucha luz (valor mayor a 900)
b. Encender 1 foco cuando el valor sea mayor a 600
c. Encender 2 focos cuando el valor sea mayor a 400
d. Encender 3 focos cuando el valor no superé los 400
Haciendo el efecto de ir encendiendo o apagando según la luz
3. Medir la intensidad de luz de:
a. Un cerillo
b. El brillo del dia a las 1 pm
c. El brillo del dia a la 8 pm
d. El brillo de la noche a las 10 pm
e. El brillo de los focos dentro de tu casa
4. Conectar 1 foco led que de noche debe estar parpadeante y de día debería estar encendido
constante.
19
“SENSORES” Práctica 4.
Modificando la intensidad de la iluminación
Objetivo
Que el alumno aprenda el funcionamiento de un potenciómetro, la lectura de su valor desde
Arduino y controle la iluminación de un foco led mediante PWM.
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de 330 Ohms
• 1 foco led
• 1 potenciometro
Diagrama de conexión:
DIAGRAMA 1. Prueba del funcionamiento de un potenciometro sin Código (girar para ver el
resultado)
DIAGRAMA 2. Lectura del valor de un potenciometro mediante Arduino y empleo para modificar
intensidad de un foco LED
20
Explicación teórica
Un potenciómetro es también conocido como resistencia variable (siendo esta su principal
función), está compuesto de 3 pines y una perilla que puedes girar en ambas direcciones, existen
de diversos tipos algunos y tamaños. Un potenciómetro tiene un valor asignado en Ohms y al
girar la perilla se incremente o decrementa el valor entre 0 y el valor máximo.
Controlar la intensidad de un foco LED requiere indicar valores intermedios al momento de enviar
salida a un puerto de arduino, hasta el momento solo hemos utilizado HIGH y LOW (máximo y
mínimo o 255 y 0). Arduino posee algunos puertos que tienen la capacidad de recibir valores
intermedios de salida, éstos están indicados por un ~
21
Código
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
value = analogRead(analogPin); // realizar la lectura analógica raw
Resultado
Al ir girando la perilla se podrá observar de forma clara el cambio de intensidad de luminosa del foco LED.
Prácticas propuestas
23
“ACTUADORES” Práctica 5.
Encendiendo un motor DC 5v
Objetivo
Conocer el funcionamiento básico de un motor de DC y su operación mediante arduino con apoyo
de un transistor NPN
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de 100 Ohms
• 1 motor de 5V
• 1 relevador DC de 5V
• 1 transistor NPN 2N2222
• Fuente de alimentación externa de 5 a 9 V 8 (Cuatro pilas AA o un de 9V)
Diagrama de conexión:
Explicación teórica
De acuerdo a la siguiente página: https://tostatronic.com/store/es/motores/101-motor-corriente-
directa-cd-a-5v.html
El estator es la parte mecánica del motor donde están los polos del imán.
24
El rotor es la parte móvil del motor con devanado y un núcleo, al que llega la corriente a
través de las escobillas.
Si queremos cambiar el sentido de giro del rotor, tenemos que cambiar el sentido de la
corriente que le proporcionamos al rotor; basta con invertir la polaridad de la pila o batería.
Para controlar un motor con arduino es necesario contar con la corriente de energía necesario
para moverlo, lamentablemente arduino por si solo ofrece máximo 40 mA. Por ello es necesario
tener una fuente de alimentación externa que ofrezca dicha energía.
Es importante, MUY IMPORTANTE, cuando utilices una fuente externa más la energía del arduino
es necesario UNIR GND o TIERRA para evitar QUEMAR nuestro arduino.
Para controlar el encendido y apagado de un motor vamos a utilizar un transistor NPN 2N2222 y
un relevador de energía eléctrica de 5V DC. El primero permite el paso de GND al relevador para
abrir el circuito y el relevador a su VEZ permite el paso de energía de la fuente externa al motor.
Para mover al sentido contrario el motor es necesario invertir la polaridad, para ello será
necesario utilizar otro componente llamado PUENTE H o bien adquirir un modulo de este tipo
https://electrocrea.com/products/puente-h-l298n
Código
int motor=6;
void setup() {
pinMode(motor, OUTPUT);
}
void loop() {
digitalWrite(motor,HIGH);
delay(4000);
digitalWrite(motor,LOW);
25
delay(4000);
}
Resultado
El motor electrico funcionará por 4 segundas y se detendra el mismo tiempo.
Prácticas propuestas
26
“ACTUADORES” Práctica 6.
Controlando un servomotor
Objetivo
El alumno utiliza el hardware arduino para realizar movimientos mediante un servomotor SG90
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 servomotor SG90
Diagrama de conexión:
Explicación teórica
Un servomotor está compuesto por un mecanismo giratorio muy preciso, que permite maniobrar
el componente a una cierta cantidad de grados, logrando levantar cosas, empujar o dibujar según l
aplicación que quiera darle. Existen de diferentes tamaños siendo su principal diferencia la
cantidad de fuerza o peso que pueden ofrecer o soportar.
https://www.zonamaker.com/arduino/modulos-sensores-y-shields/control-de-servomotores-con-
arduino
Código
void setup()
{
servo1.attach(11); //Asociamos el servo al puerto 11 de Arduino PWM
}
void loop()
{
servo1.write(-90);
delay(2000);
servo1.write(0);
delay(2000);
servo1.write(90);
delay(2000);
servo1.write(0);
delay(2000);
}
Resultado
El servo motor se moverá de izquierda derecha y viceversa.
Prácticas propuestas
28
“MICROCONTROLADORES” Práctica 7.
RGB en la iluminación
Objetivo
Mediante el uso de un led RGB imprimir colores utilizando arduino
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 3 Resistencia de 220 ohms
• 1 foco led RGB
Explicación teórica
29
Existen dos tipos de led RGB: de ánodo común y de cátodo común
De allí es importante, identificar cual es el que posees en tus manos, para realizar dicha
comprobación conecta de la siguiente forma:
En caso de encender tienes un RGB de ánodo común, en caso contrario tienes un RGB de cátodo
común.
Para el caso de cátodo común, el único cambio que debe realizarse es conectar el común a GND. Y
en el código para dar soporte a ambos LEDs en la página
http://arduinocostarica.blogspot.com/2015/01/ejemplo-20-led-rgb-de-anodo-comun.html
Se crea una función llamada:
pasando como parámetros el valor de cada color (entre 0 y 255), y si es anodoComún mediante
30
false o true.
Código
void setup()
{
pinMode(pinRojo, OUTPUT);
pinMode(pinVerde, OUTPUT);
pinMode(pinAzul, OUTPUT);
}
void loop()
{
definirColor(255, 0, 0,true); // rojo
delay(1000);
definirColor(0, 255, 0,true); // verde
delay(1000);
definirColor(0, 0, 255,true); // azul
delay(1000);
definirColor(255, 255, 0,true); // amarillo
delay(1000);
definirColor(80, 0, 80,true); // purpura
delay(1000);
}
31
analogWrite(pinRojo, rojo);
analogWrite(pinVerde, verde);
analogWrite(pinAzul, azul);
}
Resultado
Diversos colores definidos desde código
Prácticas propuestas
32
“Programación de microcontroladores”
Práctica 8.
Usando el control de mi TV. PARTE I Leyendo
valores infrarrojos
Objetivo
Mediante el sensor Receptor De Infrarrojos 1838b se pueda realizar la detección de un control
remoto ordinario de TV para realizar acciones especificar con Arduino.
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de 100 ohms o valor cercano.
• 1 sensor de infrarrojos 1838b
Diagrama de conexión:
33
Explicación teórica
La explicación completa del sensor la pueden encontrar en esta página:
https://naylampmechatronics.com/blog/36_Tutorial-Arduino-y-control-remoto-Infrarrojo.html
y además ejemplos y código del uso del sensor.
Este sensor permite la lectura de diversos dispositivos infrarrojos, como controles de TV,
componentes de audio, DVDs, etc.
El objetivo principal, es que mediante la lectura de valores de los botones de tu control remoto
puedas COPIARLOS para que después realices alguna acción con Arduino.
Los códigos dependiendo del tipo de control pueden venir con un valor en BIT diferente ( 16 y 32
bits son lo más común ). También podrás ver el código en HEXADECIMAL y BINARIO. Los dos
valores que debes GUARDAR para usarlos mas adelante son los bits y el HEXADECIMAL
#include <IRremote.h>
int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;
34
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Empezamos la recepción por IR
}
Serial.print("(");
Serial.print(results->bits, DEC);
Serial.print(" bits)");
if (results->decode_type == UNKNOWN) {
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: ");
}
else if (results->decode_type == RC5) {
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6) {
Serial.print("Decoded RC6: ");
}
else if (results->decode_type == PANASONIC) {
Serial.print("Decoded PANASONIC - Address: ");
Serial.print(results->address, HEX);
Serial.print(" Value: ");
}
else if (results->decode_type == LG) {
35
Serial.print("Decoded LG ");
}
else if (results->decode_type == JVC) {
Serial.print("Decoded JVC ");
}
else if (results->decode_type == AIWA_RC_T501) {
Serial.print("Decoded AIWA RC T501 ");
}
else if (results->decode_type == WHYNTER) {
Serial.print("Decoded Whynter ");
}
Serial.print(results->value, HEX);
Serial.print(" (HEX) , ");
Serial.print(results->value, BIN);
Serial.println(" (BIN)");
void loop() {
if (irrecv.decode(&results)) {
dump(&results);
irrecv.resume(); // empezamos una nueva recepción
}
delay(300);
}
Resultado
Se deberá mostrar el valor devuelto por sensor en el monitor serie
36
Usando el control de mi TV. PARTE II.
Encendiendo un foco con mi control remoto
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de 100 ohms o valor cercano.
• 1 sensor de infrarrojos 1838b
• 1 foco led
• 1 resistencia entre 100 a 500 ohms para el led
Diagrama de conexión
37
Se agrega un led al Arduino conectado al PIN 4, y al GND con una resistencia.
Código
En el código se encuentran marcados en amarillo los códigos HEXADECIMALES utilizados por mis
pruebas, reemplazarlos por los que ustedes copiaron o guardaron de la actividad de lecturas de
valores.
#include "IRremote.h"
int receiver = 3;
IRrecv irrecv(receiver);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(4, OUTPUT);
}
void loop()
{
38
if (irrecv.decode(&results))
{
switch(results.value)
{
case 0x05FF00E6:
digitalWrite(4, !digitalRead(4));
Serial.println("Tecla 1 presionada");
break;
case 0x00FF11AA:
Serial.println("Tecla 2 presionada");
break;
}
irrecv.resume();
}
delay(300);
}
Resultado
El foco debería encender presionando el botón del control remoto de tu TV, y en el monitor serie
aparecería Tecla 1 presionada, en el caso del segundo valor solo aparecería Tecla 2 presionada.
Ejercicios propuestos
1. Encender varios focos a la vez con un solo botón
2. Controlar el color de un foco RGB enviando números desde el control remoto
3. Controlar la velocidad de un motorreductor
39
“Programación de microcontroladores”
Práctica 9.
Controlando mi televisor
Objetivo
Mediante un LED infrarrojo enviar mensajes infrarrojos a un televisor mediante códigos
HEXADECIMALES anteriormente leídos/definidos/capturados.
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de 100 ohms o valor cercano.
• 1 LED INFRARROJO
Diagrama de conexión:
40
Explicación teórica
Una vez contando con los códigos HEXADECIMALES y NUMERO DE BITS del control remoto.
Mediante IRremote es posible enviar dichas codificaciones mediante un LED infrarrojo hacia
cualquier aparato que cuente con esta tecnología.
Código
LO QUE HACE ESTE CODIGO ES: Enviar cada 5 segundos una señal 3 veces separados por 40
milisegundos para asegurar que el receptor lea la señal.
41
/*
* IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
* An IR LED must be connected to Arduino PWM pin 3.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
#include <IRremote.h>
IRsend irsend;
void setup()
{
}
void loop() {
for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xA90, 32);
delay(40);
}
delay(5000); //5 second delay between each signal burst
}
Resultado
Basado en el código hexadecimal indicado en “sendNEC” esta señal se enviará y si el aparato
electrónico lo reconoce ejecutará una acción. Por ejemplo: encender TV, subir volumen, cambiar
canal, etc.
42
“Programación de microcontroladores”
Práctica 10.
Apagando focos desde mi computadora
Objetivo
Mediante un lenguaje de programación y la conexión USB desarrollar una interfaz para apagar y
encender focos LED.
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de 100 ohms o valor cercano.
• 1 led
Diagrama de conexión:
43
Explicación teórica
La comunicación entre el ARDUINO y EL LENGUAJE DE PROGRAMACIÓN C# será a través del
puerto SERIE (conexión USB), dicha conexión dentro de la placa Arduino esta controlado usando
los pines 0 (RX - Receptor) y 1 (TX - Transmisor). Es por eso que pocos tutoriales utilizan dichos
PINES, y si los asignas a otro fin, no podrás conectarte por este puerto.
El código en Arduino es muy simple. Pero es importante observar que se inicializa la comunicación
serial igual que lo hacemos para cuando deseamos imprimir al monitor serie (de allí el nombre), es
importante anotar y recordar la taza de transferencia indicada, comúnmente 9600.
Código
void setup()
{
44
Serial.begin(9600);
pinMode(pinLED, OUTPUT);
}
void loop() {
if (Serial.available() > 0)
{
int option = Serial.read();
if (option == 'a')
{
digitalWrite(pinLED, LOW);
}
if (option == 'b')
{
digitalWrite(pinLED, HIGH);
}
}
}
Procedimiento en C#
En este ejemplo vamos a hacer un formulario simple con dos botones de ON y OFF, que nos
permitirán encender el LED integrado en la placa de Arduino, conectado al Pin9.
En primer lugar arrancamos Visual Studio, y creamos un nuevo proyecto de C#. Para ello pulsamos
en File/New/Project.
45
Se abrirá un formulario vació, que será la ventana principal de nuestro ejemplo. Arrastramos
desde el Toolbox dos botones hasta nuestro formulario, y los ponemos uno encima del otro.
Ahora empleamos la barra de propiedades para cambiar el texto y el nombre tanto de los botones
como del formulario.
46
Dejamos los valores como muestra la siguiente tabla.
Ahora, pulsamos F7 encima del formulario para acceder al código (o pulsamos con el botón
derecho y elegimos "View code").
47
Reemplazamos todo el código por el siguiente.
using System;
using System.Windows.Forms;
namespace BasicSerialPort
{
public partial class frmMain : Form
{
System.IO.Ports.SerialPort ArduinoPort;
public frmMain()
{
InitializeComponent();
48
//vincular eventos
this.FormClosing += FrmMain_FormClosing;
this.btOFF.Click += BtOFF_Click;
this.btON.Click += BtON_Click;
}
Recuerda sustituir el puerto serie del código, en el ejemplo "COM4", por el puerto serie en el que
tengas conectado Arduino.
Resultado
Una aplicación de escritorio con 2 botones, que al ser presionados apagan o prenden un LED
conectado al Arduino.
49
“Programación de microcontroladores”
Práctica 11.
Medidor de intensidad de luz C#
Objetivo
Mediante una interfaz gráfica con C# mostrar la intensidad de luz detectada por una fotoresistencia
con Arduino.
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Resistencia de 10 Kohms o valor cercano.
• 1 fotoresistencia
Diagrama de conexión:
Explicación teórica
En esta práctica se demuestra que mediante la instrucción Serial.println (que hasta ahora hemos
50
utilizado para mandar mensajes a la computadora y observarlos mediante el “famoso” monitor
serie) podemos leer dichos mensajes pero ahora a través de un lenguaje de programación y
modificarlos al gusto.
En C# se utilizan dos controles específicos: un Timer que permite realizar una acción cada cierto
tiempo (configurado por la propiedad Interval) y un ProgressBar para mostrar visualmente la
cantidad de luz u oscuridad de un sensor de luminosidad.
Código Arduino
void setup() {
Serial.begin(9600);
}
void loop() {
int valor = analogRead(A0);
Serial.println(valor);
delay(330);
}
Código C#
using System;
51
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace LeerFotoresistencia
{
public partial class Form1 : Form
{
SerialPort ArduinoPort;
public Form1()
{
InitializeComponent();
ArduinoPort.Close();
ArduinoPort.Dispose();
//crear Serial Port
ArduinoPort = new System.IO.Ports.SerialPort();
ArduinoPort.PortName = comboBox1.Text;
52
ArduinoPort.BaudRate = 9600;
ArduinoPort.Open();
CheckForIllegalCrossThreadCalls = false;
if (ArduinoPort.IsOpen == true)
{
MessageBox.Show("Conectado a arduino!");
timer1.Enabled = true;
}
else
{
MessageBox.Show("El puerto seleccionado NO ES de Arduino");
return;
}
}
Procedimiento C#
Paso 1. Debes crear un nuevo proyecto de Windows Forms en C#
|
53
Paso 2. Deberás crear la siguiente interfaz en el formulario, con los siguientes controles:
• Dos etiquetas (label) una para el texto “Puerto” y otra para “Nivel de luz”
• Una lista desplegable (Combobox) para mostrar los puertos activos de la computadora
• Un botón (Button) para realizar la conexión
• Una barra de progreso (ProgressBar) para mostrar la cantidad de luz, modificar las
propiedades: Minimum a 0 y Maximun a 1024
• Un control de tiempo (Timer) para monitorear cada cierto tiempo la conexión serial,
modificar el valor de la propiedad Interval a 330 (son milisegundos).
Resultado
Una aplicación tipo escritorio que se conecta a un Arduino y que lee cada 330 milisegundos el
valor de la fotoresistencia, mostrando gráficamente mediante un control tipo barra la cantidad de
luz existente.
54
“Puertos y buses”
Práctica 12.
Mi control de juegos (<-- -->)
Objetivo
Que el alumno mediante el empleo de botones push button pueda crear una control personalizado
para jugar video juegos en la computadora utilizando la interfaz serial.
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 2 resistencias de 220 Kohms.
• 2 Push button
Diagrama de conexión:
55
Explicación teórica
En este ejercicio se hace uso de la conexión serial para el envió de datos de Arduino a la
computadora.
Se utilizan las instrucciones:
Serial.begin(9600); // Para la inicialización de la comunicación
Una vez realizada la conexión entre la aplicación C# con el puerto donde esta instalado el Arduino,
puede abrirse el juego en primer plano y podremos presionar los push button haciendo las
acciones que haría la tecla física en el teclado.
Código Arduino
void setup()
{
pinMode(boton1, INPUT);
pinMode(boton2,INPUT);
}
void loop()
{
if (digitalRead(boton1) == HIGH) {
Serial.println(“a”);
delay(200);
}
if (digitalRead(boton2) == HIGH) {
Serial.println(“b”);
56
delay(200);
}
delay(5);
}
Código C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace ControlJuego
{
public partial class Form1 : Form
{
SerialPort ArduinoPort;
public Form1()
{
InitializeComponent();
57
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
ArduinoPort.Close();
ArduinoPort.Dispose();
//crear Serial Port
ArduinoPort = new System.IO.Ports.SerialPort();
ArduinoPort.PortName = comboBox1.Text;
ArduinoPort.BaudRate = 9600;
ArduinoPort.Open();
CheckForIllegalCrossThreadCalls = false;
if (ArduinoPort.IsOpen == true)
{
MessageBox.Show("Conectado a arduino!");
timer1.Enabled = true;
}
else
{
MessageBox.Show("El puerto seleccionado NO ES de Arduino");
return;
}
}
}
}
58
}
Procedimiento C#
Paso 1. Debes crear un nuevo proyecto de Windows Forms en C# con el nombre que desees
|
Paso 2. Deberás crear la siguiente interfaz en el formulario, con los siguientes controles:
Resultado
Una aplicación C# que una vez abierta y conectada podrás minizar y e iniciar a jugar el juego que
mas te guste, en este caso, solo se muestra el uso de 2 botones por ejemplo para saltar o disparar.
59
Para hacerlo mas completo, agregar mas botones al Arduino, y agregar las condiciones necesarias
al código.
60
“Interfaces”
Práctica 13.
Un dato que viaja por Wifi
Objetivo
Que los alumnos mediante el componente electrónico Wifi ESP8266 (Nodemcu V2) puedan enviar el
valor de la temperatura del sensor DHT11 a una base de datos en Internet.
Materiales:
• 1 Arduino nano/uno
• Cables dupont
• 1 Nodemcu V2.
• 1 DHT11
Diagrama de conexión:
Explicación teórica
Una de las grandes ventajas del modulo ESP8266 es que es en si mismo un componente
altamente configurable, desde ser un simple cliente Web hasta convertirse en un servidor de red.
Ver https://esp8266-arduino-spanish.readthedocs.io/es/latest/esp8266wifi/readme.html
En este caso dicho modulo viene integrado en el Nodemcu que incluye puertos de E/S para realizar
diversas actividades.
61
El sensor DHT11 nos permite realizar la lectura de temperatura y humedad del ambiente, siendo
esta lectura DIGITAL.
Debe realizarse la instalación de una librería para el DHT11 (ver tutorial “Installing DHT Sensor
Library” en https://lastminuteengineers.com/esp8266-dht11-dht22-web-server-tutorial/)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
// Uncomment one of the lines below for whatever DHT sensor type you're using!
//#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
ESP8266WebServer server(80);
// DHT Sensor
uint8_t DHTPin = D8;
float Temperature;
float Humidity;
void setup() {
Serial.begin(115200);
delay(100);
62
pinMode(DHTPin, INPUT);
dht.begin();
Serial.println("Connecting to ");
Serial.println(ssid);
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
void handle_OnConnect() {
63
server.send(200, "text/html", SendHTML(Temperature,Humidity));
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}
ptr +="</div>\n";
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;
}
64
Procedimiento C#
Es importante indicar que se debe reemplazar en el código siguiente los datos de SSID y
PASSWORD para que correspondan a tu modem o dispositivo de acceso a la red. Una vez en la red
la información de temperatura estará disponible en ella por medio de la dirección IP asignada al
ESP8266 y que puede verse desde el monitor serial.
Desde cualquier dispositivo en la red podrá accesarse a dicha IP y obtener la información del
sensor leído desde Arduino.
Resultado
Se espera que desde cualquier dispositivo conectado a la red que cuente con un navegador Web y
mediante la dirección IP se pueda acceder a la información de temperatura y humedad leídos
desde el modulo ESP8266.
65
“EJERCICIOS Y/O ACTIVIDADES PARA EVALUAR
CON FECHAS DE ENTREGA”
66