Mostrando entradas con la etiqueta pulsador. Mostrar todas las entradas
Mostrando entradas con la etiqueta pulsador. Mostrar todas las entradas

lunes, 22 de octubre de 2012

Diseño de un pulsador con C++

Diseño de un pulsador utilizando el circuito integrado NE555.

Categoría: 1. Programación y electrónica.

Se desarrolló un programa en C++ que calcula la frecuencia, el tiempo del ciclo o periodo (T, en s), el tiempo en HIGH (t1, en s) y el tiempo en LOW (t2, en s). Genera una tabla que se despliega en la consola de Visual C++ y al mismo tiempo genera un archivo, pulsda06.txt, con un formato separado por tabuladores. Este archivo de texto puede abrirse con el programa Excel, de manera que se pueden manejar sus valores para elaborar diferentes tipos de gráficos.
El diagrama del circuito es el siguiente:



Las ecuaciones de diseño según la hoja de datos para este circuito integrado son las siguientes:
t1 = 0.693*(RA+RB)*C
t2 = 0.693*(RB)*C
T = t1+t2 = 0.693*(RA+2RB)*C
f = 1.44 / (RA+2RB)*C
Output driver duty cycle = t1 / (t2+t1) = RB / (RA+2RB)

El programa se corre con un valor inicial de 2200ohm para Ra y termina con 10Mohm con incrementos de 50000ohm en cada ciclo. Para Rb se toma un valor inicial de 2200ohm y se incrementa en 1000ohm en cada ciclo. Se utilizó un capacitor de 2.2uF.
En el archivo de salida la primera columna corresponde al número de ciclo de cálculo, la segunda columna es el valor de Ra (ohm), la tercera columna es el valor de Rb (ohm), la cuarta columna es el valor de t1 (s), la quinta columna es el valor de t2 (s), la sexta columna es el valor de T (s), la séptima columna es el valor de f (s-1) y la octava columna es el valor del ciclo de trabajo (número fraccionario).
El código del programa es el siguiente:



// PulsadorNE555_04.cpp: define el punto de entrada de la aplicación de consola.
//
// PulsadorNE555_03.cpp: archivo de proyecto principal.
// despliega los valores de #corrida, Ra, Rb, t1, t2, T, freq y dutyCycle separados por punto y coma
// se trata que el archivo de texto pueda ser leido por el programa Excel con columnas
// separadas por tabulador

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;

int main() {
 float t1;
 float t2;
 float Time;
 float freq;
 float dutyCycle;
 float Ra = 2200;
 float Rb = 2200;
 float c = 0.0000022;
 int caso = 1;
 ofstream out("D:\\pulsda06.txt");
 while (Ra < 10000000)  {
 t1 = 0.693*(Ra + Rb)*c;
 t2 = 0.693*Rb*c;
 Time = t1+t2;
 freq = 1/Time;
 dutyCycle = (Ra + Rb) / (Ra + 2*Rb);

 cout << caso;
 cout << ";\t";
 cout << Ra;
 cout << ";\t";
 cout << Rb;
 cout << ";\t";
 cout << t1;
 cout << ";\t";
 cout << t2;
 cout << ";\t";
 cout << Time;
 cout << ";\t";
 cout << freq;
 cout << ";\t";
 cout << dutyCycle;
 cout << ";\n";
 // escribeArchivo:
 if (!out)  {
  cout << "cannot open file...\n";
  return 1; }
 out << caso;
 out << "\t";
 out << Ra;
 out << "\t";
 out << Rb;
 out << "\t";
 out << t1;
 out << "\t";
 out << t2;
 out << "\t";
 out << Time;
 out << "\t";
 out << freq;
 out << "\t";
 out << dutyCycle;
 out << "\n";
 Ra = Ra + 50000;
 Rb = Rb + 1000;
 caso++;  }
 out.close();
 system("pause");
 return 0; }

