本文へ移動
cccskills
無料GitHub で公開

atmega328p-nano

Firmware development for the Arduino Nano (A000005, ATmega328P @ 16 MHz, 5 V) — its 30 KB usable flash, 2 KB SRAM, 1 KB EEPROM, 8-channel 10-bit ADC, six 8-bit PWM pins across three timers, UART shared with the USB-serial chip, I2C on A4/A5, SPI on D10–D13, sleep modes, and the Arduino AVR core + PlatformIO setup around them. Use when working on this board or any ATmega328P Nano clone (FTDI or CH340 USB): project setup, platformio.ini, old-vs-new bootloader uploads, pin mapping, A6/A7 restrictions, timer/Servo/tone conflicts, the 2 KB SRAM budget, analog references, powering from VIN, ICSP recovery, or debugging why something on the board does not work.

インストール方法を見る

含まれるファイル(11)

  • SKILL.md11.3 KB
  • assets/IMAGE.md432 B
  • reference/board-hardware.md29.8 KB
  • reference/recipes.md9.7 KB
  • template/.gitignore13 B
  • template/include/board.h2.5 KB
  • template/platformio.ini1.1 KB
  • template/README.md2.8 KB
  • template/src/main.cpp3.1 KB
  • template/variants/minimal/main.cpp535 B
  • template/variants/new-project.sh1.3 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Arduino Nano (ATmega328P)

