23 de novembro de 2017
Neste projeto vamos aprender a controlar uma Matriz de LED (Dot Matrix) 8X8 utilizando um Joystick com o Arduino.
As peças necessárias são:
A ligação da Matriz de LED é a mesma utilizada em um dos projetos de exemplo que acompanham a IDE do Arduino chamado RowColumnScanning, você pode encontrar o detalhamento da ligação e outras explicações no próprio link.
Neste exemplo iremos usar um Joystick para a movimentação do LED, o que dá um controle muito melhor que os dois potenciômetros.
O código também é totalmente diferente e acredito que esteja mais simples e fácil de compreender.
Outra diferença são os resistores que devem ser usados para evitar sobrecarga de corrente nos LEDs e possível dano ao seu display.
Na imagem podemos ver a ligação para termos uma ideia melhor:

Segue o esquema das ligações:

Neste esquema o Joystick possui uma nomenclatura diferente do que estou usando, o que pode ser o seu caso também. Caso isso ocorra é só trocar as opções HORZ e VERT por VRx e VRy respectivamente.
Veja o vídeo demonstrativo:
E finalmente, segue o código:
int axisX = A0;
int axisY = A1;
float valX;
float valY;
// Set initial position
int currentRow = 3;
int currentCol = 3;
// Boundaries
int maxLimit = 7;
int minLimit = 0;
// Lower numbers are faster
int gameSpeed = 100;
// Just for reference
// Dot Matrix Rows pins sequence: 9, 14, 8, 12, 1, 7, 2, 5
// Dot Matrix Cols pins sequence: 13, 3, 4, 10, 6, 11, 15, 16
int rows[] = { 2, 7, 19, 5, 13, 18, 12, 16 };
int cols[] = { 6, 11, 10, 3, 17, 4, 8, 9 };
void setup() {
// Optional declaration, but useful for clearness
pinMode(axisX, INPUT);
pinMode(axisY, INPUT);
// Set all rows/cols pins as OUTPUT
for (byte i = 0; i < 8; i++) {
pinMode(rows[i], OUTPUT);
pinMode(cols[i], OUTPUT);
}
drawLed();
}
void loop() {
readJoystick();
defineMovement();
}
void turnOffAllLeds() {
for (byte i = 0; i < 8; i++) {
digitalWrite(rows[i], LOW);
digitalWrite(cols[i], HIGH);
}
}
void readJoystick() {
valX = analogRead(axisX);
valY = analogRead(axisY);
delay(gameSpeed);
}
void defineMovement() {
// Controls reversed due to joystick cables position
// Left and Right
if (valX > 550 && currentCol > minLimit) {
currentCol -= 1;
drawLed();
} else if (valX < 500 && currentCol < maxLimit) {
currentCol += 1;
drawLed();
}
// Up and Down
if (valY > 550 && currentRow > minLimit) {
currentRow -= 1;
drawLed();
} else if (valY < 500 && currentRow < maxLimit) {
currentRow += 1;
drawLed();
}
}
void drawLed() {
turnOffAllLeds();
digitalWrite(rows[currentRow], HIGH);
digitalWrite(cols[currentCol], LOW);
}
Visualizações: 5.428
06 de novembro de 2017