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: 4.469
06 de novembro de 2017