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++) {
Línia 45: Línia 45:
 
     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 60: 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 70: 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 92: 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 112: 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ó de 14:45, 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