2010年5月19日水曜日

Make: Tokyo Meeting 05に出展します

今週末、東京工業大学 大岡山キャンパスで開催される Make: Tokyo Meeting 05に出展します。

詳しいイベント情報はこちら
Make: Tokyo Meeting 05
MAKE: Japan : Make: Tokyo Meeting 05

開発部9課の展示は体育館、プレゼンスペースのすぐ前。

あと3日、まだまだ準備できていません。
実験用に作った、ブレッドボードで使えるモジュール等をいくつか販売予定です。

2010年5月5日水曜日

Arduinoのリセット~その後

Arduinoのリセットについて、まだやってました。MTM05の準備もしないで大丈夫なんだろうか。

Arduino本体に手を加えずに確実に起動させる方法を考えていたのだが、完全ではないが十分な成果が得られた。ResetHelperと呼んでいるが、+5V、GNDとRESET信号の 3つで動作する、ちょっとした回路だ。これもシールドと呼べるのだろうか。

前回までのデータと見比べて欲しいが、まずUSBケーブルを差した場合。
ドライバの影響で繰り返す部分では時間が 50ms程度になってしまっているが、最初の電源立ち上り時には 250ms程度のリセット時間が確保できている。10Vまで上昇してしまう現象にも対処している。

外部電源を使用した場合はこのようになる。
250ms程度のリセット時間が確保できている。これは Ethernet shield等の確実な起動には効果的だろう。

そしてこれがスケッチのアップロード時の動作。
一発掛ければ十分なはずだが、何の都合か 3回目が本番のようだ。アップロード中、DTRはローを維持している。

最後にRESET信号にコンデンサを追加してしまった場合は、スケッチのアップロード時にこのようになる。
上記のブートローダ起動部分の拡大だが、残念ながら 1箇所補正できていない。しかしこの後のリセットパルスがブートローダー起動の本番なので、正常にアップロードできる。補正しきれていない部分は、使用した部品の特性が原因なのだが、実害がないとはいえ解決できずちょっと残念だ。

Arduino本体に手を加えずにできるのは、このあたりが限界かと思う。
実際に困っている話しはあまり聞かないのだが、外部電源を使うと挙動がおかしい等で困っている方は相談して欲しい。

2010年4月24日土曜日

続 -Arduinoのリセット~その3

Arduinoのリセット、まだ続きます。

その2の投稿の後、「周辺デバイス側のリセット端子にコンデンサがぶら下ってて、Arduinoのリセットがかからなかった事がある」という情報を頂いた。Thanks、arms22さん
きっとあれだな、と思えるデータが取ってあったので、追加実験もして公開しておく。

まず、リセット波形の拡大から。
ATmegaのリセット入力条件は非常に厳しく、上限は 0.1Vccとなっている。Deumilanoveのように 5Vで動いていれば 0.5Vだ。この時は Deumilanove単体での測定だが、有効時間は 65μsある。ATmegaのリセット条件としては十分だし、実際にリセットとして認識する電圧はもっと高いはずだ。

ではリセット-グランド間にコンデンサを追加すると、どうなるか。DTR信号とグランド間でコンデンサが直列となる形になるため、DTR信号がローになってもリセット信号で電圧が落ち切らなくなってしまう。0.1μFを追加した場合、こうなる。
約 2.6Vまでしか下っていない。DTR信号も若干鈍って見えるのは、負荷が重いということだろう。この電圧では、ブートローダは起動しない。

Ethernet shieldの起動不良については海外でも問題認識されているようで、リセット-グランド間にコンデンサを追加するという意見に賛否があったようだ。しかし上記の現象を見れば、良い方法ではないことが分る。少くともスケッチのアップロードに、オートリセット機能は使えない。

実際に Duemilanoveに Ethernet shieldを組み合せ、0.1μFを追加した場合、どうなのだろう。
上図はUSB給電の場合だが、W5100はぎりぎりリセットが掛かるかもしれない。
しかし、電源が変われば事情が異なる。
外部電源を使用した例だが、起動が緩やかだとコンデンサの効果はほとんどない。

