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を使用しています。
■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プロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは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)
|