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: | + | '''// 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++) { | ||
− | |||
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
- 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); } }