Skip to content

hike-dev/arduino-experiments

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Arduino Uno R3 Starter Experiments

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.md
  • uno-rgb-led: sketches/02_rgb_led/README.md
  • uno-photoresistor: sketches/03_photoresistor/README.md
  • uno-joystick: sketches/04_joystick/README.md
  • uno-hcsr04: sketches/05_hcsr04_ultrasonic/README.md
  • uno-ir-receiver: sketches/06_ir_receiver/README.md
  • uno-lcd-16x2: sketches/07_lcd_16x2/README.md
  • uno-74hc595: sketches/08_shift_register_74hc595/README.md
  • uno-max7219-matrix: sketches/09_max7219_matrix/README.md
  • uno-mpu6050: sketches/10_mpu6050/README.md
  • uno-servo-sg90: sketches/11_servo_sg90/README.md
  • uno-dc-motor-l293d: sketches/12_dc_motor_l293d/README.md
  • uno-stepper-28byj48: sketches/13_stepper_28byj48/README.md

Инструкции для ребёнка 10 лет (и взрослого помощника)

Эта папка — набор маленьких “уроков” для Arduino Uno. Мы будем собирать схемы на макетной плате, загружать программу в Arduino и смотреть результат.

1) Самые важные правила безопасности (прочитай вслух)

  1. Перед тем как переставлять провода — отключи питание.
    • Если питаешь от USB: вынь USB.
    • Если питаешь от адаптера 9V: выключи/выдерни адаптер.
  2. Никогда не соединяй 5V и GND напрямую. Это короткое замыкание.
  3. Светодиоды — только через резистор. Обычно подходит 220Ω или 330Ω.
  4. Двигатели и сервоприводы “шумят” по питанию. Если мотор/серво дергается — это нормально, но так можно “уронить” питание и перезапустить Arduino.
  5. Провода не должны греться. Если что-то пахнет/греется — сразу отключай питание и зови взрослого.

2) Что куда подключать: питание простыми словами

  • Для первых опытов (светодиоды, датчики) почти всегда достаточно питания от USB.
  • Адаптер 9V 1A лучше использовать, когда подключаешь моторы (через драйвер) или когда USB не хватает.
  • Важно: сервоприводу SG-90 и шаговому двигателю обычно нужно 5V, а не 9V. 9V — это вход для Arduino (в разъём питания) или для части “Vmotor” в драйверах.
  • Если ты используешь и Arduino, и драйвер мотора: земля (GND) должна быть общей.

2.1) Ограничения Arduino Uno R3 (память, скорость, ток)

Это нормально: 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).

Как экономить память (простые правила):

  1. Печатай “длинные тексты” в Serial через F("...") (строка хранится во Flash, а не в SRAM).
  2. Избегай String на Uno: лучше Serial.print(...) и короткие char[].
  3. Не делай большие массивы внутри loop()/функций (они занимают стек).
  4. Если нужны большие таблицы — используй PROGMEM (хранение во Flash).
  5. Используй маленькие типы там, где можно: uint8_t вместо int, если диапазон маленький.

3) Быстрый старт за 5 минут (самый простой урок)

Цель: заставить мигать встроенный светодиод на плате.

  1. Подключи Arduino к компьютеру USB-кабелем.
  2. Открой этот проект в VS Code.
  3. Установи PlatformIO (любой способ):
    • Через расширение VS Code: “PlatformIO IDE”.
    • Или через командную строку: pip install platformio.
  4. Залей пример uno-blink:
    • Сборка: pio run -e uno-blink
    • Загрузка: pio run -t upload -e uno-blink

Если всё получилось — на плате начнёт мигать маленький светодиод.

3.1) Все этапы разработки и внедрения прошивки (понятно и по шагам)

Это “дорожка”, по которой удобно идти почти для любого проекта в этой папке.

  1. Выбери урок (что делаем?)
    • Смотри таблицу ниже “Урок (env) → …” и выбери нужный uno-....
  2. Собери схему на макетной плате
    • Сначала подключи GND, потом 5V, и только потом сигнальные провода.
    • Всегда сверяйся со строкой “Куда подключать” из таблицы.
  3. Подключи Arduino к компьютеру
    • Для первых проверок лучше через USB.
  4. Собери проект (проверка, что код компилируется)
    • pio run -e <env>
    • Если есть ошибка — прочитай последнее сообщение: там обычно написано, в каком файле и что не так.
  5. Загрузи прошивку в Arduino
    • pio run -t upload -e <env>
  6. Проверь, что оно “живое”
    • Если урок печатает данные: pio device monitor -b 115200
    • Если это мотор/серво/матрица/LCD — смотри на устройство.
  7. Исправляй и улучшай (это нормально!)
    • Меняй только одну вещь за раз: например, пин или скорость, или задержку.
    • После изменения: снова pio run -t upload -e <env>.
  8. Внедрение: как сделать, чтобы работало “без компьютера”
    • Если проект готов: отключи USB и подключи питание через разъём питания Arduino:
      • адаптер 9V (из набора) или батарейка “крона” через переходник.
    • Для моторов/серво чаще нужен отдельный источник питания (и общий GND).
    • Прежде чем “оставить работать”: потрогай проводки — ничего не должно греться.

