Урок 4. Не касаясь: ближе 20 см

В картинках

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


4.1. Идея: «ближе 20 см» — сравнить десятки — CLOSE

Что хотим: CLOSE = 1, когда расстояние меньше 20 см — то есть 00…19. У всех этих чисел десятки — 0 или 1, у остальных — 2 и больше. Значит, единицы можно не смотреть: десятки < 2.

Сравнивать числа умеет CD4585 — компаратор двух 4-битных чисел A и B, у него три выхода: LT (A < B), EQ (A = B), GT (A > B). Подаём A = десятки счётчика CT3…CT0, B = 2 (0010: B1 = VCC, остальные GND):

Десятки (A)РасстояниеCLOSE = LT
000…09 см1
110…19 см1
2…920…99 см0

Ноги LTIN, EQIN, GTIN — для цепочки из нескольких CD4585 (сравнить 8, 12 бит…). У нас корпус один, и TI велит: GTIN = 1, остальные — 0.

00…0910…1920…2930…3940…4950…5960…6970…7980…8990…99расстояние, см — десятки:ближе 20 см = десятки 0 или 1CD4585A < B → LTA = CT3…CT0B = 0010 (2)LT = CLOSE
«Ближе 20 см» не нужно сравнивать по всем цифрам: у 00…19 десятки — 0 или 1, у остальных — 2 и больше. CD4585 сравнивает десятки счётчика с числом 2.

Хочешь другой порог — поменяй B: B = 3 (0011) — 30 см, B = 1 — 10 см.

4.2. Идея: запомнить на шаге «показать» — NEAR

CLOSE смотрит прямо на счётчик, а счётчик на шаге PING сбрасывается в 00 — и в этот миг CLOSE = 1 («стенка вплотную»!), хотя это не так. Поэтому CLOSE защёлкиваем D-триггером — вторым в CD4013 — на шаге SHOW, когда счёт закончен и число верное:

  • D2 = CLOSE, CL2 = SHOW → Q2 = NEAR держится до следующего замера.
шаг0123…9счётчик000816243235CLOSESHOWNEARPING и начало счёта: 00…19 —CLOSE = 1, но это неправдаSHOW: счёт закончен, 35 см —защёлка пишет NEAR = 0: далеко
Почему CLOSE защёлкивают: стенка в 35 см, но на шаге PING счётчик стоит в 00, а потом пробегает 00…19 — и всё это время CLOSE кричит «близко». Триггер CD4013 пишет его только на шаге SHOW, когда число уже верное.

Это тот же приём, что у табло в уроке 3: показывать только готовое.

4.3. Идея: удар или близко — TRIP

Что хотим: манёвр запускается, если сработал бампер или впереди близко:

HITNEARTRIP
000
101
011
111
  • TRIP = HIT ИЛИ NEAR — вентиль ИЛИ из CD4071.

А в CD4001 (запрет HOLD, урок 2) вместо HIT теперь TRIP: HOLD = НЕ-ИЛИ(NFWD, TRIP). Всё остальное — манёвр, колёса — не меняется: «жук» просто получил второй, бесконтактный повод для разворота.

Почему не убрать бампер? Ультразвук смотрит узким лучом прямо вперёд. Если робот едет к стенке наискосок, луч может скользить вдоль неё, а угол корпуса — уже коснуться. Тогда спасает бампер.

4.4. Сборка

Поверх урока 3. Две новые микросхемы и несколько перецепок: метку на ноге переименовать — двойной клик по метке, новое имя; у пустой ноги — двойной клик по ноге.

Шаг 1. Ближе 20 см

ДетальНога / действиеМетка / куда
TI CD4585BA0
A1
A2
A3
B0
B1
B2
B3
LTIN
EQIN
GTIN
LT
CT0
CT1
CT2
CT3
GND
VCC
GND
GND
GND
GND
VCC
CLOSE

Не подключать: EQ и GT у CD4585.

Шаг 2. Удар или близко

ДетальНога / действиеМетка / куда
TI CD4071BA
B
J
C
D
E
F
G
H
HIT
NEAR
TRIP
GND
GND
GND
GND
GND
GND

Не подключать: K, L, M у CD4071.

Шаг 3. Лампа «близко»

Цвет лампы — Alt/⌘+щелчок по ней, до синего.

ДетальНога / действиеМетка / куда
LED, синяявходNEAR

Шаг 4. Перецепки

Второй триггер CD4013 (тот, что в уроке 3 стоял на GND) становится защёлкой «близко», а CD4001 теперь запускает манёвр не от удара, а от TRIP — удара или «близко».

ДетальНогаОтцепить отПрицепить к
TI CD4013B, выход которой = ECHOSR2GNDRESET
TI CD4013B, выход которой = ECHOSD2GNDCLOSE
TI CD4013B, выход которой = ECHOSCL2GNDSHOW
TI CD4013B, выход которой = ECHOSQ2— (не подключена)NEAR
TI CD4001B, выход которой = RDIRCHITTRIP

4.5. Проверка

  1. Включи питание, нажми «Сброс», включи GO.
  2. Робот едет к стенке, число на табло тает. Около 20 — загорается синяя NEAR, и робот, не коснувшись, делает тот же манёвр: назад (BACK), разворот (TURN), вперёд.
  3. После разворота, если впереди дальше 20 см, NEAR гаснет на ближайшем замере, и робот едет дальше.
  4. Бампер остаётся страховкой: если робот подъехал к стенке наискосок, ультразвук смотрит вперёд мимо неё — тогда сработает удар, как в уроке 2. Такое бывает редко.
  5. На бумаге — путь, который почти не касается стенок: развороты в 20 см от них.
ВпередиNEAR (синяя)Робот
дальше 20 смне горитедет вперёд
ближе 20 смгоритназад, разворот, вперёд
упёрся бампером (вскользь)—тот же манёвр, от удара

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

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

# Урок 4 — не касаясь: ближе 20 см (CD4585) — тот же манёвр, что от удара; бампер остаётся страховкой.# Вставка: Cmd+I в новый проект (ставит уроки 1–4 целиком).# ---------- питание ----------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=TRIP, 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=RESET, D2=CLOSE, CL2=SHOW, Q2=NEAR)# ---------- 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)# ---------- CD4585: ближе 20 см ----------"TI CD4585B"(A0=CT0, A1=CT1, A2=CT2, A3=CT3, B0=GND, B1=VCC, B2=GND, B3=GND, LTIN=GND, EQIN=GND, GTIN=VCC, LT=CLOSE)# ---------- CD4071: удар или близко ----------"TI CD4071B"(A=HIT, B=NEAR, J=TRIP, C=GND, D=GND, E=GND, F=GND, G=GND, H=GND)# ---------- лампа «близко» ----------led{color=blue}(NEAR)

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