3.3V対応赤外線LED駆動回路決定版

家電製品のリモコンの信号を解析、再現する方法はもうだいたいわかって次の目標は強烈な信号を発射すること。この点については以前、Raspberry Pi対応赤外線LEDドライブ回路の決定版で一応の完成をみたが(何しろ「決定版」といっちゃったので)、電源電圧5Vが必要なので3.3Vだけのマイコンボードだと使えない。電源電圧3.3V対応の新しい回路を念頭に部品を探していて見つけたのがIRLU3410PBF。比較的新しいパワーMOSFETで、ゲート電圧1V付近で完全にオンになるから、ありきたりなトランジスタの回路のトランジスタと置き換えるだけで動き、新しい回路はいらない。ベース(FETだとゲート)抵抗も省略できる。こんな凄い部品がネットであまり盛り上がっていないのは誰もデータシートのグラフなんかに関心がないせいだろうか。

IRLU3410PBF

只今研究中のLPC810で実験。受信側と送信側をひとつのブレッドボードに組み立てる。

remocon02

回路はこんな感じ。受信側は赤外線受光モジュールをただつないだだけ。送信側はありきたりなトランジスタの回路のトランジスタをIRLU3410PBFと置き換えただけ。ゲート抵抗は省略。FETの場合、ゲート抵抗の実態はゲート容量の影響を避けるダンピング抵抗なので、LPC810のハイカレントドライバがついたピンでスイッチングすれば大丈夫(だと思う)。

ircProto

赤外線リモコンは送信側も受信側も信号線1本でいい。製作ずみの書き込み装置の未使用のピンへ接続。書き込み装置はうまい具合にハイカレントドライバがついたピンが余っている。そして、うまい具合にシリアルでパソコンと接続している。だから、プログラムを書き込んだらすぐ動作確認できる。ただし、電流供給能力に劣る。だとしても、1mくらいは届くと思う。

remocon01

プログラムの書き込みにはFlashMagicを使う。FlashMagicはTOOLs->Terminalでシリアルの端末が開く。だから書き込みから動作確認までジャンパワイヤーの切り替えが不要。下の表示例は比較的複雑なPioneerのリモコンを解析し、再現したところ。動作確認に成功。

remocon_fm

同じことをやってみたいと思う人がいるかどうかわからないが捏造ではないことを証明するためプログラムを公開しておく。下のアーカイブにはLPCXpresso IDEのプロジェクトがふたつ含まれる。ひとつはlpcopen_2_01_lpcxpresso_lpc812max.zipの中のライブラリlpc_chip_8xx_libのバグを修正したもの、もうひとつはLPC810でリモコンの信号を解析、再現するircProto。

ボクが公開するリモコン関係のプログラムはSonyフォーマットに対応しない。それ以外はたぶん何でも大丈夫。Sonyフォーマットはいずれ何とかするつもりだが、ほかにやりたいことがいっぱいあってしばらく手がつけられそうにない。

カテゴリー: トランジスタ, LPC810 | コメントする

BeagleBone Black最後の1台

秋月に入るとき残り3台だったBeagleBone Blackが買いものを終えて出ると1台になっていた。帰って秋月の商品のページを見たら、やっぱり売り切れで「納期確認中」。前回(6月)入荷分は3日で売り切れたから、それよりは長持ちした。信頼できる伝聞によると、今回からメーカーとの直接取引きで、前回よりかなり多く仕入れたという。それでも2週間が限界か。

bbb_book

で、空いたスペースにようやく登場したのが『ボクのBeagleBone Black工作ノート』。プロトケープの製作例が多数掲載されていて裏表紙に並んだ写真が壮観。手間の掛かったいい本だと思うが、信頼できる伝聞ではBeagleBone Blackが入荷しないため取り扱いが保留になっていて、入荷しても売り場がなくてしばらく保留されていたらしい。もう少しで幻の本と化すところだった。いや、BeagleBone Blackの次回の入荷が遅れればまた姿を消すかも。

カテゴリー: BeagleBoneBlack | コメントする

LPC810でWS2811を動かす

マイコン内蔵フルカラーLED、たとえば秋月で売ってるPL9823-F5、どうせすぐ廃番になるイロモノだろうと思って無視していたら意外な人気。動かすのが凄く難しいのだが、あちこちで「オレは動かした」みたいな話が盛り上がっている。案外それが人気の秘密か。

PL9823-F5

