2020年
2月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2020-02-03 小型のarduino

_ arduinoとLUFA

それなりに昔のことになるが,書き込み機が簡単に自作できるということを知って,マイコンとしてAVRを使うようになった.当初はtinyを使っていたが,ピンの数が足りなくなって,megaも使うようになった.ハンダ付けや配線と書き込みが面倒だと感じて居たのだが,arduino自作用の基盤を使うと,それらが楽になることに気が付いて,しばらく使っていた.そして,中国製のarduinoが安価に手に入るようになったので,arduinoも使うようになった.arduinoとしては,UNOを最初に使ったが,nanoはそれとほぼ同等の性能で小型なので,小さい部分に使う時に使うようになった.

USBと通信のできるnanoよりも小さくて16個以上のピンのものが必要になった.nanoの基板の片側を切り取れば,希望の大きさになり,その部分には重要な回路は無いので一応動作することが分かったが,面倒だし美しくない.いろいろと調べたら,arduino pro microというのが,それなりに小さくてピンの数も大丈夫だということが分かった.さらに,これはAVR本体でUSBと通信しているので,USBをシリアル以外としても使うことができる.

arduino pro microは,arduino Leonardoを小型にしたもののようで,AVRとしては,atmega32u4を使っている.通常のarduinoとは違って,USB-serial変換ICが無いので,書き込みの癖が強いらしい.実際にやってみたが,うまく行ったり行かなかったりで,調子は良くない.このAVRについて調べていたら,LUFAというものを発見した.arduinoでは無いのだが,独自のbootloaderを作っており,今回の目的に一致するように感じたので,少し使ってみた.

LUFAをdownloadしてunzipすると,いろいろなfileができるが,Bootloaders/MassStorageにあるBootloaderMassStorageを使うことにした.これは,AVRをharddiskのような形で認識させて,そこにファイルのような形でプログラムを転送して,AVRに実行させるものである.まず,makefileを編集して,以下のようにparameterを変更する.

MCU          = atmega32u4
BOARD        = LEONARDO
F_CPU        = 16000000
FLASH_SIZE_KB         = 32
BOOT_SECTION_SIZE_KB  = 4

そして,BootloaderMassStorage.cを必要に応じて変更する.bootloaderが実行されると,watchdogリセットがかかってApplication_Jump_Check()が実行され,ここからプログラムに飛ぶ.このsubroutineのLEONARDOのところのピンの条件を変更すると,その条件が満たされたときには,プログラムに飛ばずにプログラム転送modeになる.makeすることによってhexファイルを作成し,ISPでpro microに書き込む.arduino as ISPを使う場合には,以下のコマンドである.

avrdude -p m32u4 -c avrisp -P /dev/ttyUSB0 -b 19200 -B 4 -U flash:w:"BootloaderMassStorage.hex" -v

ちなみに,fuseはE:CB, H:D8, L:FFとなっていた.BOOTRSTは0となっているが,1にすると直接プログラムに飛ぶのだと思う.必要に応じて,fuseも書き換えれば良い.プログラム転送modeになったときには,二つのLEDが交互に光る.この状態でAVRはmediaとして認識されるので,binファイルをddで転送する.cpでcopyしたらダメだった.sdbとして認識している場合には,以下のコマンドでファイル転送できる.もし,sdbが別のdiskを示している場合には,それを上書きしてしまわないように注意が必要である.書き込んだ後にumountすることもお忘れ無く.

sudo dd if=output.bin of=/dev/sdb seek=4

arduinoを使って書けるようなプログラムは,その方が簡単に作ることができる.転送するプログラムのbinをarduinoで作る方法を説明しよう.まず,arduino IDEはaptで入れるのでは無く,本家から新しいものをdownloadしてinstallする必要がある.File - Preferences - Additional Boards Manager URLs:のところにhttps://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.jsonを指定して,Tools - Boards Managerからを選んで,pro microを使えるようにする.ToolsでBoardはSparkFunProMicroとして,適切な電圧とクロックを選択する.プログラムができたら,compileして,Sketch-Export compiled Binaryとすると,hexファイルができるので,以下のコマンドでbinファイルを作ると,これを上記の用に転送して再起動すればプログラムを動かすことができる.

avr-objcopy -I ihex -O binary -R .eeprom -R .fuse -R .lock -R .signature sketch.ino.promicro.hex output.bin