Board-specific firmware knowledge. The Nano is simple enough that every failure mode is silent — the sketch compiles, uploads, runs, and does something subtly wrong — so read the reference file rather than guessing.

  • reference/board-hardware.md — the complete board reference: corrected pin map (the official manual's own tables contain errors), power tree, clock, memory map, connector/LED inventory plus a development guide (Part II: §8 toolchain, §10 peripheral cookbook, §11 gotchas, §12 flashing, §13 symptom → cause → fix table).
  • reference/recipes.md — copy-paste code: platformio.ini, board.h, non-blocking timing, serial + free RAM, EEPROM with update semantics, ADC and references, interrupts, the timer/PWM map, Servo vs tone(), power-down sleep, PROGMEM tables.
  • template/ — a project that builds clean, in two variants, plus a scaffold script. See template/README.md.

Orientation

MCUATmega328P, 8-bit AVR @ 16 MHz (crystal — fixed, no PLL), Harvard architecture
Memory32 KB flash (30,720 B usable — 2 KB bootloader reserve), 2 KB SRAM, 1 KB EEPROM. No DMA, no MPU
LED / buttonL = D13 (LED_BUILTIN), on = HIGH · RESET button, active-low
ADC8 × 10-bit, 0–5 V, ~100 µs per analogRead(); A6/A7 are analog-input only
PWM6 × 8-bit: D3, D11 (~490 Hz, Timer2), D9, D10 (~490 Hz, Timer1), D5, D6 (~980 Hz, Timer0)
UARTD0/D1 — shared with the USB-serial chip, not free pins
I2C / SPIA4=SDA, A5=SCL · D10=SS, D11=MOSI, D12=MISO, D13=SCK (+ICSP header)
Power5 V logic. USB Mini-B, VIN 7–12 V via LDO, +5V pin (bypasses regulator). 3V3 pin 50 mA max
DebugNo SWD/JTAG — only the 6-pin ICSP header (pin 1 at the outer edge; some diagrams rotate it 180°)
ToolchainPlatformIO 6.1 + atmelavr 5.3.0 + Arduino AVR core, board = nanoatmega328new (Optiboot) / nanoatmega328 (old bootloader)

Rules that prevent the expensive mistakes

Each of these produces a failure that looks like something else.

  1. upload_speed = 57600 on old-bootloader boards. Genuine Nanos sold before Jan 2018 and most clones run the old ATmegaBOOT at 57600 baud, not Optiboot's 115200. The wrong choice fails uploads with not in sync / stk500_recv — which reads like a driver or cable problem, not a firmware-era problem. In the Arduino IDE the equivalent is Tools → Processor → ATmega328P (Old Bootloader).
  2. The 2 KB SRAM is the wall, not the 30 KB flash. Every Serial.print string literal, const array and String copy lands in SRAM by default. The failure is a heap/stack collision that corrupts variables or crashes after minutes-to-days — nothing prints "out of memory". F() on every literal, PROGMEM for tables, static buffers instead of String, and watch free RAM (recipe 4).
  3. digitalWrite(A6) / digitalRead(A7) compile and silently misbehave. A6/A7 feed the ADC mux only — there is no port register behind them. They are analog-input-only; any digital use needs the signal moved to a real pin. A0–A5 are full digital pins (aliases 14–19).
  4. D0/D1 are wired to the FTDI/CH340 chip, not to free GPIO. Using them while Serial is open produces garbage in both directions, and anything external wired to them blocks uploads. The TX/RX LEDs show USB-serial traffic only — they say nothing about D1 driven manually.
  5. Never write TCCR0A/TCCR0B. Timer0 is millis(), micros() and delay() and the ~980 Hz PWM on D5/D6. "Just changing the PWM frequency" on those pins makes delay() lie and baud-rate-timed software (SoftwareSerial, DHT, NeoPixel) glitch, with no error anywhere.
  6. Every PWM pin is rented from a library. Servo takes Timer1 — D9/D10 analogWrite() dead while attached. tone() takes Timer2 — D3/D11 dead while playing. Servo + tone coexist (different timers) but neither survives touching Timer0. Also: PlatformIO's AVR core bundles only EEPROM/HID/SoftwareSerial/SPI/Wire — #include <Servo.h> is a compile error until lib_deps = arduino-libraries/Servo is added (the Arduino IDE bundles it).
  7. D13 is the LED and the SPI clock. The LED + series resistor load the line, which matters when D13 is an input or SCK: a flaky SPI bus that blinks L with the clock is this, not your wiring.
  8. All GPIO are 5 V push-pull. Into a 3.3 V-only peripheral that is damage, not a logic level. The 3V3 pin is an output limited to 50 mA — powering a sensor is fine, a radio module is not.
  9. analogReference(EXTERNAL) before any voltage touches AREF, and AREF ≤ 5 V always. Driving AREF while an internal reference is selected burns the pin.
  10. The +5V pin bypasses the regulator. Feeding it from anything above 5.0 V — or from a "5 V" supply that drifts — goes straight into the MCU. Unregulated input belongs on VIN, which needs ≥ 7 V to clear the LDO dropout (7–12 V recommended).
  11. wdt_disable() first in setup() (and clear MCUSR). A sketch that leaves the watchdog enabled boot-loops boards with the old ATmegaBOOT bootloader — it does not clear the WDT on entry — and the loop survives re-uploading; only ICSP recovery or Optiboot fixes it.
  12. Unconnected inputs are not zero — they float. Pull-ups (20–50 kΩ) are off by default: INPUT_PULLUP or an external resistor, or the pin reads random noise.
  13. USB + VIN together = auto power selection, highest voltage wins. A 9 V VIN while debugging over USB back-feeds the USB port. Power actuators from VIN, the debug session from USB, grounds common — or accept VIN < 5 V.

When the task is memory

2,048 B covers globals, heap and stack together, and there is no MPU: the heap grows up, the stack grows down, and their collision is whatever random corruption results. The arithmetic that matters:

  • A Serial.println("temperature sensor ready") costs 26 B of SRAM forever; in F() it costs 0. A 256-entry uint16_t table is an eighth of the chip — PROGMEM it (recipe 11).
  • The Arduino core + a Blink already use ~600 B flash and single-digit bytes of RAM; Serial adds ~1.5 KB flash. The template's full variant — heartbeat + serial report + ADC + EEPROM counter — totals 2,874 B flash, 201 B RAM. Budget accordingly: a 1 KB receive buffer is half the machine.
  • String fragments the small heap; static char[] buffers do not. On this part, prefer snprintf() into a fixed buffer.
  • Instrument, don't estimate: the free_ram() probe in recipe 4 costs 20 B flash. Below ~200 B free, stop adding features and restructure.

When the task is timing

The three timers are the whole scheduling story, and all of them are spoken for:

TimerOwned byPWM pinsFree to reconfigure?
Timer0millis()/micros()/delay()D5, D6 (~980 Hz)never
Timer1Servo libraryD9, D10 (~490 Hz)if Servo is not used (recipe 8 has the fast-PWM setup)
Timer2tone()D3, D11 (~490 Hz)if tone is not used

Consequences worth internalizing: an ISR or noInterrupts() section longer than ~100 µs starts eating UART characters and skewing millis()-based intervals; delayMicroseconds() is cycle-counted and stays exact; and anything bit-banged (DHT, one-wire, SoftwareSerial) degrades when interrupts are blocked — including by long Servo pulses. The non-blocking millis() pattern (recipe 3) is the default shape of every loop on this board.

Starting a new project

Do not hand-assemble one. template/ builds clean; scaffold from it:

~/.claude/skills/atmega328p-nano/template/variants/new-project.sh <target-dir> [--full|--minimal]
cd <target-dir> && pio run
  • --minimal — the classic Blink on the "L" LED, hardware-verified. 924 B flash, 9 B RAM. Flash this first on an unfamiliar board: if it does not blink, the problem is the toolchain, the COM port or the bootloader era (rule 1), not the code.
  • --full (default) — non-blocking heartbeat, serial report with F() strings, free-RAM watch, ADC sample on A0, EEPROM boot counter. 2,874 B flash, 201 B RAM.

Both build as-is with platform-atmelavr 5.3.0 (verified). Nothing is generated and no paths are embedded, so copying the tree by hand works identically. template/README.md maps files to subsystems.

When the user already has a project, prefer bringing it in line with the template's platformio.ini and include/board.h over rewriting their code.

Flashing

Over the Mini-B USB cable, nothing to press — the DTR auto-reset opens the bootloader (Optiboot listens ~1 s at 115200, old ATmegaBOOT ~1–2 s at 57600):

pio run -t upload -t monitor

The board enumerates as a COM port: FTDI VCP on genuine boards, CH340 on most clones (needs the WCH driver — its absence is why a clone "does not appear on any port").

Upload failure checklist, in order: wrong bootloader era (rule 1), wrong COM port / missing CH340 driver, something wired to D0/D1 (disconnect), and only then assume the sketch. A sketch that crashes instantly or blocks interrupts can be replaced by timing a RESET press during upload.

The recovery route is the 6-pin ICSP header with a second Arduino running 11.ArduinoISP, a USBasp, or avrdude — it bypasses the bootloader entirely, so no bad firmware permanently bricks this board. Burn Bootloader over ICSP also restores the fuse set (LOW=0xFF, HIGH=0xDA, EXT=0xFD — PlatformIO's own board definition; avrdude reads back the equivalent 0x05 on some tools since only the low 3 BODLEVEL bits are implemented) — the fix for clones with mis-set clock fuses and for WDT boot-loops. ICSP is also how to upload bootloader-less and reclaim the reserved 2 KB.

Reporting

Say what is verified on hardware and what is derived. In this skill the Blink (the template's --minimal variant) ran on an Arduino Nano A000005 v3.x with the Optiboot bootloader, and the pin map it relies on is the corrected physical pinout of §2 — the official A000005 manual's own pin tables contain errors (they omit RESET/GND and AREF, mislabel 3V3, and invent "Serial Wire Debug" pins), so quote this skill's tables, not Arduino's. Everything marked ⚠︎ compile-checked only in reference/recipes.md — ADC references, interrupts, Timer1 PWM, Servo/ tone, sleep, PROGMEM — compiles against the Arduino AVR core but was not run on hardware by the author. The VIN range is reported inconsistently by the sources (7–15 V, 7–12 V, 6–20 V); this skill states 7–12 V recommended as the conservative intersection.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Firmware development for the Beetle — the CJMCU / DFRobot "Mini Arduino Leonardo" USB board (ATmega32U4 @ 16 MHz, 5 V, 21×28 mm, castellated pads) — its native USB (CDC serial + HID keyboard/mouse/joystick), Caterina bootloader and 1200 bps touch upload, ten exposed I/O pads, four PWM pins across Timer0/Timer1, five ADC channels, I2C on D2/D3, SPI on the back-side ICSP pads, 28 KB usable flash and 2.5 KB SRAM, and the PlatformIO + Arduino AVR core (`board = leonardo`) setup around them. Use when working on this board or any ATmega32U4 Leonardo/Micro/Pro-Micro-class clone: project setup, platformio.ini, why the board shows up as two different serial ports, uploads that fail or hang, recovering a bricked or HID-spamming board by shorting the ICSP reset pads, pin mapping and which pads are missing, PWM/timer conflicts, Servo and tone, USB HID keyboard projects, the SRAM budget, powering from the + pad, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills192026年9月25日 更新

Разработка прошивок для BE-U1000 (Baikal Electronics / Байкал Электроникс, три ядра RISC-V: BR-350 и BM-310) на отладочных платах EVU-BA-2.1, EVU-BA-2.0 и EVU-BA-1.2 — её eFlash и QSPI flash, UART0/BootROM CLI, PWMA (захват и импульсы), АЦП с DMA, CAN FD, SPI, WDT, CLIC, а также SDK Байкала и его система сборки на make. Use when working on this board or any BE-U1000 / BMCU_U project (SDK 2.1/2.3, riscv32-none-elf, dfu-util, OpenOCD): настройка проекта, Makefile и MEM_REG_ROM, карта выводов и разъёмы XP1/XP8/XP9/XP10, режимы начальной загрузки и страповые выводы, прошивка по UART XMODEM либо USB DFU, работа с eFlash и TCM, прерывания и CLIC, отладка по JTAG — и разбор, почему плата молчит, не стартует, зависает или почему периферия «настроилась», а обмена нет.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills192026年9月25日 更新

Firmware development for the 30-pin ESP32-WROOM-32 development board — the DOIT ESP32 DevKit V1 / ESP32 CH340 Type-C / NodeMCU-ESP32 30-pin form factor, 15 pins per side, CH340G or CP2102 USB-UART bridge, AMS1117 LDO, user LED on GPIO2. Use when working on a 30-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 module): project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, I2C, deep sleep and RTC wake pins, flashing over the CH340 bridge, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills192026年9月25日 更新

Firmware development for the 36-pin ESP32-WROOM-32 development board — the original DOIT ESP32 DevKit V1 with 18 pins per side, i.e. the 30-pin layout plus the six in-package flash pins (SD0 SD1 SD2 SD3 CMD CLK = GPIO6-11) broken out at the USB end, CH340G or CP2102 bridge, AMS1117 LDO, user LED on GPIO2, GPIO0 not on the header. Use when working on a 36-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 module), or when identifying which ESP32 board size you have: project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, the flash-pin trap, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, deep sleep and RTC wake pins, flashing, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills192026年9月25日 更新

Firmware development for the 38-pin ESP32-WROOM-32 development board — Espressif ESP32-DevKitC V4, Ai-Thinker NodeMCU-32S, DOIT ESP32 DevKit V1 38-pin and their CH340/CP2102 clones, 19 pins per side, with GPIO0 and the six in-package flash pins (GPIO6-11, labelled D0 D1 D2 D3 CMD CLK or SD0-SD3) broken out. Use when working on a 38-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 or ESP32-WROVER module): project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, the flash-pin and IO0 traps, WROVER GPIO16/17 PSRAM conflict, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, deep sleep and RTC wake pins, flashing, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills192026年9月25日 更新

Firmware development for the ESP32-C3 0.42" OLED board (ESP32-C3FH4, QFN32) — the ABRobot / 01Space "ESP32-C3-0.42LCD" mini board and its clones, sold as "ESP32-C3 SuperMini with OLED" and "ESP32 C3 OLED development board". Covers its 72x40 SSD1306 OLED on I2C, the single I2C bus, blue LED on GPIO8, BOOT button on GPIO9, USB Serial/JTAG console, ADC1, Wi-Fi/BLE, and the ESP-IDF + PlatformIO setup around them. Use when working on this board or a bare ESP32-C3: project setup, platformio.ini and sdkconfig, pin mapping and strapping pins, getting the 0.42-inch display to show something other than snow, U8g2 offsets, adding a second I2C device, flashing over USB-C, or debugging why something on the board does not work.

日本語の概要は準備中です。原文の説明を表示しています。

alexex1993/mcu-skills192026年9月25日 更新

alexex1993 のスキルをすべて見る

このスキルの問題を報告する