Урок 3. Ультразвук: сантиметры на табло
В картинкахПосле этого урока у робота впереди ультразвуковой дальномер, а на табло — сколько сантиметров до стенки или препятствия перед ним. Шесть раз в секунду: пинг, эхо, счёт, показать.
3.1. Идея: время — это расстояние
Датчик (как настоящий HC-SR04): дали на TRIG импульс — на его спаде датчик «пикает». Пока звук летит до стенки и обратно, на ECHO горит 1. Чем дальше стенка, тем дольше горит ECHO: у нас — 0,125 мс на каждый сантиметр.
Значит, сантиметры можно сосчитать: взять генератор с периодом ровно 0,125 мс (это 8 кГц) и считать его такты, пока горит ECHO. Сколько тактов — столько сантиметров.
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 — считать) |
|---|---|---|
| 1 | 1 | 0 — считаем |
| 1 | 0 | 1 — 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 CD4017B | CLOCK RESET INH O0 O2 | CK60 RESET GND PING SHOW |
| TI CD4069UB | A G B H C D E F | CK8K NCK8K FULL NFULL GND GND GND GND |
| TI CD4013B | S1 R1 D1 CL1 Q1 S2 R2 D2 CL2 | GND RESET ECHO NCK8K ECHOS GND GND GND GND |
| TI CD4081B | A B J C D K E F L G H | CT3 CT0 X9 CU3 CU0 Y9 X9 Y9 FULL GND GND |
| TI CD4011B | A 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 CD4029B | CLOCK 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 CD4029B | CLOCK 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 CD4029B | CLOCK 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 CD4029B | CLOCK 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. Проверка
- Включи питание, нажми «Сброс».
GOвыключен. - Табло показывает расстояние в сантиметрах от носа датчика до того, что перед роботом. Перетащи робота мышью носом к стенке — число меняется: ближе — меньше.
- Дальше 99 см — на табло 99: столько счётчик не считает.
- Включи
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)Не получается? Что-то не работает →