sábado, 17 de marzo de 2012

Montaje De Sistemas Secuenciales Empleando Memorias

SISTEMAS SECUENCIALES DIGITALES

Una de las tantas formas de implementar un sistema digital, es por medio de una memoria tipo EEPROM o FLASH para allí hacer la parte lógica combinatoria. La parte digital secuencial es manejada por flip flop tipo D, que como se observara en el diagrama esquemático realimenta el circuito.

EJEMPLO DE  UN SISTEMA SECUENCIAL

Problema

Hacer un contador cíclico de 1 a 4. El sistema operara de la siguiente manera:
Contara con dos pulsadores que generaran las estradas digitales al sistema tal como se muestra en la tabla. sean P0 y P1 los pulsadores.
Entradas del sistema
Contara con 3 bits de salida para indicar los números de la cuenta en formato bcd (binario codificado decimal).
Salidas digitales

Diagrama De Estados

El contador propuesto es un contado cíclico, es decir que cuenta de 1 a 4 y nuevamente inicia en uno si la cuenta es de uno en uno.
Según como se propone en la primer tabla donde están las entras y la acción a realizar, se tiene el siguiente diagrama de estados.
Diagrama de estados

Asignación Binaria A Los Estados

Cada estado tendrá un valor binario único para distinguirlo de los demás.En este ejemplo tenemos 4 estados.

Tabla De Estados

La tabla de estados es una síntesis del diagrama de estados, la tabla tal como se representa en este ejemplo esta dada para se llevada  a la memoria.

Tabla de estados

Mapa De Memoria

El mapa de memoria corresponde a los datos binarios que serán guardados, estos corresponden a la tabla de estados. El mapa de memoria es una transcripción de la tabla de estados para representar la parte combinatoria del sistema.

Mapa de memoria

Diagrama Esquemático

En el montaje real las entradas no utilizadas se conectan a tierra, no pueden quedar flotantes.
Diagrama esquemático

Montaje


Este es el esquema de montaje para implementar un sistema secuencial digital, empleando una memoria como dispositivo lógico programable y un flip flop D, para la realimentación de estados. En este circuito por el momento el ADC no cumple función alguna, pues no esta conectado a la memoria.
Recientemente un estudiante me dijo que el 74LS379 no es fácil de conseguir, así que le sugerí reemplazarlo por el 74LS175.

martes, 13 de marzo de 2012

Control de sentido de giro y velocidad para un motor DC



En este esquema utilizamos la entrada análoga 13 para leer el valor entregado por el potenciometro y así asignar este valor a la salida PWM del terminal 11.
Se lee el estado del pulsador en el terminal 21 configurado como entrada.
Con las salidas 0 y 1 controlamos el sentido de giro del motor.
Se utiliza para este ejemplo el puente H  L298.


#define PIC18F4550
int velocidad;
void setup(){
   pinMode(21,INPUT);
   pinMode(0,OUTPUT);
   pinMode(1,OUTPUT);
}
void loop(){
   velocidad=analogRead(13);
   if(digitalRead(21)){
      digitalWrite(0,LOW);
      digitalWrite(1,HIGH);
      analogWrite(11,velocidad);
   }else{
      digitalWrite(0,HIGH);
      digitalWrite(1,LOW);
      analogWrite(11,velocidad);
   }   
}

viernes, 2 de marzo de 2012

Pinguino Bot


Pinguino Bot
Este es un robot sencillo solo utiliza dos puentes H para manejar cada uno de los motores, se utilizo el LM386 para la obstrucción del puente H aqui esta el enlace de como hacerlo http://micropinguino.blogspot.com/2011/04/puente-h-con-el-lm386.html
Solo utilizo cuatro terminales configurados como salidas digitales.
Modo de operación
Este es el vídeo que corresponde al código de ejemplo
Aquí esta el código utilizado:

