En este proyecto implementaremos un sistema para gestionar 4 entradas digitales, 4 salidas digitales y una pantalla de cristal líquido LCD de 16 x 2 caracteres.
Además realizaremos una placa base y algunas placas periféricas para usarlas en sustitución de la placa de pruebas (protoboard).
Esto nos permitirá implementar, ejecutar y depurar este y futuros proyectos de una manera rápida en lo que se refiere al cableado y los componentes básicos que requieren cualquier circuito electrónico para un microcontrolador tales como L.E.D.'s, resistencias, clemas, pulsadores, etc.
Esto nos permitirá implementar, ejecutar y depurar este y futuros proyectos de una manera rápida en lo que se refiere al cableado y los componentes básicos que requieren cualquier circuito electrónico para un microcontrolador tales como L.E.D.'s, resistencias, clemas, pulsadores, etc.
De esta manera, una
vez realizadas las placas estarán siempre disponible para comenzar
cualquier nuevo proyecto centrándonos solo en el software.
La placa base tendrá una interfaz física de idéntica distribución que el puerto de entradas y salidas de propósito general ( GPIO ) de la RaspberryPi B PLUS.
Para la conexión de la placa base con el Arduino Micro, se usará una placa conversora de la distribución de los contactos entre ambos.
La placa base tendrá una interfaz física de idéntica distribución que el puerto de entradas y salidas de propósito general ( GPIO ) de la RaspberryPi B PLUS.
Para la conexión de la placa base con el Arduino Micro, se usará una placa conversora de la distribución de los contactos entre ambos.
La placa base
servirá de nexo entre nuestro microcontrolador principal, ya sea RaspberryPi o Arduino y los elementos de
campo tales como relés, entradas-salidas digitales, sondas de
temperatura, pantallas LCD y otros dispositivos habituales de un
sistema de automatización y control.
Con el programa EntradasSalidasDigitalesMasLcd*.* , probaremos todas las placas y circuiterías realizadas usando ambos microcontroladores.
1 Placas base y periféricas.
1.1 Circuitos básicos
1.1.1 Salida
digital. Activación de un diodo emisor de luz LED.
1.1.2 Salida
digital. Activación de un micro relé.
1.1.3 Entrada
digital.
1.1.4 Entrada
digital opto-acoplada.
1.1.5 Pantalla LCD 16 x 02.
1.1.5 Pantalla LCD 16 x 02.
1.2 Imágenes de los circuitos.
1.2.1 Placa base.
1.2.2 Zócalo
pantalla LCD.
1.2.3 Zócalo para
módulo exterior de 4 relés.
1.2.4 Módulo
exterior de 2 entradas digitales.
1.2.5 Módulo
exterior de 2 entradas digitales opto-acopladas.
1.2.6 Sensores de
temperatura DS18B20.
1.2.7 Interfaz para Arduino Micro.
2 Software.
2.1 Entorno de programación.
2.2 Librerías especiales.
2.3 Archivo EntradasSalidasDigitalesMasLcdRaspberryPi.cpp
2.4 Archivo de EntradasSalidasDigitalesMasLcdArduino.ino
3 Descargas.
3.1 Esquemas de conexionado.
3.2 EntradasSalidasDigitalesMasLcdRaspberryPi.cpp
3.3 EntradasSalidasDigitalesMasLcdArduino.ino
4 Vídeo demostración
4.1 Demo EntradasSalidasDigitalesMasLcd *
1.2.7 Interfaz para Arduino Micro.
2 Software.
2.1 Entorno de programación.
2.2 Librerías especiales.
2.3 Archivo EntradasSalidasDigitalesMasLcdRaspberryPi.cpp
2.4 Archivo de EntradasSalidasDigitalesMasLcdArduino.ino
3 Descargas.
3.1 Esquemas de conexionado.
3.2 EntradasSalidasDigitalesMasLcdRaspberryPi.cpp
3.3 EntradasSalidasDigitalesMasLcdArduino.ino
4 Vídeo demostración
4.1 Demo EntradasSalidasDigitalesMasLcd *
1 PLACAS BASE Y PERIFÉRICAS
1.1Circuitos básicos.
1.1.1 Activación de un diodo emisor de luz LED.
Descripción del funcionamiento:
Al activarse la
salida del microcontrolador, se establecerá una corriente entre esta
misma y la conexión a tierra del indicador LED, iluminándolo he
indicándonos el estado de la misma.
Para la alimentación
de un diodo LED, es necesario conocer primero algunas características,
como por ejemplo su tensión umbral (tuV) y el rango de intensidad ( I ) para su funcionamiento. Esto nos permitirá calcular una resistencia limitadora adecuada a las
mismas. La tensión umbral (tuV) difiere según el color del LED.
En nuestro caso solo
utilizaremos LED's verdes y rojos de 5 mm de diámetro.
La tensión umbral
(tuV) para que un LED rojo conduzca corriente es de 1,9 V.
La tensión umbral
(tuV) para que un LED veede conduzca corriente es de 2,4 V.
La intensidad
recomendada para estos LED's es entre 5mA y 25 mA, dependiendo de la
intensidad de brillo que necesitemos.
Para el valor del
voltaje del Pin de salida, consideraremos 5V.
Nuestra intensidad
de referencia será de 5 mA.
Para el calculo de las resistencias utilizaremos únicamente la Ley de Ohm
R= V / I
Restamos al voltaje de referencia V, la tensión umbral del LED tuV
R = (V – tuV) / I
Resistencia
limitadora LED rojo R = (5 – 1,9) / 0,005 = 620 h.
Resistencia
limitadora LED verde R = (5 – 2,4) / 0,005 = 520 h.
Potencia de la
resistencia P =V·I ; 3,1 · 0,005 = 0,0155 W, menos de ¼ de
W.
Usaremos las
resistencias comerciales de ¼ W mas cercanas a estos valores.
1.1.2 Activación de un micro relé.
La activación de la bobina de un relé a través de la salida de un microcontrolador no la podemos hacer directamente, pues normalmente el consumo de su bobina extralimita el soportado por la salida del microcontrolador.
El método más habitual de hacerlo es mediante un transistor.
En nuestro caso
hemos utilizado el siguiente circuito para las salidas digitales de
relé:
Descripción del funcionamiento:
Con la salida del
microcontrolador desactivada, el flujo de corriente entre la unión colector
(c) y el emisor (e) es nulo y no hay conducción eléctrica.
El transistor BD137 está en estado de corte.
El transistor BD137 está en estado de corte.
Con la salida del
microcontrolador activada se establecerá una pequeña corriente ,
(la que nos permite circular la resistencia de 1K1 ) entre la salida
del microcontrolador y la conexión a tierra del transistor en
el emisor, pasando antes por la base (b) del transistor.
El transistor está en estado de saturación.
El transistor está en estado de saturación.
Este nuevo estado de saturación convertirá en conductora al unión colector- emisor, permitiendo así un flujo de corriente mucho mayor desde la
toma de 5Vcc, hasta la conexión a tierra del transistor en el
emisor.
Este segundo flujo
de corriente se verá forzado a circular a través de la bobina del relé,
energizándola a su paso hacia la conexión a tierra del transistor en el emisor.
Cuando la salida del microcontrolador se desactive, el transistor volverá al estado de corte.
Cuando la salida del microcontrolador se desactive, el transistor volverá al estado de corte.
Esta transición de estados entre saturación y corte puede generar
altos picos de tensión en la propia bobina, y que pueden resultar
peligrosos para vida útil del transistor.
El diodo rectificador
1N4007 evitará esta situación cortocircuitando estos picos
indeseados.
1.1.3 Entrada digital.
Descripción del funcionamiento:
El pin de entrada está conectado mediante la resistencia de 4K3 al tierra. En el pin de entrada se están recibiendo en este momento 0Vcc que digitalmente serán interpretados como un "0" lógico.
Cuando se cierra el
pulsador, se reciben 5Vcc en el pin de entrada que digitalmente será interpretado como un "1" lógico.
La resistencia 4K3
evitará el cruce de la fuente entre +5Vcc y tierra cuando se cierre
el pulsador.
1.1.4 Entrada digital opto-acoplada.
Descripción del funcionamiento:
El opto-acoplador es una solución que nos permite proteger a nuestras entradas y salidas digitales de sobre tensiones y derivaciones a tierra indeseadas, que pueden incluso averiar nuestro microcontrolador irreversiblemente.
El pin de entrada
está conectado mediante la resistencia de 4K3 al tierra.
Cuando el
foto-transistor del 4N25 entra en estado de saturación se
reciben 5Vcc en el pin de entrada.
Para ello es
necesario accionar el pulsador, que al cerrar el circuito, se
iluminará el LED encapsulado dentro del opto-acoplador. Esta luz
será recibida por el foto-transistor que entrará en
saturación.
Cualquier circuito
de entrada o salida digital puede estar complementado
con un indicador luminoso LED para conocer su estado, siendo el
siguiente su esquema:
con un indicador luminoso LED para conocer su estado, siendo el
siguiente su esquema:
1.1.5 Pantalla LCD 16 x 02
Descripción del funcionamiento:
El potenciómetro 1K5 regula el contraste de la pantalla por el pin 3.La resistencia 330 limita la corriente en el LED de retro-iluminación de la pantalla por el pin 15.
CONTROL:
El estado del pin 6 E indica si es posible el acceso a la pantalla.
El estado del pin 5 R/W indica el tipo de acceso, si es de lectura o escritura.
El estado del pin 4 indica si lo recibido por el bus se deben considerar un dato o comando.
Los pins 7 a 14 son el bus de datos/comandos.
1.2 Imágenes de los circuitos.
Como se podrá comprobar a continuación las extensiones exteriores de la placa base así como los módulos están basados en conectores de 8 contactos RJ45 y espadines de 4 contactos, estos últimos muy utilizados en proyectos de Arduino.
En cualquier caso todos los componentes utilizados son de stock permanente en cualquier almacén del ramo.
1.2.1 Placa base.
2 SoftWare.
2.1 Entorno de programación.
El entorno de de desarrollo utilizado para la programación de la RaspberryPi, es el IDE Code::Blocks, por su facilidad de manejo, por ser de código abierto y por el amplio soporte ofrecido.
Se puede instalar fácilmente una copia en la RaspberryPi.
Link de Code::Blocks.org http://www.codeblocks.org/
Para le programación del Arduino Micro, claro está se ha utilizado se ha utilizado el IDE de Arduino.
Se puede instalar fácilmente una copia en la RaspberryPi.
Link de Arduino http://arduino.cc/en/pmwiki.php?n=main/software
2.2 Librerías especiales.
Para realizar este proyecto con RaspberryPi B+, se han incluido en el código fuente algunas librerías especiales que facilitan el control del puerto de entradas y salidas de propósito general ( GPIO ) de la RaspberryPi, además del control de la pantalla LCD. Estas son -wiringPi.h - y -lcd.h-.
En las opciones del enlazador "linker" del compilador, deben incluirse además las siguientes librerias , -libwiringPi.so- y -libwiringPiDev.so-.
De todo esto se obtiene amplia información en la página oficial de wiringPi, http://wiringpi.com/ .
Para la misma aplicaión con Arduino Micro, se han incluido las librerías -Wire.h- y - LiquidCrystal.h- am,bas incluuidas en el IDE de ARDUINO.
2.3 Listado de
EntradasSalidasDigitalesMasLcdRaspberryPi.cpp
El siguiente programa escanea las entradas digitales y acciona intermitentemente el relé que corresponda a la siguiente asignación:
-pulsadorDePlaca->releDePlaca-
-pulsadorExterior_1->moduloSalida_1-
-pulsadorExterior_2->moduloSalida_2-
-pulsadorExterior_3->moduloSalida_3-
-pulsadorExterior_4->moduloSalida_4-
El proceso finaliza cuando se han ejecutado 100 escaneos, ó cuando se activan simultáneamente las entradas uno y dos.
/** --- EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -----
Programa de demostraci'on de programaci'on de la
Raspberrypi en C,C++
Uso de la libreria wiringPi.h
http:/wiringpi.com
El siguiente programa muestra como activar intermitentemente una serie de rel'es,
dependiendo de la entrada digital que que est'e activada en ese momento.
Adem'as en en la pantalla LCD impri,mir'a la salida activa.
El programa finaliza cuando se pulsan dos entradas preseleccionas a la vez o
cuando se realizan 100 escaneos de entradas.
La denominaci'on de los pines utilizada el la de wiringPi wPi. Para conocer la equivalencia
entre los distintos sistemas de nominaci'on de pines, teclear en la consola de comandos de
la raspberry :
$ sudo readall
Manuel Protasio
email:
manuelprotasio@gmail.com
http://mprsof.blogspot.com.es
*/
#include <iostream>
#include <stdio.h>
#include <wiringPi.h>
#include <lcd.h>
using namespace std;
// PANTALLA LCD
#define LCD_FILAS 2 // cantidad de filas
#define LCD_COLUMNAS 16 // cantidad de columnas
#define LCD_BITS 4 // bus de bits de datos/comandos
#define LCD_DB4 24 // pin GPIO 24 --> lcd 11
#define LCD_DB5 23 // pin GPIO 23 --> lcd 12
#define LCD_DB6 22 // pin GPIO 22 --> lcd 13
#define LCD_DB7 21 // pin GPIO 21 --> lcd 14
#define LCD_RS 25 // pin GPIO 25 --> lcd 6
#define LCD_E 30 // pin GPIO 30 --> lcd 4
int pantalla;
// PINS DE ENTRADA
int pulsadorPlaca=0; // pin GPIO 0 --> Pulsador placa
int pulsadorExterior_1=31; // pin GPIO 31 --> Pulsador exterior 1
int pulsadorExterior_2=6; // pin GPIO 36 --> Pulsador exterior 2
int pulsadorExterior_3=5; // pin GPIO 5 --> Pulsador exterior 3
int pulsadorExterior_4=4; // pin GPIO 4 --> Pulsador exterior 4
//PINS DE SALIDA
int ledDePlaca=2; // pin GPIO 2--> ledDePlaca
int releDePlaca=3; // pin GPIO 3 --> releDePlaca
int moduloSalida_1=29; // pin GPIO 29 --> salida 1 en modulo de reles
int moduloSalida_2=26; // pin GPIO 26 --> salida 2 en modulo de reles
int moduloSalida_3=27; // pin GPIO 27 --> salida 3 en modulo de reles
int moduloSalida_4=28; // pin GPIO 28 --> salida 4 en modulo de reles
int pulsadorActivo=100;
//Prototipos
void SaludoInicial();
void ConfigurarPinsDeSalida();
void ConfigurarPinsDeEntrada();
void ActivaSalida(int pulsador,int numeroBucle);
int EscanearPulsadores();
void SaludoFinal();
int main()
{
// Inicia wiringPi
wiringPiSetup();
ConfigurarPinsDeSalida();
ConfigurarPinsDeEntrada();
// Inicia LCD.
pantalla=lcdInit (LCD_FILAS,
LCD_COLUMNAS,
LCD_BITS,
LCD_RS,
LCD_E,
LCD_DB4,
LCD_DB5,
LCD_DB6,
LCD_DB7,
0,0,0,0);
SaludoInicial();
for (int k=100; k>=0; k--)
{
if ( EscanearPulsadores()==(pulsadorExterior_1+pulsadorExterior_2))
{
cout<<"\n-- EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -- acab'o por usuario\n";
SaludoFinal();
return 0;
}
ActivaSalida(EscanearPulsadores(),k);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, " ");
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, "Bucle numero %d",k);
}
cout<<"\n-- EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -- acab'o correctamente\n";
SaludoFinal();
return 0;
}
void SaludoInicial()
{
// Saludo en LCD
lcdClear(pantalla);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, "mprsoft-FREDINSA");
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla," Bienvenido ");
// Saludo en el monitor de la Raspberry
cout<<"Bienvenido al mundo de la RaspberryPi\n ";
cout<<"\n--EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -- iniciar'a en 5 segundos\n\n ";
cout<<"\nEl programa finaliza transcurridos 100 lecturas, o \n";
cout<<"\nactivando simultaneamente las entradas uno y dos";
cout<<"\n";
delay(5000);/* */
cout<<"\nActive cualquier entrada digital para activar el rel'e asociado";
cout<<"\n";
}
void ConfigurarPinsDeSalida()
{
pinMode(ledDePlaca,OUTPUT);
pinMode(releDePlaca,OUTPUT);
pinMode(moduloSalida_1,OUTPUT);
pinMode(moduloSalida_2,OUTPUT);
pinMode(moduloSalida_3,OUTPUT);
pinMode(moduloSalida_4,OUTPUT);
}
void ConfigurarPinsDeEntrada()
{
pinMode (pulsadorExterior_1,INPUT);
pinMode (pulsadorExterior_2,INPUT);
pinMode (pulsadorExterior_3,INPUT);
pinMode (pulsadorExterior_4,INPUT);
pinMode(pulsadorPlaca,INPUT);
}
int EscanearPulsadores()
{
if ( digitalRead(pulsadorExterior_1)==1 && digitalRead(pulsadorExterior_2)==1)
{
pulsadorActivo=pulsadorExterior_1+pulsadorExterior_2;
return pulsadorActivo;
}
if ( digitalRead(pulsadorPlaca))pulsadorActivo=pulsadorPlaca;
if ( digitalRead(pulsadorExterior_1))pulsadorActivo=pulsadorExterior_1;
if ( digitalRead(pulsadorExterior_2))pulsadorActivo=pulsadorExterior_2;
if ( digitalRead(pulsadorExterior_3))pulsadorActivo=pulsadorExterior_3;
if ( digitalRead(pulsadorExterior_4))pulsadorActivo=pulsadorExterior_4;
return pulsadorActivo;
}
void ActivaSalida(int pulsador,int numeroBucle)
{
int salida=1000;
char mensaje[8]="";
if (pulsador==pulsadorPlaca)
{
salida=releDePlaca;
sprintf(mensaje,"%s","PLACA ");
}
if (pulsador==pulsadorExterior_1)
{
salida=moduloSalida_1;
sprintf(mensaje,"%s"," UNO ");
}
if (pulsador==pulsadorExterior_2)
{
salida=moduloSalida_2;
sprintf(mensaje,"%s"," DOS ");
}
if (pulsador==pulsadorExterior_3)
{
salida=moduloSalida_3;
sprintf(mensaje,"%s"," TRES ");
}
if (pulsador==pulsadorExterior_4)
{
salida=moduloSalida_4;
sprintf(mensaje,"%s","CUATRO");
}
if (pulsador==100)
{
salida=100;
sprintf(mensaje,"%s","niguno");
}
for (int k=0; k<5; k++)
{
digitalWrite(salida,HIGH);
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla,"Rele %s ON ",mensaje);
delay(100);
digitalWrite(salida,LOW);
delay(100);
if (EscanearPulsadores()!=pulsador)k=11;
}
}
void SaludoFinal()
{
// Saludo final LCD
lcdClear(pantalla);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, "mprsoft-FREDINSA");
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla,"Demo Finalizada ");
delay(5000);
lcdClear(pantalla);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, " http://mrpsof. ");
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla,"blogspot.com.es ");
}// Fin de EntradasSaliodasdDigitalesMasLcdRaspberryPi.cpp
Programa de demostracion de programaci'on de la Arduino Micro
El siguiente programa muestra como activar intermitentemente una serie de rel'es,
dependiendo de la entrada que que este activada en ese momento.
Adem'as en en la pantalla LCD impri,mir'a la salida activa.
El programa finaliza cuando se pulsan dos entradas preseleccionas a la vez o
cuando se realizan 100 escaneos de entradas.
Manuel Protasio
email:
manuelprotasio@gmail.com
http://mprsof.blogspot.com.es/
*/
#include <Wire.h>
#include <LiquidCrystal.h>
// PANTALLA LCD
#define LCD_FILAS 2 //cantidad de filas
#define LCD_COLUMNAS 16 //cantidad de columnas
#define LCD_DB4 9 //pin 9 --> lcd 11
#define LCD_DB5 8 //pin 8 --> lcd 12
#define LCD_DB6 7 //pin 7 --> lcd 13
#define LCD_DB7 6 //pin 6 --> lcd 14
#define LCD_RS 10 //pin 10 --> lcd 6
#define LCD_E 5 //pin 5 --> lcd 4
//PINS DE SALIDA
#define moduloSalida_1 11 // pin 11 --> salida 1 en modulo de reles
#define moduloSalida_2 A1 // pin A1 --> salida 2 en modulo de reles
#define moduloSalida_3 A0 // pin A0 --> salida 3 en modulo de reles
#define moduloSalida_4 12 // pin 12 --> salida 4 en modulo de reles
// PINS DE ENTRADA
#define pulsadorExterior_1 A2 // pin A2 -->Pulsador exterior 1
#define pulsadorExterior_2 A3 // pin A3 -->Pulsador exterior 2
#define pulsadorExterior_3 A4 // pin A4 -->Pulsador exterior 3
#define pulsadorExterior_4 A5 // pin A5 -->Pulsador exterior 4
int pulsadorActivo=100;
int contadorDeBucles=100;
LiquidCrystal pantalla(LCD_RS,LCD_E, LCD_DB4,LCD_DB5,LCD_DB6,LCD_DB7);
void setup(){
// Tipo de pantalla de 16 caracteres por dos lineas
pantalla.begin(LCD_COLUMNAS,LCD_FILAS);
// Velocidad de transmision al monitor serie.
Serial.begin(9600);
ConfigurarPinsDeSalida();
ConfigurarPinsDeEntrada();
SaludoInicial();
}
void loop() {
if (EscanearPulsadores()==(pulsadorExterior_1+pulsadorExterior_2))
{
Serial.print ("\n-- EntradasSalidasDigitalesMasLcdArduino.ino -- acab'o por usuario\n");
SaludoFinal();
}
ActivaSalida(EscanearPulsadores());
pantalla.setCursor(0,0);
pantalla.write(" ");
pantalla.setCursor(0,0);
pantalla.write("Bucle numero ");
pantalla.print(contadorDeBucles);
Serial.print ("\n-- Numero de bucle ");
Serial.print (contadorDeBucles,DEC);
Serial.println();
contadorDeBucles--;
if (contadorDeBucles<=0)
{
Serial.print ("\n-- EntradasSalidasDigitalesMasLcdArduino.ino -- acab'o correctamente\n");
SaludoFinal();
}
}
void SaludoInicial()
{
// Saludo en LCD
pantalla.setCursor(0,0);
pantalla.write("mprsoft-FREDINSA");
pantalla.setCursor(0,1);
pantalla.write(" Bienvenido ");
delay(5000);
// Saludo en monitor Serial
Serial.print ("Bienvenido al mundo de Arduino\n ");
Serial.print ("\nEntradasSalidasDigitalesMasLcdArduino.ino// iniciar'a en 5 segundos\n\n ");
Serial.print ("\nEl programa finaliza transcurridos 100 lecturas, o \n");
Serial.print ("\nactivando simultaneamente las entradas uno y dos");
Serial.print ("\n");
delay(5000);
Serial.print ("\nActive cualquier entrada digital para activar el rel'e asociado");
Serial.print ("\n");
}
void ConfigurarPinsDeSalida()
{
pinMode(moduloSalida_1,OUTPUT);
pinMode(moduloSalida_2,OUTPUT);
pinMode(moduloSalida_3,OUTPUT);
pinMode(moduloSalida_4,OUTPUT);
}
void ConfigurarPinsDeEntrada()
{
pinMode (pulsadorExterior_1,INPUT);
pinMode (pulsadorExterior_2,INPUT);
pinMode (pulsadorExterior_3,INPUT);
pinMode (pulsadorExterior_4,INPUT);
}
int EscanearPulsadores()
{
if ( digitalRead(pulsadorExterior_1)==1 && digitalRead(pulsadorExterior_2)==1)
{
pulsadorActivo=pulsadorExterior_1+pulsadorExterior_2;
return pulsadorActivo;
}
if ( digitalRead(pulsadorExterior_1))pulsadorActivo=pulsadorExterior_1;
if ( digitalRead(pulsadorExterior_2))pulsadorActivo=pulsadorExterior_2;
if ( digitalRead(pulsadorExterior_3))pulsadorActivo=pulsadorExterior_3;
if ( digitalRead(pulsadorExterior_4))pulsadorActivo=pulsadorExterior_4;
return pulsadorActivo;
}
void ActivaSalida(int pulsador)
{
int salida=1000;
char mensaje[8]="";
if (pulsador==pulsadorExterior_1)
{
salida=moduloSalida_1;
sprintf(mensaje,"%s"," UNO ");
}
if (pulsador==pulsadorExterior_2)
{
salida=moduloSalida_2;
sprintf(mensaje,"%s"," DOS ");
}
if (pulsador==pulsadorExterior_3)
{
salida=moduloSalida_3;
sprintf(mensaje,"%s"," TRES ");
}
if (pulsador==pulsadorExterior_4)
{
salida=moduloSalida_4;
sprintf(mensaje,"%s","CUATRO");
}
if (pulsador==100)
{
salida=100;
sprintf(mensaje,"%s","niguno");
}
for (int k=0; k<5; k++)
{
digitalWrite(salida,HIGH);
pantalla.setCursor(0,1);
pantalla.write("Rele ");
pantalla.write(mensaje);
pantalla.write(" ON");
delay(100);
digitalWrite(salida,LOW);
delay(100);
if (EscanearPulsadores()!=pulsador)k=11;
}
}
void SaludoFinal()
{
pantalla.setCursor(0,0);
pantalla.write( "mprsoft-FREDINSA");
pantalla.setCursor(0,1);
pantalla.write("Demo Finalizada ");
delay(5000);
pantalla.setCursor(0,0);
pantalla.write(" http://mprsof. ");
pantalla.setCursor(0,1);
pantalla.write("blogspot.com.es ");
delay(5000);
SaludoFinal();
}// Fin de EntradasSalidasDigitalesMasLcdArduino.ino
-pulsadorDePlaca->releDePlaca-
-pulsadorExterior_1->moduloSalida_1-
-pulsadorExterior_2->moduloSalida_2-
-pulsadorExterior_3->moduloSalida_3-
-pulsadorExterior_4->moduloSalida_4-
El proceso finaliza cuando se han ejecutado 100 escaneos, ó cuando se activan simultáneamente las entradas uno y dos.
/** --- EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -----
Programa de demostraci'on de programaci'on de la
Raspberrypi en C,C++
Uso de la libreria wiringPi.h
http:/wiringpi.com
El siguiente programa muestra como activar intermitentemente una serie de rel'es,
dependiendo de la entrada digital que que est'e activada en ese momento.
Adem'as en en la pantalla LCD impri,mir'a la salida activa.
El programa finaliza cuando se pulsan dos entradas preseleccionas a la vez o
cuando se realizan 100 escaneos de entradas.
La denominaci'on de los pines utilizada el la de wiringPi wPi. Para conocer la equivalencia
entre los distintos sistemas de nominaci'on de pines, teclear en la consola de comandos de
la raspberry :
$ sudo readall
Manuel Protasio
email:
manuelprotasio@gmail.com
http://mprsof.blogspot.com.es
*/
#include <iostream>
#include <stdio.h>
#include <wiringPi.h>
#include <lcd.h>
using namespace std;
// PANTALLA LCD
#define LCD_FILAS 2 // cantidad de filas
#define LCD_COLUMNAS 16 // cantidad de columnas
#define LCD_BITS 4 // bus de bits de datos/comandos
#define LCD_DB4 24 // pin GPIO 24 --> lcd 11
#define LCD_DB5 23 // pin GPIO 23 --> lcd 12
#define LCD_DB6 22 // pin GPIO 22 --> lcd 13
#define LCD_DB7 21 // pin GPIO 21 --> lcd 14
#define LCD_RS 25 // pin GPIO 25 --> lcd 6
#define LCD_E 30 // pin GPIO 30 --> lcd 4
int pantalla;
// PINS DE ENTRADA
int pulsadorPlaca=0; // pin GPIO 0 --> Pulsador placa
int pulsadorExterior_1=31; // pin GPIO 31 --> Pulsador exterior 1
int pulsadorExterior_2=6; // pin GPIO 36 --> Pulsador exterior 2
int pulsadorExterior_3=5; // pin GPIO 5 --> Pulsador exterior 3
int pulsadorExterior_4=4; // pin GPIO 4 --> Pulsador exterior 4
//PINS DE SALIDA
int ledDePlaca=2; // pin GPIO 2--> ledDePlaca
int releDePlaca=3; // pin GPIO 3 --> releDePlaca
int moduloSalida_1=29; // pin GPIO 29 --> salida 1 en modulo de reles
int moduloSalida_2=26; // pin GPIO 26 --> salida 2 en modulo de reles
int moduloSalida_3=27; // pin GPIO 27 --> salida 3 en modulo de reles
int moduloSalida_4=28; // pin GPIO 28 --> salida 4 en modulo de reles
int pulsadorActivo=100;
//Prototipos
void SaludoInicial();
void ConfigurarPinsDeSalida();
void ConfigurarPinsDeEntrada();
void ActivaSalida(int pulsador,int numeroBucle);
int EscanearPulsadores();
void SaludoFinal();
int main()
{
// Inicia wiringPi
wiringPiSetup();
ConfigurarPinsDeSalida();
ConfigurarPinsDeEntrada();
// Inicia LCD.
pantalla=lcdInit (LCD_FILAS,
LCD_COLUMNAS,
LCD_BITS,
LCD_RS,
LCD_E,
LCD_DB4,
LCD_DB5,
LCD_DB6,
LCD_DB7,
0,0,0,0);
SaludoInicial();
for (int k=100; k>=0; k--)
{
if ( EscanearPulsadores()==(pulsadorExterior_1+pulsadorExterior_2))
{
cout<<"\n-- EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -- acab'o por usuario\n";
SaludoFinal();
return 0;
}
ActivaSalida(EscanearPulsadores(),k);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, " ");
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, "Bucle numero %d",k);
}
cout<<"\n-- EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -- acab'o correctamente\n";
SaludoFinal();
return 0;
}
void SaludoInicial()
{
// Saludo en LCD
lcdClear(pantalla);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, "mprsoft-FREDINSA");
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla," Bienvenido ");
// Saludo en el monitor de la Raspberry
cout<<"Bienvenido al mundo de la RaspberryPi\n ";
cout<<"\n--EntradasSalidasDigitalesMasLcdRaspberryPi.cpp -- iniciar'a en 5 segundos\n\n ";
cout<<"\nEl programa finaliza transcurridos 100 lecturas, o \n";
cout<<"\nactivando simultaneamente las entradas uno y dos";
cout<<"\n";
delay(5000);/* */
cout<<"\nActive cualquier entrada digital para activar el rel'e asociado";
cout<<"\n";
}
void ConfigurarPinsDeSalida()
{
pinMode(ledDePlaca,OUTPUT);
pinMode(releDePlaca,OUTPUT);
pinMode(moduloSalida_1,OUTPUT);
pinMode(moduloSalida_2,OUTPUT);
pinMode(moduloSalida_3,OUTPUT);
pinMode(moduloSalida_4,OUTPUT);
}
void ConfigurarPinsDeEntrada()
{
pinMode (pulsadorExterior_1,INPUT);
pinMode (pulsadorExterior_2,INPUT);
pinMode (pulsadorExterior_3,INPUT);
pinMode (pulsadorExterior_4,INPUT);
pinMode(pulsadorPlaca,INPUT);
}
int EscanearPulsadores()
{
if ( digitalRead(pulsadorExterior_1)==1 && digitalRead(pulsadorExterior_2)==1)
{
pulsadorActivo=pulsadorExterior_1+pulsadorExterior_2;
return pulsadorActivo;
}
if ( digitalRead(pulsadorPlaca))pulsadorActivo=pulsadorPlaca;
if ( digitalRead(pulsadorExterior_1))pulsadorActivo=pulsadorExterior_1;
if ( digitalRead(pulsadorExterior_2))pulsadorActivo=pulsadorExterior_2;
if ( digitalRead(pulsadorExterior_3))pulsadorActivo=pulsadorExterior_3;
if ( digitalRead(pulsadorExterior_4))pulsadorActivo=pulsadorExterior_4;
return pulsadorActivo;
}
void ActivaSalida(int pulsador,int numeroBucle)
{
int salida=1000;
char mensaje[8]="";
if (pulsador==pulsadorPlaca)
{
salida=releDePlaca;
sprintf(mensaje,"%s","PLACA ");
}
if (pulsador==pulsadorExterior_1)
{
salida=moduloSalida_1;
sprintf(mensaje,"%s"," UNO ");
}
if (pulsador==pulsadorExterior_2)
{
salida=moduloSalida_2;
sprintf(mensaje,"%s"," DOS ");
}
if (pulsador==pulsadorExterior_3)
{
salida=moduloSalida_3;
sprintf(mensaje,"%s"," TRES ");
}
if (pulsador==pulsadorExterior_4)
{
salida=moduloSalida_4;
sprintf(mensaje,"%s","CUATRO");
}
if (pulsador==100)
{
salida=100;
sprintf(mensaje,"%s","niguno");
}
for (int k=0; k<5; k++)
{
digitalWrite(salida,HIGH);
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla,"Rele %s ON ",mensaje);
delay(100);
digitalWrite(salida,LOW);
delay(100);
if (EscanearPulsadores()!=pulsador)k=11;
}
}
void SaludoFinal()
{
// Saludo final LCD
lcdClear(pantalla);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, "mprsoft-FREDINSA");
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla,"Demo Finalizada ");
delay(5000);
lcdClear(pantalla);
lcdPosition(pantalla,0,0);
lcdPrintf(pantalla, " http://mrpsof. ");
lcdPosition(pantalla,0,1);
lcdPrintf(pantalla,"blogspot.com.es ");
}// Fin de EntradasSaliodasdDigitalesMasLcdRaspberryPi.cpp
2.4 Listado de
EntradasSalidasDigitalesMasLcdArduino.ino
/** --- EntradasSalidasDigitalesMasLcdArduino.ino -----
Programa de demostracion de programaci'on de la Arduino Micro
El siguiente programa muestra como activar intermitentemente una serie de rel'es,
dependiendo de la entrada que que este activada en ese momento.
Adem'as en en la pantalla LCD impri,mir'a la salida activa.
El programa finaliza cuando se pulsan dos entradas preseleccionas a la vez o
cuando se realizan 100 escaneos de entradas.
Manuel Protasio
email:
manuelprotasio@gmail.com
http://mprsof.blogspot.com.es/
*/
#include <Wire.h>
#include <LiquidCrystal.h>
// PANTALLA LCD
#define LCD_FILAS 2 //cantidad de filas
#define LCD_COLUMNAS 16 //cantidad de columnas
#define LCD_DB4 9 //pin 9 --> lcd 11
#define LCD_DB5 8 //pin 8 --> lcd 12
#define LCD_DB6 7 //pin 7 --> lcd 13
#define LCD_DB7 6 //pin 6 --> lcd 14
#define LCD_RS 10 //pin 10 --> lcd 6
#define LCD_E 5 //pin 5 --> lcd 4
//PINS DE SALIDA
#define moduloSalida_1 11 // pin 11 --> salida 1 en modulo de reles
#define moduloSalida_2 A1 // pin A1 --> salida 2 en modulo de reles
#define moduloSalida_3 A0 // pin A0 --> salida 3 en modulo de reles
#define moduloSalida_4 12 // pin 12 --> salida 4 en modulo de reles
// PINS DE ENTRADA
#define pulsadorExterior_1 A2 // pin A2 -->Pulsador exterior 1
#define pulsadorExterior_2 A3 // pin A3 -->Pulsador exterior 2
#define pulsadorExterior_3 A4 // pin A4 -->Pulsador exterior 3
#define pulsadorExterior_4 A5 // pin A5 -->Pulsador exterior 4
int pulsadorActivo=100;
int contadorDeBucles=100;
LiquidCrystal pantalla(LCD_RS,LCD_E, LCD_DB4,LCD_DB5,LCD_DB6,LCD_DB7);
void setup(){
// Tipo de pantalla de 16 caracteres por dos lineas
pantalla.begin(LCD_COLUMNAS,LCD_FILAS);
// Velocidad de transmision al monitor serie.
Serial.begin(9600);
ConfigurarPinsDeSalida();
ConfigurarPinsDeEntrada();
SaludoInicial();
}
void loop() {
if (EscanearPulsadores()==(pulsadorExterior_1+pulsadorExterior_2))
{
Serial.print ("\n-- EntradasSalidasDigitalesMasLcdArduino.ino -- acab'o por usuario\n");
SaludoFinal();
}
ActivaSalida(EscanearPulsadores());
pantalla.setCursor(0,0);
pantalla.write(" ");
pantalla.setCursor(0,0);
pantalla.write("Bucle numero ");
pantalla.print(contadorDeBucles);
Serial.print ("\n-- Numero de bucle ");
Serial.print (contadorDeBucles,DEC);
Serial.println();
contadorDeBucles--;
if (contadorDeBucles<=0)
{
Serial.print ("\n-- EntradasSalidasDigitalesMasLcdArduino.ino -- acab'o correctamente\n");
SaludoFinal();
}
}
void SaludoInicial()
{
// Saludo en LCD
pantalla.setCursor(0,0);
pantalla.write("mprsoft-FREDINSA");
pantalla.setCursor(0,1);
pantalla.write(" Bienvenido ");
delay(5000);
// Saludo en monitor Serial
Serial.print ("Bienvenido al mundo de Arduino\n ");
Serial.print ("\nEntradasSalidasDigitalesMasLcdArduino.ino// iniciar'a en 5 segundos\n\n ");
Serial.print ("\nEl programa finaliza transcurridos 100 lecturas, o \n");
Serial.print ("\nactivando simultaneamente las entradas uno y dos");
Serial.print ("\n");
delay(5000);
Serial.print ("\nActive cualquier entrada digital para activar el rel'e asociado");
Serial.print ("\n");
}
void ConfigurarPinsDeSalida()
{
pinMode(moduloSalida_1,OUTPUT);
pinMode(moduloSalida_2,OUTPUT);
pinMode(moduloSalida_3,OUTPUT);
pinMode(moduloSalida_4,OUTPUT);
}
void ConfigurarPinsDeEntrada()
{
pinMode (pulsadorExterior_1,INPUT);
pinMode (pulsadorExterior_2,INPUT);
pinMode (pulsadorExterior_3,INPUT);
pinMode (pulsadorExterior_4,INPUT);
}
int EscanearPulsadores()
{
if ( digitalRead(pulsadorExterior_1)==1 && digitalRead(pulsadorExterior_2)==1)
{
pulsadorActivo=pulsadorExterior_1+pulsadorExterior_2;
return pulsadorActivo;
}
if ( digitalRead(pulsadorExterior_1))pulsadorActivo=pulsadorExterior_1;
if ( digitalRead(pulsadorExterior_2))pulsadorActivo=pulsadorExterior_2;
if ( digitalRead(pulsadorExterior_3))pulsadorActivo=pulsadorExterior_3;
if ( digitalRead(pulsadorExterior_4))pulsadorActivo=pulsadorExterior_4;
return pulsadorActivo;
}
void ActivaSalida(int pulsador)
{
int salida=1000;
char mensaje[8]="";
if (pulsador==pulsadorExterior_1)
{
salida=moduloSalida_1;
sprintf(mensaje,"%s"," UNO ");
}
if (pulsador==pulsadorExterior_2)
{
salida=moduloSalida_2;
sprintf(mensaje,"%s"," DOS ");
}
if (pulsador==pulsadorExterior_3)
{
salida=moduloSalida_3;
sprintf(mensaje,"%s"," TRES ");
}
if (pulsador==pulsadorExterior_4)
{
salida=moduloSalida_4;
sprintf(mensaje,"%s","CUATRO");
}
if (pulsador==100)
{
salida=100;
sprintf(mensaje,"%s","niguno");
}
for (int k=0; k<5; k++)
{
digitalWrite(salida,HIGH);
pantalla.setCursor(0,1);
pantalla.write("Rele ");
pantalla.write(mensaje);
pantalla.write(" ON");
delay(100);
digitalWrite(salida,LOW);
delay(100);
if (EscanearPulsadores()!=pulsador)k=11;
}
}
void SaludoFinal()
{
pantalla.setCursor(0,0);
pantalla.write( "mprsoft-FREDINSA");
pantalla.setCursor(0,1);
pantalla.write("Demo Finalizada ");
delay(5000);
pantalla.setCursor(0,0);
pantalla.write(" http://mprsof. ");
pantalla.setCursor(0,1);
pantalla.write("blogspot.com.es ");
delay(5000);
SaludoFinal();
}// Fin de EntradasSalidasDigitalesMasLcdArduino.ino
Muchas gracias por tu aporte. Me ha sido muy útil.
ResponderEliminar