Matriu LED amb joystick
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); } }