🤖 Робототехника ⚡ Основы электроники
1 2 3 4 5 6 7
Урок 6 · от железа к программе

Мостик к Arduino и Python

Цель урока Понять, что плата Arduino — это набор управляемых ножек, и что вместо пальца ими «нажимает» наша программа. Узнать про ШИМ (плавная скорость) и про то, как Python будет управлять ножками через Telemetrix. А в конце — соберём управляемый вентилятор на Arduino UNO и порулим им из окна pygame (как в играх).

🔌 Arduino = ножки, которыми управляет программа

Всё, что мы делали руками (замыкать цепь кнопкой, подавать ток на базу транзистора), умеет делать плата. У Arduino есть ножки (пины), и каждую программа может:

🧠 программа 🔌 ножка платы ⚡ транзистор / H-мост ⚙️ мотор / 💡 LED

Ножка — это «слабый палец» из урока 4: сама она тянет только светодиод, а мотор включает через транзистор или H-мост. Всё как мы разобрали — только выключателем теперь рулит код.

🌊 ШИМ — как сделать «полугаз»

Ножка умеет только 5 В или 0 В — «включено» или «выключено». А как сделать светодиод наполовину ярким или мотор помедленнее? Хитрость: очень быстро включать и выключать ножку — сотни раз в секунду. Если она включена половину времени — в среднем получается «полмощности». Это и есть ШИМ (широтно-импульсная модуляция, по-английски PWM).

💡 ШИМ на пальцах Как мигать лампочкой так быстро, что глаз видит просто «приглушённый свет». Включена 20% времени → тускло/медленно; 80% → ярко/быстро. В коде это число 0–255. На машинке именно так задаётся скорость моторов (ножка EN у H-моста, урок 5).

🐍 Как Python будет управлять ножками: Telemetrix

Сама 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)        # погасили
💡 Почему это удобно для нас Не нужно учить язык Arduino и писать «прошивку» под каждый проект. Заливаем Telemetrix — и весь ум робота живёт в Python, который ты уже знаешь по играм. В курсах роботов мы спрячем даже ножки за понятные объекты: motor, servo, radar, button — командуешь объектами, а не проводами.

🌬️ Практика: рулим вентилятором из окна pygame (Arduino UNO)

Соберём всё вместе. Возьмём схему из урока 5 (L293D + вентилятор + кнопки + лампочка) и подключим к ней плату Arduino UNO R3. Теперь «пальцем» на H-мосте будет не рука, а код, а командовать вентилятором будем из окна pygame — как в играх, которые ты уже писал.

🖥️ окно pygame 🐍 telemetrix 🔌 UNO (Telemetrix) ⚡ L293D ⚙️ вентилятор

«Ум» по-прежнему живёт в Python на ноутбуке — как в курсах MeArm и машинки. UNO просто слушается (на ней прошивка Telemetrix). Новое — это окошко pygame с управлением стрелками, знакомое тебе по играм. Вся программа — в одном файле на ноутбуке.

Arduino UNO R3 — стандартная плата курса (на ней же будут MeArm и машинка). Она работает на 5 В, поэтому никаких преобразований уровней не нужно. Пара важных моментов:

💡 Питание и земля — это главное • UNO работает на 5 В — сигналы 5 В микросхема L293D понимает напрямую.
• Мотор и L293D питай не от ножки UNO, а от модуля питания (9 В батарейка → 5 В): мотор питается отдельно — этот принцип из уроков 4–5.
• Соедини все «−» вместе: GND UNO, GND модуля, GND L293D — без общей земли ничего не заработает.
• Кнопки — между ножкой и GND: у UNO есть встроенные подтяжки, лишние резисторы не нужны (нажата = 0).

Шаг 1. Подключаем провода. Питание для L293D и мотора берём через модуль питания (Power Supply, например MB102): вставляешь в него 9 В батарейку (или адаптер), а он выдаёт ровные 5 В на макетку. UNO при этом питается от USB. Новое по сравнению с уроком 5 — на IN1, IN2, EN, светодиод и кнопки теперь идут ножки Arduino UNO (а не твои руки); кнопки переподключаем чуть иначе — между ножкой и GND (подтяжка уже внутри UNO). Самое важное: «−» модуля и GND UNO должны быть соединены — без общей земли ничего не заработает:

Подключение: UNO + MB102 (9 В) → L293D → вентилятор Arduino UNO R3 питание: USB L293D H-мост D5 → EN (ШИМ) D7 → IN1 D8 → IN2 OUT1/OUT2 вентилятор 9 В батарейка Модуль MB102 выход 5 В 5 В → VCC1, VCC2 GND GND общая земля — соедини все «−» вместе! 2 светодиода и кнопки → таблица ↓

