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

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

2010年4月18日日曜日

Ethernet Shieldの改造

Ethernet Shieldの出力で試した、W5100の MISO(先の記事ではDOと表記)を開放する改造の実例を公開する。

追加するのは IC1個。SSを反転して SENに入力する。PROG端子を使用する予定があれば、ICの出力に 1kΩ程度の抵抗を直列に入れておくと良いだろう。ここでは SN74AHC1G04が使用されているが、3.3V電源で使用して 5V入力が許容できるタイプなら他でも構わない。
ところで EAGLEは始めて使ったのだけど、ICの電源ピン用のリファレンス、ここでは IC5Pの表示だが、隠しておくことはできないのだろうか。ちょっと探してみたが、解らなかった。

これは実装例。イタリアの北側。拡大すると、こんな感じだ。

数箇所レジストを削って半田付けしてあるが、配線は 1本のみ。

これで他のSPIデバイスと共存が可能となる。

2010年4月13日火曜日

XBeeシールド

妙な形状の XBeeシールドを見てみよう。
USB コネクタとの干渉を避け、LEDが見えるように切り欠きがある。この部分には、更に上のシールドへのソケットが無いわけだが、信号自体は Arduino本体から直接取り出せる。ソケットヘッダだけを挿して延長するという手も使えるだろう。
しかし電源部のコネクタは XBeeモジュールに塞がれたままである。モジュール用の電源は ICSPコネクタから取っている。

Ethernetシールドの場合、コネクタの干渉をどうやって回避しているのかというと、
実はピンが 5mm長い。どこかで入手できるのか?


3段重ねの写真を見た覚えがあるが、XBeeシールドが Ethernetシールドの RJ45コネクタと干渉してしまい、完全に差し込むことはできない。仕様変更があったのだろうか。

Ethernetシールドには ICSPコネクタがないため、コネクタの干渉を回避できて挿せたとしても、電源とリセットは別に配線する必要がある。

SparkFun製の XBeeShieldもあるのだが、回路図を見るかぎりでは、必要な電圧変換が行なわれていないため、使わないほうが良いだろう。
用途によっては Ethernetと Zigbeeの中継のようなアプリケーションも考えられると思うのだが、簡単にはいかないようだ。


訂正:電圧変換ではありませんが、対策はされていました。SparkFun製の XBeeShieldは使えそうです。

Arduino FIO

先週末、Arduino FIOを入手した。arduino.cc他で紹介されているのを見て妙に気になってしまい、金曜の昼休みに発注してしまった。届くのは週明けかと思ってい たが、土曜の午後には届いてびっくり、スイッチサイエンスさん、ありがとう。
とりあえず現物を眺めてみる。小さい、ブレッドボードに載せられそう なピン配置、XBeeが載せられる、といったところだろうか。その他にもリチウムイオン充電池用の充電回路があり、電源スイッチも付いている。
XBeeモジュールを載せてみると、FIOのターゲットというかコン セプトのようなものが見えた気がした。たぶんブレッドボードに載せるというのは違うのだろうと思う。XBeeモジュール横のスペースは電池用にピッタリに 思える。となると拡張用のソケットは主要部品側に実装することになるが、ここをピンヘッダとしてブレッドボードに挿すと不便だろう。逆側にピンヘッダを実装しても XBeeモジュールが邪魔になる。つまり FIOは無線子機に特化したものなのだろう。


FIO側をソケットにすると当然シールド側がピンヘッダとなるが、ブレッドボードに載せられて、他への流用も容易だろ う。FIOでの使用が前提でも、シールドをブレッドボードに載せて、Arduino nanoと組み合せて開発、というのは良さそうに思う。
などと 考えながら、シールドを作ってみた。
















加速度センサーと+@が載っているが、片面基板で作ったため、組み立てると部品は内側に入って目立たない。手元にあったソケットの高さがあったため、ちょっと厚めな感じになったが、部品搭載には都合よかった。他で使用予定だったリチウムポリマ電池の大きさがぴったりで、見た目は良いが容量が少な目だ。
残念なのは、手持ちの XBeeモジュールがワイヤアンテナ仕様で、邪魔そうに見えるところか。そのうちチップアンテナ仕様のモジュールも手配しよう。

