Урок 3. Ультразвук: сантиметры на табло

В картинках

После этого урока у робота впереди ультразвуковой дальномер, а на табло — сколько сантиметров до стенки или препятствия перед ним. Шесть раз в секунду: пинг, эхо, счёт, показать.


3.1. Идея: время — это расстояние

Датчик (как настоящий HC-SR04): дали на TRIG импульс — на его спаде датчик «пикает». Пока звук летит до стенки и обратно, на ECHO горит 1. Чем дальше стенка, тем дольше горит ECHO: у нас — 0,125 мс на каждый сантиметр.

Значит, сантиметры можно сосчитать: взять генератор с периодом ровно 0,125 мс (это 8 кГц) и считать его такты, пока горит ECHO. Сколько тактов — столько сантиметров.

тудаи обратноPINGECHOCK8Kпинг на спаде PINGсчитаем такты, пока горит ECHO: 1 такт = 1 см
Ультразвук: пинг — и ECHO горит, пока звук летит до стенки и обратно, 0,125 мс на сантиметр. Генератор 8 кГц тикает раз в 0,125 мс — сколько тактов, столько сантиметров.

3.2. Идея: замер — это шаги

Второй CD4017 шагает от генератора 60 Гц (шаг — 16,7 мс) и делит замер на шаги:

  • шаг 0, PING: счётчик сбрасывается в 00, на конце шага — пинг;
  • шаг 1: летит звук, горит ECHO, счётчик считает. Самое дальнее, 99 см, — это 12,4 мс: укладывается в шаг;
  • шаг 2, SHOW: готовое число переписывается на табло;
  • шаги 3…9 — пауза. Десять шагов — 1/6 секунды: шесть замеров в секунду.

3.3. Идея: счётчик сантиметров — два CD4029

CD4029 считает на фронте CLOCK, если разрешено: нога CI (разрешение) работает наоборот — считает при CI = 0. При BD = 0 он десятичный: 0…9 и снова 0, а на переходе 9 → 0 даёт перенос CO = 0. Два корпуса в цепочку: CO единиц — в CI десятков, и выходит счётчик 00…99. PE = 1 записывает в счётчик ноги J1…J4 — у нас там GND: на шаге PING счётчик стоит в 00.

3.4. Идея: когда считать — CIU

Что хотим: считать, пока горит эхо, но не дальше 99 — иначе после 99 счётчик перевалит в 00, и табло покажет «стенка вплотную», когда её нет вовсе.

ECHOS (эхо)NFULL (не 99)CIU (0 — считать)
110 — считаем
101 — 99, стоим
0любое1 — эха нет, стоим
  • Считать = ECHOS И NFULL; ногу CI нужно держать в 0, когда считать: CIU = НЕ (ECHOS И NFULL) = И-НЕ(ECHOS, NFULL) — один вентиль CD4011.

3.5. Идея: «полно» — FULL

Что хотим: FULL = 1 ровно на 99. Счётчик двоично-десятичный: каждая цифра — 4 бита, 9 = 1001. Из цифр 0…9 только у девятки горят и старший бит, и младший (8 = 1000, 1 = 0001). Поэтому:

  • десятки — девять: X9 = CT3 И CT0;
  • единицы — девять: Y9 = CU3 И CU0;
  • FULL = X9 И Y9 — три вентиля И из CD4081; NFULL = НЕ FULL — инвертор CD4069.

3.6. Идея: эхо по такту — ECHOS

ECHO загорается и гаснет когда угодно — в том числе в тот самый миг, когда приходит фронт 8 кГц. Счётчик тогда может «наполовину» сосчитать. Поэтому эхо сначала проходит через D-триггер CD4013, который записывает его на спаде такта (CL1 = NCK8K — такт через инвертор): ECHOS меняется только между фронтами счёта, и счётчик видит его чистым.

3.7. Идея: табло не мигает

Если показывать сам счётчик, табло на каждом замере пробегало бы 00 → 01 → … → число. Поэтому ещё два CD4029 работают регистром: CLOCK = GND (не считают), PE = SHOW — на шаге «показать» они записывают готовое число со счётчика и держат его до следующего замера.

Табло — Display (bus) на 8 бит в виде HEX: каждая шестнадцатеричная цифра — это 4 бита, а у нас как раз по 4 бита на десятичную цифру. Поэтому двоично-десятичное число на HEX-табло читается как обычное: 0011 0111 — 37.

3.8. Сборка

Поверх урока 2. Робот по-прежнему разворачивается от удара бампером, а впереди у него теперь ультразвуковой дальномер: табло показывает, сколько сантиметров до стенки или препятствия перед ним.

Шаг 1. Ультразвук на шасси

