NeoMatrix Arduino Pong
Компоненты и расходные материалы
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| Женский заголовок 8, позиция 1, строка (0,1 ") | | × | 1 | |
| половинный размер макета Perma-Proto | | × | 1 | |
| Аналоговый джойстик (общий) | | × | 1 | |
| Поворотный потенциометр (общий) | | × | 1 | |
Приложения и онлайн-сервисы
Об этом проекте
Матрица
Нет, не фильм, а матрица NeoPixel! Чтобы сделать матрицу, достаточно купить одну полосу индивидуально адресуемых светодиодов NeoPixel. Разверните полоску и обратите внимание на стрелки на ней. Вы можете прикрепить их только в ОДНОМ НАПРАВЛЕНИИ, вы можете испортить их, если ориентация неправильная.
Я использовал полосу 30 светодиодов / м 5 м и разрезал их на полосы по десять светодиодов в каждой. Затем я начал укладывать полосы на картон, чередуя ориентацию. Затем я отрезал провода нужной длины и припаял их к клеммам NeoPixel. После того, как я проделал это 14 раз, моя матрица наконец была готова! Затем я проверил мультиметром, чтобы не было коротких замыканий, так как короткое замыкание сожжет Nano, матрицу и, возможно, ваш USB-порт (я знаю по опыту). Загрузите тестовый набросок неоматрицы с параметрами «NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG». Если он прокручивает «привет» по дисплею, значит, с дисплеем все готово!
Логика
В игре в понг есть несколько объектов:ракетка, стены и мяч. В коде есть переменные ball X и ball Y, которые отслеживают положение мяча. Направление мяча определяется переменными направления либо 1, либо -1. Манипулятор представляет собой прямоугольник, который управляется потенциометром, которому присвоены значения от 0 до 15. Y весла не изменится, поэтому переменная для его отображения не требуется. В начале игры мяч начинается с 1,1, и игрок должен позволить мячу отскочить один раз, чтобы начать. Физика учитывает направление мяча и место его попадания в ракетку.
Веселое время!
Теперь просто подключите матрицу NeoPixel к Arduino Nano, + 5 В на джойстике к 5 В, GND к Arduino GND и, наконец, ось X к A0. Получайте удовольствие от своей новой игры в понг! Попробуйте добавить больше игроков и улучшить физику для испытания!
Код
Код Arduino C / C ++
<Предварительно> #include #include #include #define PIN-матрица 6Adafruit_NeoMatrix =Adafruit_NeoMatrix (15, 10, PIN-код, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800); // переменные для положения мяча и ракетки; int paddleX =0; int paddleY =0; int oldPaddleX, oldPaddleY; int ballDirectionX =1; int ballDirectionY =1; int score =0; int ballSpeed =10; // меньшие числа быстрее int ballX, ballY, oldBallX, oldBallY; void setup () {Serial.begin (9600); // инициализируем матрицу отображения .begin (); // черный фон matrix.fillScreen (0); matrix.setTextColor (matrix.Color (0,255,0)); matrix.print («GO»); matrix.show (); задержка (2000); matrix.fillScreen (0); matrix.show ();} void loop () {// сохраняет ширину и высоту экрана int myWidth =matrix.width (); int myHeight =matrix.height (); // сопоставляем положение лопасти с позицией потенциометров paddleX =map (analogRead (A0), 0, 1023, 0, 12); paddleY =8; // установить черный цвет заливки и стереть предыдущую // позицию ракетки, если она отличается от текущей if (oldPaddleX! =paddleX || oldPaddleY! =paddleY) {matrix.fillRect (oldPaddleX, oldPaddleY, 4, 1, matrix. Цвет (0,0,0)); } // рисуем ракетку на экране, // сохраняем текущую позицию как предыдущую. //if(paddleX> =0 &&paddleX <=11) {matrix.fillRect (paddleX, paddleY, 4, 1, matrix.Color ( 0,0,255)); //} // иначе if (paddleX <0) {// paddleX =0; //matrix.fillRect(paddleX, paddleY, 3, 1, matrix.Color (0,0,255)); //} // иначе if (paddleX> =13) {//} oldPaddleX =paddleX; oldPaddleY =веслоY; matrix.show (); // обновляем положение мяча и выводим его на экран if (millis ()% ballSpeed <2) {moveBall (); } matrix.show (); если (ballY> 8 &&(millis ()> 10000)) {оценка + =1; matrix.fillScreen (0); matrix.setTextColor (matrix.Color (255,0,0)); matrix.setCursor (0,2); matrix.print (Строка (оценка)); matrix.show (); задержка (4000); ballX =случайный (3,11); ballY =случайный (1,1); matrix.fillScreen (0); matrix.show (); задержка (1000); } delay (5);} // эта функция определяет положение мяча на экранеvoid moveBall () {// если мяч уходит за пределы экрана, меняем направление:if (ballX> matrix.width () - 1 || ballX <0) {ballDirectionX =-ballDirectionX; } если (ballY> matrix.height () || ballY <0) {ballDirectionY =-ballDirectionY; } // проверяем, занимают ли мяч и ракетка одно и то же место на экране if (inPaddle (ballX, ballY, paddleX, paddleY, 4, 1)) {if (ballX ==paddleX &&ballY ==paddleY) {ballDirectionX =- ballDirectionX; ballDirectionY =-ballDirectionY; } иначе, если (ballX ==paddleX + 3 &&ballY ==paddleY) {ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; } иначе, если (ballX ==paddleX + 1 &&ballY ==paddleY) {ballDirectionX =-ballDirectionX; ballDirectionY =-ballDirectionY; } иначе, если (ballX ==paddleX + 2 &&ballY ==paddleY) {ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; }} // обновляем положение мяча ballX + =ballDirectionX; ballY + =ballDirectionY; // стираем предыдущую позицию шара if (oldBallX! =ballX || oldBallY! =ballY) {matrix.drawPixel (oldBallX, oldBallY, matrix.Color (0,0,0)); } // рисуем текущее положение мяча matrix.drawPixel (ballX, ballY, matrix.Color (150,150,0)); oldBallX =ballX; oldBallY =ballY;} // эта функция проверяет положение мяча // чтобы увидеть, пересекается ли он с ракеткой inPaddle (int x, int y, int rectX, int rectY, int rectWidth, int rectHeight) {boolean result =false; если ((x> =rectX &&x <=(rectX + rectWidth)) &&(y> =rectY &&y <=(rectY + rectHeight))) {результат =true; } вернуть результат;} Код Arduino C / C ++
<Предварительно> #include #include #include #define PIN-матрица 6Adafruit_NeoMatrix =Adafruit_NeoMatrix (15, 10, PIN-код, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800); // переменные для положения мяча и ракетки; int paddleX =0; int paddleY =0; int oldPaddleX, oldPaddleY; int ballDirectionX =1; int ballDirectionY =1; int score =0; int ballSpeed =10; // меньшие числа быстрее int ballX, ballY, oldBallX, oldBallY; void setup () {Serial.begin (9600); // инициализируем матрицу отображения .begin (); // черный фон matrix.fillScreen (0); matrix.setTextColor (matrix.Color (0,255,0)); matrix.print («GO»); matrix.show (); задержка (2000); matrix.fillScreen (0); matrix.show ();} void loop () {// сохраняет ширину и высоту экрана int myWidth =matrix.width (); int myHeight =matrix.height (); // сопоставляем положение лопасти с позицией потенциометров paddleX =map (analogRead (A0), 0, 1023, 0, 12); paddleY =8; // установить черный цвет заливки и стереть предыдущую // позицию ракетки, если она отличается от текущей if (oldPaddleX! =paddleX || oldPaddleY! =paddleY) {matrix.fillRect (oldPaddleX, oldPaddleY, 4, 1, matrix. Цвет (0,0,0)); } // рисуем ракетку на экране, // сохраняем текущую позицию как предыдущую. //if(paddleX> =0 &&paddleX <=11) {matrix.fillRect (paddleX, paddleY, 4, 1, matrix.Color ( 0,0,255)); //} // иначе if (paddleX <0) {// paddleX =0; //matrix.fillRect(paddleX, paddleY, 3, 1, matrix.Color (0,0,255)); //} // иначе if (paddleX> =13) {//} oldPaddleX =paddleX; oldPaddleY =веслоY; matrix.show (); // обновляем положение мяча и выводим его на экран if (millis ()% ballSpeed <2) {moveBall (); } matrix.show (); если (ballY> 8 &&(millis ()> 10000)) {оценка + =1; matrix.fillScreen (0); matrix.setTextColor (matrix.Color (255,0,0)); matrix.setCursor (0,2); matrix.print (Строка (оценка)); matrix.show (); задержка (4000); ballX =случайный (3,11); ballY =случайный (1,1); matrix.fillScreen (0); matrix.show (); задержка (1000); } delay (5);} // эта функция определяет положение мяча на экранеvoid moveBall () {// если мяч уходит за пределы экрана, меняем направление:if (ballX> matrix.width () - 1 || ballX <0) {ballDirectionX =-ballDirectionX; } если (ballY> matrix.height () || ballY <0) {ballDirectionY =-ballDirectionY; } // проверяем, занимают ли мяч и ракетка одно и то же место на экране if (inPaddle (ballX, ballY, paddleX, paddleY, 4, 1)) {if (ballX ==paddleX &&ballY ==paddleY) {ballDirectionX =- ballDirectionX; ballDirectionY =-ballDirectionY; } иначе, если (ballX ==paddleX + 3 &&ballY ==paddleY) {ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; } иначе, если (ballX ==paddleX + 1 &&ballY ==paddleY) {ballDirectionX =-ballDirectionX; ballDirectionY =-ballDirectionY; } иначе, если (ballX ==paddleX + 2 &&ballY ==paddleY) {ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; }} // обновляем положение мяча ballX + =ballDirectionX; ballY + =ballDirectionY; // стираем предыдущую позицию шара if (oldBallX! =ballX || oldBallY! =ballY) {matrix.drawPixel (oldBallX, oldBallY, matrix.Color (0,0,0)); } // рисуем текущее положение мяча matrix.drawPixel (ballX, ballY, matrix.Color (150,150,0)); oldBallX =ballX; oldBallY =ballY;} // эта функция проверяет положение мяча // чтобы увидеть, пересекается ли он с ракеткой inPaddle (int x, int y, int rectX, int rectY, int rectWidth, int rectHeight) {boolean result =false; если ((x> =rectX &&x <=(rectX + rectWidth)) &&(y> =rectY &&y <=(rectY + rectHeight))) {результат =true; } вернуть результат;} Схема