HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-01-04 (Sun) Today's Access : 184 Total : 1260882. Since 10 Sep. 2019

ATMEGA328P-PU 3.3V/8MHz駆動
ブートローダーなしにプログラムを起動する
2021.12.25 / 2023.06.23更新


YouTube でも紹介しています。画像をクリックすると再生できます。

今回は、ATmega328Pにプートローダーを書き込むことなしに、3.3V 8MHzで動作するようにプログラムを書き込みます。

■ATMEGA328P-PU

・電源電圧:1.8~5.5V ・コア:megaAVR ・コアサイズ:8bit ・クロック:20MHz ・プログラムメモリ:32kB ・EEPROM:1kB ・RAM:2kB ・GPIO:23pin ・ADC:6Ch ・UART/USART:1Ch ・I2C:1Ch ・SPI:1Ch ・タイマ:3Ch ・オシレータ:内蔵/外付


Arduino Nano をAVRライターとして用い、ラズベリーパイからATMEGA328P用のコードをNanoに流し込み、 ATmega328Pへの書き込みを行います。

■PlatformIOのインストール

プログラムのビルドには、Platformioを使用しています。
Arduino開発環境構築 PlatformIO

■ArduinoISP

通常は、ATMEGA328PなどのLSIにプログラムを書き込みは、AVRプログラマを使ってアクセスします。

今回は、手持ちのArduino Nano をAVRプログラマ代わりに使用して、対象のLSIにシリアルプログラミングモードでアクセスします。

シリアルプログラミングモードは、ATmega328のRESET端子をLOWにアサート中に、SPI端子を使ってATmega328の内部情報(ヒューズビットやフラッシュ、EEPROMなど)へアクセスする仕組みのことです。

Arduino Nano をAVRライターとして使用するために、ISP(In System Programming)をビルドします。


ラズベリーパイとArduinoをUSBでつなぎます。

プロジェクトを作成して、Arduino ISPをビルドします。

$ mkdir -p ~/Nano328/ArduinoISP
$ cd ~/Nano328/ArduinoISP
$ pio init -b nanoatmega328

ArduinoISPは、ArduinoをAVRライタにするためのスケッチです。 様々な派生形のArduinoISPがネットからダウンロードできますが、 今回は、Arduino IDE に含まれる ArduinoISP.ino をファイルに保存して使いました。

$ pio run -t upload

■Atmel AVR開発ツール

PlatformIO用のAtmel AVR開発プラットフォームとツールをインストールします。
AVRDUDE は、ISP(In System Programing)を使用して、ターミナルモードでのさまざまなメモリ領域のインタラクティブな検査と変更を行うためのユーティリティです。
Ref.https://www.nongnu.org/avrdude/ AVRDUDE - AVR Downloader/UploaDEr

$ pio platform install atmelavr --with-package tool-avrdude
Platform Manager: atmelavr @ 3.3.0 is already installed
Tool Manager: toolchain-atmelavr @ 1.70300.191015 is already installed
Tool Manager: tool-avrdude @ 1.60300.200527 is already installed
The platform 'atmelavr' has been successfully installed!
The rest of the packages will be installed later depending on your build environment.

■Arduino Nano と ATMEGA328Pの接続





以下の画像の通りArduino Nano と ATMEGA328Pを接続します。

ATMEGA328P  Nano
GND←→GND
5V←→5V
D13←→13 SCK
D12←→12 MISO
D11←→11 MOSI
RESET←→10
    GND - 10uF - RST
   9 - 1KΩ - 緑色LED(Heartbeat) - GND
   8 - 1KΩ - 赤色LED(Error) - GND
   7 - 1KΩ - 黄色LED(Programing) - GND

NanoのGNDピンとRSTピンを10uFのコンデンサーを挟んで接続します。
9番、8番、7番ピンは10KΩの抵抗を介して、緑、赤、黄のLEDを接続し、GNDに流します。
9: Heartbeat - shows the programmer is running
8: Error - Lights up if something goes wrong
7: Programming - In communication with the slave


