Шпаргалка по робототехнике
Шпаргалки по подключению компонентов к ардуино
Пример программы по управлению экраном OLED 128X64
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // ширина OLED-дисплея в пикселях
#define SCREEN_HEIGHT 64 // высота OLED-дисплея в пикселях
#define SCREEN_ADDRESS 0x3C // адрес дисплея по I2C (может отличаться в зависимости от модуля)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // создание объекта дисплея

void setup() {
  Serial.begin(9600);
  // инициализация дисплея с указанием I2C-адреса
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("Failed to start SSD1306 OLED"));
    while (1);
  }
  delay(2000); // задержка для инициализации
  display.clearDisplay(); // очистка дисплея
}

void loop() {
  // рисование прямоугольника
  display.drawRect(0, 15, 60, 40, WHITE);
  display.display(); // отображение на OLED
  delay(2000);
}
Библиотека Adafruit_GFX.h
Библиотека Adafruit предоставляет функции для рисования различных примитивов, от простых пикселей до сложных фигур, таких как круги и треугольники. Некоторые команды для рисования:
  • drawPixel(x, y, color). Устанавливает один пиксель, принимает в качестве аргументов координаты x и y, где появляется пиксель, и цвет.
  • drawLine(x0, y0, x1, y1, color). Рисует линию между двумя точками.
  • drawFastHLine(x, y, w, color). Оптимизированная горизонтальная линия.
  • drawFastVLine(x, y, h, color). Оптимизированная вертикальная линия.
  • drawRect(x, y, w, h, color). Рисует контур прямоугольника.
  • fillRect(x, y, w, h, color). Рисует заполненный прямоугольник.
  • drawCircle(x0, y0, r, color). Рисует контур круга.
  • fillCircle(x0, y0, r, color). Рисует заполненный круг.
  • drawRoundRect(x0, y0, w, h, radius, color). Рисует закруглённый прямоугольник.
  • drawTriangle(x0, y0, x1, y1, x2, y2, color). Рисует контур треугольника.
  • fillTriangle(x0, y0, x1, y1, x2, y2, color). Рисует заполненный треугольник.
Чтобы вывести на экран вышенаписанные команды, нужно прописать команду
display.display();

Кроме того, библиотека предоставляет функции для рисования текста, такие как setCursor, setTextColor, setTextSize и print.
ИГРА на OLED экране
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // ширина OLED-дисплея в пикселях
#define SCREEN_HEIGHT 64 // высота OLED-дисплея в пикселях
#define SCREEN_ADDRESS 0x3C // адрес дисплея по I2C (может отличаться в зависимости от модуля)
#define LEVO=2
#define PRAVO=3
#define VERH=4
#define NIZ=5

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // создание объекта дисплея

//переменные для обьекта "ШАР"
int R=5;
int X=64;
int Y=32;
int VX=1;
int VY=1;

//переменные для объекта "БОМБА"
int R2=2;
int X2=124 //начальная координата бомбы
int Y2=10
int VX2=3 //скорость бомбы

void setup() {
  //настройка контактов для подключения кнопок
  pinMode(LEVO,INPUT_PULLUP);
  pinMode(PRAVO,INPUT_PULLUP);
  pinMode(VERH,INPUT_PULLUP);
  pinMode(NIZ,INPUT_PULLUP);

  Serial.begin(9600);
  // инициализация дисплея с указанием I2C-адреса
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("Failed to start SSD1306 OLED"));
    while (1);
  }
  delay(2000); // задержка для инициализации
  display.clearDisplay(); // очистка дисплея
}

void loop() {
  // прорисовка объектов в кадре
  display.clearDisplay();
  display.fillCircle(X,Y, R, WHITE);
  display.fillCircle(X2,Y2, R2, WHITE);
  display.display();
  delay(50);// отображение на OLED
  
  //движение нашего шара
  //X=X+VX;
  //Y=Y+VY;
  //if (X>128){VX=-VX;}
  //if (X<0){VX=-VX;}
  //if (Y>64){VY=-VY;}
  //if (Y<0){VY=-VY;}
  if(digitalRead(PRAVO)==0){X=X+VX;}
  if(digitalRead(LEVO)==0){X=X-VX;}
  if(digitalRead(VERH)==0){Y=Y+VY;}
  if(digitalRead(NIZ)==0){Y=Y-VY;}

  //движение бомбы
  X2=X2-VX2;
  if(X2<0){
    X2=127;
    Y2=random(63);
  }

  //отслеживание столкновения
  if(abs(X-X2)<(R+R2)&&abs(Y-Y2)<(R+R2)){
    display.clearDisplay(); // Очистить буфер
  display.setTextSize(4); // Установить размер шрифта
  display.setTextColor(SSD1306_WHITE); // Установить цвет текста (белый)
  display.setCursor(0, 15); // Установить позицию курсора
  display.println("BOOM"); // Вывести текст
  display.display(); // Отправить буфер на экран
  delay(5000);
  X2=127;
  Y2=random(63);
  }
}
ИГРА "ЗМЕЙКА" на OLED экране
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Настройки дисплея
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Пины кнопок
const int upButton = 2;
const int rightButton = 3;
const int downButton = 4;
const int leftButton = 5;