Если хочешь сделать свой новый урок (новый скетч)

  1. Создай папку: sketches/<my_sketch>/src/ и файл main.cpp.
  2. Добавь окружение в platformio.ini:
    • [env:uno-my-sketch]
    • build_src_filter = -<*> +<<my_sketch>/src/main.cpp>
  3. Собери и залей: pio run -t upload -e uno-my-sketch.

4) Твой набор (комплект поставки) — что это и зачем

Ниже — список из коробки. Не пугайся: сразу всё не нужно. Мы будем брать детали по одной.

  1. Плата Arduino Uno R3 — 1 шт. “мозг”, который выполняет программу.
  2. USB-кабель — 1 шт. питание + загрузка программы.
  3. Набор перемычек (Jumper Wires) провода для макетной платы.
  4. Перемычка “папа‑мама” (4 контакта) удобно подключать модули/датчики.
  5. Макетная плата (400 точек) — 1 шт. доска с дырочками для сборки без пайки.
  6. Shield для прототипов — 1 шт. “плата сверху” для удобных подключений (можно пока не использовать).
  7. Сетевой адаптер 9В 1А — 1 шт. внешнее питание (часто нужно для моторов).
  8. MPU‑6050 — 1 шт. датчик наклона/ускорения (акселерометр+гироскоп).
  9. HC‑SR04 — 1 шт. ультразвуковой “дальномер”.
  10. Двигатель постоянного тока — 1 шт. обычный мотор.
  11. Шаговый двигатель — 1 шт. крутится “шагами”.
  12. Драйвер шагового двигателя ULN2003 — 1 шт. плата‑помощник для шагового двигателя.
  13. Сервопривод SG‑90 — 1 шт. поворачивается на угол.
  14. ЖК индикатор 16×2 без подсветки — 1 шт. экран для текста.
  15. Джойстик — 1 шт. две оси + кнопка.
  16. Одноканальный релейный модуль — 1 шт. включает/выключает нагрузку (лучше с взрослым).
  17. Переходник “крона 9V → Arduino” — 1 шт. питание Arduino от батарейки.
  18. RGB светодиод — 1 шт. три цвета в одном.
  19. Светодиод красный — 5 шт.
  20. Светодиод желтый — 5 шт.
  21. Светодиод белый — 5 шт.
  22. Светодиод синий — 5 шт.
  23. Светодиод зеленый — 5 шт.
  24. BC557 — 5 шт. транзисторы (обычно для усиления/ключей).
  25. PN2222 — 5 шт. транзисторы (часто для управления нагрузкой).
  26. BC547 — 5 шт. транзисторы.
  27. 1N4001 — 5 шт. диоды (защита от “обратного тока”).
  28. Набор резисторов (100 шт.) 10Ω, 100Ω, 220Ω, 330Ω, 1k, 2k, 5.1k, 10k, 100k, 1M.
  29. Термистор — 1 шт. датчик температуры (сопротивление меняется).
  30. Керамический конденсатор 22 пФ — 5 шт.
  31. Керамический конденсатор 1 мкФ — 5 шт.
  32. Конденсатор 10 мкФ 50В — 2 шт.
  33. Конденсатор 100 мкФ 50В — 2 шт.
  34. Потенциометр — 2 шт. “крутилка” (например контраст LCD).
  35. Динамик‑пищалка — 1 шт. звук.
  36. 74HC595N — 1 шт. микросхема “много выходов из трёх проводов”.
  37. MAX7219 — 1 шт. драйвер для матрицы/индикаторов.
  38. L293D — 1 шт. драйвер мотора.
  39. ИК‑приемник — 1 шт. принимает команды с пульта.
  40. Кнопка тактовая — 4 шт. кнопки.
  41. ИК‑пульт ДУ — 1 шт. пульт.
  42. Семисегментный индикатор 1 символ — 1 шт.
  43. Семисегментный индикатор 4 символа — 1 шт.
  44. Светодиодная матрица 8×8 — 1 шт.
  45. Держатель HC‑SR04 — 1 шт. крепёж для датчика.
  46. Штыревой разъем 40 контактов — 1 шт. пины (может понадобиться для модулей).
  47. Фоторезистор — 2 шт. “датчик света”.

5) Выбирай урок: “деталь → проект → куда втыкать”

Ниже таблица: выбери, что хочешь собрать, и используй соответствующую команду 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.

6) Как смотреть “цифры” (Serial Monitor)

Многие уроки печатают данные в “монитор порта”.

  • Открой монитор: pio device monitor -b 115200
  • Если видишь “кракозябры”, значит неправильная скорость. Тут почти всегда 115200.

6.1) Шпаргалки-схемы (макетная плата)

Подсказка: на макетной плате обычно есть две длинные шины (плюс и минус). Можно сделать так:

  • красная шина = 5V
  • синяя/чёрная шина = GND

Тогда почти все схемы собираются проще: питание берём с шин.