Датчик — меню «Датчики» → Ultrasonic: он ставится вместе с отражателем — отражатель удали, он не нужен: эхо даёт любая стенка или препятствие. Датчик тяни за оранжевую гайку к центральной зелёной точке шасси — защёлкнется носом вперёд. Метки — на ногах датчика.

ДетальНога / действиеМетка / куда
Ultrasonic (датчик)TRIG
ECHO
посадить
PING
ECHO
на c (центр шасси)

Шаг 2. Генераторы

Первый Clock — щелчками до 60Hz, второй — до 8kHz.

ДетальНога / действиеМетка / куда
Clock 60HzвыходCK60
Clock 8kHzвыходCK8K

Шаг 3. Микросхемы

ДетальНога / действиеМетка / куда
TI CD4017BCLOCK
RESET
INH
O0
O2
CK60
RESET
GND
PING
SHOW
TI CD4069UBA
G
B
H
C
D
E
F
CK8K
NCK8K
FULL
NFULL
GND
GND
GND
GND
TI CD4013BS1
R1
D1
CL1
Q1
S2
R2
D2
CL2
GND
RESET
ECHO
NCK8K
ECHOS
GND
GND
GND
GND
TI CD4081BA
B
J
C
D
K
E
F
L
G
H
CT3
CT0
X9
CU3
CU0
Y9
X9
Y9
FULL
GND
GND
TI CD4011BA
B
J
C
D
E
F
G
H
ECHOS
NFULL
CIU
GND
GND
GND
GND
GND
GND

Не подключать: у второго CD4017 — O1, O3…O9, CO; у второго CD4069 — I…L; у CD4013 — QN1, Q2, QN2; у CD4081 — M; у CD4011 — K, L, M.

Шаг 4. Счётчик и число для табло

ДетальНога / действиеМетка / куда
TI CD4029BCLOCK
PE
CI
UD
BD
J1
J2
J3
J4
Q1
Q2
Q3
Q4
CO
CK8K
PING
CIU
VCC
GND
GND
GND
GND
GND
CU0
CU1
CU2
CU3
COU
TI CD4029BCLOCK
PE
CI
UD
BD
J1
J2
J3
J4
Q1
Q2
Q3
Q4
CK8K
PING
COU
VCC
GND
GND
GND
GND
GND
CT0
CT1
CT2
CT3
TI CD4029BCLOCK
PE
CI
UD
BD
J1
J2
J3
J4
Q1
Q2
Q3
Q4
GND
SHOW
VCC
GND
GND
CU0
CU1
CU2
CU3
DU0
DU1
DU2
DU3
TI CD4029BCLOCK
PE
CI
UD
BD
J1
J2
J3
J4
Q1
Q2
Q3
Q4
GND
SHOW
VCC
GND
GND
CT0
CT1
CT2
CT3
DT0
DT1
DT2
DT3

Не подключать: CO у десятков счётчика и у двух CD4029 табло.

Шаг 5. Табло

Display (bus) из палитры. ⚙ в левом верхнем углу — ширина (нужна 8, она и стоит), метка в правом верхнем — щёлкай до HEX. Ноги слева, сверху вниз — от старшего бита к младшему.

ДетальНога / действиеМетка / куда
Display (bus) — таблоширина (⚙) / вид
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
8 бит / HEX
DT3
DT2
DT1
DT0
DU3
DU2
DU1
DU0

3.9. Проверка

  1. Включи питание, нажми «Сброс». GO выключен.
  2. Табло показывает расстояние в сантиметрах от носа датчика до того, что перед роботом. Перетащи робота мышью носом к стенке — число меняется: ближе — меньше.
  3. Дальше 99 см — на табло 99: столько счётчик не считает.
  4. Включи GO — робот едет, а число на табло тает по мере приближения к стенке. В момент удара — 00 (если наехал наискосок, бампер касается углом — табло успевает показать несколько сантиметров), манёвр урока 2, и после разворота число снова большое.
Где робот (носом к стенке)Табло
дальше 99 см99
50 см (250 точек холста)50
13 см (65 точек)13
упёрся бампером в лоб00

5 точек холста — 1 см; клетка фона — 10 точек, 2 см.


Вставка урока 3 (Cmd+I)

Вставлять в новый проект — ставит уроки 1–3 целиком. Нужны микросхемы из robot-chips.json.

