Senshu LAB
サイト内検索: AND検索 OR検索  


Counter: 22469, today: 6, yesterday: 7
Table of Contents

教材作成に有用な情報や組込み技術の情報が共有できればと考えています.
※ 本サイトの掲載内容を利用して発生した損害,障害の責は負いませんので悪しからず.


「掲示板」(マイコンおよびコンピュータ全般)

新規の記事は、新掲示板をご利用ください。
このマイコンに関する情報交換にご活用ください。

Arduino日本語リファレンス

senshu (2009-10-28 (水) 19:27:40)

「Arduino 日本語リファレンス」はArduinoの参考資料としてはピカイチです。

http://www.musashinodenpa.com/arduino/ref/index.php

自作したArduinoでは、以下の図を印刷し配線しています。オリジナルのArdiunoは
使ったことはありませんが、ブレッドボードを前提とした回路製作ではあまり違いが
無いように思えます。

http://www.musashinodenpa.com/arduino/ref/mega168.jpg


Arduino2313を評価中(不具合との遭遇)

senshu (2009-10-28 (水) 18:57:53)

dude-wrapで実用的に使えるようになったArduino2313ですが、LED Blinkは
順調でしたが、Melodyを実行すると「キラキラ星」が単なるブザーのような
音で鳴ります。

念のため、mega168で同じコードを試すと正常に動作します。現象から察すると、以下の
関数が正常に動作していないように思えます。「delayMicroseconds(tone)」関数の挙動が
おかしいのでしょうか。 delay関数は正常に動作しますが、もう少しブラッシュアップが
必要と感じます。

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}



  • iruka? 2009-10-28 (水) 19:28:19
    こんばんは。
    fuseは8MHz(12MHz?)動作になっていますでしょうか?
    fuseのClock(1/8)が生きているとかありませんかね。

    あと、duration * 1000L; i += tone * 2の乗算は一応ループ外に出るみたいですが、
    tiny2313は(8x8)乗算ハードがないのでやや不利なのと、ループ変数がlongなので
    かなり大げさな命令列が落ちるようです。
    普通に8bit CPUを使うときはせいぜい16bitカウンタまでにしておいて、うまく工夫
    するもんなんですけどねえ・・・。

    こういった大味なコードを書きたい方々向けにはいっそARMとかThumbのCPUを
    与えたほうがいいような気がします。

    P.S.
    avr-gcc4.3はr2〜r15もしっかり使っているようです。
    場合によって短くなるのはそのためでしょうか?
    hidpsx88でregister割り当てを使うとバグるのはそのせいですね。
  • senshu 2009-10-28 (水) 19:43:16
    irukaさん、コメントに感謝します。ATtiny2313はRC OSCの8MHzで動作させています。

    ご指摘のように乗算ハードが無いので、そのせいかもしれません。また、コードも
    あまり良くないのでコードの見直しが必要かもしれません。もっとタイマーを活用
    したコードを書くべきだと思います。

    こうすれば改善できる、という報告に期待しています。

    それから、
    avr-gcc4.3はr2〜r15もしっかり使っているようです。
    の件、了解です。ChuckさんのI2Cの各種の実装(どれも素晴らしい仕上がりです)
    のI2C LCDでは、avr-gccの3.4.6では溢れてしまいます。これを契機に、新版にも
    一目おくことにしました。

dude-wrap利用のMyArduinoの紹介

senshu (2009-10-28 (水) 17:21:30)

ATmega168、FT232RLモジュール、HIDaspxを組合せ、Arduinoを自作してみました。

製作に要した時間は1時間程度です。ピンの機能が不明なので、配線用プリントを手元に
置く必要がありますが、通常のArduino IDEと操作は全く変わりません。新品のAVRマイコ
ンを挿し、ブートローダ書き込みメニューを実行すれば、開発を開始できます。

PCとの通信が不要なら、FT232RLモジュールは不要です。ケース入りのHIDaspxライタが
あれば、ブレッドボードに実装する必要もありません。学生教材として作成しましたが、
書き込みも速く実用的に使えることを再確認しました。しかも、ライブラリは豊富です。
これで、デバッグ機能があればよいのですが、Serial.print(printf類似)でデバッグを
になるのが唯一残念なところです。

MyArduino.jpg


  • senshu 2009-10-28 (水) 21:11:41
    このMyArdionoは、Arduino-0017以下のフォルダ(一式で100MB程あります)をコピーする
    だけで動作します。USBメモリにコピーしておけば、HDDにコピーする必要もありません。

    HIDaspxで書き込みを行うなら、ドライバのインストールも不要で、Arduino IDEは日本語
    メニューです。

    これはかなり魅力的な学習環境であり、ちょっと前なら夢のシステムです。

AVRマイコンによるI2Cスレーブの例

senshu (2009-10-27 (火) 21:02:24)

Chuckさんの手になる「AVRマイコンで実装したI2C Slave」の実装例です。

http://ecrafts.g.hatena.ne.jp/Chuck/20090915/1252969896

ATtiny2313によるスイッチ/ロータリエンコーダ読み取りスレーブ (I2C UI)
ATtiny2313による16bit PWMスレーブ (I2C PWM16)
ATtiny2313による7セグメントのLED表示器スレーブ(I2C 7SEG)
ATtiny2313によるLCD表示器スレーブ(I2C LCD)
ATtiny85による正弦波生成スレーブ(I2C 1-chip DDS) 

廉価なATtiny2313で実現したものが多く、気軽に追試できそうなので、追試
してみたいと思います。


  • senshu 2009-10-27 (火) 21:49:50
    「ATtiny2313による7セグメントのLED表示器スレーブ(I2C7SEG)」をmakeすると、
    WinAVR 2006-0624 では2048バイト以内に収まらないことを確認しました。

    ちょっと悩みましたが、gcc version 4.3.2 (WinAVR 20090313)でmake したところ、
    i2c_lcd\i2clcd_Rel_20090827\src\default>size *.hex
       text    data     bss     dec     hex filename
          0    1952       0    1952     7a0 i2clcd.hex
    となり、2048バイト以内に収めることが可能になりました。今まで、gcc ver 4以降は
    サイズが肥大化すると考えていましたが、それが当てはまらない場合もあるようです。
    (何が影響しているのか、興味が湧きましたが、時間も無いので保留です)

    実用的な例が多く、大変参考になりました。Chuckさんに感謝いたします。