Para este ejemplo se registran 200 ciclos de cálculo que quedan guardados en el archivo pulsda06.txt. Este archivo se abrió desde Excel donde se generaron tres gráficos que se muestran a continuación:


 Gráfico 1. Valores de t1 y t2 en función del valor de Ra
 Gráfico 2. Valor de la frecuencia en función de Ra
Gráfico 3. Valor del ciclo de trabajo en función de Ra

Con los datos generados se puede obtener para un ciclo de 1.04s, un ciclo de trabajo de 0.978, con duración de t1 de 1.018s y t2 de 0.022s. Para ello se requiere valores de Ra= 652200ohm y para Rb= 15200ohm. El valor de f será de 0.96 s^-1.

Por lo pronto es todo. Saludos y hasta la próxima.

Referencias bibliográficas:
2010. Texas Instruments. NA555, NE555, SA555, SE555. Data Sheet. USA.
1998. STMicroelectronics NE555, SA555, SE555. Data Sheet. USA.
2004. Applied digital circuits: 555 timer, analog to digital (ADC) and digital to analog (DAC) conversion (DAC). University of California at Berkeley. Physics 111 Laboratory. Basic semiconductor circuits. Lab 11 & 12. USA.
http://www.bgsu.edu/departments/compsci/docs/write.html








sábado, 25 de agosto de 2012

Dado Electrónico

Dado electrónico con Arduino UNO.

Categoría: 1. Programación y electrónica.

En este ejercicio se construye un circuito electrónico con un display de siete segmentos con ánodo común. Las terminales (a, b, c, d, e, f y g) se conectaron a las I/O (2, 3, 4, 5, 6, 7 y 8) respectivamente. En la I/O número 9 se conectó un botón pulsador conectando un extremo al polo positivo (+5V), el otro extremo a una resistencia de 10K conectada a la terminal GND (tierra) de la tarjeta Arduino UNO. Los valores del uno al seis se despliegan simultáneamente en el display LED y en el monitor serial del ambiente Arduino. El monitor serial muestra además el estado de la entrada digital, el botón pulsador. Los números del uno al seis se despliegan 50 veces rápidamente (50 ms HIGH y 15 ms LOW). Durante esta etapa se aprieta el botón pulsador y el número seleccionado queda guardado en la variable optn. Al terminar el despliegue de la serie de números, el display LED muestra el número seleccionado (destellando 15 veces, 250 ms HIGH y 15 ms LOW) cuando se apretó el botón pulsador.

 
Figura 1. Display de LED, botón pulsador y placa Arduino UNO.

En el desarrollo del proyecto se comenzó con una primera versión del programa completo, aunque este no funcionaba correctamente pero sí era compilado. Después se construyó el circuito electrónico y se reinició la escritura del código. Primero haciendo encender y apagar cada uno de los segmentos del display y corrigiendo cualquier error en el hardware. Una vez que el hardware funcionó, se codificaron las funciones para generar los números (uno al seis). A continuación se estableció la comunicación con el monitor serial y la entrada digital a través del botón pulsador. Por último se desarrollaron dos fracciones de código, uno con la instrucción for, para seleccionar el valor a través del botón pulsador asociado a la asignación del valor para la variable optn y otra con la instrucción switch/case, para desplegar el valor seleccionado por la pulsación del botón.
Aunque el código que se presenta adelante es bastante extenso, es posible quitar partes que no intervienen directamente con el funcionamiento del dado. Las funciones para desplegar los números se repiten, cambiando únicamente los valores de la instrucción delay();. Como ejercicio, se puede quitar un juego de estos números colocando como argumentos de las funciones, las duraciones para la instrucción mencionada.

El código desarrollado para el proyecto es el siguiente:

/*
Un display LED de 7 segmentos despliega rápidamente números
del uno al seis. Se detiene cuando se presiona un botón
pulsador, mostrando el valor en forma estática.
Al pulsar nuevamente el botón pulsador vuelve a comenzar el
despliegue de números del uno al seis
Se utiliza la instrucción switch / case
*/

int a=2;
int b=3;
int c=4;
int d=5;
int e=6;
int f=7;
int g=8;
int pulsador=9;

void setup ()  {
  Serial.begin(9600);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(pulsador, INPUT);  }


void loop ()  {
  digitalWrite(a, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  delay(75);

  digitalWrite(b, HIGH);
  delay(250);
  digitalWrite(b, LOW);
  delay(75);

  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(c, LOW);
  delay(75);

  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(d, LOW);
  delay(75);

  digitalWrite(e, HIGH);
  delay(250);
  digitalWrite(e, LOW);
  delay(75);

  digitalWrite(f, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  delay(75);

  digitalWrite(g, HIGH);
  delay(250);
  digitalWrite(g, LOW);
  delay(75);

  digitalWrite(a, HIGH);
  delay(200);
  digitalWrite(b, HIGH);
  delay(200);
  digitalWrite(c, HIGH);
  delay(200);
  digitalWrite(d, HIGH);
  delay(200);
  digitalWrite(e, HIGH);
  delay(200);
  digitalWrite(f, HIGH);
  delay(200);
  digitalWrite(g, HIGH);
  delay(200);

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  int optn =0;

for (int i=0; i<50; i++)  {
  Uno();
  int valUno= digitalRead(pulsador);
  Serial.print(" 1 ");
  Serial.println(valUno);
  if (valUno == 1)  {
    optn =1;  }

  Dos();
  int valDos= digitalRead(pulsador);
  Serial.print(" 2 ");
  Serial.println(valDos);
  if (valDos == 1)  {
    optn =2;  }

  Tres();
  int valTres= digitalRead(pulsador);
  Serial.print(" 3 ");
  Serial.println(valTres);
  if (valTres == 1)  {
    optn =3;  }

  Cuatro();
  int valCuatro= digitalRead(pulsador);
  Serial.print(" 4 ");
  Serial.println(valCuatro);
  if (valCuatro == 1)  {
    optn =4;  }

  Cinco();
  int valCinco= digitalRead(pulsador);
  Serial.print(" 5 ");
  Serial.println(valCinco);
  if (valCinco == 1)  {
    optn =5;  }

  Seis();
  int valSeis= digitalRead(pulsador);
  Serial.print(" 6 ");
  Serial.println(valSeis);
  if (valSeis == 1)  {
    optn =6;  }  }

Serial.print("el valor de optn es: ");
Serial.println(optn);

switch (optn)  {
  case 1:  {
    UnoDisplay();
    break;  }
  case 2:  {
    DosDisplay();
    break;  }
  case 3:  {
    TresDisplay();
    break;  }
  case 4:  {
    CuatroDisplay();
    break;  }
  case 5:  {
    CincoDisplay();
    break;  }
  case 6:  {
    SeisDisplay();
    break;  }
  default:
    break;  }  }

void Uno ()  {
  digitalWrite(f, HIGH);
  digitalWrite(e, HIGH);
  delay(50);
  digitalWrite(f, LOW);
  digitalWrite(e, LOW);
  delay(15);  }

void Dos ()  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Tres ()  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Cuatro ()  {
  digitalWrite(f, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  delay(50);
  digitalWrite(f, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  delay(15);  }

void Cinco ()  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Seis ()  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(c, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  digitalWrite(c, LOW);
  delay(15);  }

void UnoDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(f, HIGH);
  digitalWrite(e, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  digitalWrite(e, LOW);
  delay(15);  }  }

void DosDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void TresDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void CuatroDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(f, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  delay(15);  }  }

void CincoDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void SeisDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  digitalWrite(c, LOW);
  delay(15);  }  }


Como se comentó al inicio, el desarrollo del proyecto se hizo mediante avances parciales hasta completar las funciones que se habían contemplado en el programa inicial. Con la diferencia de que el formato final funcionó correctamente.
El proyecto y el código correspondiente fueron desarrollados por Miguel Angel Orduña Bustamante en el año 2012. Saludos.