//Prototipos de las funciones utilizadas
void adelante();
void atras();
void parar();
void giroDerecha();
void giroIzquierda();
//Configuracion
void setup(void){
   pinMode(0,OUTPUT);   
   pinMode(1,OUTPUT); 
   pinMode(2,OUTPUT);   
   pinMode(3,OUTPUT);   
}
//prueba de los diferentes movimientos
void loop(void){
   adelante();
   delay(5000);
   giroDerecha();
   delay(3000);
   adelante();
   delay(3000);
   giroIzquierda();
   delay(3000);
   atras();
   delay(3000);
   parar();
   delay(5000);
}
//funciones utilizadas
void adelante(){
   digitalWrite(0,LOW);
   digitalWrite(1,HIGH);
   digitalWrite(2,HIGH);
   digitalWrite(3,LOW);
}
void atras(){
   digitalWrite(0,HIGH);
   digitalWrite(1,LOW);
   digitalWrite(2,LOW);
   digitalWrite(3,HIGH);
}
void parar(){
   digitalWrite(0,LOW);
   digitalWrite(1,LOW);
   digitalWrite(2,LOW);
   digitalWrite(3,LOW);
}
void giroDerecha(){
   digitalWrite(0,LOW);
   digitalWrite(1,HIGH);
   digitalWrite(2,LOW);
   digitalWrite(3,HIGH);
}
void giroIzquierda(){
   digitalWrite(0,HIGH);
   digitalWrite(1,LOW);
   digitalWrite(2,HIGH);
   digitalWrite(3,LOW);
}

sábado, 18 de febrero de 2012

viernes, 17 de febrero de 2012

Marcha Imperial Con Pinguino!!!



Para estrenar mi nueva tarjeta pinguino he colocado algo de música.
Gracias al siguiente enlace http://yeisoneng.blogspot.com/2011/09/marcha-imperial-con-pinguino_06.html.
Hice algunas modificaciones al código para la visualización utilizando en puerto B. En mi código la salida para el parlante esta en el terminal 11.

Montaje basico se puede emplear un parlante normal de 8 ohm y el
transistor puede ser el popular 2n2222
Este es el código.

#define RunLed PORTAbits.RA4

int speakerPin = 11;

#define c 261
#define d 294
#define e 329
#define f 349
#define g 391
#define gS 415
#define a 440
#define aS 455
#define b 466
#define cH 523
#define cSH 554
#define dH 587
#define dSH 622
#define eH 659
#define fH 698
#define fSH 740
#define gH 784
#define gSH 830
#define aH 880

#define vua 255
#define vub 127
#define vuc 63
#define vud 31
#define vue 15
#define vuf 7
#define vug 3
long delayAmount;
long loopTime;
int x;

void setup()
{
  pinMode(speakerPin, OUTPUT);
  TRISB = 0;
  //establece speakerPin como salida
}
  
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds, int vuLed)
{
  frequencyInHertz;
  timeInMilliseconds;
    RunLed=LOW;
    PORTB = vuLed;
      
 delayAmount = (long)(1000000/frequencyInHertz);
    loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
    for (x=0;x<loopTime;x++)
    {
        digitalWrite(speakerPin,HIGH);
        delayMicroseconds(delayAmount);
        digitalWrite(speakerPin,LOW);
        delayMicroseconds(delayAmount);
 }
  
    RunLed=HIGH;
    PORTB = 0;
    delay(20);
    //una pequeña pausa para que las notas suenen por separado
}
  
