// Голова Port осматривается дальномером (1.9.74, площадка «Столб на пути»).
//
// Два привода прямо на выводах платы (библиотека Servo):
// S0 поворот ← D9 (write(90) — прямо, больше — влево),
// S1 наклон ← D10 (write(90) — прямо).
// Дальномер HC-SR04 в лице: TRIG ← D7, ECHO ← D8; смотрит туда же, куда голова.
//
// Голова проходит от −60° до +60° через 15°, в каждом направлении — замер.
// В конце скетч называет, где ближе всего (столб или стена) и где свободнее всего.
#include <Servo.h>
Servo yaw, pitch;
const uint8_t TRIG = 7, ECHO = 8;
long distanceCm() {
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long us = pulseIn(ECHO, HIGH, 25000);
return us ? (long)(us / 58) : 500; // нет эха — дальше 4 м
}
void setup() {
Serial.begin(9600);
yaw.attach(9, 500, 2500);
pitch.attach(10, 500, 2500);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pitch.write(90);
yaw.write(30); // начать справа (−60°)
delay(800);
}
void loop() {
long nearCm = 9999, farCm = -1;
int nearDeg = 0, farDeg = 0;
for (int deg = -60; deg <= 60; deg += 15) {
yaw.write(90 + deg);
delay(300); // голова доворачивается
long cm = distanceCm();
Serial.print(deg); Serial.print("° — "); Serial.print(cm); Serial.println(" см");
if (cm < nearCm) { nearCm = cm; nearDeg = deg; }
if (cm > farCm) { farCm = cm; farDeg = deg; }
}
Serial.print("ближе всего: "); Serial.print(nearDeg); Serial.print("°, "); Serial.print(nearCm); Serial.println(" см");
Serial.print("свободнее всего: "); Serial.print(farDeg); Serial.println("°");
yaw.write(90);
delay(3000);
}
Голова Port осматривается дальномером
Голова на стойке поворачивается от −60° до +60°, в каждом направлении меряет расстояние дальномером в лице и называет, где ближе всего и где свободно.
Что на схеме
Плата Arduino Uno, к ней подключены:
- Голова Port —
r1, площадка «Столб на пути»
Задействованы выводы платы: GND, D9, D10, D7, D8. Всего соединений на схеме: 5.
Как смотреть
Нажмите ▶ Запустить — после сборки откроется окно робота (потом его открывает кнопка 🤖 над схемой). Мышью камеру можно повернуть, колесом — приблизить; щелчок по суставу показывает номер привода, канал PCA9685 и строку кода для него. Кнопка ⏺ над схемой записывает сцену в GIF — с теми поворотами камеры, что вы делаете.
Робот — не анимация, а модель с массами, шарнирами и трением: скетч только шлёт импульсы приводам и читает датчики, а встанет робот, пойдёт или упадёт — решает физика. Как она устроена — на странице «Физика сцен с роботами».
Как это работает
Два привода — поворот и наклон, дальномер HC-SR04 смотрит туда же, куда голова. Расстояние в модели — луч из лица до первого препятствия. Так робот выбирает, куда идти, в примерах «Port обходит столб» и «Port проходит лабиринт». В мониторе порта — расстояние на каждом угле.
Что попробовать
- Площадка «Стена в 2 м» или «Лабиринт» в свойствах детали — другие картины расстояний.
- Наклоните голову вниз (S1) и найдите, где луч упирается в пол.
Библиотеки
Пример собирается с библиотеками:
- Servo
Они уже установлены на сервере сборки — отмечать их в проекте вручную не нужно, список приезжает вместе с примером.
Как это устроено в коде
Основное, чем пользуется скетч:
Servo— управление сервоприводом по длительности импульсаdigitalWrite()— выставляет на выводе высокий или низкий уровеньdelayMicroseconds()— короткая пауза внутри протоколаpulseIn()— измеряет длительность импульса, отсюда берётся расстояние у дальномераSerial.begin()— открывает монитор порта на заданной скоростиpinMode()— назначает выводу режим: выход, вход или вход с подтяжкойdelay()— пауза, на время которой ядро занято ожиданиемSerial.println()— печатает строку в монитор порта
В скетче 50 строк; свои функции: distanceCm(); подключено заголовков: 1. Сам скетч открыт на соседней вкладке — его можно менять и запускать заново.
Что попробовать изменить
- Замените
delay()на счёт поmillis()— иloop()освободится для всего остального, что должно происходить одновременно. - Добавьте свои
Serial.println()в интересных местах — монитор порта здесь и есть отладчик. - Перенесите деталь на другой вывод — на схеме и в коде — и убедитесь, что пример работает так же.
- Нажмите «Форкнуть»: копия станет вашим проектом, и в ней можно менять что угодно.

Смотрите также
- Кисть Port считает на пальцах — Пять пальцев — пять сервоприводов прямо на выводах Uno. Кисть сжимается в кулак и разгибает пальцы по одному: раз, два…
- Рука Port берёт кубик — Рука на стойке: плечо, локоть и пальцы — три сервопривода на выводах D9–D11. Рука опускает кисть на кубик, сжимает пальц…
- Нога Port пинает мяч — Нога на стойке: бедро, колено и голеностоп на выводах D9–D11. Замах назад с согнутым коленом, быстрый удар вперёд — мяч…
- Робот 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.