Diferència entre revisions de la pàgina «Matriu LED amb joystick»

De Wiket
Salta a la navegació Salta a la cerca
Línia 12: Línia 12:
 
==Codi Arduino==
 
==Codi Arduino==
 
<pre>
 
<pre>
// Fem servir la variable temps amb la funció "millis" per contar-ne els milisegons:
+
'''// Fem servir la variable temps amb la funció "millis" per contar-ne els milisegons:'''
 
unsigned long time = millis();
 
unsigned long time = millis();
  
//Iniciatlitzem els pins per files:
+
'''//Iniciatlitzem els pins per files:'''
 
const int row[8] = {
 
const int row[8] = {
 
   2, 7, 19, 5, 13, 18, 12, 16
 
   2, 7, 19, 5, 13, 18, 12, 16
 
};
 
};
//Iniciatlitzem els pins per columnes:
+
'''//Iniciatlitzem els pins per columnes:'''
 
const int col[8] = {
 
const int col[8] = {
 
   6, 11, 10, 3, 17, 4, 8, 9
 
   6, 11, 10, 3, 17, 4, 8, 9
 
};
 
};
  
//Creem un vector bidimensional pels pixels:
+
'''//Creem un vector bidimensional pels pixels:'''
 
int pixels[8][8];
 
int pixels[8][8];
  
//Inicialitzem al centre la posició del cursor:
+
'''//Inicialitzem al centre la posició del cursor:'''
 
  int x = 5;
 
  int x = 5;
 
  int y = 5;
 
  int y = 5;
  
//Creem 2 funcions; goingUp per moure el cursor i stopped per saber si està o no en moviment  
+
'''//Creem 2 funcions; goingUp per moure el cursor i stopped per saber si està o no en moviment'''
 
boolean goingUp=true;
 
boolean goingUp=true;
 
boolean stopped=true;
 
boolean stopped=true;
Línia 38: Línia 38:
 
   Serial.begin(9600);
 
   Serial.begin(9600);
 
    
 
    
   // Inicialitza i itinera entre els pins:
+
   '''// Inicialitza i itinera entre els pins:'''
 
    
 
    
 
   for (int thisPin = 0; thisPin < 8; thisPin++) {
 
   for (int thisPin = 0; thisPin < 8; thisPin++) {
 
      
 
      
    // initialize the output pins:
 
 
     pinMode(col[thisPin], OUTPUT);
 
     pinMode(col[thisPin], OUTPUT);
 
     pinMode(row[thisPin], OUTPUT);
 
     pinMode(row[thisPin], OUTPUT);
 
      
 
      
     // Initialitzem els pins de columna a HIGH per assegurar-nos que estan apagats:
+
     '''// Initialitzem els pins de columna a HIGH per assegurar-nos que estan apagats:'''
 
     digitalWrite(col[thisPin], HIGH);
 
     digitalWrite(col[thisPin], HIGH);
 
   }
 
   }
  
   // Inicialitzem la matriu de pixels:
+
   '''// Inicialitzem la matriu de pixels:'''
 
    
 
    
 
   for (int x = 0; x < 8; x++) {
 
   for (int x = 0; x < 8; x++) {
Línia 61: Línia 60:
 
void loop() {
 
void loop() {
 
    
 
    
   // Crida a la funcio per moure el cursor:
+
   '''// Crida a la funcio per moure el cursor:'''
 
   movePlayer();
 
   movePlayer();
  
   // Refresca la pantalla cridant a la funció:
+
   '''// Refresca la pantalla cridant a la funció:'''
 
   refreshScreen();
 
   refreshScreen();
 
}
 
}
Línia 71: Línia 70:
 
void  movePlayer(){
 
void  movePlayer(){
  
   // Inicialitza a HIGH la posició:
+
   '''// Inicialitza a HIGH la posició:'''
 
   pixels[x][y] = HIGH;
 
   pixels[x][y] = HIGH;
  
   // Fem que llegeixi el moviment del joystick, aquest enregistra moviments en forma de
+
   '''// Fem que llegeixi el moviment del joystick, aquest enregistra moviments en forma de
 
   // números de l'1 al 1024. Fem que si el valor que registra és més gran que 800 i està
 
   // números de l'1 al 1024. Fem que si el valor que registra és més gran que 800 i està
 
   // parat, augmenti una posició en l'eix de les X, si és més petit que 300 en disminueixi  
 
   // parat, augmenti una posició en l'eix de les X, si és més petit que 300 en disminueixi  
 
   // una posició al mateix eix i que si es troba entre 300 i 800 (al centre) no mogui la
 
   // una posició al mateix eix i que si es troba entre 300 i 800 (al centre) no mogui la
   // posició del cursor.
+
   // posició del cursor.'''
 
   
 
   
 
   int readX = analogRead(A0);
 
   int readX = analogRead(A0);
Línia 93: Línia 92:
 
   }
 
   }
  
// Jugant amb el temps, fem que els moviments es refresquin cada 0,3 segons per fer-ho  
+
'''// Jugant amb el temps, fem que els moviments es refresquin cada 0,3 segons per fer-ho  
// fluït però a la vegada fàcil de seguir amb la vista:
+
// fluït però a la vegada fàcil de seguir amb la vista:'''
 
   if(millis()-time>300){
 
   if(millis()-time>300){
 
     if(y==7){
 
     if(y==7){
Línia 113: Línia 112:
 
}
 
}
  
// Funció de refrescar la pantalla, el que fa és apagar tots els pins;
+
'''// Funció de refrescar la pantalla, el que fa és apagar tots els pins;'''
 
void refreshScreen() {
 
void refreshScreen() {
 
   for (int thisRow = 0; thisRow < 8; thisRow++) {
 
   for (int thisRow = 0; thisRow < 8; thisRow++) {

Revisió del 14:42, 30 maig 2016

El programa que hem fet realitza el moviment d'un sol LED per tota la matriu sense poder sortir-se'n d'aquesta. El control del LED es duu a terme amb un joystick incorporat també a la placa Arduino. Amb aquests dos complements es pot aconseguir que puguis moure el LED com si fos un objecte.

Components

Esquema connexions

MATRIZLED8X8.png

Codi Arduino

'''// Fem servir la variable temps amb la funció "millis" per contar-ne els milisegons:'''
unsigned long time = millis();

'''//Iniciatlitzem els pins per files:'''
const int row[8] = {
  2, 7, 19, 5, 13, 18, 12, 16
};
'''//Iniciatlitzem els pins per columnes:'''
const int col[8] = {
  6, 11, 10, 3, 17, 4, 8, 9
};

'''//Creem un vector bidimensional pels pixels:'''
int pixels[8][8];

'''//Inicialitzem al centre la posició del cursor:'''
 int x = 5;
 int y = 5;

'''//Creem 2 funcions; goingUp per moure el cursor i stopped per saber si està o no en moviment''' 
boolean goingUp=true;
boolean stopped=true;

void setup() {
  Serial.begin(9600);
  
  '''// Inicialitza i itinera entre els pins:'''
  
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    
    pinMode(col[thisPin], OUTPUT);
    pinMode(row[thisPin], OUTPUT);
    
    '''// Initialitzem els pins de columna a HIGH per assegurar-nos que estan apagats:'''
    digitalWrite(col[thisPin], HIGH);
  }

  '''// Inicialitzem la matriu de pixels:'''
  
  for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
      pixels[x][y] = HIGH;
    }
  }
 }

void loop() {
  
  '''// Crida a la funcio per moure el cursor:'''
  movePlayer();

  '''// Refresca la pantalla cridant a la funció:'''
  refreshScreen();
}


void  movePlayer(){

  '''// Inicialitza a HIGH la posició:'''
   pixels[x][y] = HIGH;

  '''// Fem que llegeixi el moviment del joystick, aquest enregistra moviments en forma de
  // números de l'1 al 1024. Fem que si el valor que registra és més gran que 800 i està
  // parat, augmenti una posició en l'eix de les X, si és més petit que 300 en disminueixi 
  // una posició al mateix eix i que si es troba entre 300 i 800 (al centre) no mogui la
  // posició del cursor.'''
 
  int readX = analogRead(A0);
  if(readX>800 && stopped && x < 7){
    x++;
    stopped= false;
  }
  else if (readX<300 && stopped && x > 0){
      x--;
      stopped= false; 
  }
  else if(readX>300 && readX<800) {
    stopped = true;
  }

'''// Jugant amb el temps, fem que els moviments es refresquin cada 0,3 segons per fer-ho 
// fluït però a la vegada fàcil de seguir amb la vista:'''
  if(millis()-time>300){
    if(y==7){
    goingUp=true;
  }
  if(y==0){
    goingUp=false;
  }
  if(goingUp){
    y--;
  }
  else{
    y++;
  }
    time=millis();
  }
    pixels[x][y] = LOW;
}

'''// Funció de refrescar la pantalla, el que fa és apagar tots els pins;'''
void refreshScreen() {
  for (int thisRow = 0; thisRow < 8; thisRow++) {
    digitalWrite(row[thisRow], HIGH);
    for (int thisCol = 0; thisCol < 8; thisCol++) {
      int thisPixel = pixels[thisRow][thisCol];
      digitalWrite(col[thisCol], thisPixel);
      if (thisPixel == LOW) {
        digitalWrite(col[thisCol], HIGH);
      }
    }
    digitalWrite(row[thisRow], LOW);
  }
}

Vídeo