右上に写っているは、Pimoroni Piano Hat を被った Raspberry Pi 3 model A です。


真っ新のATMEGA328P-PU の場合は必要ないのですが、5V@16MHzで使っていたもの8MHz/3Vに変更するときや、 フューズビットで外部発振器を指定している際には、水晶発振器が必要になります。左側の写真は8MHz/16MHz兼用の発振器です。 ライターに取り付けると右のようになります。

■Pro Mini ATmega328 (3.3V@8MHz)
ATMEGA328P を Arduino Pro Mini のように、3.3V@8MHz 仕様にします。
まずは、Pro Mini のボード情報を確認します。

$ pio boards "Pro Mini"
Platform: atmelavr
=====================================================================================================
ID                 MCU         Frequency  Flash  RAM  Name
-----------------  ----------  ---------  -----  ---  -----------------------------------------------
pro8MHzatmega168   ATMEGA168   8MHz       14KB   1KB  Arduino Pro or Pro Mini ATmega168 (3.3V, 8 MHz)
pro16MHzatmega168  ATMEGA168   16MHz      14KB   1KB  Arduino Pro or Pro Mini ATmega168 (5V, 16 MHz)
pro8MHzatmega328   ATMEGA328P  8MHz       30KB   2KB  Arduino Pro or Pro Mini ATmega328 (3.3V, 8 MHz)
pro16MHzatmega328  ATMEGA328P  16MHz      30KB   2KB  Arduino Pro or Pro Mini ATmega328 (5V, 16 MHz)
sparkfun_megamini  ATMEGA2560  8MHz       252KB  8KB  SparkFun Mega Pro Mini 3.3V

8MHz/3Vで駆動させる場合は、ボードID:pro8MHzatmega328 を使用します。

Pro Mini の環境設定を行います。
$ mkdir -p ~/Nano328/ArduinoISP/ATmega328ProMini
$ cd ~/Nano328/ArduinoISP/ATmega328ProMini
$ pio init -b pro8MHzatmega328

ビルド用の設定ファイルを開いてみます。
$ cat platformio.ini
[env:pro8MHzatmega328]
platform = atmelavr
board = pro8MHzatmega328
framework = arduino

$ cat ~/Nano328/ArduinoISP/src/ArduinoISP.ino
#define BAUDRATE 19200

ArduinoISP.inoのソースをみてみると、通信速度が192000になっているので、 環境設定ファイル内のアップロード・スピードをそれに合わせて追記します。

$ vi platformio.ini
.....
upload_speed = 19200
.....

■ブートローダーとFuse(ヒューズ)ビット
真っ新なATMEGA328Pを購入した際、一般的には最初にブートローダの書き込みを行います。 ブートローダは、USB経由でパソコンから送られてくるAVRマイコン用のプログラムをマイコンに書き込み、さらにそのプログラムを先頭アドレスから実行する」、という機能を提供します。


この表のように、最初にブートローダが書き込まれている先頭アドレス 0x3C00 が呼び出され、 ブートローダはアプリケーションプログラムが格納されている先頭アドレス 0x0000 を呼び出します。



例えば、Arduino IDE でブートローダを書き込むと、Fuseビットと呼ばれるマイコンの設定情報も書き込まれます。
BOOTRSTが0の場合、リセットベクタは Boot Flash Addressの先頭番地(0x3C00)に配置され、1の場合、0x0000に配置されます。
つまり、ブートローダーを経由しないで、直接アプリケーションプログラムを実行したい場合には、BOOTRSTに“1”をセットします。
そして、このBOOTRSTの情報はFuseビットとして管理されています。
Ref.ArduinoUnoのブートシーケンス