2010年4月6日火曜日

Ethernet Shieldと SDカードの併用

SPIを使った複数デバイス動作の当面の目標、というより手元にある Ethernet Shieldと SDカードを同時に動作させてみた。

まず先の実験の結果より、SDカードと Ethernet Shieldの出力が衝突しないように回路を追加する。
デバイスの選択は SSピンにより行なわれるが、AVRを SPIマスタとして使用しているときは単純なデジタル出力で、ソフトウェアで制御する必要がある。ハードで勝手に制御されるわけではない。これは 2つ目のデバイス用の SSを、適当なピンに割り当てて使用できるということであり、都合が良い。今回は SDカード用の SSを digital pin 9に割り当てた。

2つのライブラリが SPI機能を使うわけだから、競合して不具合が起きないようにしなければならない。SSの割り当て変更のついでに FatFSを修正した。内容は AVRの SPI機能の初期化部分の削除と SS制御部分の変更だけだ。SPI機能の初期化は Ethernet用ライブラリに任せるため、初期化の順序は気を付けなければいけない。

こんな大雑把な方法で良いのかよく判っていないのが本音だが、うまく動いているようだ。

ハードの改造が前提の部分が多少面倒だが、こういった組合せで使いたかった人の参考になれば幸いだ。

Ethernet Shieldの出力

Ethernet Shieldと SDカードを、SPI接続を共用して同時に使用するには、Ethernet Shield上の W5100も DOを開放してくれないと競合してしまう。確認してみよう。

SDカードの確認と同様に、DOは出力がハイインピーダンスになったことが判るように、抵抗分圧で終端してある。しかし非アクセス時もローレベル出力、DOは開放されていない。

W5100の機能を調べると、SPI機能を制御するピンがあり、メーカーのガイドにも他のデバイスとの併用方法が載っている。改造して確認すると、こうなる。


SENが制御用信号で、DOが開放されていることが確認できる。Ethernet Shieldの改造が前提になってしまうが、これならば SDカードとの併用も可能だろう。

あとはライブラリの工夫次第だろう。が、そこのところが良く判っていない。実際に併用動作させるには、まだまだ苦労しそうだ。

2010年4月5日月曜日

文章作るのはなかなか大変だ

前の投稿には図を貼ってみたが、思うように貼れなかった。2枚目の下、本文との間に妙な空間ができてしまうのだ。ブラウザを変えて確認しても同様なので、Bloggerの投稿エディタのくせなのだろうか。

特に調べて Bloggerを選んだわけではないが、他の有名所とは少し違うようだ。トラックバックがないというのも使い始めて知った。もっともトラックバックはスパム防止のために使用しないかたも多いようなので、なければ困るということでもないだろうが、コメントよりも有効な場面もあるように思う。

始めたばかりですぐに引越しというのもナニなので、しばらくはここで続けてみようと思う。

SDカードの出力

Ethernet Shieldではイーサネットの処理に WIZnet社の W5100という ICを使用しているが、この ICの制御は SPIで行なわれている。そして使用不可能とはなっているが、SDカードの制御は SPIではなく、通常のデジタル I/Oで行うようになっている。

もともと SPIは複数のデバイスが制御可能なので、信号線を共用できれば I/Oの節約にもなる。ところが少々やっかいなことに、SDカードの出力にはくせがあり、気を付けないと他のデバイスの出力と衝突する。このあたりの情報はChaNさんのMMCの使いかたが詳しい。

制御の工夫次第で衝突は回避できるようだが、Roland Riegelさんのライブラリではどうだろうか。実際の出力を見てみよう。



まず SDカード直結の場合。DOは出力がハイインピーダンスになったことが判るように、抵抗分圧で終端してある。SSが SDカードのセレクト信号でローアクティブ。連続したアクセス期間の前後で DOが開放されていない。拡大部分のように DOが開放される場合もあるが、このままでは他のデバイスとは共存できない。


















