// Рука Port берёт кубик с полки (1.9.74, площадка «Полка с кубиком»).
//
// Три привода прямо на выводах платы (библиотека Servo):
// S0 плечо ← D9 (write(60) — рука вниз, больше — вперёд-вверх),
// S1 локоть ← D10 (write(0) — прямой, больше — согнут),
// S2 пальцы ← D11 (write(0) — ладонь, 90 — кулак).
// Движение — по ключевым позам: между ними углы меняются плавно.
//
// Хват в модели: пальцы сжаты сильнее 60° и кубик у ладони — он держится в
// кисти; разжать (меньше 30°) — отпустить.
#include <Servo.h>
Servo shoulder, elbow, grip;
// Время (с), плечо, локоть, пальцы — градусы от «прямо».
const float KEYS[][4] = {
{0, 0, 0, 0}, {1, 0, 0, 0},
{2, 0, 70, 0}, // локоть вверх — кисть к груди
{3, 10, 70, 0}, // кисть над кубиком
{4.5, 20, 30, 0}, // опустить на кубик
{5.3, 20, 30, 90}, // сжать пальцы
{7, 30, 70, 90}, // поднять
};
const uint8_t NKEYS = sizeof(KEYS) / sizeof(KEYS[0]);
float smooth(float x) { x = x < 0 ? 0 : (x > 1 ? 1 : x); return x * x * (3 - 2 * x); }
void setup() {
Serial.begin(9600);
shoulder.attach(9, 500, 2500);
elbow.attach(10, 500, 2500);
grip.attach(11, 500, 2500);
}
uint8_t said = 0;
void loop() {
float t = millis() / 1000.0;
float p[3] = {KEYS[NKEYS - 1][1], KEYS[NKEYS - 1][2], KEYS[NKEYS - 1][3]};
for (uint8_t i = 0; i + 1 < NKEYS; i++) {
if (t < KEYS[i + 1][0]) {
float u = smooth((t - KEYS[i][0]) / (KEYS[i + 1][0] - KEYS[i][0]));
for (uint8_t j = 0; j < 3; j++) p[j] = KEYS[i][j + 1] + (KEYS[i + 1][j + 1] - KEYS[i][j + 1]) * u;
if (i + 1 > said) { said = i + 1; Serial.print("поза "); Serial.println(said); }
break;
}
}
shoulder.write(60 + p[0]); // «прямо» плеча — write(60)
elbow.write(p[1]);
grip.write(p[2]);
delay(20);
}
Рука Port берёт кубик
Рука на стойке: плечо, локоть и пальцы — три сервопривода на выводах D9–D11. Рука опускает кисть на кубик, сжимает пальцы и поднимает его с полки.
Что на схеме
Плата Arduino Uno, к ней подключены:
- Рука Port —
r1, площадка «Полка с кубиком»
Задействованы выводы платы: GND, D9, D10, D11. Всего соединений на схеме: 4.
Как смотреть
Нажмите ▶ Запустить — после сборки откроется окно робота (потом его открывает кнопка 🤖 над схемой). Мышью камеру можно повернуть, колесом — приблизить; щелчок по суставу показывает номер привода, канал PCA9685 и строку кода для него. Кнопка ⏺ над схемой записывает сцену в GIF — с теми поворотами камеры, что вы делаете.
Робот — не анимация, а модель с массами, шарнирами и трением: скетч только шлёт импульсы приводам и читает датчики, а встанет робот, пойдёт или упадёт — решает физика. Как она устроена — на странице «Физика сцен с роботами».
Как это работает
Та же рука, что у Port, и те же углы, что в примере «Port берёт кубик», — только три привода и никаких ног. Движение задано ключевыми позами (время, плечо, локоть, пальцы), между ними углы меняются плавно. «Прямо» у плеча — write(60): так весь ход руки помещается в 0…180° обычного сервопривода.
Что попробовать
- Положите кубик обратно: добавьте позы «опустить» и «разжать пальцы».
- Ускорьте подъём — удержится ли кубик?
Библиотеки
Пример собирается с библиотеками:
- Servo
Они уже установлены на сервере сборки — отмечать их в проекте вручную не нужно, список приезжает вместе с примером.
Как это устроено в коде
Основное, чем пользуется скетч:
Servo— управление сервоприводом по длительности импульсаSerial.begin()— открывает монитор порта на заданной скоростиmillis()— миллисекунды с запуска: на них строят работу без остановкиSerial.println()— печатает строку в монитор портаdelay()— пауза, на время которой ядро занято ожиданием
В скетче 53 строки; подключено заголовков: 1. Сам скетч открыт на соседней вкладке — его можно менять и запускать заново.
Что попробовать изменить
- Поменяйте период в константе и посмотрите на анализаторе, как меняется картина на выводе.
- Добавьте свои
Serial.println()в интересных местах — монитор порта здесь и есть отладчик. - Перенесите деталь на другой вывод — на схеме и в коде — и убедитесь, что пример работает так же.
- Нажмите «Форкнуть»: копия станет вашим проектом, и в ней можно менять что угодно.
Смотрите также
- Кисть Port считает на пальцах — Пять пальцев — пять сервоприводов прямо на выводах Uno. Кисть сжимается в кулак и разгибает пальцы по одному: раз, два…
- Нога Port пинает мяч — Нога на стойке: бедро, колено и голеностоп на выводах D9–D11. Замах назад с согнутым коленом, быстрый удар вперёд — мяч…
- Голова Port осматривается дальномером — Голова на стойке поворачивается от −60° до +60°, в каждом направлении меряет расстояние дальномером в лице и называет, г…
- Робот Port идёт и держит равновесие — Человекоподобный робот Port (1,75 м, 50 кг) идёт по ровному полу: походка без остановок, равновесие и курс — по датчику…
- Робот Port поднимается по лестнице — Port поднимается на четыре ступени приставным шагом: места стоп — по плану лестницы, корпус — по расчёту ZMP с предуправ…
- Робот Port проходит лабиринт — Port идёт по коридорам и смотрит дальномером в голове: у стены поворачивает направо, если там занято — налево, и держитс…
Сборка ещё не запускалась.
Печатайте в Serial числа — они станут графиком.
Serial.println(t); — один ряд,
Serial.printf("t:%.1f h:%.1f\n", t, h); — два с подписями.
Формат тот же, что понимает плоттер Arduino IDE.