// Нога Port пинает мяч (1.9.74, площадка «Мяч у ноги»).
//
// Нога на стойке, стопа чуть над полом, мяч перед ней. Три привода прямо на
// выводах платы (библиотека Servo):
// S1 бедро ← D9 (write(40) — нога вниз, больше — вперёд, меньше — назад),
// S2 колено ← D10 (write(0) — прямое, больше — согнуто),
// S3 голеностоп ← D11 (write(90) — стопа ровно).
// Удар: отвести ногу назад и согнуть колено (замах), потом быстро вперёд,
// разгибая колено, — и вернуться.
#include <Servo.h>
Servo hip, knee, ankle;
// Время (с), бедро, колено, голеностоп — градусы от «прямо».
const float KEYS[][4] = {
{0, 0, 0, 0}, {1, 0, 0, 0},
{2, -25, 70, 0}, // замах: назад, колено согнуто
{2.4, 50, 10, 0}, // удар: вперёд, колено разогнуто
{3.5, 50, 10, 0},
{4.5, 0, 0, 0}, // обратно
};
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);
hip.attach(9, 500, 2500);
knee.attach(10, 500, 2500);
ankle.attach(11, 500, 2500);
}
bool kicked = false;
void loop() {
float t = millis() / 1000.0;
float p[3] = {0, 0, 0};
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;
break;
}
}
if (!kicked && t > 2.2) { kicked = true; Serial.println("удар!"); }
hip.write(40 + p[0]);
knee.write(p[1]);
ankle.write(90 + p[2]);
delay(20);
}
Нога Port пинает мяч
Нога на стойке: бедро, колено и голеностоп на выводах D9–D11. Замах назад с согнутым коленом, быстрый удар вперёд — мяч улетает на несколько метров.
Что на схеме
Плата Arduino Uno, к ней подключены:
- Нога Port —
r1, площадка «Мяч у ноги»
Задействованы выводы платы: GND, D9, D10, D11. Всего соединений на схеме: 4.
Как смотреть
Нажмите ▶ Запустить — после сборки откроется окно робота (потом его открывает кнопка 🤖 над схемой). Мышью камеру можно повернуть, колесом — приблизить; щелчок по суставу показывает номер привода, канал PCA9685 и строку кода для него. Кнопка ⏺ над схемой записывает сцену в GIF — с теми поворотами камеры, что вы делаете.
Робот — не анимация, а модель с массами, шарнирами и трением: скетч только шлёт импульсы приводам и читает датчики, а встанет робот, пойдёт или упадёт — решает физика. Как она устроена — на странице «Физика сцен с роботами».
Как это работает
У ноги шесть приводов, как у Port: крен бедра, бедро, колено, голеностоп вперёд-назад и крен, поворот бедра. Для удара хватает трёх. Сила удара — это скорость стопы в момент касания мяча: бедро идёт вперёд, колено одновременно разгибается, и скорости складываются. Вывод T детали — датчик касания стопы: LOW, пока стопа касается мяча или пола.
Что попробовать
- Удар без замаха (бедро сразу вперёд) — насколько ближе улетит мяч?
- Ударьте носком в сторону: крен бедра (S0) или поворот (S5).
Библиотеки
Пример собирается с библиотеками:
- Servo
Они уже установлены на сервере сборки — отмечать их в проекте вручную не нужно, список приезжает вместе с примером.
Как это устроено в коде
Основное, чем пользуется скетч:
Servo— управление сервоприводом по длительности импульсаSerial.begin()— открывает монитор порта на заданной скоростиmillis()— миллисекунды с запуска: на них строят работу без остановкиSerial.println()— печатает строку в монитор портаdelay()— пауза, на время которой ядро занято ожиданием
В скетче 51 строка; подключено заголовков: 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.