次は SSを使用して DOを切り離す仕組みを追加した場合。連続したアクセス期間の前後で DOが開放されている。もちろん拡大部分のようにアクセス期間中の非アクセス時も DOはが開放されている。これならば他のデバイスとの共存に問題はない。

もちろんこの状態で SDカードへのアクセスは問題ない。
ライブラリを修正しても対応は可能と思うが、互換性等を考えればハードウェアで対処するのが良いだろう。

2010年4月4日日曜日

SDカード

手元に Ethernet Shieldがある。Arduinoに載せるだけでイーサネットI/F完成という、非常に便利なものだ。もちろんライブラリもサンプルコードも IDEに標準で用意されていて、サンプルの IPアドレスを設定すればすぐに動いた。
このシールドには目立つ部品未実装のスペースがある。以前は SDカードソケットが「NOT SUPPORTED」のシールとともに実装されていたようで、使えないから今はソケットも載せてないということのようだ。
探してみると SDカードの需要はあるようで、ソケット付きの Ethernet Shieldを改造した例もあった。また本家arduino.ccにも Ethernet Shieldで使用する例が紹介されているが、紹介されている方法には問題があるように思え、私はお勧めできない。

ちょうど SDカードソケットもあることだし、Ethernet Shieldとは別に SDカードの実験をしてみた。

SDカードは SPIモードでアクセスすると簡単に制御できる。いくつか見付かるライブラリも AVRの SPI機能を使っているので、先人の例にならって SPI接続とする。注意が必要なのは Duemilanoveの I/Oが 5Vなのに対し、SDカードは3.3V I/Oなので、電圧変換が必要ということ。実験ということで多くの方と同様に出力は抵抗分圧、入力は AVRの実力に期待することとする。
ライブラリに関してはRoland Riegelさんのものをベースにしたものが多く見られるが、今回はarms22さんのFatFs libraryを使わせて頂いた。Arduinoで扱うには非常に手軽でありがたい。

先例があるにも関わらず、最初は動かなかった。原因が 3点あり、分圧抵抗が大き過ぎ、電源コンデンサ不足、SDカードのフォーマットが問題だった。分圧抵抗もコンデンサも SDカードの物によっては問題にならない場合もあるが、安定動作させることを考えたらそれなりの回路が必要と思う。フォーマットは Windowsのエクスプローラでフォーマットした場合に非互換になる場合があるようで、SDアソシエーションで配布しているフォーマッタを使用して解決した。

次は Ethernet Shieldと共存させることを考えてみたい。

2010年4月2日金曜日

Arduino

昨年、ちょっとしたものを作るのに Arduinoを試してみた。
フィジカルコンピューティングという言葉とともに良く目にするようになっていたが、調べてみると Arduinoに関しては、専用ハードウェアと使い易い開発環境というように見て構わないようだった。専用ハードウェアといっても特定の AVRマイコンに専用ブートローダを書き込んだものでよく、部品箱にころがっていた AVRで試せそうだった。
試してみると、従来のマイコン工作と比較すれば非常に簡単で、なるほどこれなら流行るかなと感じた。簡単なぶん制約も多いが、用意されたライブラリのおかげで、簡単な実験程度であれば手間がかなり省けた。
始めは実験的に使ってみるだけのつもりだったが、最終的に Arduinoだけで完結してしまった。

その後、別件のついでに Make: Tokyo Meeting に寄ることがあったのだが、出展されている皆さんの作品で Arduinoを目にした。イーサネットを使っていたり、XBeeで無線通信していたり、使われかたはさまざまであったが、これもライブラリが充実しているおかげなのだろうなと思った。市販されているボード以外にも、私が試したような部品を集めて作ったものもあったのではないかと考えると、結構な数があったのではないだろうか。
見て回っているうちに何かやれそうに思い、会場で販売していた Arduino Duemilanoveといくつかのシールドを購入した。

結局はしばらく使うことなく時間が経ってしまい現在なわけだが、とりあえず環境をととのえ、お約束の LEDチカチカまではできた。

準備は OKだ。