Всё, что мы делали руками (замыкать цепь кнопкой, подавать ток на базу транзистора), умеет делать плата. У Arduino есть ножки (пины), и каждую программа может:
Ножка — это «слабый палец» из урока 4: сама она тянет только светодиод, а мотор включает через транзистор или H-мост. Всё как мы разобрали — только выключателем теперь рулит код.
Ножка умеет только 5 В или 0 В — «включено» или «выключено». А как сделать светодиод наполовину ярким или мотор помедленнее? Хитрость: очень быстро включать и выключать ножку — сотни раз в секунду. Если она включена половину времени — в среднем получается «полмощности». Это и есть ШИМ (широтно-импульсная модуляция, по-английски PWM).
Сама Arduino понимает только свой язык. Но есть готовая прошивка Telemetrix4Arduino: заливаешь её в плату один раз — и дальше плата просто слушается компьютера (как именно залить — покажем по шагам ниже, в практике). Со стороны Python есть библиотека telemetrix, которая командует ножками по USB:
from telemetrix import telemetrix board = telemetrix.Telemetrix() # подключились к плате board.set_pin_mode_digital_output(13) board.digital_write(13, 1) # зажгли светодиод на ножке 13 board.digital_write(13, 0) # погасили
motor, servo,
radar, button — командуешь объектами, а не проводами.
Соберём всё вместе. Возьмём схему из урока 5 (L293D + вентилятор + кнопки + лампочка) и подключим к ней плату Arduino UNO R3. Теперь «пальцем» на H-мосте будет не рука, а код, а командовать вентилятором будем из окна pygame — как в играх, которые ты уже писал.
«Ум» по-прежнему живёт в Python на ноутбуке — как в курсах MeArm и машинки. UNO просто слушается (на ней прошивка Telemetrix). Новое — это окошко pygame с управлением стрелками, знакомое тебе по играм. Вся программа — в одном файле на ноутбуке.
Arduino UNO R3 — стандартная плата курса (на ней же будут MeArm и машинка). Она работает на 5 В, поэтому никаких преобразований уровней не нужно. Пара важных моментов:
Шаг 1. Подключаем провода. Питание для L293D и мотора берём через модуль питания (Power Supply, например MB102): вставляешь в него 9 В батарейку (или адаптер), а он выдаёт ровные 5 В на макетку. UNO при этом питается от USB. Новое по сравнению с уроком 5 — на IN1, IN2, EN, светодиод и кнопки теперь идут ножки Arduino UNO (а не твои руки); кнопки переподключаем чуть иначе — между ножкой и GND (подтяжка уже внутри UNO). Самое важное: «−» модуля и GND UNO должны быть соединены — без общей земли ничего не заработает:
Полная таблица — что куда воткнуть:
| Откуда | Куда | Зачем |
|---|---|---|
| UNO D5 | L293D EN (пин 1) | включение + скорость (ШИМ) |
| UNO D7 | L293D IN1 (пин 2) | направление «вперёд» |
| UNO D8 | L293D IN2 (пин 7) | направление «назад» |
| UNO D13 | 150–220 Ом → светодиод → GND | лампочка «вперёд» (на D13 есть и встроенный LED) |
| UNO D12 | 150–220 Ом → светодиод → GND | лампочка «назад» |
| UNO D2 / D4 | кнопки → GND (встроенная подтяжка) | читать «вперёд» / «назад» |
| UNO GND | общая земля (см. ниже) | общий ноль |
| 9 В батарейка | вход модуля MB102 | источник энергии |
| MB102: выход 5 В | L293D VCC1 (пин 16) и VCC2 (пин 8) | питание чипа и мотора |
| MB102: GND («−») | L293D GND (пины 4, 5, 12, 13) и UNO GND | общая земля |
| L293D OUT1 (пин 3), OUT2 (пин 6) | два провода вентилятора | мотор крутится |
Главное правило питания: UNO — от USB; L293D и мотор — от модуля MB102 (его кормит 9 В батарейка): выход 5 В идёт и на VCC1, и на VCC2. Все «минусы» (GND) соединены вместе. Кнопки — просто между ножкой и GND (у UNO внутренняя подтяжка, нажата = 0). Распиновку L293D (где какой пин) смотри в уроке 5.
Шаг 2. Заливаем в Arduino прошивку Telemetrix. С этим мы встречаемся впервые, поэтому медленно. Чтобы плата слушалась Python, в неё надо один раз положить готовую программу — прошивку. Прошивка живёт внутри платы; мы её не пишем сами, а берём готовую Telemetrix4Arduino (ту самую, из раздела выше). Заливают прошивку бесплатной программой Arduino IDE — это делается один раз, потом можно про неё забыть.
/dev/ttyACM0).Осталась обычная подготовка ноутбука: поставь библиотеку pip install telemetrix
(pygame у тебя уже есть с курса игр). UNO оставь подключённой по USB — по нему же
Python будет ей командовать.
Шаг 3. Первая команда из кода. Проверим, что вентилятор слушается Python:
from telemetrix import telemetrix board = telemetrix.Telemetrix() # UNO с прошивкой Telemetrix, по USB IN1, IN2, EN = 7, 8, 5 # пины UNO D7, D8, D5 → входы L293D board.set_pin_mode_digital_output(IN1) board.set_pin_mode_digital_output(IN2) board.set_pin_mode_analog_output(EN) # EN — это ШИМ (скорость) board.digital_write(IN1, 1) # одно направление... board.digital_write(IN2, 0) board.analog_write(EN, 220) # ...скорость 220/255 → вентилятор закрутился!
Построчно: Telemetrix() — подключились к плате. set_pin_mode_… — говорим,
что IN1/IN2 будут «выходами-выключателями», а EN — «полугазом» (ШИМ; в коде это analog).
Дальше digital_write ставит направление (1,0 — вперёд), а analog_write(EN, 220)
задаёт скорость. Это та же таблица IN1/IN2 из урока 5 — только нажимает уже код.
Шаг 4. Делаем команды «вперёд / назад / стоп» и зажигаем свою лампочку на каждое направление:
LED_FWD, LED_BACK = 13, 12 # пины D13, D12 — лампочки вперёд/назад board.set_pin_mode_digital_output(LED_FWD) board.set_pin_mode_digital_output(LED_BACK) def forward(): board.digital_write(IN1, 1); board.digital_write(IN2, 0) board.analog_write(EN, 220) board.digital_write(LED_FWD, 1); board.digital_write(LED_BACK, 0) # горит «вперёд» def back(): board.digital_write(IN1, 0); board.digital_write(IN2, 1) board.analog_write(EN, 220) board.digital_write(LED_FWD, 0); board.digital_write(LED_BACK, 1) # горит «назад» def stop(): board.analog_write(EN, 0) board.digital_write(LED_FWD, 0); board.digital_write(LED_BACK, 0)
Шаг 5. Делаем пульт в окне pygame. Откроем окно (как в играх) и будем рулить вентилятором стрелками: ↑ вперёд, ↓ назад, пробел — стоп:
import pygame pygame.init() screen = pygame.display.set_mode((460, 220)) pygame.display.set_caption("Пульт вентилятора") big = pygame.font.SysFont(None, 44) small = pygame.font.SysFont(None, 26) clock = pygame.time.Clock() state = "стоп" # что показываем на экране running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: forward(); state = "вперёд" if event.key == pygame.K_DOWN: back(); state = "назад" if event.key == pygame.K_SPACE: stop(); state = "стоп" screen.fill((20, 24, 35)) screen.blit(big.render("Вентилятор: " + state, True, (235, 235, 235)), (30, 80)) screen.blit(small.render("стрелки = направление, пробел = стоп", True, (150, 160, 180)), (30, 140)) pygame.display.flip() clock.tick(30) stop() pygame.quit()
Это знакомый игровой цикл: ловим события (нажатия стрелок), на каждое — вызываем нашу
команду forward / back / stop, и рисуем на экране текущее
состояние. Запусти файл — откроется окошко, жми стрелки, и вентилятор слушается. 🎉
(По желанию) читаем и физические кнопки из урока 5 — тогда вентилятором можно рулить и руками. У нас две кнопки: D2 → «вперёд» и D4 → «назад». Telemetrix сам зовёт нашу функцию при нажатии и отпускании (у UNO встроенная подтяжка: нажато = 0, отпущено = 1) — прямо в ней и командуем мотором:
def on_button(data): # telemetrix зовёт это при нажатии/отпускании if data[2] == 0 and data[1] == 2: # D2 нажата (подтяжка: нажато = 0) forward() if data[2] == 0 and data[1] == 4: # D4 нажата back() if data[2] == 1: # любую кнопку отпустили stop() board.set_pin_mode_digital_input_pullup(2, on_button) # кнопка «вперёд» (D2) board.set_pin_mode_digital_input_pullup(4, on_button) # кнопка «назад» (D4)
Фундамент готов. Теперь то же железо оживёт под управлением программы:
Рука с 4 суставами, управление из Python по USB.
Моторы, H-мост, ультразвук-радар, движение по комнате.
Выбери ответ. Ошибёшься — 30 секунд на то, чтобы вернуться в урок и перечитать.
Что такое ШИМ (PWM)?
Что даёт прошивка Telemetrix4Arduino?
Рулим вентилятором из окна pygame (UNO + Telemetrix). Где находится «ум» — программа?