Полная таблица — что куда воткнуть:

ОткудаКудаЗачем
UNO D5L293D EN (пин 1)включение + скорость (ШИМ)
UNO D7L293D IN1 (пин 2)направление «вперёд»
UNO D8L293D IN2 (пин 7)направление «назад»
UNO D13150–220 Ом → светодиод → GNDлампочка «вперёд» (на D13 есть и встроенный LED)
UNO D12150–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.

⚡ Почему вентилятор крутится небыстро Питаем мотор через модуль MB102 (удобно — одна точка питания), но он выдаёт максимум 5 В, а сама L293D «съедает» ещё ~2–3 В — до мотора доходит лишь ~2–3 В. Отсюда вялость, и ШИМ 220 тут почти не спасает. Что делать:
Проверь модуль: перемычка рейла должна стоять на 5 В (а не 3,3 В), и батарейка не села.
Хочешь бодрее на тех же 5 В — поставь вместо L293D драйвер с малыми потерями: TB6612 или DRV8833 (теряют ~0,1–0,3 В вместо 2–3 В) — мотор оживёт.
• Для учебного вентилятора «вяло» — это нормально: главное, что им рулит твоя программа.

Шаг 2. Заливаем в Arduino прошивку Telemetrix. С этим мы встречаемся впервые, поэтому медленно. Чтобы плата слушалась Python, в неё надо один раз положить готовую программу — прошивку. Прошивка живёт внутри платы; мы её не пишем сами, а берём готовую Telemetrix4Arduino (ту самую, из раздела выше). Заливают прошивку бесплатной программой Arduino IDE — это делается один раз, потом можно про неё забыть.

  1. Установи Arduino IDE (с сайта arduino.cc) и запусти.
  2. Поставь библиотеку прошивки: Инструменты → Управлять библиотеками, найди «Telemetrix4Arduino» (автор Alan Yorinks) и нажми «Установить».
  3. Подключи Arduino UNO к ноутбуку кабелем USB.
  4. Выбери плату и порт: Инструменты → Плата → Arduino UNO и Инструменты → Порт → твой порт (например, /dev/ttyACM0).
  5. Открой готовый пример (писать ничего не надо!): Файл → Примеры → Telemetrix4Arduino → Telemetrix4Arduino.
  6. Нажми кнопку Загрузить (стрелка «→» сверху слева) и дождись надписи «Done uploading». Всё — прошивка внутри платы.
💡 Если залить не получаетсяПорта нет в списке / ошибка связи → у обычного UNO драйвер не нужен; у дешёвого «клона» бывает чип CH340 — тогда поставь его драйвер и переподключи кабель.
• Закрой программы, которые могли занять порт (Serial Monitor, другой запущенный Python).
• В курсах MeArm и машинки плату готовят похоже — готовая прошивка, которой рулит Python.

Осталась обычная подготовка ноутбука: поставь библиотеку 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)
💡 Куда расти дальшеЧитай датчики: Telemetrix умеет не только командовать, но и читать (кнопки, расстояние, свет) — это пригодится в роботах.
Управляй и рукой, и из окна одновременно: код читает кнопки и ловит стрелки в pygame.
• Это ровно то, что делают MeArm и машинка: ум — в Python, плата слушается. Ты готов к настоящим роботам!

🚀 Что дальше

Фундамент готов. Теперь то же железо оживёт под управлением программы:

🦾

Робот MeArm

Рука с 4 суставами, управление из Python по USB.

🚗

Робомашинка

Моторы, H-мост, ультразвук-радар, движение по комнате.

✅ Запомнить с курса Ток течёт по замкнутому кольцу; светодиод — через резистор; мотор — через транзистор/H-мост и от своей батарейки; ножка платы — слабый «палец», которым управляет программа; ШИМ задаёт «полугаз»; готовая прошивка (Telemetrix) + Python позволяют рулить всем из знакомого кода.

🧠 Проверь себя

Выбери ответ. Ошибёшься — 30 секунд на то, чтобы вернуться в урок и перечитать.

Что такое ШИМ (PWM)?

✅ Включена 20% времени → тускло/медленно, 80% → ярко/быстро. В коде это число 0–255.

Что даёт прошивка Telemetrix4Arduino?

✅ Залил один раз — и весь ум робота живёт в Python: board.digital_write(13, 1) зажигает ножку.

Рулим вентилятором из окна pygame (UNO + Telemetrix). Где находится «ум» — программа?

✅ Ум — в Python на ноутбуке (это и есть наш пульт на pygame). UNO с Telemetrix просто слушается, как и в курсах MeArm и машинки.
← НазадУрок 5 — Мотор и H-мост