追加コンデンサの容量を小さくすればオートリセットは機能するだろうが、周辺デバイスのリセット条件は満さなくなるだろう。そもそも電源次第でコンデンサの効果はほとんどないため、気休めにもならないだろう。

2010年4月22日木曜日

続 -Arduinoのリセット~その2

Arduinoのリセットには、まだ続きがある。

私は USB給電、常時 IDE使用という環境で実験していたので見落していたが、回路を良く見ると「周辺デバイスにリセットを掛ける人」が居ない。
調べてみると、Ethernet shieldの起動不良ということで、hamayanさんのレポートに情報があった。

FT232 からのリセットというのはブートローダを起動するための機能で、単に外部電源供給した場合には AVR内蔵のリセット回路で起動する。その時リセット端子から外部に向かってリセット信号を出すことはないため、これでは周辺デバイスが正常起動する可能性は低くなってしまう。

実際の起動の様子は、こんな感じ。まずは Arduino単体で外部から 8V電源供給。
期待されるようなリセット信号にはなっていない。電圧上昇時にごく僅か DTRがローになっているが、これは FT232内部が初期化される前に出ているものと考えられる。さらに電圧安定後約 6ms後に、DTRの電圧がわずかに上昇しているが、これも FT232内部動作の影響と考えられる。

続いて Ethernet shieldを組み合わせた場合。

Ethernet shield上の 3.3Vも観測しているが、特に変化があるわけではない。これでは周辺デバイスの起動は運まかせ、ということになってしまう。

続いて IDEを起動しないで、USB給電した場合。
外部電源のと立ち上がり特性の違い程度の差しか見られない。しかし、もうちょっと長い時間軸で見るとこうなる。
これは FT232のドライバの動作が影響しているのだろう。接続から 6秒ほどの間に 8回のリセットパルスが出てる。気持ち悪いが、これならば動作する。

手持ちのリセットICで適当なものが見付からなかったので十分とは言えないが、リセットはこんな感じで掛かって欲しい。
本来は電圧安定後に解除されるタイマー内蔵型が望ましいが、この状態でも無いよりはかなりマシだ。

もう一つ気付いてしまったのだが、Ethernet shieldはシールド上で作っている 3.3Vを、Arduinoに接続するコネクタに出力している。しかし Arduino Duemilanoveからも FT232内部で作っている 3.3Vを出力している。つまり双方の電源出力が衝突していることになる。端的に言えば、これはダメだ。

他のシールドをまだ良く知らないため Ethernet shieldばかり引き合いに出してしまうが、リセット、3.3Vの件に加え SDカードスロットの件もあり、落とし穴というかクセが多い。私のように回路追い掛けてばかりいる変な人は置いといて、正しくフィジカルコンピューティングしている人達には、普通に使える、落とし穴を避ける苦労の必要がない物が必要なのではないだろうかと思う。

改良版、作ってみようかな。

続-Arduinoのリセット

昨日のリセット回路ネタの続きです。

Arduino単体の場合はともかく、他のリセットを必要とするデバイスを保護したいという場合はどうするか。対策としてダイオードを実装する場合、
  1. Arduino本体を改造する。
  2. デバイス側で保護する。
ということになる。理想的には Arduino本体で、と言いたいところだが、汎用性を考えるとデバイス側ということになるだろうか。新規開発するシールドでは、リセット信号にダイオードクランプを入れておこう、と提案したい。

では、今使用しているものはどうするか。例えば Ethernet shieldを使用している場合、コネクタの RESETと +5Vの端子が空いていたら、間にダイオードを挿しておこう。
空いていなかったら、というよりこちらのほうが後々良いと思うが、基板裏側でコネクタピンの根本に付けてしまえば良い。Ethernet shieldのソケットピンは他の物よりも 5mm長いので、取り付け作業は容易だ。

ところで、どうやら Arduinoのリセットにはまだ続きがありそうだ。他にもリセット回路に疑問を持った方は居るはず、と思い調べてみると、やはり出てきた。このあたりのネタは次回。

2010年4月21日水曜日

LCDの3線接続-改

