« 2009年6月 | トップページ | 2009年8月 »

2009年7月の5件の記事

2009年7月28日 (火)

2号機開発がなかなか進まない

 このところ電子工作以外のことに時間をとられたこともあるが、LPCMプレーヤーの2号機の開発は殆ど進展していない。気分が乗るときは夢中になるのだが、波がある。Olimexの休みの話を聞いて出鼻をくじかれたのと、EAGLEのパーツ作りが思うように行かず、ちょっとスランプ状態に入ったようだ。

 それでも、手を動かしていないと落ち着かない性分になってしまったので、2号機の実装に必要な機能のテストを少しづつやっている。

ソフトパワースイッチの落とし穴(7/23/09)
 擬似コーディングでソフトパワースイッチの骨格はできた。しかし、このときに使うsleepのパワーダウンモード(セーブモードよりもっと節電)を実際に動かしたことはまだ一度もない。がた老AVR研究所では、初期の頃の電池からDCアダプターを電源に使うようになって、節電に余り気を使わないようになっていた。これまで使っていたsleepはすべてアイドルモードである。正式に組み込む前にこのパワーダウンモードが動くか確かめておいたほうが良い。

 最近のAVRプロセッサーで名前の末尾がPで終わるチップは、Pがピコワットの頭文字であるように、これまで以上の省電力をうたっている。データシートを見てみるとMega168Pのパワーダウンモード時の消費電流は何と0.1μAである。ボタン電池あたりの自己放電電流の1/10である。これなら大威張りでソフトパワースイッチに出来るというものだ。Mega168

 ソフトパワースイッチを組み込む対象のLPCMプレーヤーはブレッドボード上に一式残っているが、いきなり入れて混乱するのを避け、実装は直近のミニLCDのテストプログラムで行うことにした。

 データシートには丁寧な解説があるし、そんなに難しい処理があるわけでもない。最初は気楽に考えて実装に入った。しかし、考えていたことを実際に動くようにすることはやっぱりそう簡単ではなかった。しかも大きな考え落ちを見つけて気分が重い。

 周辺のタイマーも全て止まっているパワーダウンモードからCPUが目覚めるのは外部割込みだけである。外部割込みは周波数カウンターや、初期のTinyなどで何度も経験済みだ。これまでのプログラムからコードをとりだし、レジスターをMega168用に取り替える。鼻歌交じりでブレッドボードにタクトスイッチをつける。ものの1時間もかからない。簡単に動くと思った。しかし、これが動かないのである。

 仕方がない。モニターにUARTメッセージを出すステートメントを入れて(いわゆるprintf)デバッグに入る。おやあ、スイッチを押しても割り込みルーチンに処理が来ていないぞ。割込みそのものが起きていない。データシートをもう一度見直す。やれやれ「データシートは穴が開くほど見よ」である。データシートに明記してあった。パワーダウンモードは確かに外部割込みでsleepから目覚めるが、目覚めるのは「外部割込みのレベル割込み」だけなのだ。こちらはスイッチの「立下り」を一生懸命待っていた。

 あわてて割込み条件を「Lowレベル」にする。と、今度は、スイッチが押されている間中割り込みが入り、長押しの時間を測るどころではない。うーむ、困った。まさしく考えたようにコンピューターは動かない。書いたようにしか動かない。

 これで良いのかどうかわからないが、割り込みが来れば、割り込み条件をただちにレベル割り込みから立下り割り込みに換え(このあとの制御に使うため)、割り込みリクエストをクリアし、次のパワーダウンsleepに入る前にもう一度レベル割込みに戻すコードを付け加える。よーし、2秒長押しで電源が入った。今度は電源断のルーチンだ。でもその前にどれくらいの消費電流になっているか調べてみよう。テスターを取り出す。

 まず実行時で6mA程度。電源をOFF/ONしパワーダウンモードにする。何い、パワーダウンしても3mA以上流れているぞ、LEDか?いやそんなものつけていない。LCDか。しまった。CPUはパワーダウンしてもLCDの電源は入ったままだ。これはいかん。こいつの電源もCPUで制御しないとソフトパワースイッチにならない。これは大きな考え落ちだ。

 それはとにかく、LCDをブレッドボードからはずす。何と、電流が変わらない。この電流はLCDではない。プルアップ抵抗?まさか。はずしてみる。変化なし。とすると、あとはPCとつないでいるISPケーブルしかない。このテストプログラムは、ISPを利用したUARTをモニターにしている。ええー、こんなところに電流が流れるの?PCの端末プログラムは動かしていない。

 電流の主はやっぱりISPケーブルだった。こいつをはずすと、150μAに激減した。LCDをはずすと0.4μA。やれやれやっとスペック(0.1μA)に近い消費電流に落ちた。あとはプルダウン抵抗を通してCPUやLCDに流れ込む電流だろう。ミニLCDの消費電流の150μAは優秀だけど、これを流しっぱなしにするわけにはいかない。

 LCDの電源をパワーダウンモードと同時に切る必要が出てきた。いくらCPUがμA以下でも、周辺機器に150μAも流れれば何にもならない。FETか何かで切る必要がある。しかし、今度の2号機はもうスペースがない。やっぱりスライドスイッチを使うのか。

 次の日、電源断のロジックも入れてソフトパワースイッチのテストプログラムは完動した。2号機にソフトパワースイッチを実装するかは微妙になってきた。周辺機器の電源制御は結構厄介で、下手な制御をすると、予期しないところに電流が流れて誤動作したり、ひどいときにはCPUそのものをこわしてしまったりする(どちらも経験済みだ)。スライドスイッチはケースの上蓋や、余裕のある半田面のケース側につけようと思えばつけられる。

 それに「でんし研」のTADさんからのコメントで、プリント基板発注のOlimexが8月一杯夏休みで注文を受け付けてくれないということがわかった。これは計画を大幅に作り直す必要がでてきた。流れはスライドスイッチを入れた手配線版を実装する方向に傾きつつある。

