Trastejant amb arduino

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

Aquest són els projectes extranys, inconclusos o frikis amb Arduino, però que vull documentar.

Trastejant amb un integrat T74LS259

En una placa he trobat varis integrats T74LS259. Es tracta d'un integrat molt interessant per als meus projectes, ja que és un multiplexor i una memòria de 8 bits al mateix temps.

Segons la fulla d'especificacions, les seues aplicacions són:

  • Per a convertir de serie a paral·lel.
  • Guardar 8 bits.
  • Accedir a qualsevol dels 8 bits per a escriptura de manera aleatòria.
  • Multiplexor.

Aquest és l'esquema:

T74ls259b1.png

Siguent:

  • A1, A2, A3 les entrades per a direccions.
  • D l'entrada de dades.
  • E L'entrada ENABLE
  • C l'entrada CLEAR
  • Q0 a Q7 les eixides.

Amb les entraces E i C es poden fer combinacions. De tal manera que:

E C Mode
L H Guardar en la direcció el valor de D
H H Memoria (No li afecten les entrades)
L L Multiplexor - H L Clear
Si volem guardar tots els bits, tenim que anar passant a mode memòria per a poder canviar les entrades de dades i direcció abans de guardar.

Jo he fet dos codis per a provar la seua funció de multiplexor i de memòria. Però en primer lloc, l'esquema del circuit:


T74ls259 bb.png


Ara el codi del mode multiplexor:

const int PIN_CLEAR =   8;
const int PIN_ENABLE =  9;
const int DATA     =    10;

const int Ad1        =  0;
const int Ad2        =  1;
const int Ad3        =  2;

const int num[8][3]={{0,0,0},{1,0,0},{0,1,0},{1,1,0},{0,0,1},{1,0,1},{0,1,1},{1,1,1}};

void setup(void)
{
  pinMode(PIN_CLEAR,OUTPUT);
  pinMode(PIN_ENABLE,OUTPUT);
  pinMode(DATA,OUTPUT);
  
  pinMode(Ad1,OUTPUT);
  pinMode(Ad2,OUTPUT);
  pinMode(Ad3,OUTPUT);
  
  
  //clear
  digitalWrite(PIN_CLEAR,LOW);
  digitalWrite(PIN_ENABLE,HIGH);
  
  //multiplexor
  digitalWrite(DATA,HIGH);
  digitalWrite(PIN_CLEAR,LOW);
  digitalWrite(PIN_ENABLE,LOW);
  digitalWrite(Ad1,LOW);
  digitalWrite(Ad2,LOW);
  digitalWrite(Ad3,LOW);
}

void loop(void)
{

  for(int i=0; i<8;i++){
  digitalWrite(Ad1,num[i][0]);
  digitalWrite(Ad2,num[i][1]);
  digitalWrite(Ad3,num[i][2]);
    delay(100);
  }
  
  
}

I el codi del mode memòria:

const int PIN_CLEAR =   8;
const int PIN_ENABLE =  9;
const int DATA     =    10;

const int Ad1        =  0;
const int Ad2        =  1;
const int Ad3        =  2;

const int num[8][3]={{0,0,0},{1,0,0},{0,1,0},{1,1,0},{0,0,1},{1,0,1},{0,1,1},{1,1,1}};

void setup(void)
{
  pinMode(PIN_CLEAR,OUTPUT);
  pinMode(PIN_ENABLE,OUTPUT);
  pinMode(DATA,OUTPUT);
  
  pinMode(Ad1,OUTPUT);
  pinMode(Ad2,OUTPUT);
  pinMode(Ad3,OUTPUT);
  
  
  //clear
  digitalWrite(PIN_CLEAR,LOW);
  digitalWrite(PIN_ENABLE,HIGH);
  
  //addressable latch
  // guardamos en posicion 0 un 1
 /* digitalWrite(Ad1,LOW);
  digitalWrite(Ad2,LOW);
  digitalWrite(Ad3,LOW);
  digitalWrite(DATA,HIGH);
  digitalWrite(PIN_CLEAR,HIGH);
  digitalWrite(PIN_ENABLE,LOW);
  
  // memory (dejamos todo en memory hasta cambiar la direccion)
  digitalWrite(PIN_CLEAR,HIGH);
  digitalWrite(PIN_ENABLE,HIGH);*/
  
  
  
  
}

void loop(void)
{
  for (int number = 0; number <= 255; number++)
  {
  
  
  for(int i=0; i<8;i++){
  digitalWrite(Ad1,num[i][0]);
  digitalWrite(Ad2,num[i][1]);
  digitalWrite(Ad3,num[i][2]);
  
  
  if (number & (1 << i)) // check if bit position 'pin' in 'number' is a 1 or not
    {
      digitalWrite(DATA,HIGH); // it's a 1!
    }
    else
    {
      digitalWrite(DATA,LOW); // it's a 0!
    }
  
  
  digitalWrite(PIN_CLEAR,HIGH);
  digitalWrite(PIN_ENABLE,LOW);
  
  // memory (dejamos todo en memory hasta cambiar la direccion)
  digitalWrite(PIN_CLEAR,HIGH);
  digitalWrite(PIN_ENABLE,HIGH);
  
  //delay(1000);
  }
  delay(100);
  }
  
}


Ruleta numèrica

En la meua col·lecció de fem tecnológic, he trobat una espècie de ruleta, probablement, de una màquina de premi. Com que són displays de 7 segments de LEDs, pareixía fàcil tornar a donar vida al circuit.

Si voleu vorer la foto: [1]

El primer problema és que no és un circuit fet per ser reutilitzable. És molt específic. Té dos connectors per darrere estàndars, però sols utilitza una fracció dels cables. Calía detectar la funció de cadascun.

Aquest dibuix cutre representa el que vaig averiguar:

Eptagonoled.png

El segon problema és que els displays de LEDs són de ánode comú, quant jo tinc un integrat cd4511be, fet per a càtode comú. No podia utilitzar l'integrat. Necessitava 7 eixides d'arduino per als segments i pensar al contrari. (El 0 és encés i el 1 és apagat.)

Vaig utlitzar 7 eixides per als segments i 7 per a cadascun dels displays. El del mig va sempre.

El codi sols és una demo del que es pot fer:

const int leds[] = {2,3,4,5,6,7,8};

int n=0;
int d=0;
byte displays[10]={0,1,9,10,11,12,13};
byte numbers[10][7]={
{0,0,1,1,1,1,1},
{0,1,0,0,1,0,0},
{0,0,0,0,1,1,0},
{0,0,1,1,0,1,0},
{1,0,0,0,0,1,0},
{1,0,1,0,0,0,0},
{0,0,0,1,1,1,1},
{0,0,0,0,0,0,0},
{0,0,0,1,0,1,0},
{0,0,0,0,0,0,1}

};

float idelay=1;

void setup()
{
 
  for (int i=0;i<14;i++){ 
   pinMode(i,OUTPUT);
   
  }
 
 // digitalWrite(10,HIGH);
}

void loop()
{
  digitalWrite(displays[d],HIGH);
  int r=random(10);
  for(int i=0;i<7;i++){
  digitalWrite(leds[i],HIGH);
  digitalWrite(leds[i],numbers[r][i]);
  }
  
  delay(idelay);
  digitalWrite(displays[d],LOW);
  n=(n+1)%10;
  d=(d+1)%7;
  idelay=idelay*1.1;
  
}