こういう話には乗るタチなので只今研究中のLPC810で参戦。とりあえず秋月のホームページで信号のタイミングを調べたらPL9823-F5のデータシートと内蔵ICのWS2811のデータシートでぜんぜん違う。取っ掛かりから難問。いちかばちかWS2811のデータシートにあわせる。それにしてもタイミングが厳しすぎ。たとえば0を表す信号はパルス幅0.25μ秒、LPC810を24MHzで動かして6クロックしかなく、タイマにしろPWMにしろ割り込みは割り込むだけで精一杯。こんなのが本当に動くのかと思い念のためArduinoとAdafruitのライブラリで試したら、あらら動いたよ。

RGB_Arduino

32ビットのLPC810で思い悩んでいるものを8ビットのArduinoが動かしたことは凄いショック。敗北感を抱きながらスケッチを覗き見たら肝腎なところがアセンブリ言語で書いてある。ああそういうことね。で、生まれて初めてCortex-m0+のアセンブリ言語を書く。できあがったのがこちら。C言語から使うときはws2811Write(const uint8_t *data, uint8_t count)と書くことになる。前後に50μ秒以上の0(リセット)が必要。実行中に割り込みが掛かってはいけない。そういう配慮はC言語のほうでやる。これで動いた様子を下に示す。

RGB_LPC810

プログラムを全部C言語で書くとCortex-m0+もPICもArduinoもだいたい同じ。だからといって、Cortex-m0+を味わうためにアセンブリ言語が面白いとまでいう力量はない。たまにしかたなくアセンブリ言語が必要、くらいの感じがちょうどいい。

PL9823-F5のデータシートの回路例は1本ずつ抵抗をつないでいるが、これは普通のLEDの電流調整用の抵抗ではなく、電源のダンピング抵抗。電流調整用の抵抗だったら必須だが、ダンピング抵抗ならなくても大丈夫だろう。ついでに電源のパスコンと信号のダンピング抵抗も省略し、ただ4本をつないだだけ。プログラムがとびきり難しくても組み立てはとびきり簡単。

カテゴリー: LPC810 | コメントする

LPC810のROM APIのI2Cを理解した

LPC810のROM APIのI2Cのスレーブを割り込みで動かす方法を理解した。とはいえ今日は理解していても明日になったら忘るかもしれないので、ソースを切り分け、ライブラリ風にまとめた。以前、LPCOpen2.01のサンプルを編集した「何はともあれ動くプログラム」を公開したが(LPC810のROM APIのI2C参照)、これはサンプルのバグがそのまま残っていて、動いたことがむしろ不思議なシロモノだった。それをダウンロードした人がソースを解析してもどうして動くのかぜんぜんわからないと思う。ほうっておいたら申し訳ないので、あらためてちゃんとしたやつを公開する。

下のアーカイブにはLPCXpresso IDEのプロジェクトがふたつ含まれる。ひとつはlpcopen_2_01_lpcxpresso_lpc812max.zipの中のライブラリlpc_chip_8xx_libのバグを修正したもの、もうひとつはLPC810を周波数カウンタとして動かすfrq810。そのfrq810のほうにROM APIのI2Cのスレーブを割り込みで動かすソースi2cs.cとヘッダi2cs.hがある。関数の仕様はi2cs.hにコメントで書いてある。使い方の具体例は周波数カウンタの本体frq810.cをご覧いただきたい。

frq810は4バイトを読み出すと32ビット長の周波数が得られる。1バイトを書き込むとサンプリング期間を変更できる。サンプリング期間にあわせてLEDが点滅する。もしI2Cでエラーが発生するとブザーが鳴る。その他の細かいことはソースで理解してもらいたい。動作確認した様子を下に示す(ちゃんと動いた証明にはならないだろうけど)。Arduinoでサンプリング期間を変えながら周波数を読み出している。周波数はもうひとつのLPC810が生成。これでARMのデュアルコアである。

LPC810Freq

現在、PICやArduinoで成功したことを順次LPC810でもやってみているところ。LPC810ならではの働きが実現するのはもう少し先になりそう。

カテゴリー: LPC810 | コメントする

BeagleBoneBlack秋月に入荷

秋月の店頭にときどき現れてはすぐ売り切れるBeagleBone Black。秋月のホームページには売り切れの期間もずっとBeagleBone Blackのページが残っている。さっきふと見たら在庫がAAAになっていて、「※秋葉原店への入荷は10/29 PM2:00頃を予定しております」だと。明日じゃん。

ここ1、2日くらい、秋月の店頭にBeagleBone Blackが山積みになっているという、年に1度の珍しい光景が見られそう。

カテゴリー: BeagleBoneBlack | コメントする

LPC810でAD変換