いつのまにか動いたミニLCD(7/24/09)
 2号機のLCDの換装のテストをした。ブレッドボードにあるLPCMプレーヤーから秋月の「超小型」LCDとDC-DCコンバータをはずし、さらに小さいストロベリーリナックスのミニLCDをセットする。ハードはいたって簡単。インタフェースはI2Cなので、これまでのパラレルのデータ4本、制御線3本、それに電源、グランド合わせて9本のケーブルに対して、信号線2本、電源も含めて4本をつなぐだけである。ずいぶんすっきりした。A7282092

 ソフトのほうは先に公開したミニLCDのライブラリを入れて、メインのLCD関数をミニLCDのものに換える。たいした手間ではない。テストに入る。全く反応なし。まあ、こういうのには慣れている。コードをもう一度見直す。どこも間違っていない。それでも動かない。段々頭に血が昇ってくる。いかん、いかん。落ち着いて最初から見直そう。

 基本的なところからチェック。電源は入っている。暴走はしていない。スイッチは反応して音楽は通常に演奏する。それではと、こういうときのためのUARTを復活させる。ありゃ、やっぱり初期化でエラーが出ている。ロジアナを持ち出す。いやちゃんとI2Cは動いている。

 こうなったらデバッグステートメントてんこもりだ。I2CのsendコマンドにUARTの出力をぶちこむ。盛大に送信データとリターンコードがPCに流れる。おやあ、正常終了だぞ。あ、画面が出ている。何も他に変えていない。UARTでI2Cコマンドのタイミングが遅くなったので動いたのか。デバグステートメントをはずしてみる。何と何と、正常に表示するではないか。原因がわからずに動いてしまった。気分が悪い。

 日を空けて原因究明にとりかかる。このライブラリは公開しているので責任がある。いつのまにか動くということは、また、いつのまにか動かなくなるということを意味する。放っておくわけにはいかない。自慢にもならないが、こういうときの粘着質には人には負けない自信がある。気分を落ち着けて、動くまでのひとつひとつの工程を思い出し、手順を戻してテストしていった。

 その結果、LCDのリセットピンを浮かしたまま、リセットをしないモードで動かすと、LCDが動かなくなることを確かめた。リセットをしないのなら、このピンは確実にHigh(Vcc直結)にしておく必要があるが、最初の頃は確かに何も接続していなかった。

 UARTを入れたりするデバッグの最中、リセットピンもついでに配線してリセットありでコンパイルした記憶がある。このときはUARTの初期化を間違えて端末にメッセージが出なかったため、すぐコンパイルし直したが、LCDの方は確認していなかった。

 恐らくこのときに動いたのだろう。リセットをするか、リセットピンをinactive(High)にしてどちらも動作することを確かめ問題は解決した。いやいや慌てることはデバッグの一番の敵である。

 ミニLCDの印象である。文字は小さいが視認性は悪くない。1行目のアイコン表示のところに何も表示されないので、少し間が抜けているが、アンテナや電池などのアイコンはどうも今回のプレーヤーには役に立ちそうにない。採用は見送ることにする。

