Урок 2. «Жук»: бампер и CD4017

В картинках

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


2.1. Идея: манёвр — это шаги

Манёвр «наткнулся — отъехал — развернулся» — цепочка шагов по времени. Генератор 10 Гц даёт такт каждые 0,1 с, а CD4017 на каждом такте зажигает следующий из десяти выходов O0…O9:

  • O0 — вперёд;
  • O1…O4 — назад (4 такта = 0,4 с);
  • O5…O8 — разворот (0,4 с);
  • O9 — вперёд, и снова O0.

Сложить четыре шага в один сигнал — это ИЛИ на 4 входа, CD4072: BACK = O1 + O2 + O3 + O4, TURN = O5 + … + O8.

CKHITшаг0123456789FWDBACKTURNудар — счётчик пошёлназад 0,4 с, разворот 0,4 с
Манёвр по тактам 10 Гц: пока удара нет, запрет INH держит CD4017 на шаге 0. Удар снимает запрет — шаги 1–4 «назад», 5–8 «разворот», 9 — снова вперёд.

2.2. Идея: ждать удара — HOLD

Что хотим. Пока бампер свободен, робот стоит на шаге 0 и едет вперёд. Ударился — счётчик пошёл по шагам. Начатый манёвр доводится до конца, даже если бампер уже отпустило.

У CD4017 для этого есть нога INH (запрет): пока INH = 1, такты не считаются. Значит, запрет нужен ровно тогда, когда мы на шаге 0 И удара нет:

FWD (шаг 0)HIT (удар)HOLD (не шагать)
101 — ждём удара
110 — удар, поехали
000 — манёвр идёт
010 — манёвр идёт
  • Формула: HOLD = FWD И НЕ HIT.

Можно собрать как написано: инвертор на HIT и И. Но у нас уже есть NFWD = НЕ FWD (он понадобится и дальше), а правило де Моргана говорит: «A И НЕ B» — то же самое, что «НЕ (НЕ A ИЛИ B)». Получается один вентиль НЕ-ИЛИ:

  • HOLD = НЕ-ИЛИ(NFWD, HIT) — проверь по таблице: HOLD = 1 только когда NFWD = 0 и HIT = 0.

НЕ-ИЛИ берём из CD4001 — в нём четыре таких вентиля, второй пойдёт на правое колесо.

Почему не «запрет = НЕ HIT» без FWD? Тогда, едва бампер отпустит (робот отъехал на сантиметр), счётчик встанет посреди манёвра — робот замрёт задом наперёд. Условие FWD держит только шаг 0.

2.3. Идея: какое колесо куда — LDIR и RDIR

Что хотим на каждом шаге (1 — колесо вперёд, 0 — назад):

ШагLDIR (левое)RDIR (правое)
0 — вперёд11
1–4 — BACK00
5–8 — TURN10
9 — вперёд11
  • Левое колесо идёт назад только на BACK: LDIR = НЕ BACK — один инвертор CD4069.
  • Правое идёт назад и на BACK, и на TURN: RDIR = НЕ (BACK ИЛИ TURN) = НЕ-ИЛИ(BACK, TURN) — второй вентиль CD4001.

На развороте левое вперёд, правое назад — робот крутится на месте по часовой. Хочешь против часовой — поменяй местами LDIR и RDIR на ногах шасси.

А BACK и TURN откуда? На каждом шаге горит ровно один выход CD4017, поэтому «идёт назад» = «горит любой из O1…O4» — это ИЛИ на четыре входа: BACK = O1 + O2 + O3 + O4, TURN = O5 + O6 + O7 + O8. Два таких ИЛИ — в одном CD4072.

2.4. Сборка

Поверх урока 1. Микросхемы — готовые, из файла набора robot-chips.json; на ногах у них — метки (двойной клик по ноге).

Шаг 1. Микросхемы в библиотеку

Если в библиотеке ещё нет папки Robot с микросхемами TI CD4017B, TI CD4072B, TI CD4069UB, TI CD4001B: в библиотеке кнопка импорта → файл robot-chips.json. Встанет папка Robot — десять микросхем на весь набор (и детали, из которых они собраны внутри).

Шаг 2. Убрать пробу урока 1

Направление колёс теперь дают микросхемы — тумблеры LDIR и RDIR удали (выдели, Delete). Метки LDIR и RDIR на ногах шасси остаются.

ДетальДействие
Input (тумблер), выход которого = LDIRудалить
Input (тумблер), выход которого = RDIRудалить

Шаг 3. Генератор и «Сброс»

Clock — щелчок по корпусу до 10Hz.

ДетальНога / действиеМетка / куда
Clock 10HzвыходCK
Button (кнопка)выходRESET

Шаг 4. Бампер

Бампер тяни за оранжевую гайку к передней зелёной точке шасси — защёлкнется. Длина — ручкой (подпись у ручки): 110, шире колёс — иначе в стенку первым упрётся угол корпуса, а бампер не почует.

ДетальНога / действиеМетка / куда
Bumper (бампер)длина (ручка)
HIT
посадить
110
HIT
на f (передняя точка шасси)

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

ДетальНога / действиеМетка / куда
TI CD4017BCLOCK
RESET
INH
O0
O1
O2
O3
O4
O5
O6
O7
O8
CK
RESET
HOLD
FWD
B1
B2
B3
B4
T1
T2
T3
T4
TI CD4072BA
B
C
D
J
E
F
G
H
K
B1
B2
B3
B4
BACK
T1
T2
T3
T4
TURN
TI CD4069UBA
G
B
H
C
D
E
F
FWD
NFWD
BACK
LDIR
GND
GND
GND
GND
TI CD4001BA
B
J
C
D
K
E
F
G
H
BACK
TURN
RDIR
HIT
NFWD
HOLD
GND
GND
GND
GND

Не подключать: O9 и CO у CD4017, I…L у CD4069UB, L и M у CD4001B.

Шаг 6. Лампы манёвра

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

ДетальНога / действиеМетка / куда
LED, зелёнаявходFWD
LED, жёлтаявходBACK
LED, краснаявходTURN

2.5. Проверка

  1. Включи питание и один раз нажми «Сброс» — горит зелёная FWD.
  2. Включи GO — робот едет вперёд.
  3. Доехал до стенки или препятствия — бампер краснеет, и робот сам: назад (жёлтая BACK, около 0,4 с), разворот на месте по часовой (красная TURN, 0,4 с) и снова вперёд. Между разворотом и зелёной на мгновение не горит ни одна лампа — это шаг 9: колёса уже крутятся вперёд.
  4. Если после разворота бампер всё ещё упирается — зелёная не загорается, робот сразу снова отъезжает. Из угла он выбирается за два-три таких отскока.
  5. На бумаге — прямые пробеги и «звёздочки» в местах ударов.
ГоритКолёсаРобот
FWD (зелёная)оба вперёдедет вперёд, ждёт удара
BACK (жёлтая)оба назадотъезжает около 0,4 с
TURN (красн.)левое вперёд, правое назадразворот по часовой 0,4 с — на ~35°

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

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

# Урок 2 — «жук»: бампер; CD4017 шагает манёвр: вперёд → наехал → назад 0,4 с → разворот 0,4 с → вперёд.# Вставка: Cmd+I в новый проект (ставит уроки 1 и 2 целиком, без пробы урока 1).# ---------- питание ----------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)

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