Урок 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 |
|---|---|---|
| 0 | 00…09 см | 1 |
| 1 | 10…19 см | 1 |
| 2…9 | 20…99 см | 0 |
Ноги LTIN, EQIN, GTIN — для цепочки из нескольких CD4585 (сравнить 8, 12 бит…). У нас корпус один, и TI велит: GTIN = 1, остальные — 0.
Хочешь другой порог — поменяй 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держится до следующего замера.
Это тот же приём, что у табло в уроке 3: показывать только готовое.
4.3. Идея: удар или близко — TRIP
Что хотим: манёвр запускается, если сработал бампер или впереди близко:
| HIT | NEAR | TRIP |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
TRIP=HITИЛИNEAR— вентильИЛИиз CD4071.
А в CD4001 (запрет HOLD, урок 2) вместо HIT теперь TRIP: HOLD = НЕ-ИЛИ(NFWD, TRIP). Всё остальное — манёвр, колёса — не меняется: «жук» просто получил второй, бесконтактный повод для разворота.
Почему не убрать бампер? Ультразвук смотрит узким лучом прямо вперёд. Если робот едет к стенке наискосок, луч может скользить вдоль неё, а угол корпуса — уже коснуться. Тогда спасает бампер.
4.4. Сборка
Поверх урока 3. Две новые микросхемы и несколько перецепок: метку на ноге переименовать — двойной клик по метке, новое имя; у пустой ноги — двойной клик по ноге.
Шаг 1. Ближе 20 см
| Деталь | Нога / действие | Метка / куда |
|---|---|---|
| TI CD4585B | A0 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 CD4071B | A 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, выход которой = ECHOS | R2 | GND | RESET |
| TI CD4013B, выход которой = ECHOS | D2 | GND | CLOSE |
| TI CD4013B, выход которой = ECHOS | CL2 | GND | SHOW |
| TI CD4013B, выход которой = ECHOS | Q2 | — (не подключена) | NEAR |
| TI CD4001B, выход которой = RDIR | C | HIT | TRIP |
4.5. Проверка
- Включи питание, нажми «Сброс», включи
GO. - Робот едет к стенке, число на табло тает. Около 20 — загорается синяя
NEAR, и робот, не коснувшись, делает тот же манёвр: назад (BACK), разворот (TURN), вперёд. - После разворота, если впереди дальше 20 см,
NEARгаснет на ближайшем замере, и робот едет дальше. - Бампер остаётся страховкой: если робот подъехал к стенке наискосок, ультразвук смотрит вперёд мимо неё — тогда сработает удар, как в уроке 2. Такое бывает редко.
- На бумаге — путь, который почти не касается стенок: развороты в 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)Не получается? Что-то не работает →