scan_files( )の機能を落とす(7/27/09)
 機嫌よく、ブレッドボードの2号機用のLPCMプレーヤーを鳴らしてテストするうち、1枚のSDカードで暴走しシステムリセットがかかるようになった。TinyFatFSでは問題がなかったカードである。今度のFatFSのバージョンアップによる不具合であることは明らかだ。

 しかし、このカードで動かなくなる原因には心当たりがある。ディレクトリがあるカードである。現在のLPCMプレーヤーはルートディレクトリ上のWAVファイルしか演奏対象にせず、ディレクトリ以下のファイルは無視しているが、レジューム機能のときにSDカードを特定するため、ファイルサイズとファイル数をChaNさんのFatFSの内部関数scan_files( )を使ってサブディレクトリ下のファイルまで全部数え上げている。

 scan_files( )の仕様が変わったのだろうか。ディレクトリのアトリビュートにロングファイルネームのオプションが入ったのが気になる。ソースコードを調べる。全く変わっていない。UARTを入れてシステムリセットがかかる原因を調べていく。

 予想通り、scan_filesで暴走していることが確かめられた。UARTをさらに奥深く入れて検証する。おやあ、このディレクトリはさらに下にまだディレクトリを持っているぞ。あああ、わかった。スタック領域がSRAMを潰しているのが原因にちがいない。このscan_files(  )は自分で自分を呼ぶ、再帰構造になっており、これは大量のスタックデータを消費する。

 TinyFatFSからFatFSに上げてSRAMが残り少なくなっていた(90%)のが気になっていたが、やっぱり駄目だったか。試しに、このディレクトリの構造を一段少なくすると暴走しなくなった。これが原因であることは間違いない。

 ルートディレクトリのファイルしか見ていないのに、scan_files( )で全部のファイルを調べる必要はない。過剰品質である。しかし、見事な美しい作りなのでオリジナルを生かしたままにしておいたのが仇になった。泣く泣く、scan_files( )に手を入れて、ルートディレクトリだけのファイルを数えることにする。これでどんなに複雑なディレクトリ構造のカードでも暴走はしないはずである。

 2号機に向けてのソフト開発はこれで一段落したようだ。今回はソフトパワースイッチは実装を見送ることにする。残るは、手配線に着手するか、EAGLEをさらに攻めるかである。

 上記トラブルは、ディレクトリのないSDカードでは発生しません。もしディレクトリがあるSDカードで、ディレクトリの階層が深い(3段以上)ときは、メインファイル(SDPCM328V3.c)の193行目にある、scan_files(char* path)の以下のステートメント4行をコメントアウトしてください。これでscan_filesはルート上のファイル、ディレクトリしか数えませんが実用上は全く問題ありません。

            if (finfo.fattrib & AM_DIR) {
                acc_dirs++;
//                *(path+i) = '/'; strcpy(path+i+1, &finfo.fname[0]);
//                res = scan_files(path);
//                *(path+i) = '\0';
//                if (res != FR_OK) break;
                                          } else { .........

(以上)

| | コメント (0) | トラックバック (0)

2009年7月20日 (月)

プリント基板の道は遠い

EAGLEのバージョンが古かった(7/18/09)
 プリント基板CADの勉強を参考書で始めている。    レイトレーシングで有名なフリーのPOV-Rayを使って3D CADも出来るようだ。素晴らしくきれいにレンダリングされた基板の写真が口絵にある(添付の画像は著作権のため本家のもの)。これはすごい。20年前なら一部の大企業が莫大な開発費用をかけ、大型機でやっとのことで実現してきたことが、こんなアマチュアの世界でも可能になった。良い時代になったものだ。Fetchphp

 今度のLPCMプレーヤーの回路図を入力し始める。これまでのCADとはユーザーインターフェースが違うが基本的なことは同じなので、そうまごつく事はない。moveで、ちゃんと結線を維持したまま移動できる。機能はフリーウエアのCADに較べると格段に高そうだ。ただ、回路図を入れただけで、自動配線までやらせるためには、これまでのように気楽に部品を設定し、そこをつなぐだけというわけにはいかない。部品の諸元を厳密に決めているライブラリがしっかり出来ていないとそこまで行き着けない。

 しかし、ウェブの解説ページにもあるように、EAGLEのライブラリはヨーロッパ主体で、日本のおなじみの部品が標準ライブラリに少ない。ウェブで検索してもなかなか適当なのが見つからない。ICはともかく、SDカードのソケット、基板用のステレオフォンジャック、平型の2連可変抵抗器などは、どうも全部自分で作るしかないようだ。

 メインのIC、Mega328(168)すらAtmelのライブラリに入っていない。おかしいな、これもないのかとウェブで探す。やっと見つけてインストールしてみたら、古いバージョンには入らないと怒られた。ええー、この参考書そんなに古いのか。去年(2008年)のはずだぞ。奥付をもう一度確かめる。しまった。初版は2004年で5年も前だ。去年と思ったのは第三版の発行日付だった。

 参考書のEAGLEのバージョンは4.11r2である。あわてて、ウェブで最新バージョンを確かめる。うわあ、5.60だ。違いすぎる。去年3版を出したのなら少しはこのあたりを補足しておいて欲しかった。良く確かめて参考書を買うんだった。後の祭り。

 進歩の早いこの世界では、参考書はよほど気をつけて買わないとこういうことが起きる。全体的な流れを掴むために参考書を使うのだが、こんなにバージョンが大きく変わってしまうと個々の細かい説明が違ってしまって結局それすら出来なくなる恐れがある。そうならないことを祈りたい。

 慌てて、製造元のCadSoftのサイトに行き、最新バージョン(25MBあまり)をダウンロードする。旧版を消し、インストールしなおす。Atmelのライブラリを見る。ちゃんとMegaの新シリーズ(Mega8系)のパーツが揃っていた。別のサイトからダウンロードしたMega168のパーツも無事認識された。

 配線は出来ても、自動レイアウト、自動配線(Autoroute)まで行くには、今度のLPCMプレーヤーにかなりなライブラリを自分で登録する必要がある。まだ相当時間がかかりそうだ。基板の発注は、これも定番のブルガリアのOlimex(この前のARM-USB-TINYインタフェースを買ったところ)に決めてあるが、発注して基板が送られてくるのまで2週間はかかるという。

 一方、EAGLEの勉強と並行して、ケースの工作の方は順調に進み、ケース上蓋とタクトスイッチ、LCDの間の高さ調整(タクトスイッチはリード線を延ばしてOK。LCDはピンソケットでぴったりOK)、基板取り付けポストの固定も済んだ。レイアウトをもう一度検討しなおし、右利きの人が片手で持って、音量調整と演奏ボタンが親指で楽に出来るようにした(自分は左利きだが)。部品を載せて全体を確かめる。うむ、何とか入った。汎用基板で作る準備は整った。A7172088

 今、迷っている。早く作りたいという気持ちと、ここで実装を始めれば、それに夢中になって、プリント基板の方が全く進まなくなる懸念とが交錯している。EAGLEの1枚のフリー基板で2セットとれるので(50×40 2枚)、3台作るなら1台足らない。手配線版が無駄になることはないと思うが、プリント基板制作を軌道に乗せる方が先だ。しかし、ケースにきれいに取り付けられたハンダ付けを待つブランクの汎用基板を見ていると誘惑に負けそうになる。

ソフトパワースイッチ検討と新版 LPCMプレーヤーのソース公開(7/21/09)
 ハードはさておき、2号機のソフトウエアの話である。このあいだFatFSを新しいバージョンに上げ、SDHCが読めるようにしたが、ソースコードを公開していなかった。忘れたのではなく、あの時点ではSDHCが動くかどうかを確認していなかったからである。

 BeagleBoardのために8GBのカードはあったが、Ubuntuのシステムが入っていたためこれでテストをするわけにはいかなかった。その後秋葉原に行ったときもう一枚8GBのSDカードを買ってきた(あきばおー¥1550)。ちゃんとしたブランド品のSanDiskだ。いつも不思議に思うのはSDカードの価格である。秋葉原、通販あたりと、家電量販店の価格の差が激しすぎる。数倍あることは珍しくない。保証の差だと言ってしまえばそれまでだが、これまで10枚以上SDカードを買って一度も不良品にあたったことはない。秋葉原でも2週間以内の初期不良には対応する。

 それはともかく、帰って早速テストしてみる。問題なく動作した。¥2000しないこんな小さな8GBカード一枚で、音楽CDが12枚近く入るのだ。良い時代というより、今までの常識が通用しない空恐ろしい時代になったともいえる。

 ソースの公開だが、実は先日、ブログのメールでソース公開の要請を受けた。これまで自分のソースコードが誰かの役に立っているという実感がなかったのだが、こういうメールを頂くと素直に嬉しい。ただ、こんどのLPCMプレーヤーのVccは3.3Vで、メーカーが保証する規格外の20Mhzのクロック(メーカーでは13.3Mhzまで)で動かしている。全く問題なく動いているとはいえ、規格外であることは間違いない。

 もし、遊び以外で使う時は、Vccを5Vに上げ、SDカードとの間はレベルシフターで接続することをお勧めする。まあ私のソースコードも無保証だから、あまり形式にこだわることはないのかもしれない。

 2号機向けのソフトは、これにミニLCDの実装と、スイッチの長押しで電源を入れるソフトパワースイッチの実装が残っている。これを含めてソースを公開しようと考えていたが、早めにこれだけで公開することにした。         

 AVRStudioのフォルダーになっています。最初のコンパイルで警告が出ますが無視して大丈夫です。

「SDPCM328V3.lzh」をダウンロード

 ソフトパワースイッチもちょっと難航している。自分なりの構想は出来ているのだが、他の人はどうしているのだろう。気になってウェブをあちこち探しているのだが、何処にもロジックを解説しているところがない。

 考えてみると、結構難しい。もし、どこかでハングして電源が切れなくなったら、バッテリーをはずすなどの作業をしなければ、あっというまに電池を消耗してしまう。特に今回は過放電に敏感なリチウム電池なので心配である。徹底したフェイルセーフにしておく必要がある。出来ればリセットをうまく使って、おかしくなれば即リセットし、最初のパワーセーブsleepに入れるようにしてやりたい。

 これまでのロジックを余りいじらず付加機能的に実現しておこうと、暇さえあればメモをとりながらロジックを考えていた。コードの視認性を高めるためには大きなループは避けたい。といってC言語ではロジックを関数として切り出すと、内部変数がグローバル化し、バグの原因になる。難しいものだ。しかし、結局は、今のメインのソースコードをそっくり関数に切り出した以下のような構造になってしまった。擬似コーディングなので細かいところの調整は必要だが、これで余り構造を変えず、しかも見やすいソフトパワースイッチのロジックの目処がついた。ウェブには、意外とこういう情報が少ない。参考になれば幸いである。

Softpwrsw

(以上)

| | コメント (5) | トラックバック (0)

2009年7月16日 (木)

LPCMプレーヤー2号機開発の道草

LPC2388のRTCバッテリーバックアップに挑戦する(7/12/09)
 思わぬ道草を食ってしまった。ストロベリーリナックスのミニ液晶表示装置を2種類のIICで動かすライブラリを開発して、ちょっと自慢したくなり、ショップの問い合わせフォームで報告したら、あのPICNICで有名な社長の落合正弘氏ご本人がすぐメールを返してくれた。ショップへのこうした連絡はなしのつぶてということが多い。誠実な態度に感激した。

 記事をアップしてからすぐ「ねむい」さんからコメントを貰い、ソフトIICのDDRの謎はいっぺんに解けた。冷静に考えれば、出力ポートを最初0にしておけば、ポートをハイインピーダンスの入力から出力に切り替えれば、そのポートは0になるというのは自然なことだ。 もっと早く気が付くべきだった。そのうえ、リリースしてからすぐバグを見つけてしまい、少しめげている。

 ソースコードを見ていただければわかるが、欲張ってスクロールしようと思ってコードを追加したらあまりにも遅い(クリアに1msかかる)ので元へ戻したあと、テストを十分していなかったのが原因である。くやしいので、クリアをやめてDDRAMにデータとブランクを書き込む手法もあとから試したが、これもあまりスクロールに見えない。2行程度では難しいようだ。余計落ち込む。

 こういうときは、手を動かしていやなことを忘れるに限る。前々からやろうとしていたARMのもうひとつの雑誌付録基板、LPC2388のバッテリーバックアップ配線に挑戦することにした。前の記事では、これはとても無理だと書いたが、このあいだChaNさんの掲示板にある動画で、ご本人が苦もなく、0.5ミリピッチで並ぶピンを切り、配線しているのを見てしまった。うわあ、出来るんだ。驚きと同時に勇気を奮い立たせてくれた。A7112057

 しかし、手持ちの道具では、あんな細いピンを切ることは不可能だ。市販の超極細ニッパの刃先は0.3ミリというから、これで切れるのかもしれないが、出来るか出来ないものに¥2000近く投資するのも何か馬鹿らしい。

 で、暫く様子を見ていたが、たまたまアートカッターというクラフトワークに使う極細のカッターがあるのをウェブで発見した。刃先の厚さが0.38ミリだと言う。これなら切れるかもA7152071しれない。値段も¥500から¥1000前後で手頃だ。他の用途にも使える。東急ハンズを覗いてみたら沢山あったので手頃なカッターを2本買ってみたが、すぐには取り掛からずにいた。

 ところが、さらに強力な武器が思わぬところから手に入ったのである。このところ持ち歩いているSDカードプレーヤーを久しぶりに訪れたなじみのパブで自慢したら、何を考えたかマスターが奥からLED照明つきのヘッドルーペを持ち出してきた。使ってくれと言う。先日亡くなった母が使っていて誰か使ってくれる人がいないか探していたのだそうだ。渡りに船とはこのことだ。有難く頂戴した。

 道具が揃った。ヘッドルーペをつける。少し重いが、3倍の拡大率で視点を自由に変えられるので、A7112060作業しやすい。カッターで少しづつVbatピンを削って切っていく。これがなかなか難しい。ニッパーならあっという間だろうが、隣のピンを痛めずに一つのピンだけを切るのは簡単ではない。しかし始めてしまったらもう切るしかない。切り屑が出てきて切れたか切れないかルーペを通しても良くわからない。別のピンを切っていたら最悪である。何度もピンを数えて確認する。

 隣のピンも何か傷んできたようだ。これはまずい。もうやめようかとあきらめかけた時、Vbatピンが浮き上がってきた。おおお、切れたようだ。A7112063切り屑を針と洗浄剤で掃除して、テスターで切れたことを確かめる。よし、大丈夫だ。隣も確かめる。OK。いやあ冷や汗をかいた。

 切断に較べたら、半田付けは気分的に楽だ。この前の1608のチップ部品のハンダ付けの経験が生きている。問題は線の引き回しだ。基板上にピンヘッダーを横置きしてボンドで固め、ここにVbatピンか ら引き出した0.2ミリのUEW線を配線する。

A7112068 ベース基板にCR2032のフォルダーを付け、やっとのことでLPC2388のバッテリーバックアップ配線は完成した。いや楽しかった。こういう細かい手作業はいやなことを忘れさせてくれる。テストは...2号機が出来るまでお預けにしておこう。

EAGLEの入門書を買ってきた(7/15/09)
 色々道草を食ってきたが、2号機開発の作業は遅々としているとは言え、少しづつ進んでいる。ソフトパワースイッチは、大体目処がついた。FatFSが丈夫になったので、ソフトがハングして、電源が切れなくなる可能性は少なくなったが、今のスイッチルーチンの構造は、スイッチが離されるまで外へ出ないので、この構造は変える必要がある。押している間に、LCDが動き始めたり、消えたりしないと、操作性が悪い。

 まあ、これはソフトの世界なのであとから何とでもなる。ミニLCDが動いたので、ソフトの懸案は大体片付いた。いよいよメイン基板の具体的な設計に入る。

 その前に、バッテリフォルダーの制作にかかる。エポキシ系の接着剤が強力なことがわかったので、1号機で苦労した電池接点基板は、ケースの三方に接着するだけで必要な強度はとれそうである。汎用基板をルーターのカッターで切り出し、やすりで削ってケースに合う電池接点基板を作る。A7152084

ここへ、燐青銅線の接点をつける。このあいだの充電基板で試した形状の接点が簡単で具合が良いので、同じ型にする。経験が生きている。簡単につけることが出来た。テスターで電圧を測る。うむ、軽く当てるだけで安定した電圧がとれている。快調である。これなら複数台をこなせそうだ。

 メイン基板のレイアウトをもういちどやりなおす。充電回路も組み込むのでさらに大変である。部品が全部乗せられるかどうもかも自信がない。しかし、今度のメイン基板は、横の電池と同じ高さなので、配線A7152076 側が7ミリ近く空いている。いざとなったら、抵抗などはこちら側に入れることができるのでなんとかなるだろう。

 それより大きな懸案は、配線である。汎用基板にUEW線で配線することにすっかり慣れてきており、これくらいの密度でも配線できる自信はあるが、同じものを複数作れるかというと、とてもその気力はない。今回のプレーヤーは少なくとも3台は同じものを作らなければならないことになりそうである(身内1台、ヘッドルーペを貰った店1台、会社1台)。

 となると、プリント配線である。しかしこれはこれまでの工作とは全く違う大変な作業だ。もとより感光基板から作ることは考えていない。大掛かりな道具立てが必要で、今要求されているような精度の基板が作れるようになるまでには、気の遠くなるような時間がかかるだろう。現実解としてはCADで設計図を描いて、外国に発注すると言うのが一番有力なコースである。

 今までに何度か、これをやってみたい気になったことがあ36301lるが、これはこれで相当な心構えと準備が必要なのでそう簡単に始められるものではない。

 しかし、機は熟してきたようである。CADの定番、EAGLEの勉強を始めることにした。これが道草になるのかどうかは議論のあるところだが、手配線でも出来ることをCADでやろうというのだから道草の内に入るだろう。とはいえ、これがアマチュアの強みである。誰に束縛されるわけでもない。自由に自分のやりたいことができる。

 ウェブには、沢山の経験記やノウハウが載っているが、ここはオーソドックスに全体を見渡せる勉強法にしよう。書店で、「プリント基板CAD EAGLE活用入門」(\2800)という参考書を買ってきた。読み始める。また新しい登山口に立った。頂上は見えないが、未知との出会いに心が躍る。

| | コメント (1) | トラックバック (0)

2009年7月10日 (金)

ストロベリーリナックスのミニLCDのライブラリ公開

(7/10/09)Mlcd
 最近、売り出した低電圧で動くI2Cを使ったストロベリーリナックスの液晶ディスプレイのドライバーがやっと公開できるレベルに達した。このLCD、小さいが2行16文字が表示でき、低電圧(2.7Vまで)で動くのが嬉しい。昇圧用のDC-DCコンバーターなどが要らない。ただインタフェースがI2Cなので知らない人にはとっつきにくいだろう。

 今度公開するライブラリは、標準のTWI(I2CのことをAVRではこう呼ぶ。ライセンスの関係らしい)を持っているAVRチップ(Megaシリーズ)だけでなく、持っていないチップ(Tinyシリーズなど)でも、GPIO(普通のIOピン)を使って、簡単な関数呼び出しだけで文字、アイコンを、このミニLCDに自由に出すことが出来る。I2Cに関する知識は要らない。ライブラリだけならフラッシュサイズは1Kバイトそこそこで入る。

 ソフトウエアで実現するI2Cは当研究所では、ずっと前にTiny26でUSIインターフェースを使ったドライバー(マスター・スレーブとも)を完成させている。当初はこれを組み込んで、TWIとの二本立てと考えていたが、途中で気が変わった。USIインターフェースそのものがTinyシリーズでしか実装しておらず、しかもピンが固定されている。MegaシリーズでもI2Cを2チャンネル使いたい時もある。GPIOを使ったI2Cの方が汎用性が高い。

 それなら、このあいだのChaNさんのFatFSの中にあるAVR用のRTCドライバーである。この前FatFSを使った時、このソースを読み、I2Cインターフェースを実に軽妙にソフトで実現しているのに感動した覚えがある。

 このときはフラッシュサイズを縮めるためこのRTC.cをそのまま使わず、TWIに替えたので、実際にはこのコードは使ったことがない。ちょうど良い機会だ、これを使わせてもらおう。早速FatFSのライブラリのRTC.cから必要なコードを取り出し、#ifでソースを入れ込んでいく。

 気が抜けるくらい余りにも少ないコードでI2Cを実現している。1バイトを送信するだけなら、RTC.c全体の1/3くらいしかない。たいしたもんだ。これで本当に動くのか半信半疑でテストに入る。悪い予想があたってGPIOのI2Cはエラーを大量に吐き出してつながらなかった。

 オシロではそれらしい波形が見えたのに、ロジアナでは全く反応がない。実はこのコードにはもともとよく理解できないところがある。GPIOピンを上下にドライブするのに、DDRという入出力指定レジスターだけを叩いている。これがどうもよくわからない。

(オリジナル)
#define SCL_LOW()    DDRE |=    0x04         /* SCL = LOW */
#define SCL_HIGH()    DDRE &=    0xFB        /* SCL = High-Z */
 (DDREはポートEのDDRレジスター、PE2(0x04)がSCL)

 ChaNさんが書いたコードだ。ぬかりがあるわけはない。どこかに何かを設定するとこれで動くのだろう。しかし、それが何なのか見つけられない。色々いじったが事態は全く好転しない。どうもおかしい。オシロで見えて、ロジアナで見えないというのが何か気になる。臭い。しかしこうなるとハードの問題で、これ以上はちょっと手が出せない。

 悩んだ挙句、強引だがこのDDRレジスター以外に、PORTもドライブするコードを入れてテストしてみた。
(変更したもの)
#define SCL_LOW() {mLCD_DDDR|=(1<<mLCD_SCL); mLCD_DPORT&=~(1<<mLCD_SCL);}while(0)    /* SCL = LOW */
#define SCL_HIGH() mLCD_DDDR &=  ~(1<<mLCD_SCL)    /* SCL = High-Z */
(mLCD_DPORTはSCLのポート番号、mLCD_SCLはSCLピン)

 スイッチを入れる。おおお、ロジアナにそれらしい波形が戻った。ちゃんとスタートコンディションを作っている。立派、立派。しかし、依然としてLCDは動かない。 Gpio_iicでも、ここまで来れば光が見えてきた。

 printfメッセージを沢山出してコードを追う。どうもC言語のBOOL変数はわかりにくい。こちらはアセンブラー育ちなので、等しいとき、正常終了のときはリターンコード0という観念からぬけられない。C言語のTRUE=1 FALSE=0というのがどうにもなじめない。特にif文の中で式なしで使われると大混乱する。やっぱりいくつか勘違いが見つかり修正する。

 #ifを使って分離したTWIのコードとあわせてリターンコードを揃え、祈る気持ちで電源ON。やった。Welcome画面がLCDに出た。これでGPIOのI2CでもLCDが動いた。#defineを設定し直してTWIに戻してみる。動かない!今までの苦労は水の泡か。頭から血が引いていく。はっはっは、ハード接続を替えていなかった。ジャンパーコードを差し込みなおして問題なく稼動。慌ててはいけない。

 アイコンの表示と消去がちょっと難しかったけれど、このあとの開発は順調に進み、だいたいこれでミニLCDのライブラリは完成した。アイコンも関数ひとつで任意の絵柄を表示/消去できる。コントラストもコマンドで調整できる。そろそろ公開できるレベルのようだ。

 これで少しはストロベリーリナックスさんにも顔が立った。前回の記事で営業妨害で訴えられる心配もないだろう。このライブラリでLCDが沢山売れることを願っている。

以下に、AVRstudioのプロジェクトファイルの形でソースコードとヘッダーファイルを置きます。mLCD168はライブラリmLCD.cをテストするためのやっつけのモニターです。10以上を1文字で入力する時は、;、:、などを入れてください。詳しくはフォルダー内の、mLCD_readme.txtを見てください。

7/10に公開したソースコードにはgoposにバグがありました。以下のものは修正されたものです。コメントにあるような変更もしてあります。コードは80バイト近く減っています。前のmLCD.lzhをダウンロードした方はダウンロードしなおし、前のソースは破棄してください。

「mLCD168_712.lzh」をダウンロード

| | コメント (5) | トラックバック (0)

2009年7月 7日 (火)

LPCMプレーヤー2号機の開発

アクセス急増の反動でもないが別の工作へ(6/30/09)
 BeagleBoardの記事を載せてからアクセスが急激に増えた。これまでは多くても精々一日に300アクセス程度だったのだが、このところ400を越える日が増えている。ページ単位のアクセスもBeagle関係が多い。みんなの関心が高いようだ。

 前にも書いたようにBeagleBoardはこれまで色々楽しんできた電子工作とは異質の世界である。ARMと言っても最近始めた、Cortex-M3とかLPC2388とは数ランク上のプロセッサーで、ハードは勿論のこと、ソフトもすでに素人がソースレベルで気楽にいじれる規模ではない。日本語表示が出来て次のステップは日本語入力機能なのだが、あまり気が進まない。日本語が入力できたからといって何か次の目的があるわけではない。それにソフトパッケージをダウンロードしてきました。インストールしました。動きました、だけでは何となく面白くない。

 まあ、BeagleBoardに関してはすべてこれしかやっていないので偉そうなことは言えない。しかし何か、こう、どきどきわくわくするところが欲しい。自分の創意、工夫が役に立って、既定の機能と違う動きをしたり、別の働きをするところが見たい。人間とは贅沢なものである。Photo

 そんなこともあって、Beagleはちょっと横に置いて、このあいだのDS-Liteのバッテリーの充電基板を作ってみた。これは基板を作るだけが目的でなく、LPCMプレーヤー2号機を念頭に置いた、電池フォルダー制作の練習を兼ねている。もしプレーヤーを量産するとなったらより簡便な手順で電池フォルダーが作れないと効率が悪い。

 1号機で苦労したのが電池接点を支える天板の固定である。電池は接点にかなり強い力で接している必要がありその強度が問題になる。基板にピンヘッダーの接触ピンをハンダ付けし、それに基板をボンドで固定するという手の込んだ方法で天板の強度を確保しているが、ここはもっと簡単に作れるよう改善しておきたい。
Photo_2
 そこで思い当たったのが、CDケースである。スペースを節約するためCDケースは最近薄いケースを使うようになって、初期の頃の厚いケースがごろごろ余っている。このケースの高さが電池の高さとぴったり合うことを発見した。アクリルのケースを適当にルーターで切り取り、天板付のマザー基板にすることにした。ユニバーサル基板を小さく切ってボンドで接着して接点基板にし、配線用の基板を横に載せる。 Ltc4054

 充電用のIC、LTC4054はこれまでの変換基板では大きすぎるので、サンハヤトの変換シール基板と秋月の8X8のミニ基板(10 ヶ¥100)を活用して実装した。このシール基板はサンハヤトの製品にしては、お買い得で一枚(¥770)に24個のSOTチップ(一ヶあたり¥32、秋月のミニ基板をつけても¥42)をつけることが出来る。このシール基板は結構銅面が多く、データシートによる最小面積50平方mmを満足し、600 mA まで流せそうだ(外気35°C)。基板にジャンパーピンをつけて充電電流の実測が簡単に出来るようにし、充電電流を決める制御抵抗は用心のため半固定の可変抵抗にして調整できるようにする。

 うむ、なかなか具合の良い充電基板が出来た。充電も順調だ。しかしこのCDケースを応用した電池フォルダーは、プレーヤーの方のケースの高さが足らなくて、今度の2号機には使えないことがわかった。残念。充電機能も内蔵しようと当初考えていたが、これもDCアダプターが大きすぎて、とても入りそうにない。充電機能がないとなると、電池交換がすぐ出来るようにしなければならない。

ストロベリーリナックスから小さいLCDが送られてきたので部品あわせをしてみる。いやいや、これは、これまで以上に大変だ。しかし全く不可能と言うわけでもないので悩ましい。何とか納まりそうだが、やっぱり手配線では無理か。そろそろプリント配線に挑戦する時期に来ているのかもしれない。

FatFSのバージョンアップ(7/3/09)2
 LPCMプレーヤー2号機のためのソフトウエアの整備もやり始めた。電源スイッチを入れる場所がないので、スイッチ長押しのソフトパワースイッチを実装する必要がある。ちょうど良い機会なので、これまでの不満なところや、2GB以上のSDカードのサポートをしようと考えた。

 ソフトパワースイッチは、データシートを確かめて驚いた。最も節電できるPowerDownモードだと、Mega88クラス(Mega328など)で1μA、Mega128クラスでも5μAしか流れない。電池の自己放電と言えば、多いほうのニッケル水銀電池では数百μA、少ないリチウム電池でも数μAというからこの消費電流は優秀なものだ。食わず嫌いをしていたようだ。2号機はソフトパワースイッチで決まりだ。

 もうひとつの現在のソフトの不満と言えば、SDカード読み取りの途中でエラーが起きると、そこでスタックしてしまい、電源のOFF/ONをしない限り正常に戻らないという不具合である。まあスイッチを入り切りすれば元へ戻るからそう目くじら立てることもないのだが、設計上はカードを読み直して復帰するはずなのにそれがうまく動いていない。

 これはソースリストをもういちど注意深く読んで不具合があちこちで見つかった。まずマウントは、FatFSではソフト的にしか行っていないので、下位ルーチンのdisk_initializeという関数を呼ぶ必要があった。そのほかのルーチンも初期化をさぼっていて変数がそのままになり元へ戻れないことがわかる(要するにserially reusableでなかった)。これらの修正の結果、プレーヤーはSDカードを途中で差し替えても、電池の瞬断で演奏が止まっても、何かスイッチを押すと最初の状態に戻って正しく動くようになった。

 うむ、大分丈夫になった。これでソフトパワースイッチの実装の環境に不安はない。いよいよ最後のTinyFatFSから、SDHCをサポートするFatFSのバージョンアップにとりかかる。

 ChaNさんのサイトから最新のFatFS(0.07c)をダウンロードさせてもらい移植を開始する。このファイルシステムは着実に進化を続けており、このあいだのバージョンでは遂にWindowsのロングファイルネームをサポートするようになっている。海外のサイトでもFatFSの導入例を時々見る。日本の組み込みOS、TOPPERSにも採用されている。こういうソフトを無償で気前良く提供し、なおかつ改良を怠らない姿勢には頭が下がるばかりである。

 おや、TinyFatFSはどこへ行った? リリースノートを見る。ありゃあ、最新版の最初のバージョン(0.07a)ですでに標準のFatFSに吸収されてしまっている。えー、TinyFatFSは前から、FAT32をサポートしていたんだ。何だSDHCが使えるのか。知らなかった。身の不明を恥じる。それにしてもこのバージョン番号、未だに0.1以下にすることはないんじゃないでしょうか(こんなに進んでいるのに)。もう1以上を名乗って何の問題もないと思いますがね。

 フラッシュサイズはどうだ。うーん、少し大きくなっているようである。R/Oの最小サイズは、TinyFatFSの時の、2524バイトから、3824バイトに上がった。しかしこちらは今、32KBもあるMega328を使っているから全く問題はない。それにTinyFatFSはなくなったけれど、小さいチップ用のプチFatFSが用意されている。さすがやることにぬかりがない。

 I/Oディバイス依存のmmc.cは替えないで良いはずだが、まあ用心のため新しいmmc.cを入れてこちらの環境に合わせる。コンパイルする。いくつかの未定義エラーが出る。あれ、これもバージョンアップしたはずだがとソースを見ると標準のdiskio.hではなく、サンプルプログラムのSDカード用のdiskio.hが必要とわかる。 

 とりあえずコンパイルは通ったので動かしてみる。動かない。Welcome画面から先に進まない。やれやれ2行のLCDの表示だけではどうしようもない。デバッグ用のUARTを入れなおしてすこしづつ確かめていく。本当はテスト環境を作るべきなのだが、不精してプレーヤーにいきなりぶちこんだのが良くなかった。かえって手間がかかっている。

 ディスクの初期化はうまくいっているようだ。エラーは出ていない。しかしファイルの表示が出ない。あちこちにprintfを入れてデバッグする。ファイルサイズがおかしい。おやあ、ちゃんと動くSDカードがあるぞ。演奏も問題ない。これは困った。ハードも影響しているのか。

 あちこち調べまわった結果、やっと原因がわかった。不具合の原因は、ファイル名の小文字だった。LFN(ロングファイル名)をサポートしたので、ファイル名のupper case化がされていないのだ。WAVという拡張子を調べてそれ以外のファイルは再生の対象からはずしていた。正常に動いたSDカードはどういうわけか最初から大文字だった。

 wavという小文字の拡張子も再生リストに入れることにして解決。またしても大山鳴動ネズミ一匹的な騒動だった。フラッシュサイズはこれまでの13KBから1KBほど大きくなっているが、まあ問題ないレベルだ。速さはどうだろう。ロジアナを引っ張り出す。うーむ、速度も少し遅くなった。これまでより12%程度遅くなったか。ま、これも許容範囲だ。

ストロベリーリナックスの低電圧ミニLCDを動かす(7/5/09)

 最近売り出されたばかりの3Vで動く小さなLCDモジュールである。小さいけれど、生意気に2行16文字が表示できる。画面は最上行に携帯電話用らしいアイコンを表示する少し余計な機能があるが、今計画しているLPCMプレーヤー2号機にはぴったりの表示装置である。3Vの低電圧で動くのでDC-DCコンバータも不要だ。3ヶも買ってある。

 インターフェースは、パラレルでなくてI2C(AVRではTWI)である。I2Cは、がた老AVR研究所では発足以来すぐ、秋月のRTC(リアルタイマークロック)とのインターフェースや、Tiny26などI2CのないチップのUSIインターフェースでソフトI2C(マスター・スレーブ)を開発したりして経験を積んでおり実装には問題ない。ショップのページには、液晶コントローラのデータシートも、アプリケーションノートも、サンプルプログラムもダウンロードできるようになっていて、開発に不安はなさそうだ。

 FatFSのバージョンアップが一段落したので、2号機に向けての次のステップとして、早速動作確認をすることにした。さすがに現用のブレッドボードにあるLPCMプレーヤーを使うことは止め、別のブレッドボードに新しくCPUチップ(Mega168)を乗せて専用のテストベンチを作る。配線そのものはCPU周りを準備(ISPまわりとXtal)すればI2Cは2線インターフェースなのでプルアップ抵抗を入れて5分もかからない。

 しかし、ちゃんと動くまでには意外に時間がかかった。日曜日を丸々一日使ってしまった。負け惜しみを言うようだが、沢山あるように見えた資料が問題だった。まず、ショップの提供するデータシートが英語であることはともかく、パラレルとシリアルそれにI2Cの3種類のインタフェース共通のデータシートでとてもわかりづらい。I2Cの項の最初には「I2Cでは書き込みしかできない」と明記してあるのに、後半には、読み込みが出来ないと使えないBusyFlagの説明が出ていたりして混乱する。一般的なI2Cの説明と、このコントローラ特有のビットの説明が混ざっているので余計わかりにくい。

 日本語のアプリケーションノートも、どうも端折って書いてあってこれまた全貌がつかめない。I2Cについてある程度知識があれば類推が効くが、そうでないと理解するのに苦労するだろう。データシートからの引用のチャートは肝心のCOビットの説明文が省略されているので何のことか良くわからない。特にファンクションセットのあたりは省略が激しい。

 結局、データシートと、アプリケーションノート、それにソースコードの3つを同時に見て、それぞれ確認していかないと開発が進まない。各コマンドのあとには必ず30μs程度のwaitが必要なようで、I2Cとしてはシビアな環境ではない。しかもI2Cインターフェースの多いRTCとは違って読み込み処理はなく、一方的に書くだけだ。

 割り切って、スタートコンディション、マスター書き込み宣言、コマンド、データ、ストップコンディションというI2CシーケンスとLCDシーケンスの順番を単純に繰り返す手順を解説するだけで、LCDはとりあえず動くはずなのだが、そういう書き方ではなく色々な方法を紹介したりするものだから余計わかりにくくなっている。

 ソースコードがまた難物であった。余り悪口は言いたくないが、構造化言語であるCの文法を全く無視したアセンブラー的なコーディング(switch文にgotoと、returnが入ると訳がわからなくなる)で、読むのに大苦労である。こういう通信関係のエラーによる中断の多いプログラムは構造化しにくい処理の代表格だが、もうすこし整理の仕方があるだろう。それにこんなに綿密にエラー処理をしたりリトライしてもあまり意味がない。近接した液晶とCPUの間で一旦エラーが起きたら回復する可能性は殆どない。先の見通しがないときエラーで帰ってきても無意味である。

 これまでのI2Cを使ったプロジェクトからソースをとりつくろいUARTからLCDを操作するテストプログラムを作る。久しぶりのAVRの本格的な開発である。用心のため、xprintf(ChaNさんのFatFSについているもの)を沢山仕込み、デバッグに備える。

 動かしてみた。全く動かない。まあこういうのには慣れている。xprintfを初期化から入れて動きを確認していく。あれえ、最初からリセットしている。なんだなんだ。変数を表示するxprintfのところで暴走している。原因はわからないがとにかくxprintfがおかしい。デバッグのために入れたステートメントで暴走するなんて洒落にもならない。

 xprintfをやめ自前のUART出力関数などでデバッグを進める。おやあ、ちゃんと正常終了のフラグを出しているぞ。あっ、ifの中の論理が逆だ。これを正しく直す。おお、画面に何かが出た。なーんだ。I2Cは動いていたのだ。正常なのにエラー終了していた。

 そりゃそうだ。このへんのI2Cの関数はすべて動作確認済みだ。ただ、文字は出たが、表記が目茶目茶である。しかし、ここまでくれば大分近づいた。ソースコードを点検する。コマンドのビットが1ビットずれているのを発見する。Mlcd

 これを修正し、めでたく低電圧ミニLCDは動くようになった。しかし、クリアや、コントラストの変更ができない。これはアプリケーションノートが端折ったところで、ファンクションセットに2種類あり、コマンドを出す前にはそれに応じたファンクションセットをしてからでないと動かないことがわかった。これを修正してUARTから自由にクリアとコントラストが調整できるようになる。

 日曜一日で何とか動くようになった。xprintfが動かなかった原因は次の日、事務所に行く途中で気がついた。xprintfの内部ルーチンのxitoaの行き先を指定するのを忘れていた。これでは暴走するはずである。情けない。

 ストロベリーリナックスさんには相当悪態をついたけれど、今回のソースコードはライブラリ化して近く公開し、少しでもこのディバイスが沢山の人に使われるようにしたいと思っている。こういうお洒落なディバイスをアマチュアに提供してくれるショップは大事にしないといけないし、オープンソースではこれまで沢山の人のお世話になっているのでせめてもの恩返しだ。

| | コメント (2) | トラックバック (0)

« 2009年6月 | トップページ | 2009年8月 »