DIY робот-голова на Arduino: управление сервоприводами с Android-телефона через SensoDuino
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino UNO | 1 | Управление сервоприводами |
| Сервопривод (стандартный, 5V) | 3 | Yaw, Pitch, Roll — 3 оси головы |
| Android-смартфон | 1 | Источник данных ориентации (акселерометр/магнетометр) |
| LinkIt ONE Board | 1 | Bluetooth-мост телефон → Arduino (если нет BT-шилда) |
| Стабилизатор питания (12V/5V/3.3V) | 1 | Отдельное питание для сервоприводов |
| Текстолит, разъёмы, провода, клей | — | Самодельный шилд для сервоприводов |
Инструменты
- Паяльная станция
Софт
- SensoDuino (бесплатное Android-приложение) — стримит данные сенсоров по Bluetooth.
История и мотивация
Хотел сделать робота, но сервоприводы дорогие. Нашёл 4 сервы за $13. Есть LinkIt ONE и Arduino UNO. Идея: робот-голова с 3 степенями свободы (Yaw, Pitch, Roll), управляемая наклоном телефона на голове оператора. Дешево и весело.
Шаг 1: Материалы

- Arduino UNO
- LinkIt ONE
- 3 сервопривода
- SensoDuino (Google Play)
- БП с выходом 5V/12V
- Текстолит, разъёмы, алюминиевая планка (L-образная), термоклей, декор (голова Санта-Клауса)
Почему две платы?
- LinkIt ONE имеет только 2 PWM-пина — мало для 3 серв.
- Мои сервы 5V, на LinkIt ONE 3.3V логика — не заработают нормально.
- Если есть BT-шилд для Arduino — LinkIt ONE не нужен.
Шаг 2: Самодельный Servo Shield для Arduino

- Печатная плата с разъёмами под 6 серв (пины 3,5,6,9,10,11).
- Питание серв — от внешнего 5V стабилизатора (не от USB Arduino!).
- Критично: Питайте Arduino от адаптера, а не USB — иначе дрожание серв, перегрев, выход из строя (одну сжёг).
Шаг 3: Связь LinkIt ONE ↔ Arduino

- Tx LinkIt ONE → Rx Arduino (Serial1).
- Общий GND.
- LinkIt ONE принимает Bluetooth от телефона, пересылает в Arduino по UART.
Шаг 4: Центральное положение серв (90°)
Загрузите Servoposition.ino — все сервы встают на 90°. Соберите механику так, чтобы в этом положении голова смотрела прямо, оси были ортогональны. Проверьте движение — сервы не должны мешать друг другу.
Шаг 5: Планирование механики (3 оси)

- Yaw (рыскание) — поворот влево/вправо (базовая серва).
- Pitch (тангаж) — вверх/вниз (вторая серва на L-крайке).
- Roll (крен) — наклон боком (третья серва на конце).
Сначала на двустороннем скотче, проверяете диапазоны, потом клеите термоклеем.
Шаг 6: Финальная сборка

Постепенно заменяйте скотч на горячий клей. Проверьте: при включении все сервы встают на 90°, голова ровная.
Шаг 7: Настройка SensoDuino

- Установите SensoDuino, дайте права на сенсоры и Bluetooth.
- Меню → Connect Bluetooth → выберите LinkIt ONE (имя «Sivam_LIO»).
- Включите Orientation Sensor (галочка «On» и «Send via Bluetooth»).
- Performance → интервал обновления (100 мс для плавности, 250 мс для тестов).
Шаг 8: Программы
LinkIt ONE (Linkitonehead.ino)
#include <LBT.h>
#include <LBTServer.h>
String inputString = "";
void setup() {
if (!LBTServer.begin((uint8_t*)"Sivam_LIO")) return;
Serial1.begin(9600); // UART к Arduino
}
void loop() {
if (LBTServer.connected()) {
uint8_t buf[64];
int bytesRead;
while ((bytesRead = LBTServer.readBytes(buf, 32)) > 0) {
inputString = "";
for (int j=0; j
Arduino UNO (Arduinohead.ino)
#include <Servo.h>
Servo leftright; // Yaw - пин 3
Servo updown; // Pitch - пин 5
Servo shake; // Roll - пин 6
String inputString = "";
void setup() {
Serial.begin(9600);
leftright.attach(3); updown.attach(5); shake.attach(6);
}
void loop() {}
void serialEvent() {
while (Serial.available()) {
char c = Serial.read();
if (c != '\n') inputString += c;
}
// Парсим пакет: >sensor_id,rec_id,val1,val2,val3>
int s = inputString.indexOf('>');
if (s >= 0) {
int e = inputString.indexOf('>', s+1);
if (e > 0) {
String packet = inputString.substring(s, e);
inputString = inputString.substring(e);
// Разбор CSV внутри пакета
int c1 = packet.indexOf(',');
String sensorId = packet.substring(1, c1);
int c2 = packet.indexOf(',', c1+1);
String recId = packet.substring(c1+1, c2);
int c3 = packet.indexOf(',', c2+1);
String v1 = packet.substring(c2+1, c3);
int c4 = packet.indexOf(',', c3+1);
String v2 = packet.substring(c3+1, c4);
String v3 = packet.substring(c4+1);
int S1 = v1.toInt(); // Yaw: 90..270 (магнитный азимут)
int S2 = v2.toInt(); // Pitch: -90..+90
int S3 = v3.toInt(); // Roll: 90..-90..90
// Маппинг в углы серв 0..180
int rot1 = map(S1, 90, 270, 180, 0); // 180° = сев
int rot2 = map(S2, -90, 90, 0, 180);
int rot3 = map(S3, 90, -90, 0, 180); // инверсия
rot1 = constrain(rot1, 0, 180);
rot2 = constrain(rot2, 0, 180);
rot3 = constrain(rot3, 0, 180);
if (rot1 != 0 && rot1 != 180) leftright.write(rot1);
if (rot2 != 0 && rot2 != 180) updown.write(rot2);
if (rot3 != 0 && rot3 != 180) shake.write(rot3);
delay(15);
}
}
}
Сервопозиция (Servoposition.ino)
#include <Servo.h>
Servo leftright, updown, shake;
void setup() {
leftright.attach(3); updown.attach(5); shake.attach(6);
leftright.write(90); updown.write(90); shake.write(90);
}
void loop() {}
Шаг 9: Упаковка электроники
Оба шилда стыкуются вертикально (двухсторонний скотч), аккуратно, без замыканий.
Шаг 10: Тест рукой
Держите телефон в руке, лицом на азимут 180° (юг). Наклоны телефона → голова повторяет.
Шаг 11: Лицо робота
Купили куклу Санта-Клауса, голова на двусторонний скотч к рычагу верхней сервы (Roll).

Шаг 12: Шляпа-контроллер
Обычная кепка + двусторонний скотч спереди → телефон наклеен на лоб. Надеваете шляпу — голова робота копирует движения вашей головы.

Видео
- Низкая частота (250 мс) — дерганье, но работает.
- Высокая частота (100 мс) — плавное следование, выглядит живо.
Выводы и улучшения
- Работает весело и дешево (~$20 без телефона).
- Проблема: провода тянут сенсор, при беге артефакты. Нужен беспроводной сенсор (вторая итерация — nRF24).
- BT-связь LinkIt ONE иногда глючит — лучше использовать HC-05/HC-06 на Arduino напрямую.
- Механику можно усилить металлом, добавить возврат пружинами.
Производственный процесс
- DIY робот в стиле Wall‑E на Raspberry Pi из коробки от CD
- Робот-будильник на колесах: умная мобильная система пробуждения на Raspberry Pi и Google Calendar
- RasPiRobot Board V2: Расширьте Raspberry Pi в мощный робот-контроллер
- Создание моторизированного робота-крипера Minecraft на Arduino
- Archimedes: Робот-совица с ИИ для распознавания эмоций
- Создание робота с компьютерным зрением и голосовым управлением на Windows 10 IoT Core
- ROS-робот: Управление навигацией из терминала на Raspberry Pi
- Интеграция Microsoft Kinect с Raspberry Pi для детекции людей в реальном времени на роботе Sonbi
- Simple Pi Robot — Сборка 2WD автономного ровера на Raspberry Pi
- Главный актив: человеческий капитал в производственных операциях