PlatformIO-based multi-sketch workspace targeting Arduino Uno R3. Each sketch lives under sketches/<NN_name>/src/main.cpp.
Folders under sketches/ are prefixed with 01_, 02_, ... in order of increasing cognitive complexity.
В этом репозитории иллюстрации сделаны в трёх форматах (что удобнее в конкретном месте):
- ASCII: короткая шпаргалка подключения прямо в начале каждого
main.cpp. - Mermaid: схема проводов в Markdown рядом со скетчем.
- SVG: простая картинка для сложных подключений (моторы/драйверы) в
docs/images/.
Документация по урокам:
uno-blink:sketches/01_blink/README.mduno-rgb-led:sketches/02_rgb_led/README.mduno-photoresistor:sketches/03_photoresistor/README.mduno-joystick:sketches/04_joystick/README.mduno-hcsr04:sketches/05_hcsr04_ultrasonic/README.mduno-ir-receiver:sketches/06_ir_receiver/README.mduno-lcd-16x2:sketches/07_lcd_16x2/README.mduno-74hc595:sketches/08_shift_register_74hc595/README.mduno-max7219-matrix:sketches/09_max7219_matrix/README.mduno-mpu6050:sketches/10_mpu6050/README.mduno-servo-sg90:sketches/11_servo_sg90/README.mduno-dc-motor-l293d:sketches/12_dc_motor_l293d/README.mduno-stepper-28byj48:sketches/13_stepper_28byj48/README.md
Эта папка — набор маленьких “уроков” для Arduino Uno. Мы будем собирать схемы на макетной плате, загружать программу в Arduino и смотреть результат.
- Перед тем как переставлять провода — отключи питание.
- Если питаешь от USB: вынь USB.
- Если питаешь от адаптера 9V: выключи/выдерни адаптер.
- Никогда не соединяй
5VиGNDнапрямую. Это короткое замыкание. - Светодиоды — только через резистор. Обычно подходит 220Ω или 330Ω.
- Двигатели и сервоприводы “шумят” по питанию. Если мотор/серво дергается — это нормально, но так можно “уронить” питание и перезапустить Arduino.
- Провода не должны греться. Если что-то пахнет/греется — сразу отключай питание и зови взрослого.
- Для первых опытов (светодиоды, датчики) почти всегда достаточно питания от USB.
- Адаптер 9V 1A лучше использовать, когда подключаешь моторы (через драйвер) или когда USB не хватает.
- Важно: сервоприводу SG-90 и шаговому двигателю обычно нужно 5V, а не 9V. 9V — это вход для Arduino (в разъём питания) или для части “Vmotor” в драйверах.
- Если ты используешь и Arduino, и драйвер мотора: земля (GND) должна быть общей.
Это нормально: Arduino — маленький “микрокомпьютер”, и у него есть пределы.
Память (самое важное):
- Flash (прошивка): 32 KB (под код обычно доступно около ~31.5 KB).
- SRAM (оперативная память): 2 KB (самое узкое место).
- EEPROM (память без питания): 1 KB.
Если SRAM заканчивается, бывают странные симптомы: перезагрузки, зависания, мусор в Serial.
Скорость и “железо”:
- 16 MHz, логика 5V.
- Аналоговые входы A0–A5: АЦП 10 бит (0…1023).
- PWM есть не на всех пинах (обычно D3, D5, D6, D9, D10, D11).
Ток и питание (важно для безопасности):
- Пины Arduino не предназначены для питания моторов.
- Двигатели/серво подключай через драйвер и внешнее питание (и общий GND).
Как экономить память (простые правила):
- Печатай “длинные тексты” в Serial через
F("...")(строка хранится во Flash, а не в SRAM). - Избегай
Stringна Uno: лучшеSerial.print(...)и короткиеchar[]. - Не делай большие массивы внутри
loop()/функций (они занимают стек). - Если нужны большие таблицы — используй
PROGMEM(хранение во Flash). - Используй маленькие типы там, где можно:
uint8_tвместоint, если диапазон маленький.
Цель: заставить мигать встроенный светодиод на плате.
- Подключи Arduino к компьютеру USB-кабелем.
- Открой этот проект в VS Code.
- Установи PlatformIO (любой способ):
- Через расширение VS Code: “PlatformIO IDE”.
- Или через командную строку:
pip install platformio.
- Залей пример
uno-blink:- Сборка:
pio run -e uno-blink - Загрузка:
pio run -t upload -e uno-blink
- Сборка:
Если всё получилось — на плате начнёт мигать маленький светодиод.
Это “дорожка”, по которой удобно идти почти для любого проекта в этой папке.
- Выбери урок (что делаем?)
- Смотри таблицу ниже “Урок (env) → …” и выбери нужный
uno-....
- Смотри таблицу ниже “Урок (env) → …” и выбери нужный
- Собери схему на макетной плате
- Сначала подключи GND, потом 5V, и только потом сигнальные провода.
- Всегда сверяйся со строкой “Куда подключать” из таблицы.
- Подключи Arduino к компьютеру
- Для первых проверок лучше через USB.
- Собери проект (проверка, что код компилируется)
pio run -e <env>- Если есть ошибка — прочитай последнее сообщение: там обычно написано, в каком файле и что не так.
- Загрузи прошивку в Arduino
pio run -t upload -e <env>
- Проверь, что оно “живое”
- Если урок печатает данные:
pio device monitor -b 115200 - Если это мотор/серво/матрица/LCD — смотри на устройство.
- Если урок печатает данные:
- Исправляй и улучшай (это нормально!)
- Меняй только одну вещь за раз: например, пин или скорость, или задержку.
- После изменения: снова
pio run -t upload -e <env>.
- Внедрение: как сделать, чтобы работало “без компьютера”
- Если проект готов: отключи USB и подключи питание через разъём питания Arduino:
- адаптер 9V (из набора) или батарейка “крона” через переходник.
- Для моторов/серво чаще нужен отдельный источник питания (и общий GND).
- Прежде чем “оставить работать”: потрогай проводки — ничего не должно греться.
- Если проект готов: отключи USB и подключи питание через разъём питания Arduino:
- Создай папку:
sketches/<my_sketch>/src/и файлmain.cpp. - Добавь окружение в
platformio.ini:[env:uno-my-sketch]build_src_filter = -<*> +<<my_sketch>/src/main.cpp>
- Собери и залей:
pio run -t upload -e uno-my-sketch.
Ниже — список из коробки. Не пугайся: сразу всё не нужно. Мы будем брать детали по одной.
- Плата Arduino Uno R3 — 1 шт. “мозг”, который выполняет программу.
- USB-кабель — 1 шт. питание + загрузка программы.
- Набор перемычек (Jumper Wires) провода для макетной платы.
- Перемычка “папа‑мама” (4 контакта) удобно подключать модули/датчики.
- Макетная плата (400 точек) — 1 шт. доска с дырочками для сборки без пайки.
- Shield для прототипов — 1 шт. “плата сверху” для удобных подключений (можно пока не использовать).
- Сетевой адаптер 9В 1А — 1 шт. внешнее питание (часто нужно для моторов).
- MPU‑6050 — 1 шт. датчик наклона/ускорения (акселерометр+гироскоп).
- HC‑SR04 — 1 шт. ультразвуковой “дальномер”.
- Двигатель постоянного тока — 1 шт. обычный мотор.
- Шаговый двигатель — 1 шт. крутится “шагами”.
- Драйвер шагового двигателя ULN2003 — 1 шт. плата‑помощник для шагового двигателя.
- Сервопривод SG‑90 — 1 шт. поворачивается на угол.
- ЖК индикатор 16×2 без подсветки — 1 шт. экран для текста.
- Джойстик — 1 шт. две оси + кнопка.
- Одноканальный релейный модуль — 1 шт. включает/выключает нагрузку (лучше с взрослым).
- Переходник “крона 9V → Arduino” — 1 шт. питание Arduino от батарейки.
- RGB светодиод — 1 шт. три цвета в одном.
- Светодиод красный — 5 шт.
- Светодиод желтый — 5 шт.
- Светодиод белый — 5 шт.
- Светодиод синий — 5 шт.
- Светодиод зеленый — 5 шт.
- BC557 — 5 шт. транзисторы (обычно для усиления/ключей).
- PN2222 — 5 шт. транзисторы (часто для управления нагрузкой).
- BC547 — 5 шт. транзисторы.
- 1N4001 — 5 шт. диоды (защита от “обратного тока”).
- Набор резисторов (100 шт.) 10Ω, 100Ω, 220Ω, 330Ω, 1k, 2k, 5.1k, 10k, 100k, 1M.
- Термистор — 1 шт. датчик температуры (сопротивление меняется).
- Керамический конденсатор 22 пФ — 5 шт.
- Керамический конденсатор 1 мкФ — 5 шт.
- Конденсатор 10 мкФ 50В — 2 шт.
- Конденсатор 100 мкФ 50В — 2 шт.
- Потенциометр — 2 шт. “крутилка” (например контраст LCD).
- Динамик‑пищалка — 1 шт. звук.
- 74HC595N — 1 шт. микросхема “много выходов из трёх проводов”.
- MAX7219 — 1 шт. драйвер для матрицы/индикаторов.
- L293D — 1 шт. драйвер мотора.
- ИК‑приемник — 1 шт. принимает команды с пульта.
- Кнопка тактовая — 4 шт. кнопки.
- ИК‑пульт ДУ — 1 шт. пульт.
- Семисегментный индикатор 1 символ — 1 шт.
- Семисегментный индикатор 4 символа — 1 шт.
- Светодиодная матрица 8×8 — 1 шт.
- Держатель HC‑SR04 — 1 шт. крепёж для датчика.
- Штыревой разъем 40 контактов — 1 шт. пины (может понадобиться для модулей).
- Фоторезистор — 2 шт. “датчик света”.
Ниже таблица: выбери, что хочешь собрать, и используй соответствующую команду pio run -t upload -e ....
| Урок (env) | Что нужно из набора | Куда подключать (Arduino Uno) | Что увидишь |
|---|---|---|---|
uno-blink |
только Arduino + USB | ничего подключать не надо | мигает LED на плате |
uno-rgb-led |
RGB LED + 3× резистор 220/330Ω + провода | R=11, G=10, B=9 через резисторы; общий вывод LED → GND | плавная смена цветов |
uno-photoresistor |
фоторезистор + резистор 10k + провода | делитель: 5V—LDR—(A0)—10k—GND | цифры “LDR raw” в Serial |
uno-joystick |
джойстик + провода | VRx=A0, VRy=A1, SW=D2, VCC=5V, GND=GND | X/Y/кнопка в Serial |
uno-hcsr04 |
HC-SR04 + провода + (иногда) 2 резистора для делителя | TRIG=D7, ECHO=D6, VCC=5V, GND | расстояние в см в Serial |
uno-ir-receiver |
ИК‑приёмник + пульт + провода | SIGNAL=D7, VCC=5V, GND | коды кнопок в Serial |
uno-mpu6050 |
MPU‑6050 + 4 провода | SDA=A4, SCL=A5, VCC=5V*, GND | ускорение/гиро в Serial |
uno-servo-sg90 |
SG‑90 + провода | SIGNAL=D9, VCC=5V, GND | серво “ходит” 0…180 |
uno-dc-motor-l293d |
DC‑мотор + L293D + адаптер 9V + провода | ENA=D5, IN1=D8, IN2=D7; мотор к OUT1/OUT2; Vmotor=9V; GND общий | мотор меняет скорость/направление |
uno-stepper-28byj48 |
шаговый + ULN2003 + провода | IN1=D8, IN2=D10, IN3=D9, IN4=D11; ULN2003 VCC=5V, GND | шаговый плавно крутится |
uno-74hc595 |
74HC595 + (лучше 8 LED + резисторы) + провода | DS=D11, SH_CP=D12, ST_CP=D8 | “бегущий огонёк” на выходах |
uno-max7219-matrix |
MAX7219 + матрица 8×8 + провода | DIN=D12, CLK=D11, CS=D10, VCC=5V, GND | смайлик/стрелка |
uno-lcd-16x2 |
LCD 16×2 + потенциометр + провода | RS=12, E=11, D4=5, D5=4, D6=3, D7=2; контраст: ползунок потенциометра → V0 (VO) на LCD; концы → 5V/GND; дополнительно: соединить ползунок с A0 | на экране “LCD ready” и значение Pot |
* Если на плате MPU‑6050 рядом с питанием написано только 3V3, подключай питание к 3.3V.
Многие уроки печатают данные в “монитор порта”.
- Открой монитор:
pio device monitor -b 115200 - Если видишь “кракозябры”, значит неправильная скорость. Тут почти всегда 115200.
Подсказка: на макетной плате обычно есть две длинные шины (плюс и минус). Можно сделать так:
- красная шина =
5V - синяя/чёрная шина =
GND
Тогда почти все схемы собираются проще: питание берём с шин.
Светодиод нельзя подключать напрямую к 5V или к пину — нужен резистор.
Arduino D11 (или другой pin)
|
[220Ω или 330Ω]
|
|>| LED
|
GND
Где у светодиода “плюс/минус”:
- Длинная ножка обычно “плюс” (анод).
- Короткая ножка и/или плоская грань на корпусе — “минус” (катод).
Так Arduino сможет “измерять свет”.
5V ---[ LDR ]---+--- A0
|
[10k]
|
GND
Если есть Arduino и отдельное питание/драйвер мотора, схема должна “договариваться”, где ноль.
Arduino GND --------------+
|
Driver GND / Battery(-) --+
Без общего GND датчики/моторы часто “не работают” или работают странно.
HC-SR04 -> Arduino Uno
VCC -> 5V
GND -> GND
TRIG -> D7
ECHO -> D6
Если когда-нибудь будешь подключать датчик к плате 3.3V (не Uno), для ECHO часто нужен делитель.
У серво обычно цвета такие:
- коричневый/чёрный = GND
- красный = 5V
- оранжевый/жёлтый/белый = сигнал
Servo GND -> Arduino GND
Servo 5V -> 5V (или внешний 5V источник)
Servo SIG -> D9
Если питаешь серво не от Arduino, помни про общий GND (схема C).
У LCD есть ножка V0/VO (контраст). Экран может быть “пустой”, пока не настроишь контраст.
Pot end 1 -> 5V
Pot end 2 -> GND
Pot middle -> LCD V0/VO (контраст)
Этот проект ещё читает значение потенциометра на A0, поэтому можно сделать перемычку:
Pot middle -> LCD V0/VO
Pot middle -> A0 (ещё одним проводом)
Важно: мотор нельзя подключать напрямую к пинам Arduino — нужен драйвер.
Этот проект управляет мотором так:
- скорость (PWM) на
D5(ENA) - направление на
D8(IN1) иD7(IN2)
Схема-идея (без “ножек” микросхемы, просто соединения):
Arduino Uno L293D / питание / мотор
D5 ----------------> ENA (enable, скорость)
D8 ----------------> IN1 (направление)
D7 ----------------> IN2 (направление)
5V ----------------> Vcc1 (логика)
GND ----------------> GND (общая земля)
9V adapter (+) ------> Vmotor (питание мотора)
9V adapter (-) ------> GND (и к Arduino GND тоже!)
OUT1 ---------------> мотор вывод 1
OUT2 ---------------> мотор вывод 2
Если мотор крутится “не туда” — поменяй местами провода мотора на OUT1/OUT2.
Тут всё проще: мотор обычно подключается в ULN2003 “белым разъёмом”, а мы соединяем только IN1–IN4 и питание.
Arduino Uno -> ULN2003
5V -> VCC
GND -> GND
D8 -> IN1
D10 -> IN2
D9 -> IN3
D11 -> IN4
Мотор 28BYJ-48 -> в разъём на плате ULN2003
Если шаговый “дёргается” и не крутится, чаще всего перепутаны IN-пины или не хватает питания 5V.
- Питание: USB подключён? Плата светится?
- Порт: выбран правильный USB‑порт (PlatformIO обычно сам находит, но иногда надо выбрать вручную).
- Провода: все ли в нужных дырочках? Не перепутаны ли 5V и GND?
- Общий GND: если есть внешний драйвер/мотор — земли должны быть соединены.
- LCD пустой: почти всегда это контраст (крутилка на V0/VO).
- HC‑SR04 показывает 0/NaN: проверь TRIG/ECHO, питание, и что датчик смотрит на предмет.
- Мотор не крутится: проверь питание мотора (Vmotor), и что мотор подключён к OUT1/OUT2 драйвера.
- Install PlatformIO Core (
pip install platformio) or open with the VS Code PlatformIO extension. - Build:
pio run -e uno-blink - Upload:
pio run -t upload -e uno-blink - Monitor (115200 baud unless noted):
pio device monitor -b 115200 - Switch sketches by changing
-eto the desired environment name (see below).
Если сборка проходит, но загрузка падает с ошибкой вроде:
Please install 99-platformio-udev.rulesPlease specify upload_port
это почти всегда означает, что Linux не даёт доступ к USB-порту или порт не найден.
- Проверь, что плата подключена и порт появился:
ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null
- Дай себе права на сериал-порт (обычно группа
dialout):
sudo usermod -aG dialout $USER- выйди из системы и зайди снова (или перезагрузи ПК)
- Поставь udev rules для PlatformIO (рекомендуется):
curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules >/dev/nullsudo udevadm control --reload-rules && sudo udevadm trigger- переподключи Arduino USB-кабель
- Если PlatformIO всё равно не находит порт, укажи его явно:
- В
platformio.ini(локально):upload_port = /dev/ttyACM0 - Или в командной строке:
pio run -t upload -e uno-blink --upload-port /dev/ttyACM0
В WSL2 USB-устройства не доступны напрямую по умолчанию, поэтому Arduino может не появляться как /dev/ttyACM0 и PlatformIO будет просить upload_port.
Есть 2 нормальных пути:
- Проще всего: прошивать из Windows
- Установи PlatformIO в VS Code на Windows (не внутри WSL) и открывай проект как обычную папку Windows.
- Тогда Arduino будет видна как
COM..., и загрузка работает “из коробки”.
- Если хочешь прошивать из WSL2: пробрось USB через usbipd
На Windows (PowerShell от имени администратора):
usbipd list- Найди Arduino и запомни
BUSID(например1-4). usbipd bind --busid <BUSID>usbipd attach --wsl --busid <BUSID>
Пример (Arduino Uno часто выглядит как USB Serial Device (COMx)):
- если в списке
BUSID=5-7, то команды будут:usbipd bind --busid 5-7usbipd attach --wsl --busid 5-7
Внутри WSL2:
- Если ты в zsh и видишь
no matches found, это не ошибкаls, а поведение zsh при пустых масках. Используй один из вариантов:ls /dev/ttyACM*(N) /dev/ttyUSB*(N)- или
ls /dev/ttyACM0 /dev/ttyUSB0 2>/dev/null
- Также в некоторых случаях Windows COM-порт виден в WSL как
/dev/ttyS<номер COM>. Например, если в Windows Arduino — этоCOM3, то в WSL это может быть/dev/ttyS3. Проверь:ls /dev/ttyS* 2>/dev/null - Если появился, например
/dev/ttyACM0, то можно указать порт явно:- в
platformio.ini:upload_port = /dev/ttyACM0и (по желанию)monitor_port = /dev/ttyACM0 - или, если доступен
ttyS:upload_port = /dev/ttyS3иmonitor_port = /dev/ttyS3
- в
Если после attach порт не появился, обычно помогает:
- переподключить USB-кабель
- повторить
usbipd attach --wsl ...
uno-blink: usesLED_BUILTIN.uno-rgb-led: PWM pins R=11, G=10, B=9, common cathode to GND, current-limit resistors.uno-photoresistor: LDR to 5V, 10k to GND, midpoint to A0.uno-hcsr04: TRIG=7, ECHO=6 (add voltage divider for echo if needed), Vcc=5V, GND.uno-servo-sg90: signal=9, Vcc=5V, GND (power from adapter if servo chatters).uno-stepper-28byj48: ULN2003 IN1=8, IN2=10, IN3=9, IN4=11, Vcc=5V, GND.uno-dc-motor-l293d: ENA=5 (PWM), IN1=8, IN2=7, motor on OUT1/OUT2, external 9V supply to L293D Vmotor and GND tied to Uno.uno-lcd-16x2: LiquidCrystal RS=12, E=11, D4=5, D5=4, D6=3, D7=2. LCD contrast is set via V0/VO using a potentiometer (wiper to V0/VO, ends to 5V/GND). This sketch also reads the potentiometer on A0 (you can jumper the wiper to A0).uno-joystick: VRx=A0, VRy=A1, SW=2 with pull-up, Vcc=5V, GND.uno-ir-receiver: signal=7, Vcc=5V, GND. Uses IRremote library; monitor serial for decoded frames.uno-mpu6050: SDA=A4, SCL=A5, Vcc=5V, GND. Uses Adafruit MPU6050.uno-max7219-matrix: DIN=12, CLK=11, CS=10, Vcc=5V, GND. Uses LedControl.uno-74hc595: DS=11, SH_CP=12, ST_CP(latch)=8, outputs to LEDs with resistors.
Common helpers live in lib/shared:
Timing.h: simpleIntervalTimerfor periodic actions.Pinout.h: small pin helpers for outputs, PWM, and serial start.
- Power motors/servos from an external supply and tie grounds together with the Uno.
- IR decoding and sensor readings stream over serial; open the monitor to view data.
- Adjust pin assignments as needed; update the corresponding
main.cppif you rewire.