После первого эксперимента с ардуино, джойстиком и сервомотором я начал думать, как еще можно использовать стик. Так как у меня был дисплей 128x64 для arduino, было решено сделать что-нибудь с ним. Наиболее простой вариант - передвигать фигуру по дисплею вслед за манипуляциями джойстика. Итак, у нас в наличии: аналог arduino uno, джойстик и дисплей 128x64 точек.
Теперь собираем схему. Подключаем джойстик к arduino:
- gnd - gnd;
- 5v - 5v;
- VRX (сигнал для координат по оси X) - A1;
- VRY (сигнал для координат по оси Y) - A0;
- SW (режим кнопки - нажата или отпущена) - 2 пин.
Подключаем дисплей к arduino:
- gnd - gnd;
- vcc - 3.3v;
- scl - A5;
- sda - A4.
Открываем Arduino IDE, запускаем следующий скетч:
//Подключаем библиотеки
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
int x = 0; // текущая позиция x
int y = 0; // текущая позиция y
int minX = 0; // минимальное значение x
int minY = 0; // минимальное значение y
int maxX = 128; // максимальное значение x
int maxY = 64; // максимальное значение x
int const centerX = 64; // центр x
int const centerY = 32; // центр y
int xPin = A1; //А1 - аналоговый сигнал Х координат джойстика
int yPin = A0; //А0 - аналоговый сигнал У координат джойстика
int buttonPin = 2; // Пин для режима кнопки (нажата или отпущена)
int buttonState = 0; //текущее состояние кнопки (нажата)
int xPosition = 0; // переменная для хранения текущей позиции джойстика по оси X
int yPosition = 0; // переменная для хранения текущей позиции джойстика по оси Y
void setup() {
Serial.begin(9600); // инициализация обмена данными по серийному протоколу со скоростью 9600 bps
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализация I2C адреса 0x3C
// начальные позиции фигуры - центр экрана
x = centerX;
y = centerY;
pinMode(xPin, INPUT); // Сигнал с xPin определяем как входной сигнал
pinMode(yPin, INPUT); // Сигнал с yPin определяем как входной сигнал
pinMode(buttonPin, INPUT_PULLUP); // активируем подтягивающий резистор на пине кнопки
}
void loop() {
display.clearDisplay();
xPosition = analogRead(xPin); // читаем значение xPin
yPosition = analogRead(yPin); // читаем значение yPin
buttonState = digitalRead(buttonPin); // читаем 'состояние' кнопки
//если значение xPosition больше 530
if(xPosition > 530) {
x = x + 2;
if(x > 126) {
x = 126;
}
}
//если xPosition меньше 500
if(xPosition < 500) {
x = x - 2;
if(x < 0) {
x = 0;
}
}
//если значение yPosition больше 530
if(yPosition > 530) {
y = y + 2;
if(y > 62) {
y = 62;
}
}
//если yPosition меньше 500
if(yPosition < 500) {
y = y - 2;
if(y < 0) {
y = 0;
}
}
// если нажата кнопка джойстика
if(buttonState == 0)
{
x = centerX;
y = centerY;
}
// рисуем прямоугольник
display.drawRect(x, y, 2, 2, WHITE);
// отображаем на дисплее
display.display();
// задержка 10 милисекунд
delay(10);
}
После загрузки скетча в центре дисплея отрисуется прямоугольник, который можно передвигать по осям X и Y манипулируя джойстиком. Вот видео с результатами работы:
Итак, в данной статье рассмотрен процесс подключения дисплея 128x64 точек и джойстика к Arduino Uno, приведен пример скетча, позволяющего двигать прямоугольник на дисплее манипулируя джойстиком.
В дальнейшем планирую написать простую игру наподобие тетриса или арканоида используя arduino uno, джойстик и дисплей.