Fuseビットは、AVRマイコンの動作の設定を書き込む不揮発性メモリで、フラッシュメモリやEEPROMとは別のメモリ空間にあります。 Fuseビットは、「拡張」「上位」「下位」の3つのバイトで構成されており、それぞれのビットにマイコン設定の機能が割り当てられています。

今回はATMEGA328Pを、3.3V, 8MHz駆動の、Pro mini 仕様で使いますが、データシートをみて、すべてのヒューズビットを判断するのは大変ですので、 Pro Mini ATMEGA328 (3.3V, 8 MHz)ブートローダ書き込みの際のヒューズビットを参考にします。

$ cat ~/.platformio/platforms/atmelavr/boards/pro8MHzatmega328.json
  ......
  "bootloader": {
    "efuse": "0xFD",
    "file": "atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex",
    "hfuse": "0xDA",
    "lock_bits": "0x0F",
    "lfuse": "0xFF",
    "unlock_bits": "0x3F"
  },
  ......
hfuseは上位バイトの値で、"0xDA"をビットに展開すると、"11011010"となり、BOOTRSTを示す0ビットの値が"0"なのでブートローダーが起動されます。
そこで、BOOTRST=1として、"11011011"とすると、"hfuse": "0xDB" になります。

これをもとにして、設定ファイルに反映させると下記のようになります。

$ vi platformio.ini
[env:pro8MHzatmega328]
platform = atmelavr
board = pro8MHzatmega328
framework = arduino
upload_protocol = custom
upload_port = /dev/ttyUSB0
upload_speed = 19200
board_build.f_cpu = 8000000L
board_fuses.lfuse = 0xFF
board_fuses.hfuse = 0xDB
board_fuses.efuse = 0xFD
upload_flags =
	-C
	; use "tool-avrdude-megaavr" for the atmelmegaavr platform
	$PROJECT_PACKAGES_DIR/tool-avrdude/avrdude.conf
	-p
	$BOARD_MCU
	-P
	$UPLOAD_PORT
	-b
	$UPLOAD_SPEED
	-c
	stk500v1
upload_command = avrdude $UPLOAD_FLAGS -U flash:w:$SOURCE:i
Ref.Atmel AVR Ateml Configuration

■テストコード(Lチカ・プログラム)作成

$ vi src/led.ino
#define LED_PIN 9

void setup() {
	pinMode(LED_PIN, OUTPUT);
}

void loop() {
	digitalWrite(LED_PIN, HIGH);
	delay(1000);
	digitalWrite(LED_PIN, LOW);
	delay(1000);
}
先に示した配線に追加して、9番ピンに抵抗を介してLEDを取り付けます。

■プログラムの書き込み
ラズベリーパイとArduino NanoをUSB接続すると、ISPプログラム稼働中の Heart Beat の緑色LEDが点滅します。


$ pio run -t upload
(抜粋)
Processing pro8MHzatmega328 (platform: atmelavr; board: pro8MHzatmega328; framework: arduino)
-------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/pro8MHzatmega328.html
PLATFORM: Atmel AVR (3.4.0) > Arduino Pro or Pro Mini ATmega328 (3.3V, 8 MHz)
HARDWARE: ATMEGA328P 8MHz, 2KB RAM, 30KB Flash
DEBUG: Current (avr-stub) On-board (avr-stub, simavr)
PACKAGES:
 - framework-arduino-avr @ 5.1.0
 - tool-avrdude @ 1.60300.200527 (6.3.0)
 - toolchain-atmelavr @ 1.70300.191015 (7.3.0)
Converting led.ino
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 5 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Compiling .pio/build/pro8MHzatmega328/src/led.ino.cpp.o
Linking .pio/build/pro8MHzatmega328/firmware.elf
Checking size .pio/build/pro8MHzatmega328/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [          ]   0.4% (used 9 bytes from 2048 bytes)
Flash: [          ]   3.0% (used 924 bytes from 30720 bytes)
Configuring upload protocol...
AVAILABLE: custom
CURRENT: upload_protocol = custom
Uploading .pio/build/pro8MHzatmega328/firmware.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file ".pio/build/pro8MHzatmega328/firmware.hex"
avrdude: writing flash (924 bytes):