WinAVR(avr-gcc)のatmega328pへの対応度

senshu (2009-10-25 (日) 20:57:05)

ATmega168とATmega328pはメモリサイズとFUSEのわずかな違いを除けば、ほぼ同等の
機能と考えていましたが、AVR freaksを除いてみると、pの有無でかなりの違いが
あるとの書込みがありました。

最近のWinAVRはmega328pに対応していますが、ヘッダファイルの記述が48/88/168と
は微妙に違いがあります。新規に書き下ろしているようですが、その割にはFUSEの
記述が不正確で、PORT記述にも一部互換性がなく、完全なものではありません。

次の版の対応はしばらく先だと思いますので、利用者側で修正し利用するなどの工夫
が必要と思われます。ヘッダファイルにはATMEL社の文字も見て取れるのですが、その
割には不徹底な点が散見されます。

Cコンパイラなどは基本ツールですから、一層の品質向上を期待したいです。
(自分で修正すべきかもしれません)


ATmega644pを使った応用例

  • senshu 2009-10-27 (火) 07:06:28
    irukaさんが、興味深い実験を紹介しています。

    ATmega644pを使って、V-USBを稼動させています。同じアーキテクチャですから、
    動作して当然、というのは早計です。動作させるには、いくつかの修正が必要
    だったようです。ここで利用している基板は、私のところで製作依頼したもの
    で市販されていませんが、私の手元に若干の在庫はありますので、興味を持った
    方は、私まで問い合わせください。(自作する方が柔軟に作れますが、全I/Oピン
    が規則正しくコネクタに配置されており、シリアルI/Oのコネクタも付属するので、
    644pの評価には便利です。)

    「ATmega644によるV-USB実験」↓
    http://hp.vector.co.jp/authors/VA000177/html/ATmega644.html

    ATmega328p, 644p 共に、実用するには実績を積む必要があるようです。

mega644pでHIDaspxを実現

  • iruka? 2009-10-27 (火) 22:00:40
    senshuさん、こんばんは。
    ご紹介いただきましてありがとうございます。
    とりあえず、例のATmega644基板にて、HIDmon88ブートローダーとHIDaspxが
    使えるようになりました。
    手順としましては、まずHIDmon88-ws172-m644を導入して、次にbootloaderを
    使ってHIDspx88-ws172-m644を書き込み、ブート切り替えをアプリ側(PC2JUMPER
    クローズ)にします。
    USBケーブルを挿しなおして(ここが微妙にだめなところですが)hidspx88を使って
    AVRデバイスに書き込み、ベリファイまでを確認いたしました。
  • senshu 2009-10-27 (火) 23:21:29
    irukaさん、こんばんは。精力的な取り組みに敬意を表します。
    USBケーブルを挿しなおして(ここが微妙にだめなところですが)hidspx88を使って
    AVRデバイスに書き込み、ベリファイまでを確認いたしました。
    了解しました。ある程度動作すれば、改良してくれる人が登場するかもしれません。
    改良が進むことを期待したいです。でも、期待のPICspxはその後、進展はありません。
    どうも、PIC/AVRのオールラウンドプレイヤーは限られるようです。

    例のボード(ws201)は、Ws☆NAKさんに在庫があるはずなので、追試を希望する方の登場を
    期待しています。dude-wrapを使えば、Arduino644p としても使えるはずです。
    ピン数やメモリが少なくて困っていた方や、安定な書き込みを希望する方に推薦できます。

    また、メモリが2kBしかない ATtiny2313とは異なり、64kBの広大なメモリを有する644pな
    ら、応用は無限(やや大袈裟?)とも感じます。

    なお、hidspx88というコマンドで操作するようですが、hidspxも日々進化しているので、
    可能ならマージできると便利に感じます。

    irukaさんの掲示板にも書込みがありましたが、USB-シリアルの変換が同一のモジュー
    ルで可能なら便利だと思っています。Windows XP限定では魅力は半減ですが、Linuxでも
    CDCのサポートが拡充されるようです。

    Ubuntu 0910版で対応されることに期待したいと思います。

  • iruka? 2009-10-29 (木) 23:11:14
    >USB-シリアルの変換が同一のモジュール

    これにはAVRよりもUSB-PICのほうをお勧めしたいです。
    HIDとCDCの複合デバイスにすれば両方同時にいけるのではないかと思います。
    一応FullSpeedなのでWinXP縛りはなくなります。

HIDaspxの次期バージョン

  • senshu 2009-10-30 (金) 21:30:01
    私も以前からUSB I/F内蔵のPICマイコンの価格に魅力を感じています。

    HIDaspxの次期バージョン(上手く実装できれば)は、PIC18Fシリーズにしたいと考え
    ています。可能なら、動作電圧範囲の広い「14k50」で実現したいです。
    そうすればこの仕様を無理なく達成できます。
    HIDとCDCの複合デバイスにすれば両方同時にいけるのではないかと思います。
    同時に実現できれば理想ですね。最初は簡単な操作で切り替えられればOKだと思います。
    利用者の希望する機能があれば制御用のマイコンの種類は重要ではありません。

配線ミスの基板とPICkit2で冷や汗

senshu (2009-10-24 (土) 21:21:24)

10/24、山形駅西口にある山形県産業科学館にて、小中学生を対象にした科学工作教室
を開催しました。

私は、PICマイコン(12F629, 12F683)による電子オルゴールを担当しました。

今回も面実装部品を多用した基板を採用し(ゴミの発生が少ないエコな基板です)、
小学生には実装は難しいので、大半の部品を私たちが実装したものを持ち込みました。
 ↓
index.php?plugin=ref&page=AVR%2Fnews26&src=WSN202.jpg

