Сервомотор SG90 с памятью на SD-карте Arduino

Сервомотор SG90 с записью траектории на SD-карту — отличный проект для создания повторяемых движений в робототехнике, ЧПУ-станках или панорамных камерах. В этом уроке своими руками мы подключим два сервомотора SG90 к Arduino, запишем углы поворота с потенциометров на microSD-карту и воспроизведём сохранённые движения автономно.

Сервомотор SG90 с памятью на SD-карте Arduino

Возможности проекта

  • Запись углов двух сервомоторов с потенциометров
  • Сохранение траектории на microSD-карту
  • Автономное воспроизведение движений
  • Лёгкое расширение до 12 сервомоторов (на Uno)
  • Создание роботов, манипуляторов, панорамных систем

Необходимые компоненты

  • Arduino Uno / Nano
  • 2 сервомотора SG90
  • 2 потенциометра 10 кОм
  • Модуль microSD-карты
  • microSD-карта (FAT16/FAT32)
  • Макетная плата и провода

Схема подключения

Потенциометры:

  • Крайние выводы → 5V и GND
  • Средний → A0 и A1

Сервомоторы SG90:

  • Красный → 5V
  • Коричневый → GND
  • Оранжевый → D9 и D10

Модуль microSD:

  • CS → D4
  • SCK → D13
  • MOSI → D11
  • MISO → D12
  • VCC → 5V, GND → GND

Запись траектории (скетч 1)

#include <SPI.h>
#include <SD.h>
#include <Servo.h>

Servo servo1, servo2;
File dataFile;

void setup() {
  Serial.begin(9600);
  if (!SD.begin(4)) {
    Serial.println("SD error!");
    return;
  }
  dataFile = SD.open("traj.txt", FILE_WRITE);
}

void loop() {
  int pot1 = analogRead(A0);
  int pot2 = analogRead(A1);
  int angle1 = map(pot1, 0, 1023, 0, 180);
  int angle2 = map(pot2, 0, 1023, 0, 180);
  
  servo1.write(angle1);
  servo2.write(angle2);
  
  if (dataFile) {
    dataFile.println(String(angle1) + "," + String(angle2));
    Serial.println(String(angle1) + "," + String(angle2));
  }
  delay(100); // частота записи
}
Делает следующее:
считывает два потенциометра на A0 и A1.
преобразует значения в углы 0–180°.
управляет двумя сервоприводами в реальном времени.
записывает текущие углы в файл traj.txt на SD-карту каждые 100 мс.

Воспроизведение (скетч 2)

#include <SPI.h>
#include <SD.h>
#include <Servo.h>

Servo servo1, servo2;
File dataFile;

void setup() {
  servo1.attach(9);
  servo2.attach(10);
  if (!SD.begin(4)) return;
  dataFile = SD.open("traj.txt");
}

void loop() {
  if (dataFile.available()) {
    String line = dataFile.readStringUntil('\n');
    int comma = line.indexOf(',');
    int angle1 = line.substring(0, comma).toInt();
    int angle2 = line.substring(comma+1).toInt();
    
    servo1.write(angle1);
    servo2.write(angle2);
    delay(100);
  } else {
    dataFile.seek(0); // повтор с начала
  }
}
Делает следующее:
читает файл traj.txt с SD-карты построчно.
парсит углы из строк вида «angle1,angle2».
устанавливает их на два сервопривода (пины 9 и 10).
после конца файла возвращается в начало и повторяет воспроизведение.

Заключение

Проект позволяет создавать сложные повторяемые движения без постоянного управления. Идеален для анимации, роботов-манипуляторов, панорамного видеонаблюдения и простых ЧПУ-систем.

FAQ — Сервомотор SG90 с памятью

Сколько сервомоторов можно подключить?

До 12 на Arduino Uno (библиотека Servo), до 48 с Servo.h на Mega.

Можно ли сгладить рывки при воспроизведении?

Да, уменьшите delay() до 20–50 мс и записывайте чаще.

Как питать мощные сервомоторы?

Отдельный источник 5–6В, общая земля с Arduino.

Формат SD-карты важен?

Да, только FAT16 или FAT32. Имя файла в формате 8.3 (traj.txt).

Можно записать больше двух серв?

Да, добавьте потенциометры и углы в строку через запятую.

Как редактировать траекторию вручную?

Откройте файл traj.txt в блокноте — углы через запятую, по строке на шаг.

Работает ли с другими сервомоторами?

Да, любые с углом 0–180° (MG996R, MG90S и др.).

📁 Скачать примеры