Diferència entre revisions de la pàgina «Matriu LED amb joystick»
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: | |
unsigned long time = millis(); | unsigned long time = millis(); | ||
− | + | //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: | |
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: | |
int pixels[8][8]; | int pixels[8][8]; | ||
− | + | //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 | |
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: | |
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: | |
digitalWrite(col[thisPin], HIGH); | digitalWrite(col[thisPin], HIGH); | ||
} | } | ||
− | + | // 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: | |
movePlayer(); | movePlayer(); | ||
− | + | // Refresca la pantalla cridant a la funció: | |
refreshScreen(); | refreshScreen(); | ||
} | } | ||
Línia 70: | Línia 70: | ||
void movePlayer(){ | void movePlayer(){ | ||
− | + | // 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 | |
// 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 | |
− | // 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; | |
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
- Placa Arduino Uno
- Matriu de LEDs
- Protoboard
- Joystick
- 19 cables
Esquema connexions
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); } }