# Урок 3 — ультразвук: пинг, эхо считается в сантиметрах (8 кГц = 1 см на такт), число — на табло.# Вставка: Cmd+I в новый проект (ставит уроки 1–3 целиком).# ---------- питание ----------power(VCC)ground(GND)# ---------- арена: бумага, контур поверх неё, препятствие ----------mpaper p{w=800, h=500}mwall w{w=800, h=500}mblock ob{w=80, h=80}at(p, 0, 0)at(w, p, 0, 0)at(ob, p, 440, 210)# ---------- робот: шасси, перо на задней точке ----------mchassis rb{spd=60}(L_ON=GO, R_ON=GO, L_DIR=LDIR, R_DIR=RDIR)at(rb, p, 80, 210)mpen pen(DOWN=VCC)mount(pen, rb.r)# ---------- GO — моторы (остаётся до конца набора) ----------input(GO)# ---------- генератор и сброс ----------clock{rt=10}(CK)button(RESET)# ---------- бампер на передней точке шасси ----------mbumper bp{len=110}(HIT=HIT)mount(bp, rb.f)# ---------- CD4017: шаги манёвра ----------"TI CD4017B"(CLOCK=CK, RESET=RESET, INH=HOLD, O0=FWD, O1=B1, O2=B2, O3=B3, O4=B4, O5=T1, O6=T2, O7=T3, O8=T4)# ---------- CD4072: назад = шаги 1–4, разворот = шаги 5–8 ----------"TI CD4072B"(A=B1, B=B2, C=B3, D=B4, J=BACK, E=T1, F=T2, G=T3, H=T4, K=TURN)# ---------- CD4069: не-вперёд, левое колесо ----------"TI CD4069UB"(A=FWD, G=NFWD, B=BACK, H=LDIR, C=GND, D=GND, E=GND, F=GND)# ---------- CD4001: правое колесо, держать шаг 0 ----------"TI CD4001B"(A=BACK, B=TURN, J=RDIR, C=HIT, D=NFWD, K=HOLD, E=GND, F=GND, G=GND, H=GND)# ---------- лампы манёвра ----------led{color=green}(FWD)led{color=yellow}(BACK)led{color=red}(TURN)# ---------- ультразвук на центре шасси ----------ustx us(TRIG=PING, ECHO=ECHO)mount(us, rb.c)# ---------- генераторы обхода и сантиметров ----------clock{rt=60}(CK60)clock{hz=1}(CK8K)# ---------- CD4017: шаг 0 — пинг, 1 — эхо, 2 — показать ----------"TI CD4017B"(CLOCK=CK60, RESET=RESET, INH=GND, O0=PING, O2=SHOW)# ---------- CD4069: НЕ такта 8 кГц, НЕ «полно» ----------"TI CD4069UB"(A=CK8K, G=NCK8K, B=FULL, H=NFULL, C=GND, D=GND, E=GND, F=GND)# ---------- CD4013: эхо по такту (второй триггер — в уроке 4) ----------"TI CD4013B"(S1=GND, R1=RESET, D1=ECHO, CL1=NCK8K, Q1=ECHOS, S2=GND, R2=GND, D2=GND, CL2=GND)# ---------- CD4081: 99 — полно ----------"TI CD4081B"(A=CT3, B=CT0, J=X9, C=CU3, D=CU0, K=Y9, E=X9, F=Y9, L=FULL, G=GND, H=GND)# ---------- CD4011: считать, пока эхо и не полно ----------"TI CD4011B"(A=ECHOS, B=NFULL, J=CIU, C=GND, D=GND, E=GND, F=GND, G=GND, H=GND)# ---------- CD4029 × 2: счётчик сантиметров (единицы, десятки) ----------"TI CD4029B"(CLOCK=CK8K, PE=PING, CI=CIU, UD=VCC, BD=GND, J1=GND, J2=GND, J3=GND, J4=GND, Q1=CU0, Q2=CU1, Q3=CU2, Q4=CU3, CO=COU)"TI CD4029B"(CLOCK=CK8K, PE=PING, CI=COU, UD=VCC, BD=GND, J1=GND, J2=GND, J3=GND, J4=GND, Q1=CT0, Q2=CT1, Q3=CT2, Q4=CT3)# ---------- CD4029 × 2: число для табло (переписывается на шаге «показать») ----------"TI CD4029B"(CLOCK=GND, PE=SHOW, CI=VCC, UD=GND, BD=GND, J1=CU0, J2=CU1, J3=CU2, J4=CU3, Q1=DU0, Q2=DU1, Q3=DU2, Q4=DU3)"TI CD4029B"(CLOCK=GND, PE=SHOW, CI=VCC, UD=GND, BD=GND, J1=CT0, J2=CT1, J3=CT2, J4=CT3, Q1=DT0, Q2=DT1, Q3=DT2, Q4=DT3)# ---------- табло: десятки DT3…DT0, единицы DU3…DU0 ----------display{base=HEX, bits=8}(DT3, DT2, DT1, DT0, DU3, DU2, DU1, DU0)

Не получается? Что-то не работает →