Как воссоздать игру в понг с двумя горшками и функцией карты?
Я работаю над проектом для своих братьев и всех, кто заинтересован в том, чтобы поиграть в настольный теннис. Я просто застрял на программной части. Я действительно не знаю, что делать. Но у меня есть идея: я хочу использовать функцию map (), чтобы облегчить себе жизнь, однако я не уверен, как использовать функцию map с матрицей точек. Любая помощь будет признательна. Все это было в этом наборе.
Вот тестовый код:
#include <LedControl.h>
int DIN = 2;
int CS = 3;
int CLK = 4;
const int playerOnePin = A0;
const int playerTwoPin = A1;
int playerOneValue;
int playerOneValue2;
int playerTwoValue;
int playerTwoValue2;
LedControl lc = LedControl(DIN, CLK, CS, 0);
void setup() {
lc.shutdown(0, false); //The MAX72XX is in power-saving mode on startup
lc.setIntensity(0, 15); // Set the brightness to maximum value
lc.clearDisplay(0); // and clear the display
pinMode(playerOnePin, INPUT);
pinMode(playerTwoPin, INPUT);
}
void loop() {
byte a[8] = {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
printByte(a);
}
void printByte(byte character []) {
int i = 0;
for (i = 0; i < 8; i++)
{
lc.setRow(0, i, character[i]);
}
}
void readPot() {
playerOneValue = analogRead(A0);
playerOneValue2 = map(playerOneValue, 0, 1023, 0, 180);
}
Вот другой код:
#include <LedControl.h>
int DIN = 2;
int CS = 3;
int CLK = 4;
byte displayImage[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// considering a 2d co-ordinate system with origin (0,0) at bottom left corner
int ballX = 3; //X position
int ballY = 7; //Y position - top
int speedX = 0; // no X movement, can be -1, 0 or 1
int speedY = -1; // downward Y movement, can be -1, 0 or 1
int paddleX = 4; // X position of center of paddle - can be 1 to 6. Paddle width is 3
int score = 0;
LedControl lc = LedControl(DIN, CLK, CS, 0);
void setup() {
pinMode (A0, INPUT);
pinMode (A1, INPUT);
lc.shutdown(0, false); // Keep MAX72XX awake
lc.setIntensity(0, 15); // Set the brightness to maximum value
lc.clearDisplay(0); // and clear the display
}
void loop() {
// update ball position
ballX = ballX + speedX;
ballY = ballY + speedY;
// check for ball interaction with walls
if (ballX == 0 || ballX == 7) {
speedX = speedX * -1; // bouncing off walls in horizontal direction
}
// bouncing off ceiling
if (ballY == 7) {
speedY = speedY * -1; // bouncing off the ceiling
}
// bouncing off the paddle
if (ballY == 0 && ballX >= (paddleX - 1) && ballX <= (paddleX + 1)) {
speedY = speedY * -1;
score++; // player earns a point
}
// going past the paddle
if (ballY == 0 && ballX < (paddleX - 1) && ballX > (paddleX + 1)) {
// going past the paddle - player is out
Serial.println(); Serial.print("Score: "); Serial.println(score);
for (int i = 0; i < 8; i++) {
displayImage[i] = 0x00;
}
displayImage[3] = 0xFF; displayImage[4] = 0xFF; // show a line
renderByte(displayImage);
while (1); // Freeze
}
// clearing the image variable
for (int i = 0; i < 8; i++) {
displayImage[i] = 0x00;
}
// generating new image
addPixel(ballX, ballY); // adding the ball position to image
addPixel(paddleX - 1, 0); addPixel(paddleX, 0); addPixel(paddleX + 1, 0);
// adding paddle position to image
renderByte(displayImage); // show the generated image
// handling paddle control
if (analogRead(A0) && paddleX > 0) {
paddleX = paddleX - 1; // move paddle left
}
if (analogRead(A1) && paddleX < 7) {
paddleX = paddleX + 1; // move paddle right
}
delay(200);
}
void addPixel(int xVal, int yVal) {
int newRowval = 2 ^ (7 - xVal);
int rowVal = displayImage[7 - yVal];
displayImage[7 - yVal] = rowVal || newRowval; // inserting a 1 at the required pixel
}
void renderByte(byte image [])
{
int i = 0;
for (i = 0; i < 8; i++)
{
lc.setRow(0, i, image[i]);
}
}
Вот изображение проводки и схема:
@Austin, 👍2
Обсуждение1 ответ
Лучший ответ:
Сначала определите минимальные и максимальные значения, которые может иметь paddleX. Я предполагаю,что если весло шириной в две точки, то его min, max будет 0,6, Затем определите min и max вашего пота, как правило, 0,1023 для 10-битного ацп. Теперь, чтобы сопоставить значение вашего пота со значением paddleX, вы бы использовали команду :
paddleX = map(analogRead(A0),0,1023,0,6);
вот документация по карте : https://www.arduino.cc/reference/en/language/functions/math/map/
Для равномерно распределенного отображения paddleX = карта(аналоговый поток(A0),0,1024,0,7);
это дало бы лучшие результаты. ( Целочисленное деление усекается ), @DataFiddler
Да, весло имеет ширину в две точки., @Austin
Я действительно не знаю, что делать дальше., @Austin
- Как отобразить текст в матрицу 8x8 с 64-разрядными целыми числами?
- Просто становится слишком жарко . Есть какой-нибудь способ его охладить?
- Можете ли вы использовать python для управления RGB-матрицей с помощью Arduino Mega?
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
Ваш мяч будет идти либо прямо, либо по диагонали под углом 45° ?, @DataFiddler
Да, мяч полетит прямо, я не знаю, как насчет диагональной части, но он не сдвинет весло., @Austin