Writing | ################################################## | 100% 1.13s

avrdude: 924 bytes of flash written
avrdude: verifying flash memory against .pio/build/pro8MHzatmega328/firmware.hex:
avrdude: load data flash data from input file .pio/build/pro8MHzatmega328/firmware.hex:
avrdude: input file .pio/build/pro8MHzatmega328/firmware.hex contains 924 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.62s

avrdude: verifying ...
avrdude: 924 bytes of flash verified

avrdude: safemode: Fuses OK (E:FF, H:D9, L:E2)

avrdude done.  Thank you.

avrdude: verification error, first mismatch at byte 0x0000
のエラーがでた場合は、水晶発振器を取り付けてみると改善するかもしれません。

書き込まれたヒューズの値をみてみると
avrdude: safemode: Fuses OK (E:FF, H:D9, L:E2)
0xDB(11011011)ではなく、0xD9(11011001)になっていて、ブートサイズ設定も変更されるようです。

■動作確認


ATMEGA328Pに、1.5Vの乾電池2本、3Vを供給することで単体でLEDが点滅します。

VCCとアナログ機能用電源AVCCです。実際の回路では、AVCCとVCCを直結します。 アナログ機能用とはいってもPC0からPC3までのデジタル機能用電源も兼用しており、VCC±0.3V以内とすることが推奨されています。 GNDは内部で接続されています。耐ノイズ性向上のため、VCCとの間にバイパスコンデンサ(0.1uF)を接続します。
Arduino(ATmega328P)を単体で内部クロック8MHzで動かしてみる!


■クロックが8分周されてしまっている場合
$ ~/.platformio/packages/tool-avrdude/avrdude -C ~/.platformio/packages/tool-avrdude/avrdude.conf -p m328p -P /dev/ttyUSB0 -b 19200 -c avrisp

avrdude: AVR device initialized and ready to accept instructions
Reading | ########################## | 100% 0.11s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: Fuses OK (E:FF, H:D9, L:62)
avrdude done. Thank you.

ヒューズビット(E:FF, H:D9, L:62)になってしまっている場合は変更が必要です。 ローヒューズの値が、0x62(0b01100010)で第7ビット CKDIV8=0により、クロックが8分周されてしまっています。
ローヒューズの第7ビットCKDIV8を1にして8分周を無効にするために、 0x62(0b01100010) → 0xE2(0b11100010)に変更します。

$ ~/.platformio/packages/tool-avrdude/avrdude -C ~/.platformio/packages/tool-avrdude/avrdude.conf -p m328p -P /dev/ttyUSB0 -b 19200 -c avrisp -U lfuse:w:0b11100010:m
avrdude: AVR device initialized and ready to accept instructions
Reading | ######################### | 100% 0.11s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "0b11100010"
avrdude: writing lfuse (1 bytes):
Writing | ######################### | 100% 0.12s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0b11100010:
avrdude: load data lfuse data from input file 0b11100010:
avrdude: input file 0b11100010 contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ######################### | 100% 0.03s
avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: safemode: Fuses OK (E:FF, H:D9, L:E2)
avrdude done. Thank you.

デバイスIDを確認しておきます。
$ ~/.platformio/packages/tool-avrdude/avrdude -C ~/.platformio/packages/tool-avrdude/avrdude.conf -p m328p -P /dev/ttyUSB0 -b 19200 -c avrisp
avrdude: AVR device initialized and ready to accept instructions
Reading | ######################### | 100% 0.11s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: Fuses OK (E:FF, H:D9, L:E2)
avrdude done. Thank you.