A) Светодиод + резистор (самое важное правило)

Светодиод нельзя подключать напрямую к 5V или к пину — нужен резистор.

Arduino D11 (или другой pin)
	 |
	[220Ω или 330Ω]
	 |
	|>|  LED
	 |
	GND

Где у светодиода “плюс/минус”:

  • Длинная ножка обычно “плюс” (анод).
  • Короткая ножка и/или плоская грань на корпусе — “минус” (катод).

B) Фоторезистор (LDR) как делитель напряжения → A0

Так Arduino сможет “измерять свет”.

5V ---[ LDR ]---+--- A0
								|
							[10k]
								|
							 GND

C) Общая земля (GND) — когда устройств больше одного

Если есть Arduino и отдельное питание/драйвер мотора, схема должна “договариваться”, где ноль.

Arduino GND --------------+
													|
Driver GND / Battery(-) --+

Без общего GND датчики/моторы часто “не работают” или работают странно.

D) HC-SR04 (ультразвук)

HC-SR04  ->  Arduino Uno
VCC      ->  5V
GND      ->  GND
TRIG     ->  D7
ECHO     ->  D6

Если когда-нибудь будешь подключать датчик к плате 3.3V (не Uno), для ECHO часто нужен делитель.

E) Серво SG-90 (3 провода)

У серво обычно цвета такие:

  • коричневый/чёрный = GND
  • красный = 5V
  • оранжевый/жёлтый/белый = сигнал
Servo GND   -> Arduino GND
Servo 5V    -> 5V (или внешний 5V источник)
Servo SIG   -> D9

Если питаешь серво не от Arduino, помни про общий GND (схема C).

F) LCD 16x2: контраст через потенциометр (крутилку)

У 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   (ещё одним проводом)

G) Двигатель постоянного тока + L293D (драйвер мотора)

Важно: мотор нельзя подключать напрямую к пинам 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.

H) Шаговый двигатель 28BYJ-48 + ULN2003

Тут всё проще: мотор обычно подключается в ULN2003 “белым разъёмом”, а мы соединяем только IN1–IN4 и питание.

Arduino Uno  ->  ULN2003
5V          ->  VCC
GND         ->  GND
D8          ->  IN1
D10         ->  IN2
D9          ->  IN3
D11         ->  IN4

Мотор 28BYJ-48 -> в разъём на плате ULN2003

Если шаговый “дёргается” и не крутится, чаще всего перепутаны IN-пины или не хватает питания 5V.

7) Если не работает — чек‑лист (без паники)

  1. Питание: USB подключён? Плата светится?
  2. Порт: выбран правильный USB‑порт (PlatformIO обычно сам находит, но иногда надо выбрать вручную).
  3. Провода: все ли в нужных дырочках? Не перепутаны ли 5V и GND?
  4. Общий GND: если есть внешний драйвер/мотор — земли должны быть соединены.
  5. LCD пустой: почти всегда это контраст (крутилка на V0/VO).
  6. HC‑SR04 показывает 0/NaN: проверь TRIG/ECHO, питание, и что датчик смотрит на предмет.
  7. Мотор не крутится: проверь питание мотора (Vmotor), и что мотор подключён к OUT1/OUT2 драйвера.

Build and Upload

  • 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 -e to the desired environment name (see below).

Linux: если не виден порт / не загружается прошивка

Если сборка проходит, но загрузка падает с ошибкой вроде:

  • Please install 99-platformio-udev.rules
  • Please specify upload_port

это почти всегда означает, что Linux не даёт доступ к USB-порту или порт не найден.

  1. Проверь, что плата подключена и порт появился:
  • ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null
  1. Дай себе права на сериал-порт (обычно группа dialout):
  • sudo usermod -aG dialout $USER
  • выйди из системы и зайди снова (или перезагрузи ПК)
  1. Поставь 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/null
  • sudo udevadm control --reload-rules && sudo udevadm trigger
  • переподключи Arduino USB-кабель
  1. Если PlatformIO всё равно не находит порт, укажи его явно:
  • В platformio.ini (локально): upload_port = /dev/ttyACM0
  • Или в командной строке: pio run -t upload -e uno-blink --upload-port /dev/ttyACM0

WSL2 (Windows Subsystem for Linux): важное про Arduino

В WSL2 USB-устройства не доступны напрямую по умолчанию, поэтому Arduino может не появляться как /dev/ttyACM0 и PlatformIO будет просить upload_port.

Есть 2 нормальных пути:

  1. Проще всего: прошивать из Windows
  • Установи PlatformIO в VS Code на Windows (не внутри WSL) и открывай проект как обычную папку Windows.
  • Тогда Arduino будет видна как COM..., и загрузка работает “из коробки”.
  1. Если хочешь прошивать из 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-7
    • usbipd 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 ...

Environments and Wiring

  • uno-blink: uses LED_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.

Shared Helpers

Common helpers live in lib/shared:

  • Timing.h: simple IntervalTimer for periodic actions.
  • Pinout.h: small pin helpers for outputs, PWM, and serial start.

Notes

  • 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.cpp if you rewire.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors