domingo, 8 de diciembre de 2019

Laboratorio 16 - Matriz de LED´S con Arduino

Registros de desplazamiento

Muchas veces corremos con el problema de no contar con suficientes salidas o entradas digitales en nuestros proyectos y recurrimos a utilizar otros micro controladores de apoyo en una configuración maestro-esclavo. La verdad es que manejar más de 13 Leds (sin PWM) debería sonar como algo fácil, y en realidad lo es.
Los registros de desplazamiento (shifter registers) permiten expandir nuestra capacidad de entradas y de salidas digitales, basándose en el desplazamiento de una secuencia de bytes que se envía o recibe desde estos circuitos integrados.
Las dos variantes más populares de registros de desplazamiento son los de entrada en serie y los de entrada en paralelo.
Un registro de desplazamiento es un circuito digital secuencial (es decir, que los valores de sus salidas dependen de sus entradas y de los valores anteriores) consistente en una serie de biestables, generalmente de tipo D, conectados en cascada , que basculan de forma sincrónica con la misma señal de reloj. Según las conexiones entre los biestables, se tiene un desplazamiento a la izquierda o a la derecha de la información almacenada. Es de señalar que un desplazamiento a la izquierda de un conjunto de bits, multiplica por 2, mientras que uno a la derecha, divide entre 2. Existen registros de desplazamiento bidireccionales, que pueden funcionar en ambos sentidos. Los registros universales, además de bidireccionales permiten la carga en paralelo.

¿Como hicimos el proyecto?

Primero hicimos como en una tabla 8x8(por los leds de la matriz), colocamos la letra de como quisieramos que se viera y ese condigo binario que saliera convertirlo a hexadecimal y colocarlo como parte de la programacion de Arduino.
A continuacion las imagenes para formar el codigo para leer EDGAR.






Codigo Arduino(Modificado)

Este codigo esta invertido la señal puesto que asi salio en la demostracion
byte E[] = {0x7C, 0x40, 0x40, 0x78, 0x78, 0x40, 0x40, 0x7C};
byte D[] = {0x70 ,0x48, 0x44, 0x44, 0x44, 0x44, 0x48, 0x70};
byte G[] = {0x42, 0x42, 0x42, 0x42, 0x42, 0x5A, 0x7E, 0x66};
byte A[] = {0x41, 0x41, 0x41, 0x7F, 0x41, 0x41, 0x22, 0x1C};
byte R[] = {0x46, 0x4C,0x58, 0x70, 0x78, 0x44, 0x44, 0x78};
byte dot[]={0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
byte sp[]= {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};


void setup() // Prog_36_1
    {   for (int j=2; j<19; j++)
              pinMode(j, OUTPUT);         
       Serial.begin(9600);
    }
void SetChar(char p) 
{    
     Clear();
     for (int fil = 0; fil <8 ; fil++)
        {
            digitalWrite( fil + 10 , LOW) ; // Activamos la fila para el barrido
            //byte F = N[fil] ;
            byte F = Selecciona( p, fil);
                         
            for (int col =7; col >= 0 ; col--)
                {  
                    digitalWrite(8-col, LOW);     //Bajamos la columna
                    bool b = GetBit(F, col)  ;
                    if (b)
                        digitalWrite( 9 - col  ,HIGH); //Levantamos la columna, con su pin
                    else
                        digitalWrite( 9 - col  ,LOW); // Si 0, apagamos

                 }                                    // Solo si b es 1
            digitalWrite( fil + 10 , HIGH) ;          // Apagamos fila antes de salir   
          }
}

bool GetBit( byte N, int pos)
{                              // pos = 7 6 5 4 3 2 1 0
    int b = N >> pos ;         // Shift bits
    b = b & 1 ;                // coger solo el ultimo bit
    return b ;
}
void Clear()
{
   for (int j=2; j<10; j++)  // Valores de los pines de columna
        digitalWrite(j, LOW); // Todos apagados
         
   for (int k= 10 ; k<18 ; k++)
        digitalWrite(k, HIGH); // Todas las filas cortadas
 }
 byte Selecciona( char c, byte fil)
{
  if ( c == 'E')         return(E[fil]) ;
  if ( c == 'D')         return( D[fil]) ;
  if ( c == 'G')         return(G[fil]);
  if (c == 'A')          return( A[fil]);
  if (c == 'R')          return( R[fil]);

  if (c == '.')          return( dot[fil]);
  if (c == ' ')          return( sp[fil]);
     
}

void loop()
{
String s = "EDGAR  " ;
  int l = s.length();      // Calcula la longitus de s
  for ( int n = 0; n< l; n++ )
    {
      long t = millis();
      char c = s[n];
      while ( millis()< t+ 400)
            SetChar(c);

    }
   
  }

 Video tutorial(En este video tutorial el codigo y la demostracion esta con la "E" minuscula)


Integrantes:

- Pumacayo Pinto, Antonio Valentin
-Quiñones Colque Adrian
-Chaucha Llacho Andrew


sábado, 7 de diciembre de 2019

Laboratorio 15 -  Contadores Digitales con Arduino

Programación con Arduino

La programación de Arduino es la programación de un microcontrolador. Esto era algo más de los ingenieros electrónicos, pero Arduino lo ha extendido a todo el público. Arduino ha socializado la tecnología.

Programar Arduino consiste en traducir a líneas de código las tareas automatizadas que queremos hacer leyendo de los sensores y en función de las condiciones del entorno programar la interacción con el mundo exterior mediante unos actuadores.

Arduino proporciona un entorno de programación sencillo y potente para programar, pero además incluye las herramientas necesarias para compilar el programa y “quemar” el programa ya compilado en la memoria flash del microcontrolador. Además el IDE nos ofrece un sistema de gestión de librerías y placas muy práctico. Como IDE es un software sencillo que carece de funciones avanzadas típicas de otros IDEs, pero suficiente para programar.

Ejercicio del laboratorio


Código completo para el aumento disminución de números con Arduino

int unidades=0;
int decenas=0;

void setup() 
{
DDRD = 0b00001111; //pines 0 al 3 SALIDAS y 4 al 7 ENTRADAS
DDRB = 0b00001111; // pines 8 al 11 SALIDAS y 12 al 13 ENTRADAS
PORTD = unidades; //Transferimos valor de variable a puerto B 
PORTB = decenas; //Transferimos valor de variable a puerto D 
}

void loop() 
{
if (digitalRead(7) == LOW)
  {
    unidades++;
    if (unidades>9)
      {
        unidades=0;
        decenas++;
      }
    PORTD=unidades;
    PORTB=decenas;
    delay(200);
  }
if (digitalRead(6) == LOW)
  {
    unidades--;
    if (unidades<0)
      {
        unidades=9;
        decenas--;
      }
    PORTD=unidades;
    PORTB=decenas;
    delay(200);
  }
}

Vídeo Tutorial sobre simulación en Proteus




Vídeo tutorial sobre el laboratorio de Circuitos




Lo que se aprendio con este laboratorio es la programacion basica en arduino para la elaboracion de un contador funcional con pulsador.

Integrantes:

- Pumacayo Pinto, Antonio Valentin
-Quiñones Colque Adrian
-Chaucha Llacho Andrew