■ロックビットの確認
AVRマイコンにはロックビットという記憶領域があり、フラッシュメモリの内容や ヒューズバイトの内容を間違って書き換えないようにロックするための設定です。
0x3f であれば、書き込み可能です。ヒューズビットの設定を誤ると文鎮化する危険があります。
Ref.文鎮化した自作キーボードをArduinoを使って復帰させる

$ ~/.platformio/packages/tool-avrdude/avrdude -C ~/.platformio/packages/tool-avrdude/avrdude.conf -p m328p -P /dev/ttyUSB0 -b 19200 -c avrisp -U lock:r:con:h
avrdude: AVR device initialized and ready to accept instructions
Reading | ######################### | 100% 0.11s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading lock memory:
Reading | ######################### | 100% 0.04s
avrdude: writing output file "con"
avrdude: safemode: Fuses OK (E:FF, H:D9, L:E2)
avrdude done. Thank you.

$ cat con
0x3f

■その他・ヒューズビット (ATmega328 3.3V, 8 MHz)

◇拡張バイト efuse (低電圧検出リセットと復帰)



低電圧検出 BODLEVEL (Brown Out Detect) / BOT (Brown Out Threshold)

電源電圧がMin Vbot値よりも低くなった瞬間にリセットが発生し、Max Vbotよりも電圧が高くなったらリセットから復帰します。

◇上位バイト hfuse


Name Bit Description Value
RSTDISBL 7 PC6(1番ピンの用途)
1:RESETピン / 0:I/Oピン
シリアルプログラミングモードを
使用するので必ず1とする。
1(RESET)
DWEN 6 デバッグWIRE機能許可 1(無効)
SPIEN 5 シリアルプログラミングの許可 0(有効)
WDTON 4 ウォッチドッグタイマ常時有効 1(無効)
EESAVE 3 チップ消去からEEPROM内容を保護 1(初期化)

下位バイト lfuse


名称 ビット 意味 Value
CKDIV8 7 内蔵8MHzシステムクロック選択(8分周)
0:有効 / 1:無効
出荷時1/8に分周されているため、
1MHzになっています。
1(8MHz)
CKOUT 6 システムクロック出力許可
0:PB0に出力 / 1:出力しない
1(不許可)
SUT1..0 5-4 起動時間選択
下記 Table 9-6.参照
11
CKSEL3..0 3-0 クロック種別選択
“111*”の場合
外付け水晶振動子使用
“0010”の場合
OSCCAL(発振校正レジスタ)値による較正
“0000”の場合
XTAL1端子のみ使用、XTAL2はポートB7に割当
1111


■ATMEGA328P-PU 3.3V/8MHz 用ブートローダ書込み
ArduinoISPを用いてプログラムを書き込むのであれば、ブートローダは必要ないのですが、 USBシリアルで書き込む場合には事前にブートローダを書き込む必要があります。

■秋月電子 ATmega328P Bootloader 3.3V@8MHz

秋月電子では、ATmega328P Bootloader 3.3V@8MHz が書き込まれたDIPパッケージが販売されています。
このチップのヒューズビットを確認してみると下記のようになっていました。

$ ~/.platformio/packages/tool-avrdude/avrdude -C ~/.platformio/packages/tool-avrdude/avrdude.conf -p m328p -P /dev/ttyUSB0 -b 19200 -c avrisp

avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: Fuses OK (E:FE, H:DE, L:E2)
avrdude done. Thank you.

拡張ヒューズビット(E:FE/0b1111110)で低電圧検出(MIN1.7/MAX2.0)が有効になっているのがわかります。
ヒューズビットの上位バイト(H:DE/0b11011110)でBootloader Flash Section 0x3F00-0x3FFF になっています。
ヒューズビットの下位バイト(L:E2/0b11100010)で内蔵オシレータ使用になっています。

PlatformIO の pro8MHzatmega328.json で定義されているブートローダを再度みてみます。
"bootloader": {
 "efuse": "0xFD",
 "file": "atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex",
 "hfuse": "0xDA",
 "lock_bits": "0x0F",
 "lfuse": "0xFF",
 "unlock_bits": "0x3F"
},