作成済みのHEXファイルを書き込んで完成させるものです。私と学生アシスタント
(1名)での対応なので、トラブルによる停滞は許されません。10:00〜16:00までの
6時間で60セットほどを製作する計画を立てました。

実際には、用意した75台分の材料全てを提供することになりました。7台強/時間を
製作したことになります。そこで、書き込み容易なwisp628を使ってXWISP2で書き込
む予定でしたが、45セット書き込んだところでエラーが起き、予備のPICkit2に変更
しましたが、エラーは変わらず、製作が10分間ほど中断しました。

調査の結果、エラーの原因は基板のVDD-GND間が短絡していた為とわかりました。
この基板を接続した時点で短絡を検出できればよかったのですが、どちらのライタ
も短絡を検出できず、かつPICkit2ではターゲットを取り外した後も、数分間反応が
なくなるので、問題の切り分けに時間を要しました。

このことから、可能ならターゲット給電部とライタ電源は分離しているのが望まし
いと感じました。

また、保護回路は私の作成したwisp628では3端子レギュレータを採用しましたが、
ポリスイッチよりも回復が早く(切り離せば回復)、トラブルの判断が容易でした。

市販のツールでも保護回路の充実度は異なり、簡易タイプもあることがわかります。

なお両方使っての感想ですが、大量書込みでは、GUIよりもCMD上で利用するXWISPが
遥かに便利でした(学生アシスタントも同意見です)。キーボードの↑↓の操作と、
数文字のキー入力(ファイル名の修正)で書き込めるのです。PICkit2のGUIによる操作
では、快適な操作は難しいと感じました。

PICkit2にもPK2CMD(CMD上で利用可能)があるのですが、オプション指定が複雑で、
今ひとつ便利に感じません。利用者の意見を反映したものが望まれます。


xwisp2を改良

  • senshu 2009-10-24 (土) 21:39:55
    期せずして、HIDaspxの回路は3端子レギュレータを内蔵し、電源の給電が確認できる
    LEDも実装しています。これは、上記のような不具合を持った基板を接続時の切り分け
    に必要な情報を得ることができます。(切り分けが容易なのは大きな利点です。)

    またwisp628用のXWISP2(書き込みソフト)でも、改良すべき点を確認しました。
    多数のUSB-シリアルのケーブルを接続したPCでは、COM10以上に割り付けられる場合が
    あり、割当てられたCOMポートの番号が10を超えるとポートアクセスに失敗します。
    これは
    com10以上のアクセスには、\\.\com10のように指定する
    ことで、改善できますがこの指定はプログラムの修正が必要です。
    そこで、さっそく修正しました。xwisp2.exe ⇒ filexwisp2-196.LZH

ATmega328PでHIDaspxを実現する

senshu (2009-10-23 (金) 18:24:36)

irukaさんが、興味深い取り組みを行っています。

ATtiny2313で構成されるHIDaspxをATmega88/168/328で実現しようという
ものです。ATtiny2313よりもメモリが豊富なので、ブートローダを搭載でき、
A/D変換機能なども利用でき、HIDaspxの可能性が広がります。

http://hp.vector.co.jp/authors/VA000177/html/ATmega88C0B8B3E8.html

ただし、例によって、avr-gccのバージョンアップの副作用があるようで、
対応に苦労されているようです。私も協力したいのですが、時間的な余裕が
ありません。例のPIC18F14k50(30個)も入手したのですが全くの手付かず
の状態です。


irukaさんの快挙!(Arduino付属のWinAVRの不具合を解明)

senshu (2009-10-21 (水) 22:19:50)

irukaさんのページは、いつも刺激的です。

「本日のドジ」と書いていますが、全く内容は異なります。開発システム側の
不備により、正しく生成されない部分を追求し、それを解決しています。

わかってしまえば簡単ですが、この部分の解決に要した時間は相当の苦労が
あったと思います。(感謝!)

http://hp.vector.co.jp/authors/VA000177/html/2009-10.html


Arduino Firmataとは

senshu (2009-10-21 (水) 00:56:14)

いつも道具や環境ばかり整備していて、応用に疎くなっていたようです。

最近のArduinoではFirmataという仕組みが使えるようになっています。

私は、今までProce55ingとArduino間を通信させるときにはシリアル通信用のコードを
別々に書いていました。これは結構面倒です。しかし、今では標準で「Firmataライブラリ」
が利用できます。PC側から制御する場合は、Arduino用のコードを書くことなく、Proce55ing
の記述のみでArduinoを制御できるのです。

詳しくは、以下のURLをご覧ください。

http://kousaku-kousaku.blogspot.com/2008/12/processing-arduinofirmata.html

prose55ingからコントロールする場合には、Arduino(AVR側)にFirmataライブラリを
書き込んでおきます。これにより、prose55ingベースの利用が可能になります。
何となく、UBWやGainerを思わせる仕組みです。なお、USB-serialの変換基板を利用すれば、
dude-wrapを使った環境でも利用可能です。

ただし、ライブラリは大きめです。サンプルをコンパイルしてみましたが7〜8kBは必要でした。
mega88では厳しいサイズであり、これを活用するにはmega168以上が必須だと思います。
mega328Pも安価になったので、これを使えば存分に利用できると思います。


未サポートのAVRマイコン用のBootLoaderを実現する

senshu (2009-10-20 (火) 18:10:30)

こうした話題はGoogleで検索すると多数見つかります。

「Arduinoのbootloaderについて深追い」
  ↓
http://www15.atwiki.jp/arduino/pages/36.html

このページを見ても、少メモリのFLASHの場合には「ブートローダ不要」という展開です。

ぜひ、dude-wrapの採用を提案したいところですね。


hidspxに同梱しているfuse.txtにも修正が必要

senshu (2009-10-19 (月) 21:59:04)

irukaさんのページでわかるように、ATmega168とATmega328PのFUSEバイトには
割り当ての違いがあります。

現行のhidspxに同梱している fuse.txtには以下の記述があります。

Device: ATmega88
Device: ATmega88P
Device: ATmega168
Device: ATmega168P
Device: ATmega328P
 :