void march()
{
    //una traducción de una partitura a frecuencia / tiempo (en milisegundos)
    //se usa 500 ms para un cuarto de nota
  
    beep(speakerPin, a, 500,vua);
    beep(speakerPin, a, 500,vua );  
    beep(speakerPin, a, 500,vua );
    beep(speakerPin, f, 350,vuf );
    beep(speakerPin, cH, 150,vuc );
  
    beep(speakerPin, a, 500,vua );
    beep(speakerPin, f, 350,vuf );
    beep(speakerPin, cH, 150,vuc );
    beep(speakerPin, a, 1000,vua );
    //first bit
  
    beep(speakerPin, eH, 500,vue );
    beep(speakerPin, eH, 500,vue );
    beep(speakerPin, eH, 500,vue );  
    beep(speakerPin, fH, 350,vuf );
    beep(speakerPin, cH, 150,vuc );
  
    beep(speakerPin, gS, 500,vug );
    beep(speakerPin, f, 350,vuf );
    beep(speakerPin, cH, 150,vuc );
    beep(speakerPin, a, 1000,vua );
    //second bit...
  
    beep(speakerPin, aH, 500,vua );
    beep(speakerPin, a, 350,vua );
    beep(speakerPin, a, 150,vua );
    beep(speakerPin, aH, 500,vua );
    beep(speakerPin, gSH, 250,vug );
    beep(speakerPin, gH, 250,vug );
  
    beep(speakerPin, fSH, 125,vuf );
    beep(speakerPin, fH, 125,vuf );  
    beep(speakerPin, fSH, 250,vuf );
    delay(250);
    beep(speakerPin, aS, 250,vua );  
    beep(speakerPin, dSH, 500,vud );
    beep(speakerPin, dH, 250,vud );
    beep(speakerPin, cSH, 250,vuc );
    //start of the interesting bit
  
    beep(speakerPin, cH, 125,vuc);
    beep(speakerPin, b, 125,vub);
    beep(speakerPin, cH, 250,vuc);    
    delay(250);
    beep(speakerPin, f, 125,vuf);
    beep(speakerPin, gS, 500,vug );
    beep(speakerPin, f, 375,vuf);
    beep(speakerPin, a, 125,vua );
  
    beep(speakerPin, cH, 500,vuc );
    beep(speakerPin, a, 375,vua );
    beep(speakerPin, cH, 125,vuc );
    beep(speakerPin, eH, 1000,vue );
  
    beep(speakerPin, aH, 500,vua );
    beep(speakerPin, a, 350,vua);
    beep(speakerPin, a, 150,vua);
    beep(speakerPin, aH, 500,vua);
    beep(speakerPin, gSH, 250,vug);
    beep(speakerPin, gH, 250,vug);
  
    beep(speakerPin, fSH, 125,vuf);
    beep(speakerPin, fH, 125,vuf);  
    beep(speakerPin, fSH, 250,vuf);
    delay(250);
    beep(speakerPin, aS, 250,vua);
    beep(speakerPin, dSH, 500,vud);
    beep(speakerPin, dH, 250,vud);
    beep(speakerPin, cSH, 250,vuc);
    //repeat... repeat
  
    beep(speakerPin, cH, 125,vuc);
    beep(speakerPin, b, 125,vub);
    beep(speakerPin, cH, 250,vuc);    
    delay(250);
    beep(speakerPin, f, 250,vuf);
    beep(speakerPin, gS, 500,vug);
    beep(speakerPin, f, 375,vuf);
    beep(speakerPin, cH, 125,vuc);
        
    beep(speakerPin, a, 500,vua);        
    beep(speakerPin, f, 375,vuf);        
    beep(speakerPin, c, 125,vuc);        
    beep(speakerPin, a, 1000,vua);    
}

void loop()  // se ejecuta una y otra vez...
{
  march();
}

martes, 14 de febrero de 2012

Brazo robótico 2




Este es un brazo construido como proyecto integrador de cursos de 4 semestre de tecnología mecatrónica nocturno de la UNIAJC
El programa se hizo en processing ejecutandose en un live cd de ubuntu, se empleo la tarjeta pinguino para el control del robot.

sábado, 4 de febrero de 2012

Como realizo los gráficos de los montajes

Para la realización de los montajes utilizo http://fritzing.org/ lo sugiero para la realización de los circuitos impresos.
Luego exporto el montaje como un archivo svg y lo edito en http://inkscape.org/?lang=es

Montaje Conversor Análogo Digital ADC0804

Montaje

COMPONENTES

Cables rojos - 5 voltios
Cables negros - Tierra
Capacitor electrolítico - 1 uf
Capacitor cerámico 150 pf  (151)
Potenciometro de 5K o 10K
Diagrama Esquemático

ESQUEMA DE TERMINALES DEL ADC0804

Esquema Guía

ENLACES DE INTERÉS

http://www.ucontrol.com.ar/wiki/index.php?title=ADC0804
http://fuhrer-luftwaffe.blogspot.com/2009/02/adc0804.html



viernes, 3 de febrero de 2012

jueves, 26 de enero de 2012

Pinguino con el max232 para comunicación RS232


Este es el esquema de como conectar la tarjeta al puerto serie del computador.
Los capacitores son de un 1uf. La franja blanca en el capacitor indica el cátodo (-).
Los ejemplos de código están en la carpeta examples/serial.