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プロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81
無水エタノールP 500mlx2個パック(掃除)
ケイバ(KEIBA) マイクロニッパー MN-A04
サンハヤト SAD-101 ニューブレッドボード
白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02
[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠
|