Arduinoにどれだけ周辺デバイスを接続できるか、ピン数が少ないため結構苦労することもあると思う。

無茶な例とは思うが、Ethernet shield、XBee shield、SDカードを 4bit I/Oで接続すると、アナログピンを除いたデジタルピンは 4本しか残らない。キャラクターLCDを標準ライブラリで使用するには最低 6ピン必要だから、アナログピンも使う予定であれば、足らない。

ここまで極端な例は置いておくとしても、まりすさんの「Arduino にLCDを信号線3本で繋ぐ」は一つの解だろう。で、記事を読んで、もしやと思った。

例に挙げた Ethernet shieldと SDカードは、先日の実験で共用可能となっている。SPI はモード 0だ。モード 0のタイミングと 74HC164の動作を見比べると、データ転送に使えそうだ。実験してみよう。
いろいろと省略した回路図だが、要点は 74HC164へのデータとクロックを SPIで共用して、4ビットのデータと RS信号をセットする、ということだ。LCDのための追加は E信号 1ピンで済む。この手法を使えば、先の無茶な例に LCDを追加しても、デ ジタルピンは 6本空く。

ライブラリの改造には手間取ったが、無事使えることは分った。LCDを 4bitモードで使用するためパフォーマンスは落ちるが、ソフトでビットシフト制御することを考えれば負荷は軽くなるのではないだろうか。

問題はライブラリだ。現状の Arduinoでは SPIの扱いがデバイス個別になっているため、複数のデバイスを使用する場合は複雑になってしまう。後日公開する予定にしているが、うまくまとまるだろうか。
試してみたい方へのヒントとしては、AVRの SPI機能の初期化はイーサネットライブラリ等に任せて、データ送信部分のみ実装するということだ。

最近 USB Host shieldが出てきたが、あれは割り込みを使っているようなので、今のやりかたでの共存は難しいのだろうな、と考えている。

Arduinoのリセット回路

Arduino Duemilanoveの回路図を始めて見てから、ずっとひっかかっていたことがある。リセット回路だ。

IDEからスケッチをアップロード時に、ブートローダを起動 するためのオートリセット機能として、FT232の DTR出力を使ってリセット制御している。DTR出力をコンデンサを介して接続し、充放電回路となってリセットパルスを作っている。実際にはDTR出力がローになる時にリセットパルスが発生するが、ひっかかっていたの はハイに戻る時である。

チャージポンプの理屈通り、ハイパルスは 10Vにまで逹している。通常 ICの入力電圧上限は、電源電圧+0.5V程度と規定されている。5Vで使用すれば 5.5Vだから、10Vではちょっとオーバーどころではない。
しかし、これが問題かというと、実は重大な問題ではなかった。調べてみると、ATmegaのリセット入力だけは最大 13.0Vまでと規定されていた。重大ではない問題としては、推奨範囲はやはり電源電圧+0.5Vということだ。

そういうことならば、とりあえずこれで OKかというと、そうでもない。他のデバイスと組み合わせた場合に問題となる。たとえば Ethernet shieldと組み合わせると、こうなる。

単体の場合よりもピーク電圧が低く 7.5Vとなっているのは、Ethernet shield上の W5100の入力保護等の影響だろう。しかし W5100の最大入力電圧は 5.5V、これはマズいだろう。

というわけで対策を考えるが、よくやる簡単な方法、ダイオードクランプで試してみた。手持ちのショット キーダイオードを使ったところ、こうなった。
ピーク電圧 5.2V。これならばなにも心配はない。次は通常の小信号用といわれる一般的なダイオード。多少電圧は上がるかもしれない。
ピーク電圧 5.6V。これなら、まず問題はないだろ う。

Arduinoは手軽にシールドを組み合せて使えるところも、人気になっている要因と思う。だから組合せによっては壊してしまう可能性 が潜んでいるというのは、ちょっと残念だ。部品の干渉や、必要なコネクタを省略してしまって組み合せられない等の問題は、もう少し考慮されてもいいと思う。

リセットの件は、せめて国産互換機は対策されているといいな、と願う。