Arduino uno, джойстик и дисплей (128x64) - двигаем прямоугольником

После первого эксперимента с ардуино, джойстиком и сервомотором я начал думать, как еще можно использовать стик. Так как у меня был дисплей 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, джойстик и дисплей.