このように、現状ではこれらのAVRマイコンは同じビット割り当てを仮定していますが、
実際には違いがあるわけです。データシートをよく読み、修正する必要があります。

;-----------------------------------------------------------------------------;
Device: ATmega88
Device: ATmega88P
Device: ATmega168
Device: ATmega168P
Mode: ISP/Parallel
Low: 76543210
     ||||++++-- CKSEL[3:0] システムクロック選択
     ||++-- SUT[1:0] 起動時間
     |+-- CKOUT (0:PB0にシステムクロックを出力)
     +-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)

High:76543210
     |||||+++-- BODLEVEL[2:0] (111:無, 110:1.8V, 101:2.7V, 100:4.3V)
     ||||+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
     |||+-- WDTON (1:WDT通常動作, 0:WDT常時ON)
     ||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
     |+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
     +-- RSTDISBL (RESETピン 1:有効, 0:無効(PC6))

Ext: -----210
          ||+-- BOOTRST (1:Normal, 0:BootLoader)
          ++-- BOOTSZ[1:0] (11:128W, 10:256, 01:512, 00:1024)

;-----------------------------------------------------------------------------;
Device: ATmega328P
Mode: ISP/Parallel
Low: 76543210
     ||||++++-- CKSEL[3:0] システムクロック選択
     ||++-- SUT[1:0] 起動時間
     |+-- CKOUT (0:PB0にシステムクロックを出力)
     +-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)

High:76543210
     |||||||+-- BOOTRST (1:Normal, 0:BootLoader)
     |||||++-- BOOTSZ[1:0] (11:256W, 10:512, 01:1024, 00:2048)
     ||||+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
     |||+-- WDTON (1:WDT通常動作, 0:WDT常時ON)
     ||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
     |+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
     +-- RSTDISBL (RESETピン 1:有効, 0:無効(PC6))

Ext: -----210
          +++-- BODLEVEL[2:0] (111:無, 110:1.8V, 101:2.7V, 100:4.3V)

一応、修正案を書いてみましたが、mega328Pをお持ちの方に試していただきたいと
思います。


  • senshu 2009-10-19 (月) 22:19:42
    Atmel社も何の理由でこうした変更を行ったのでしょうか。

    利用者にとっては「百害あって一利なし」です。罪な仕様の変更ですね。

  • senshu 2009-10-23 (金) 10:44:09
    ここにも似た報告がありました。

    シンセ・アンプラグドさんの2009-08-23の記事「Pakurino の ATmega328P 化 (2)」です。

    http://d.hatena.ne.jp/pcm1723/20090823/1251042624

    悩ましい変更です。

代表的なArduinoのFUSE設定

以下は、ArduinoにおけるFUSE設定を図式化(hidspx -rf)したものですが、
意図した内容になっていると思います。

;;; -fL0xff -fH0xdd -fX0x00 ATmegaBOOT_168_diecimila.hex
Low: 11111111
     ||||++++-- CKSEL[3:0] システムクロック選択
     ||++-- SUT[1:0] 起動時間
     |+-- CKOUT (0:PB0にシステムクロックを出力)
     +-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)

High:11011101
     |||||+++-- BODLEVEL[2:0] (111:無, 110:1.8V, 101:2.7V, 100:4.3V)
     ||||+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
     |||+-- WDTON (1:WDT通常動作, 0:WDT常時ON)
     ||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
     |+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
     +-- RSTDISBL (RESETピン 1:有効, 0:無効(PC6))

Ext: -----000
          ||+-- BOOTRST (1:Normal, 0:BootLoader)
          ++-- BOOTSZ[1:0] (11:128W, 10:256, 01:512, 00:1024)

;;; -fL0xff -fH0xda -fX0x05 ATmegaBOOT_168_atmega328.hex

Low: 11111111
     ||||++++-- CKSEL[3:0] システムクロック選択
     ||++-- SUT[1:0] 起動時間
     |+-- CKOUT (0:PB0にシステムクロックを出力)
     +-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)

High:11011010
     |||||||+-- BOOTRST (1:Normal, 0:BootLoader)
     |||||++-- BOOTSZ[1:0] (11:256W, 10:512, 01:1024, 00:2048)
     ||||+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
     |||+-- WDTON (1:WDT通常動作, 0:WDT常時ON)
     ||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
     |+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
     +-- RSTDISBL (RESETピン 1:有効, 0:無効(PC6))

Ext: -----101
          +++-- BODLEVEL[2:0] (111:無, 110:1.8V, 101:2.7V, 100:4.3V)

  • senshu 2009-10-20 (火) 13:23:46
    irukaさんのwikiより引用
    '-fh11011001' とやるところを '-fl11011001' とやってしまい、
    この設定では、以下のようにLow Power Crystal Oscillatorになります。
    Low: 11011001
         ||||++++-- CKSEL[3:0] システムクロック選択
         ||++-- SUT[1:0] 起動時間
         |+-- CKOUT (0:PB0にシステムクロックを出力)
         +-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)
    Device Clocking OptionCKSEL3..0
    Low Power Crystal Oscillator1111 - 1000
    Full Swing Crystal Oscillator0111 - 0110
    Low Frequency Crystal Oscillator0101 - 0100
    Internal 128 kHz RC Oscillator0011
    Calibrated Internal RC Oscillator0010
    External Clock0000
    Reserved0001
    このモードでは、一般的なクリスタルでは発振しない場合もあるので、強制クロック注入
    が必要かも知れません。

ArduinoにATmega328を使うには一工夫必要

senshu (2009-10-19 (月) 10:04:32)

Arduino関係で有名な船田さんによれば、ATmega328に差し替える場合、ブート
ローダに一工夫必要とのことです。

http://www.nnar.org/?s=%E3%81%AB%E3%81%97&paged=7

以下のURLで公開されているものなら不具合無く使えるようです。このページは
見たことがあります。私は、以前から(m168用)ここから入手したパッチを適用
して使っていました。

http://www.ladyada.net/library/arduino/bootloader.html

Arduino-0017に添付されているブートローダのソースは、mega328を考慮したものに
なっていますが、上記のURLで示されるパッチの意味を再検討する必要はありそうです。


  • senshu 2009-10-19 (月) 12:23:01
    irukaさんのサイトで、この件に関係する興味深い考察が書かれています。

    http://hp.vector.co.jp/authors/VA000177/html/ATmega328PA4CEfuse.html

    これによれば、「添付のmega328用HEXファイルでは不安定で、修正したHEXファイル
    により、安定に動作するようになった」とのことです。

328P用のパッチは適用されているか

  • senshu 2009-10-20 (火) 12:32:46
    OGURAMさんからの遠隔コメントです。

    http://d.hatena.ne.jp/OGURAM/20091020

    現行のArduino-0017に付属するブートローダなら問題はない、とのことです。

    例によって、ブートローダのソースを確認してみました。
    #ifdef WATCHDOG_MODS
    	ch = MCUSR;
    	MCUSR = 0;
    
    	WDTCSR |= _BV(WDCE) | _BV(WDE);
    	WDTCSR = 0;
    :
    #else
    	asm volatile("nop\n\t");
    #endif
    となっていて、WATCHDOG_MODSを有効にした場合には、WATCHDOGパッチが適用されるよう
    なっています。通常は未使用です。また、ATmega328P対応を確認しました。

    RESETでブートローダが機能するかどうかは、回路がシンプルすぎるので、環境に
    依存する部分があるようです。

    dude-wrapを利用すれば、ISP対応の回路構成にすれば書き込めないトラブルは発生しません
    ので、かえって入門者に向いていると感じてきました。

hidspxでArduinoのブートローダを書き込む

senshu (2009-10-18 (日) 21:49:14)

Arduinoのprogrammers.txtを元に、hidspxのコマンド行に変換してみました。
作業ミスを避けるため、AWKスクリプトを使って自動生成しました。

atmega328-e -fL0xff -fH0xda -fX0x05 ATmegaBOOT_168_atmega328.hex
diecimila-e -fL0xff -fH0xdd -fX0x00 ATmegaBOOT_168_diecimila.hex
mega-e -fL0xff -fH0xda -fX0xf5 ATmegaBOOT_168_atmega1280.hex
mini-e -fL0xff -fH0xdd -fX0x00 ATmegaBOOT_168_ng.hex
bt-e -fL0xff -fH0xdd -fX0x00 ATmegaBOOT_168.hex
lilypad328-e -fL0xff -fH0xda -fX0x05 ATmegaBOOT_168_atmega328_pro_8MHz.hex
lilypad-e -fL0xe2 -fH0xdd -fX0x00 LilyPadBOOT_168.hex
pro328-e -fL0xff -fH0xda -fX0x05 ATmegaBOOT_168_atmega328_pro_8MHz.hex
pro-e -fL0xc6 -fH0xdd -fX0x00 ATmegaBOOT_168_pro_8MHz.hex
atmega168-e -fL0xff -fH0xdd -fX0x00 ATmegaBOOT_168_ng.hex
atmega8-e -fL0xdf -fH0xca ATmegaBOOT.hex
mym168-e -fL0xff -fH0xdd -fX0xf8 ATmegaBOOT_168_ng.hex
attiny2313-e -fL0xe4 -fH0x9d -fX0xff ATtiny2313.hex

以下は、上記のコマンド行作成に利用したAWKスクリプトです。

BEGIN {
   FS = "[.=]"
   chip = "";

   while (getline < "boards.txt" > 0) {
       chip = $1
       if ($2 == "bootloader") {
           if ($3 == "low_fuses") {
               cmd = " -fL" tolower($4)
           } else if ($3 == "high_fuses") {
               cmd = cmd " -fH" tolower($4)
           } else if ($3 == "extended_fuses") {
               cmd = cmd " -fX" tolower($4)
           } else if ($3 == "file") {
               cmd = cmd " " $4 ".hex"
           } else if ($3 == "unlock_bits") {
               print chip " -e" cmd
           }
       }
   }
}

こうした用途には、AWKは非常に便利に使えます。
HEXファイルのサイズは、以下のようになっています。

  text    data     bss     dec     hex filename
     0    3862       0    3862     f16 ATmegaBOOT_168_atmega1280.hex
     0    1950       0    1950     79e ATmegaBOOT_168_atmega328.hex
     0    1932       0    1932     78c ATmegaBOOT_168_atmega328_pro_8MHz.hex
     0    1958       0    1958     7a6 ATmegaBOOT_168_diecimila.hex
     0    1702       0    1702     6a6 ATmegaBOOT_168_ng.hex
     0    1968       0    1968     7b0 ATmegaBOOT_168_pro_8MHz.hex

AVRマイコンは1W=2Bytesですから、mega1280を除き、1kW以内に収まっています。


  • senshu 2009-10-19 (月) 00:56:38
    irukaさんが、ATmega328のブートローダで苦労している話を書かれています。

    http://hp.vector.co.jp/authors/VA000177/html/2009-10.html

    dude-wrapでhidspxを使う場合には苦労も不要なのですが、配線の手間は増えます。
    (ISPコネクタが付いていればよいのですが)

    上記のFUSE設定も不完全な箇所があるのだと思いますが、早期に解決したいものです。
    FUSE設定はこの設定が正しく、ブートローダ用のHEXファイルの修正にて安定動作するように
    なった、との情報がありました。↑のスレッドをご覧ください。

Arduino IDEとavrdudeへの期待

senshu (2009-10-17 (土) 19:06:40)

avrdudeの最新のソース(2009-1012)には、avrdude側でarduino protcolにてDTR/RTSの
ON/OFF (RESETピンの操作)が可能になっています。このようなパッチが正式に認められ、
Arduino IDE側でも利用されるようになれば、dude-wrap利用時も待ち時間が解消され、より
快適な利用が可能になります。