// Настройки игры
const int pixelSize = 4; // Размер сегмента змейки в пикселях
const int gridWidth = SCREEN_WIDTH / pixelSize;
const int gridHeight = SCREEN_HEIGHT / pixelSize;

struct Point {
  int x, y;
};

Point snake[256]; // Массив сегментов змейки (максимум 256 сегментов)
int snakeLength = 3;
Point food;
int dx = 1, dy = 0; // Направление движения (по умолчанию — вправо)
bool gameOver = false;
unsigned long lastMoveTime = 0;
const long moveInterval = 150; // Интервал движения в мс

void setup() {
  Serial.begin(9600);

  // Инициализация дисплея
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Бесконечный цикл при ошибке
  }
  display.display();
  delay(2000);
  display.clearDisplay();

  // Настройка пинов кнопок
  pinMode(upButton, INPUT_PULLUP);
  pinMode(rightButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(leftButton, INPUT_PULLUP);

  initializeGame();
}

void initializeGame() {
  // Начальная позиция змейки
  snake[0] = {gridWidth / 2, gridHeight / 2};
  for (int i = 1; i < snakeLength; i++) {
    snake[i] = {snake[i - 1].x - 1, snake[i - 1].y};
  }

  generateFood();
  gameOver = false;
  dx = 1; dy = 0;
  lastMoveTime = millis();
}

void generateFood() {
  food.x = random(0, gridWidth);
  food.y = random(0, gridHeight);

  // Проверка, что еда не на змейке
  for (int i = 0; i < snakeLength; i++) {
    if (food.x == snake[i].x && food.y == snake[i].y) {
      generateFood(); // Рекурсивный вызов при наложении
      return;
    }
  }
}

void readInput() {
  if (digitalRead(upButton) == LOW && dy != 1) { // Нельзя двигаться вниз, если движемся вверх
    dx = 0; dy = -1;
  } else if (digitalRead(rightButton) == LOW && dx != -1) {
    dx = 1; dy = 0;
  } else if (digitalRead(downButton) == LOW && dy != -1) {
    dx = 0; dy = 1;
  } else if (digitalRead(leftButton) == LOW && dx != 1) {
    dx = -1; dy = 0;
  }
}

void updateGame() {
  // Движение змейки: каждый сегмент следует за предыдущим
  for (int i = snakeLength - 1; i > 0; i--) {
    snake[i] = snake[i - 1];
  }

  // Новая позиция головы
  snake[0].x += dx;
  snake[0].y += dy;

  // Проверка границ (телепортация на противоположную сторону)
  if (snake[0].x < 0) snake[0].x = gridWidth - 1;
  if (snake[0].x >= gridWidth) snake[0].x = 0;
  if (snake[0].y < 0) snake[0].y = gridHeight - 1;
  if (snake[0].y >= gridHeight) snake[0].y = 0;

  // Проверка столкновения с собой
  for (int i = 1; i < snakeLength; i++) {
    if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
      gameOver = true;
      return;
    }
  }

  // Проверка поедания еды
  if (snake[0].x == food.x && snake[0].y == food.y) {
    snakeLength++;
    generateFood();
  }
}

void drawGame() {
  display.clearDisplay();

  // Отрисовка змейки
  for (int i = 0; i < snakeLength; i++) {
    display.fillRect(snake[i].x * pixelSize, snake[i].y * pixelSize,
                   pixelSize, pixelSize, SSD1306_WHITE);
  }

  // Отрисовка еды
  display.fillRect(food.x * pixelSize, food.y * pixelSize,
                 pixelSize, pixelSize, SSD1306_WHITE);

  // Отображение счёта
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("Score: ");
  display.print(snakeLength - 3);

  if (gameOver) {
    display.setTextSize(1);
    display.setCursor(30, 30);
    display.print("GAME OVER");
  }

  display.display();
}

void loop() {
  unsigned long currentTime = millis();

  readInput();

  if (!gameOver && currentTime - lastMoveTime >= moveInterval) {
    updateGame();
    lastMoveTime = currentTime;
  }

  drawGame();

  // Перезапуск при проигрыше по нажатию любой кнопки
  if (gameOver &&
      (digitalRead(upButton) == LOW ||
       digitalRead(rightButton) == LOW ||
       digitalRead(downButton) == LOW ||
       digitalRead(leftButton) == LOW)) {
    initializeGame();
  }

  delay(10); // Небольшая задержка для стабильности
}
ЧПУ станок
1) Собери механику станка
2) Прошей плату Ардуино . Скачать прошивку можно по ссылке:
Made on
Tilda