LPCOpen2.01でまたもやバグを発見(すでに発見したバクについては過去の投稿を探してください)。lpc_chip_8xx_libのacmp_8xx.cのChip_ACMP_SetupVoltLadderで、引数に記述したボルテージラダーの値が正しく設定されない。当面、(ボルテージラダーの値 << 1)と指定すれば正しく設定されるが、バグが修正されたとき誤動作を招くので、バグが修正されるまでこの関数を使わず、レジスタを直接操作するのが無難。

LPC810のボルテージラダーの動かしかたが判明した結果、NXPのAN11329に説明されている、コンパレータとタイマを使ったシグマデルタADコンバータが完成。これにI2Cスレーブのソースを埋め込んで1チャンネルADコンバータICのようにまとめた。動作確認した様子を下に示す。LCDが乗った基板はただひたすらADコンバータの値を読んで表示するだけの装置。その手前にある基板がADコンバータの評価装置。電圧入力ピンをプルアップ抵抗に当てているからLCDが約3.3Vを表示している。

ADC810

LPC810が本物のADコンバータを備えていればこんな面倒くさいことをしなくていい。しかし、これはこれでメリットもある。このADコンバータはフルスケール3.3VでAD変換値が3300になるよう設定してあり、直読でmV単位の電圧が得られる。こんなこと、既製のADコンバータにはできないでしょ。基本的にはAN11329のパクリだけれど、ソースはほぼ書き下ろし、それやこれやの現実的な機能を盛り込んだ。回路図とソースは清書してから公開するつもりだが、LPC810についてはほかにやりたいことがいっぱいあり、しばらく清書するヒマがないと思う。

カテゴリー: LPC810 | コメントする

Linuxの割り込み処理

マイコンを使った電子工作の趨勢はPICなど単体部品の組み合わせからArduinoなどのマイコンボードへ、そしていまRaspberry PiやBeaglebone BlackなどLinux搭載ボードへと切り替わりつつあるらしい。PICからArduinoにかけて割り込みの腕を磨いた人が、同じやり方でLinuxを動かそうとして思い悩む姿が想像される。このブログも「Linux 割り込み」で検索をかけた人がたくさん来てくれる。そうやって来てくれた人をがっかりさせることになるかもしれないが、やはり真実をいうべきだろう。

Linuxで割り込みはできない。ついでにいうとレジスタの操作もできない。インターネットで「Linux 割り込み」を検索するとそれなりの記事が見つかるが、どれも知りたいことの回答ではないはずだ。何しろ無理なんだから。

PICやArduinoでやる割り込みは、Linuxだとメッセージを発効する(同時に最低限の処理をする)ために使われ、ユーザーが関与できない。ユーザー側の処理は、割り込みが終了したあと、メッセージを捉えて実行することになっている。だから、少し時間差が生じる。たとえば、WiringPiを使うとArduinoの割り込みのような設定ができるが、その実態は、新しいプロセスを生成してバックグラウンドでメッセージを監視し、捉えところで指定の関数を呼び出す仕組みになっている。ソースの見た目は割り込みのように記述できても、それでリアルタイムの処理ができるわけではない。

レジスタの操作も似たようなもの。ファイル/dev/memを関数mmapで開けばソースの見た目はレジスタを直接操作するように記述できる。これをレジスタの直接操作と説明する記事さえある。しかし、実態はファイルをメモリに展開して操作しているだけで、ファイルを関数openで開いて操作するのと大差ない。操作した内容は、Linuxが読み取って本物のレジスタに反映するから、やはり時間差が生じる。

多少の時間差があってもよければ、割り込みっぽい処理やレジスタの操作っぽい処理でいい。時間差があるとまずい場合、本当にそうか、必要な作業を根本的に見直してみると案外そうでもない場合が多い。実際、Linuxのたいていのアプリケーションは与えられた環境のもとで目的の働きを実現している。そういうわけにいかなければドライバを作ったりカーネルを再構築したりする。それが面倒くさければ、Linuxを諦めてリアルタイムOSを選ぶ。

PICやArduinoで培った技術は大切にしたいと思うだろうが、それをそのままLinuxに持ち込もうとしてはいけない。郷に入っては郷に従えということ。あるいは、割り込みやレジスタの操作のほうが好きだとすれば、OSが介在しないマイコンで実力を発揮してもらいたい。ボクはRaspberry PiとBeagleBone BlackでLinuxを十分に堪能したので、今後はLPC810とかLPC1114をきわめてみようと思っている(土日はZ8とMC6809とi2716に夢中です)。

カテゴリー: ARM, BeagleBoneBlack, Linux, RaspBerryPi | タグ: | 4件のコメント