ヒューズビットの上位バイト(0xDA/0b11011010)でBootloader Flash Section 0x3C00-0x3FFF になっています。
ATmega328Pは、Flash:32KB,EEPROM:1KB,RAM:2KB なのでFlash領域を節約するために、秋月と同様にコンパクトなブートローダoptibootに書き換えます。

optibootのHEXファイルをダウンロードして、解凍します。
ATmega328P
解凍した boards.txt(抜粋)の内容です。
atmega328p_8MHz.name=ATmega328P(8MHz/X'tal)
atmega328p_8MHz.bootloader.low_fuses=0xff
atmega328p_8MHz.bootloader.high_fuses=0xde
atmega328p_8MHz.bootloader.extended_fuses=0x05
atmega328p_8MHz.bootloader.file=optiboot_atmega328_8MHz.hex
atmega328p_8MHz.bootloader.unlock_bits=0x3F
atmega328p_8MHz.bootloader.lock_bits=0x0F
atmega328p_8MHz.build.mcu=atmega328p
atmega328p_8MHz.build.f_cpu=8000000L

atmega328p_8MHz_int.name=ATmega328P(8MHz/INT OSC)
atmega328p_8MHz_int.bootloader.low_fuses=0xe2
atmega328p_8MHz_int.bootloader.high_fuses=0xde
atmega328p_8MHz_int.bootloader.extended_fuses=0x06
atmega328p_8MHz_int.bootloader.file=optiboot_atmega328_8MHz.hex
atmega328p_8MHz_int.bootloader.unlock_bits=0x3F
atmega328p_8MHz_int.bootloader.lock_bits=0x0F
atmega328p_8MHz_int.build.mcu=atmega328p
atmega328p_8MHz_int.build.f_cpu=8000000L

atmega328p_16MHz.name=ATmega328P(16MHz/X'tal)
atmega328p_16MHz.upload.speed=115200
atmega328p_16MHz.bootloader.low_fuses=0xff
atmega328p_16MHz.bootloader.high_fuses=0xde
atmega328p_16MHz.bootloader.extended_fuses=0x05
atmega328p_16MHz.bootloader.file=optiboot_atmega328.hex
atmega328p_16MHz.bootloader.unlock_bits=0x3F
atmega328p_16MHz.bootloader.lock_bits=0x0F
atmega328p_16MHz.build.mcu=atmega328p
atmega328p_16MHz.build.f_cpu=16000000L
8MHz用のhexファイルはoptiboot_atmega328_8MHz.hexで、ヒューズビット(X'tal:0x05/INT OSC:0x06)によりオシレータを指定しています。
この拡張ヒューズビットの上位5桁は未使用ビットで0になっていますが、1に置き換えて、0x05→0xfd/0x06→0xfeとして使用します。

既存のブートローダの場所を確認します。
$ sudo find / -name ATmegaBOOT_168_atmega328_pro_8MHz.hex -print
/home/pi/.platformio/packages/framework-arduino-avr/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex
$ ls -al /home/pi/.platformio/packages/framework-arduino-avr/bootloaders/atmega
-rw-rw-rw- 1 pi pi 10921 12月 11 2017 ATmegaBOOT_168_atmega1280.hex
-rw-rw-rw- 1 pi pi 5533 12月 11 2017 ATmegaBOOT_168_atmega328.hex
-rw-rw-rw- 1 pi pi 5484 12月 11 2017 ATmegaBOOT_168_atmega328_pro_8MHz.hex
-rw-rw-rw- 1 pi pi 5562 12月 11 2017 ATmegaBOOT_168_diecimila.hex
-rw-rw-rw- 1 pi pi 4842 12月 11 2017 ATmegaBOOT_168_ng.hex
-rw-rw-rw- 1 pi pi 5582 12月 11 2017 ATmegaBOOT_168_pro_8MHz.hex

ここに、optiboot_atmega328_8MHz.hex を保存します。
$ cp optiboot_atmega328_8MHz.hex /home/pi/.platformio/packages/framework-arduino-avr/bootloaders/atmega

ボード情報を書き換えます。
$ vi ~/.platformio/platforms/atmelavr/boards/pro8MHzatmega328.json
"bootloader": {
 "efuse": "0xFE",
 "file": "atmega/optiboot_atmega328_8MHz.hex",
 "hfuse": "0xDE",
 "lock_bits": "0x0F",
 "lfuse": "0xE2",
 "unlock_bits": "0x3F"
},

ATMEGA328P-PU にブートローダを書き込んでみます。
$ pio run -e pro8MHzatmega328 -t bootloader -v
avrdude: safemode: Fuses OK (E:FE, H:DE, L:E2)
avrdude done. Thank you.

●シリアルでのスケッチ書き込み

リセットをかけるためのDTR-RESET間には0.1μFのコンデンサが必要となります。
Arduino(ATmega328P)を単体で内部クロック8MHzで動かしてみる!

USBシリアル変換モジュールには秋月電子のFT232RL USBシリアル変換モジュールキットを使いましたが、安価なものでも構いません。
・通信速度:300bps~460kbps ・256バイト受信バッファ、128バイト送信バッファ内蔵 ・電源はホストからUSBで供給されます。 ・仮想COMポートによりCOMポートとして使用できます。 ・RS232CではなくTTL(CMOS)レベルでの変換を行います。

ATMEGA328P  FT232RL
RESET:1←(0.1uF)→2:DTR
RESET:1←(10KΩ)→19:3V3
VCC:7←───→19:3V3
|   
VCC:20  
RXD:2←───→1:TXD
TXD:3←───→5:RXD
GND:8←───→7:GND
J1:([1-2] 3) 3V3ピンから3.3Vを供給する
J2:([1-2]) USBからVCCに5Vを供給する



$ pio device list
/dev/ttyUSB0
------------
Hardware ID: USB VID:PID=XXXX:XXXX SER=XXXXXXXX LOCATION=1-1
Description: FT232R USB UART - FT232R USB UART

/dev/ttyAMA0
------------
Hardware ID: 3f201000.serial
Description: ttyAMA0
$ pio run -t upload
avrdude: 924 bytes of flash verified
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.

ブートローダを介しているので、フューズビットは(E:00, H:00, L:00)になっています。


乾電池2本で、普通にグラフィック表示もできます。

■Arduino UNO (ATMEGA328P 5V/16MHz)にブートローダーを書き込む場合

あまりないと思うのですが、真っ新なUNOにブートローダーを書き込む場合には以下のようになります。
$ pio boards "UNO"
Platform: atmelavr
=========================================================================
ID              MCU          Frequency    Flash    RAM     Name
--------------  -----------  -----------  -------  ------  --------------
uno             ATMEGA328P   16MHz        31.50KB  2KB     Arduino Uno
elektor_uno_r4  ATMEGA328PB  16MHz        31.50KB  2KB     Elektor Uno R4
the_things_uno  ATMEGA32U4   16MHz        28KB     2.50KB  The Things Uno

UNO用のブートローダーの内容を確認します。
$ cat ~/.platformio/platforms/atmelavr/boards/uno.json
  .....
  "bootloader": {
    "efuse": "0xFD",
    "file": "optiboot/optiboot_atmega328.hex",
    "hfuse": "0xDE",
    "lock_bits": "0x0F",
    "lfuse": "0xFF",
    "unlock_bits": "0x3F"
  },
  .....
PlatformIOでは、UNO用には optibootが採用されています。

$ mkdir -p ~/Nano328/ArduinoISP/ATmega328Uno
$ cd ~/Nano328/ArduinoISP/ATmega328Uno
$ pio init -b uno

$ vi platformio.ini
[env:uno]
platform = atmelavr
board = uno
framework = arduino
upload_protocol = custom
upload_port = /dev/ttyUSB0
upload_speed = 19200
upload_flags =
	-C
	; use "tool-avrdude-megaavr" for the atmelmegaavr platform
	$PROJECT_PACKAGES_DIR/tool-avrdude/avrdude.conf
	-p
	$BOARD_MCU
	-P
	$UPLOAD_PORT
	-b
	$UPLOAD_SPEED
	-c
	stk500v1
upload_command = avrdude $UPLOAD_FLAGS -U flash:w:$SOURCE:i

$ pio run -e uno -t bootloader -v

典型的な最小構成のATmega328 5V@16MHzは下記のようになります。

Arduino互換機を作りたい(3)

■参考文献
ATmega328/P DATASHEET
ATmega328Pの調査 ~Fuseビットについて調べてみた~
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2019.12.13 モバイルバッテリーによる瞬間停電対策
2020.01.01 1280x800 HDMI MONITOR
2020.01.12 micro:bitをコマンドラインで使う
2020.02.04 サーマルプリンタを使う
2020.04.10 電卓を制御して数字を表示する
2020.08.03 Seeeduino XIAO
2020.08.09 LGT8F328P - Arduino clone
2020.09.18 電流計測モジュール INA219
2021.02.16 癒しの電子回路
2021.03.06 疑似コンソール
2021.08.08 電子ペーパー
2021.09.04 AVRマイコン・ATTiny85
2021.09.25 pH測定
2021.11.13 NTP時刻取得と活用
2021.11.27 GPS情報取得
2021.12.11 GR-KURUMI
2021.12.25 ATMEGA328P 3.3V/8MHz
2022.01.11 AS-289R2 プリンタシールド
2022.01.25 TM1637 & ATtiny85
2022.02.22 Raspberry Pi Zero 小道具
2022.03.01 ATTinyCore
2022.03.18 Adafruit QT Py + XIAO Expansion board
2022.07.31 サーマルプリンター番外編:通信筒
2023.01.01 FTP Server & SPI Flash SD
2023.02.01 LPC810(ARM Cortex-M0+)
2023.02.15 IchigoJam互換機
2023.03.01 Telnet
2023.04.26 USBメモリをUART接続で利用する
2023.05.14 焦電型赤外線モーションセンサー
2023.07.01 文字化けしないキーボード
2023.08.01 Bluetoothサーマルプリンター
2023.08.12 LattePanda 2G/32GB
2023.09.04 SI-3012KS
2023.12.01 疑似コンソール(C言語編)
2023.12.16 昭和レトロ・温度湿度時刻計
2023.12.25 二酸化炭素濃度監視
2024.01.23 なんちゃってmicro:bit
2024.02.07 オリジナル micro:bit
2024.02.23 ESP32 OTA
2024.03.08 TELNETサーマルプリンター
2024.05.08 ESP32 PROGRAM SELECTOR
2024.05.23 統合開発環境とQwiic
2025.01.24 赤外線リモコン
2025.03.25 QRCode SCANNER
2025.04.08 Keyestudio 328 WiFi Plus
2025.08.23 NanoPi NEO3
2025.09.24 I2C接続microSDモジュール
2025.10.08 UNO 3.3V@8MHz

たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」 「一念発起して何かを始めても、いつも三日坊主で終わってしまう」 「色んなことを先延ばしにしたまま、時間だけが過ぎていく」 そこで本書では、そんな著者が独自に開発した、 まったく新しい目標達成メソッド「100日デザイン」について、 その知識と技術を、余すところなくご紹介します。

まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。 ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。

今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。

ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。 29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!

【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。 基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説! 500以上のサンプルを掲載。実行結果も確認。 全24章の包括的なチュートリアル。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。

Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード

電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)

Copyright © 2011-2027 Sarako Tsukiyono All rights reserved®.