--- arduino.c   (revision 864)
+++ arduino.c   (working copy)
@@ -92,8 +92,11 @@ static int arduino_open(PROGRAMMER * pgm, char * p
   serial_set_dtr_rts(&pgm->fd, 0);
   usleep(50*1000);
   /* Set DTR and RTS high to trigger reset */
   serial_set_dtr_rts(&pgm->fd, 1);
   usleep(50*1000);
+  /* Bring DTR and RTS back low */
+  serial_set_dtr_rts(&pgm->fd, 0);
+  usleep(50*1000);

正式に導入されるには、半年もかかるのでしょうか。avrdudeとArduinoの開発者の相互の努力に
期待します。当面、困っていないのでArduino IDEの修正は行わず、今後の改定を待ちます。


avrdude「ブートローダを保持するためのオプション」

senshu (2009-10-17 (土) 18:32:04)

Arduino IDEがUpload時に生成するavrdudeコマンド行の例を示します。

avrdude_orig.exe -CC:\Arduino\hardware/tools/avr/etc/avrdude.conf \
-q -q -pm328p -cstk500v1 -P\\.\COM5 -b57600 -D \
-Uflash:w:C:\Arduino\examples\Digital\Blink\applet\Blink.cpp.hex:i

注目すべきは -Dオプションです。消さないで書く(-D)を指定しています。
これは、消去せずに書き込みを指示するオプションです。

hidspxでは、-Dオプションに相当する機能はありません。通常のライタの使い方では
この仕様で問題はなく、-Dオプションは不要と考えていました。hidspxのソースを読め
ばわかりますが、ソースを修正しない限り、ブートローダの保護は実現できません。

しかし、dude-wrapを使ってhidspxで開発を進めると、ブートローダが消去されるため、
既存のArduinoスタイルの開発も併用する場合、互換性の面で問題が生じる可能性があり、
hidspxに実装が可能なら-D機能を追加したいと考えています。

dude-wrapでは、hidspxに相当するオプションがないので、このオプションを省略し、
通常の消去後に書き込むようになっています。その結果、ブートローダの領域は消去され、
0xffに置き換わります。

デバイスを消去せずに書き込みを実現するにはページ消去機能が必要ですが、幸いなことに
ArduinoがサポートするAVRマイコンでは対応しているように思えます。

ということで、このオプションが簡単に追加できるなら、hidspxにも追加したいと思います。


-Dオプションはブートローダ限定か?

  • kuga? 2009-10-17 (土) 18:45:01
    ページ消去は自己プログラムの時だけで、ISPのシリアルプログラムではできないはずです。
  • senshu 2009-10-17 (土) 21:07:38
    kugaさん、有益なコメントを感謝します。データシートを読んでも、この部分の理解が難しい
    のです。xmegaでは可能との記述もあり、扱いに苦慮していました。

    avrdudeのオプションで、stk500v1 と-Dを指定しているので、可能なのだと思いました
    が、これは自己プログラム限定で機能することになりますね。これで、dude-wrapの仕様が妥当
    であることも再確認できました。
  • senshu 2009-10-17 (土) 21:08:53
    この件に関し調べてみると、avrdudeの付属ドキュメントには以下の記述がありました。
    「チップ消去」を実行する理由(意訳)。 
    「チップ消去」はフラッシュ ROM と EEPROM の内容を『0xff』にリセットし、すべてのロッ
    クビットをクリアします。 ページ単位で扱える ATxmegaデバイスを除き、フラッシュ ROM を
    プログラムする前に「チップ消去」を実行する必要があります。ただし、書き換える内容がビット
    『1』⇒『0』に変更する場合は、消去無しで変更可能です。
    
    なお、EERPOM セルのプログラムには、明示的な事前のチップ消去は不要です。なぜなら、MCU 
    はセルのプログラムでオート消去サイクルを提供するからです。

  • senshu 2009-10-17 (土) 23:39:14
    マニュアルを再度、調べてみました。ATmega88Pの日本語データシート(P189)からの抜粋です。
    27.9. 直列プログラミング手順
    
    ATmega48P/88P/168P に直列 データ を書く時に データ は SCK の上昇端で行われ、
    ATmega48P/88P/168P から読む時に データ は SCK の下降端で行われます。タイミング の詳細
    については図 27-9.をご覧ください。
    直列 プログラミング 動作での ATmega48P/88P/168P の プログラミング と照合は次手順が推
    奨されます (表 27-17.の命令 セット 参照)。
    
    1. 電源投入手順:
       RESET と SCK が Low(0) に設定されている間に VCC と GND 間へ電源を印加します。
       いくつかの システム で電源投入中、SCK が Low に保持されるのを書き込み器が保証でき
       ません。この場合、SCK が Low(0) に設定されてしまった後、RESET は最低 2CPU クロック
       サイクル幅の正 パルス を与えられなければなりません。
    
    2. 最低 20ms 待ち、MOSI ピンにプログラミング許可命令を送ることによって直列プログラミ
       ングを許可してください。
    
    3. 通信が同期を外していると、直列プログラミング命令は動作しません。同期していると、プ
       ログラミング許可命令の第 3 バイト送出時に第 2 バイト ($53) が戻ります。この戻りが
       正しいかどうかによらず、命令の 4 バイト全てが送信されなければなりません。$53 が戻
       らない場合、RESET に正パルスを与え、新規プログラミング許可命令を行ってください。
    
    4. フラッシュ メモリは 1 ページ単位で書かれます。ページ容量は 182 頁の表 27-9.で得ら
       れます。このメモリ ページはページ設定命令と共にアドレスの下位 5/5/6/6+1 ビットと
       データを供給することによって 1 バイトづつ設定されます。ページが正しく設定されるの
       を保証するため、与えられたアドレスにデータ上位バイトが適用される前にデータ下位バイトが
       設定されなければなりません。プログラム メモリのページはアドレスの上位 6/7/7/8 ビッ
       トを含むページ書き込み命令の設定によって (フラッシュ メモリに) 格納されます。
       ポーリング (BSY/RDY) が使用されない場合、使用者は次のページを行う前に最低 
       tWD_FLASH(表27-16.参照) 待たなければなりません。
       フラッシュ書き込み操作完了前の(ポーリング以外の) 直列プログラミング インターフェー
       スでのアクセスは不正な書き込み結果になり得ます。
    
    5. EEPROMはページ単位かバイト単位のどちらかでプログラミングできます。
     バイト単位: EEPROM は適切な EEPROM 書き込み命令と共にアドレスとデータを供給すること
       によって 1 バイト単位で書かれます。EEPR OM のメモリ位置は新規データが書かれるのに
       先立って始めで自動的に消去されます。ポーリング (BSY/RDY) が使用されない場合、次の
       バイトを行う前に最低 tWD_EEPROM(表 27-16.参照) 待たなければなりません。
     ページ単位: EEPROM の 1 ページは EEPROM ページ設定命令と共にアドレス下位 2 ビットと
       データを供給することによって 1 バイトづつ設定されます。EEPROM ページはアドレスの上
       位 6/7/7/8 ビットを含む EEPROM ページ書き込み命令によって (EEPROM に) 格納されます。
       EE PROM ページ アクセス使用時、EEPROM ページ設定命令で設定したバイト位置だけが変更
       されます。残りの位置は無変化で留まります。ポーリング (BSY/RDY) が使用されない場合、
       次ページ (表 27-10.参照) を行う前に最低 tWD_EEPROM(表 27-16.参照) 待たなければなり
       ません。チップ消去されたデバイスでの $FF データは書かれる必要がありません。
    
    6. どのメモリ位置も選択したアドレスの内容を直列出力 MISO に読み戻す読み出し命令を使用
       することによって照合できます。
    
    7. プログラミング作業終了時、RESETは通常動作を開始するため、High(1)に設定できます。
    
    8. 電源OFF手順 (必要とされるならば)
       RESETをHigh(1)に設定します。
       VCC電源をOFFにします。
    これを見る限り、チップ消去が必要とは書かれていません。ただし、ArduinoではLockビットを
    セットしており、このセットを解除するにはチップ消去が必須となります。Lockビットがセット
    されていない場合に部分的な書き換えが可能なのかは興味のあるところです。なお、パラレル書き
    込みの項には以下の記述があり、パラレル・シリアルの両方に共通事項なのだと思います。
    (「実行されなければなりません」の解釈は原文を読むとやや微妙ですが)
    27.7.3.	チップ消去
    チップ消去はフラッシュ メモリ、EEPROM(注 1)、ロック ビットを消去します。ロック ビット
    はプログラム メモリが完全に消去されてしまうまでリセット (消去) されません。
    また、ヒューズビットは変更されません。チップ消去はフラッシュ メモリや EEPROM を再書き
    込みする前に実行されなければなりません。
    注1: EESAVEヒューズがプログラム(0)されていれば、EEPROMはチップ消去から保護できます。
  • senshu 2009-10-18 (日) 08:20:57
    悩むよりも、USBaspとavrdudeを使って、実際に試してみるのが重要と思っています。
    手元に試す環境が無いので、明日以降に結果を書きます。

-Dで書き込むと、avrisp-mkII互換機でエラー発生

  • senshu 2009-10-25 (日) 22:53:22
    avrispmkii互換のライタを使って、-Dオプションが機能するか(消去せずに部分
    的な書き換えが機能するか)を確認しました。

    ATtiny2313で確認したところ、消去無しで書き込むと正しい書込みができず、照合
    エラーになることを確認しました。

    というわけで、BootLoaderを残しながら書き換えるのは難しいことがわかりました、

dude-wrapでブートローダを書き込む場合の注意点

senshu (2009-10-16 (金) 15:28:12)

dude-wrapは、hidspxでフラッシュメモリに書き込むので、ブートローダは不要です。
また、ここで書き込んだブートローダはスケッチプログラムをhidspxで書き込む時に消去
されるので、「書き込む意味も無い」ようにも思えます。

そこで「ブートローダの書き込み」を行う理由を解説します。

1. 主要なAVRマイコンは、工場出荷時「1MHz RC発振モード」で出荷される
2. hidspxは、動作周波数に見合った -dN を指定することで効率よく動作する

AVRマイコンを利用する場合には、適正なFUSE設定が必須ですし、他の環境で利用できる
「Arduino互換機」を簡単に実現できます。hidspxでは、avrdudeとの互換性に配慮して
いるので、未定義ビットを'0'で表記したFUSE設定もエラー無く扱うことができます。
もちろん、'1'にしたSTK500互換の表記も正しく処理できます。

Arduino IDEでは、ブートローダの書き込み時にFUSE設定を行う

という仕組みがあることに着目し、この機構を利用してFUSE設定を可能にしました。
なお、適正なFUSE設定を完了している場合には、ローダの書き込みは不要です。

また、HIDaspxはCOMポートを使用しませんので、COMポート指定も不要なのですが、
Arduino IDEでは、COMポートのDTR信号線をON/OFFします(リセットピン制御)。

この仕組みにより数秒のタイムラグが生じます。hidspxではDTR制御は不要ですがArduino
側を変更しない限り、この仕様の変更は難しいようです。


  • おぐらむ? 2009-10-16 (金) 17:38:16
    ああ、すみません。私のことだと勝手に解釈して、弁明させていただきます。
    私のBlogに書きましたが、今回はArduinoクローンを作ろうとしていて、意図的に
    ブートローダを書き込みたかったのです。

    dude-wrapの想定している用法と異なるのでどうかなと思ったのですが、ブートローダ
    の書き込みで挫折している方も結構いらっしゃるようなので、dude-wrapを使えば簡単
    にできますよ程度のつもりでした。
  • senshu 2009-10-16 (金) 17:49:53
    ああ、すみません。私のことだと勝手に解釈して、弁明させていただきます。
    OGURAMさん、読み返すとあまり優しくない文に見えますね。他意はありません。
    それどころか、いつも精力的にテストを行っていただき大変感謝しております。

    今回はArduinoクローンを作ろうとしていて、意図的にブートローダを書き込み
    たかったのです。
    こうした目的にも利用出来ますが、以下の事実を理解しておく必要があります。
    (1) dude-wrapを使ってスケッチを一度でも書き込むと、ブートローダは消去される
    (2) dude-wrapで開発後に標準的な利用を行う場合にはブートローダの再書き込みが必要
    私は作っている側なので疑問にも思いませんが、「ブートローダを書き込んだのに
    いつの間にか消えている」という疑問が生じることを心配していました。

    なお、hidspxは USBaspやCOM-SPIブリッジ、各種のLPTポートを利用したライタを
    サポートしています。

    HIDaspxは、USBのバスパワーが使え、廉価で、ドライバのインストール不要、という
    特徴を有し一押しですが、日本国内で広く普及しているライタをサポートしているのも
    hidspxの大きな特徴です。

    ぜひ、付属の説明書もご覧ください。

    OGURAMさん、今後もブログを楽しみにしております。

  • senshu 2009-10-16 (金) 18:27:41
    自分で書いていて気づきましたが、ブートローダが無いのにブートローダ用の
    FUSE設定を書いているのは、問題が起きるかもしれません。

    Arduino用のブートローダでは、FUSE設定により、RESET時にブートローダのアドレス
    から実行しますので、ブートローダの有無でFUSE設定を切り替える必要があります。

ブートローダを保持する方法(使い方でカバー)

  • senshu 2009-10-17 (土) 09:40:18
    hidspxではブートローダの保存はできませんが、毎回ローダを書き込む設定も可能です。
    protocol=hidspx,-d1,ブートローダファイル.hex(Full PATHで記述する)
    のように設定します。hidspxでは、複数のファイル指定すると、それらをマージして書き込む
    ことができ、ブートローダも保持できます。書き込み時間が2秒程度増加しますが、書き込みは
    高速なので許容範囲です。

    ※数秒でも高速な方がよいと感じる場合は、利用を終えた後にブートローダを書き込む
     方式(現行)をお勧めします。

「dude warp」を翻訳すると、、、

senshu (2009-10-15 (木) 01:18:58)

avrdudeをwrapし、hidspxとの連携を実現するツールに「dude-wrap」という
ベタな名前を付けました。

「dude-wrap」を機械的に和訳すると「都会人包装」となります。都会人がスマート
とは限らないのですが、それほど悪くもない命名だと思っています。一般的な名称なので
google検索で、このソフトの特定ができないのが欠点ですが、arduinoとペアで検索すれ
ば特定は可能です。

OGURAMさんと私とirukaさんのページしかヒットしませんが、他に使っている方はいません
か? Arduinoに興味のある方には、かなり便利なツールだと思います。

同種のツールで、もっとスマートに実装した例があれば教えてください。


  • senshu 2009-10-16 (金) 06:53:32
    dude-wrapの特徴は、導入後もhidspxの拡張機能を利用しなければ、導入前と全く同様に
    機能する点です。

    導入作業は、ATtiny2313対応のファイルやdude-wrap用の実行ファイルをコピーし、
    テキストファイルを修正します。修正済みのファイルを提供することも可能ですが、
    修正の意味の理解も重要と考え、手修正を採用しました。Readme.txtの記述では
    面倒に思えますが、10分間程度の時間で完了する簡単な作業です。

    非常に安価なArduino開発環境を実現でき、操作性はArduinoそのままです。購入したAVR
    マイコンをセットし、FUSE設定もメニューから実行でき、すぐに利用を開始できます。

    HIDaspxをお持ちの方はほとんど出費無しで利用可能ですから、この機会にぜひArduinoの
    使い勝手をお試しください。


「激安Arduinoの作り方」 v.s. 「dude-wrap」

senshu (2009-10-14 (水) 18:36:14)

「激安Arduinoの作り方」が以下のURLで紹介されています。
http://www15.atwiki.jp/arduino/pages/35.html

しかし、かなり面倒な印象です。これと比べると、dude-wrapを利用した
Arduino2313の操作性は、手前味噌ですがかなり優れたものだと思います。

今後、利用者の増加により、より一層洗練された開発環境に発展させたいと
考えています。


Arduino IDEでhidspxの起動が遅い理由

senshu (2009-10-13 (火) 22:30:28)

dude-wrapを利用すれば、Arduino IDEからhidspxを利用できます。

実際に使ってみると、ATtiny2313という廉価なマイコンでもArduino IDEから普通に
利用できます。FUSE設定やスケッチの書き込み操作も通常と全く同じです。
大きなスケッチではエラーになりますが、シンプルなものなら無修正で動作します。

ただしhidspxを直接使った時に比べ、書込み時HIDaspxのアクセスLED(赤色)が点滅す
るタイミングが遅い(tiny2313, mega168共)ことに気づきます。

これは、Arduino IDE側で手動によるRESETスイッチの操作を行う為の時間を考慮しての
仕様です。この時間は、hidspxを使う場合には必要ないのですが、ブートローダへの配
慮が足枷となっているわけです。

hidspxによる処理が1秒未満でも、hidspxの起動まで約6秒も待たせられるのは理不尽
ですが、Arduino本体には手を加えないという方針で小手先の小技で対処しているので、
これ以上の改善は困難です。

つまり高速なhidspxも、Arduino IDE側の仕様により低速動作になっているのです。
hidspxを使った方が書き込み自体はかなり高速なのですが、耐えられないようなら
java側のソース修正も考えます。


  • senshu 2009-10-13 (火) 23:47:03
    「待ち時間の改善に妙案をお持ちの方はぜひご一報ください」と書いてはみたものの、
    ソースを見た方が早いということで、ソースを調べてみました。
    ソースを見る限り、avrdudeを起動する前に、COMポートの操作を行ない、タイムアウトに
    なるのを待っているのが原因のようです。

    http://code.google.com/p/arduino/source/browse/#svn/trunk/app/src/processing/app/debug

    書式のラフさが気になりますが、このソースを修正でhidspxに対応させる方が
    dude-wrapを書くよりも簡単なことがわかります。(頻繁に更新されるので保守が
    難しいですが)