マイコン工作実験日記

Microcontroller を用いての工作、実験記録

ENC624J600

2009-09-30 22:17:27 | OLIMEX
SPIでつなげるEthernetといえば、ENC28J60が秋月にも並ぶくらいにポピューラになっていますが、ENC424J600/ENC624J600という100M版がリリースされていることを今頃になって知りました。気が付くと、OLIMEXからもモジュールが販売予定になっているようです。

100M対応といったって、SPIじゃ間に合わないだろうというわけで、パラレル・インタフェースも用意されているようです。まぁ、自分では使うことは無いように思うのですが、それでも興味を引かれたのは。。
  1. 値段が安い. へたなPHYチップ買うよりも安いかも?
  2. 24Kバッファ・メモリ。これだけあれば、助かるなぁ。
  3. MACアドレス付き

内蔵しているMACを使わずに、コイツを使うという選択もありうるんだろうなぁと思ってしまいます。

タッチパネルを使った再生操作

2009-09-30 01:06:12 | MP3プレーヤ
タッチパネルが使えるようになったので、アイコンのボタンを使っての再生操作ができるようにしてみました。再生、一時停止とスキップ機能がタッチで使えるようになたので雰囲気出てきました。



最初の時計表示からMP3プレーヤ表示への切り替えは、LCD画面下部に最初から用意されているメニューアイコンをタッチすることでおこなっています。この領域はLCDの表示領域外ではありますが、タッチパネルのアクティブ領域になっています。

mbed

2009-09-25 17:57:45 | Weblog
internet.comの記事でARMとNXPがmbedという開発ツールとボードを発表したことを知りました。LPC1768のヘッダボードが定価$99のところ、予約の方には$60という記述を見て、もう少しでポチるところでした。Ethernet PHYまで載っているのは悪くないのですが、JTAG端子とか出てないようです。40ピンDIPなんでブレッドボードに挿せるけど、さすがにピン数少ないので、犠牲になったのはJTAG端子だけではなさそうですし。。。



IrDAでの無手順送受信

2009-09-24 00:17:20 | Weblog
IrDA実験ボードを使っての基本送受信の確認実験をしてみました。AT91SAM7のマニュアルには簡単ではありますがIrDAの物理層の説明もあり、モジュレーションの説明として次の図も示されています。ここで、Transmitter Outputは、USARTの送信部からの出力で、TXDは、それに変調をかけた結果で、IrDAトランシーバへの入力となる信号です。



なるほど、極性が反転していることとパルス幅が違うことを除けば、RS232Cとほぼ同じなので、ハードも簡単に実現できるわけですね。そのため、USARTをIrDAで使うのはとっても簡単で、AT91SAM7S256の場合は初期化時にIrDAモードを指定できるようになっています。ボーレートやパリティ等の設定はRS232Cで使う時とほぼ同じ。ただし、FIDIレジスタには1を設定してやります。通信方式上での大きな相違点は、IrDAは半二重通信であること。相手からの赤外線を受信中に送信ができると、自分の出した赤外線による影響を受けるためのようです。AT91SAM7S256のUSARTでは半二重通信に関する明示的なサポート機能がないので、受信動作時にはトランシーバの送信側LEDの発光を確実に止めるために、送信部をディスエーブルするだけでなく、TXD端子はGPIOに設定してLowレベルを出力するように求めています。

今回の動作確認では、次のように設定してみました。

  • US0を送信、US1を受信用に初期化。US1のTXD端子からはLowレベルを出力。
  • IrDA規格との互換性のため、8ビット、1ストップ、パリティ無しに設定。
  • ボーレートは9,600bps


実験プログラム本体は、さらにデバック・シリアル(DBG)のポートを使うことにしました。DBGから入力された文字を、US1から出力します。すると、このデータがUS0で受信されるので、その結果を文字と16進でDBGポートに出力してやります。と、まぁ、これだけのプログラムです。さっそく、実行してみると。。



めでたく、送信した文字が受信できているようです。自分で送信したデータはちゃんと受信できるようですから、トランシーバとUSARTのIrDAモードの基本動作確認はあっさり完了です。

どうせなら別のデバイスから送信したデータが受信できるかどうかも調べてみたいので、ちょっとIrDAを調べてみようと思いサイトを覗いてみました。基本仕様書であるIrDA Data Specificationsは$795もするので、とても個人では手が出せません。しょうがないので、代わりに入門ガイド的な本 IrDA Principles and Protocols を買ってみました。PDF版で、$20なり。前半はIrDA技術の全般的な話ですが、後半ではプロトコル仕様の概要について書かれているので、わたしのような初心者が読むには手ごろな資料のようです。ちょっと読んでみたところ、デバイス間の接続を確立するために、最初は9600bpsでデバイスのサーチをするという仕様になっていることがわかりました。それならば、この実験プログラムのままでもサーチ手順の始めの部分の信号を受信できてもいいハズです。IrDAデバイスと言えば、ノートPCにIrDAが付かなくなった今となっては、携帯電話しかありません。さっそく、自分の携帯電話のプロファイルの赤外線送信メニューを開いて、トランシーバに向けて送信操作をしてみると。。。



おぉ! なにやらゾロゾロとデータが受信できました!!購入した資料によると、最初の部分の0xFFがXBOFで、0xC0がフレームの始まりを示すBOF, そして0xC1がフレームの終わりを示すEOFのようです。フレームデータを良く見ると、DOCOMO/N02Aという文字列が含まれており、わたしの使っている携帯です。これだけ拾えているんだったら、SIRの受信はおそらくちゃんとできているのでしょう。ほんとは、フレームの解析をしてCRCの計算して確認しなきゃいけないのですが。

$20で買った資料でどこまで詳細仕様がわかって実装作業ができるのかまだ調べていませんが、IrCOMMでの疎通を目指してみるのもオモシロそうな気がしてきました。ざっと見たところでは、上位層にいくにしたがって説明が貧弱になっていく印象でしたが。

ともかくもちょっとIrDAをかじることができ、簡単ではあるものの勉強になった実験でした。前回の記事にも書いたように、LPC2388やSTM32のUARTにもIrDA機能はあるようですから、オマケ基板で実験してみるのも良いかもしれません。

IrDA実験ボード

2009-09-21 21:18:56 | Weblog
ここんとこLPC2388やAT91SAM9ばかり使っていて、AT91SAM7を使ってなかったので、久々にSAM7-H256をひっぱりだしました。これまでSAM7シリーズも、各シリーズで各種周辺機能をそれなりに使っきているつもりですが、そろそろ何か新ネタを探さねばと思っていたところです。そんなおり、あらためて気がついたのがUSARTのIrDA機能。以前からUSARTにIrDA機能が付いていることには気づいていたのですが、IrDAに関する予備知識があるわけでもなく、実験してみることもありませんでした。しかし、改めてネタを求めて見直してみると、USARTのIrDA機能自体は極めて簡単なもので、ハードウェアも単にトランシーバを直結すればいいだけのようです。また、他のMCUを確認してみると、LPC2388やSTM32でもUARTにはIrDA機能が具備されているようです。そんなに基本的なものなら、ちょっと調べて実験してみようと思い立った次第です。

そんないきさつで作ってみた実験ボードがこれ↓です。



秋月のトランシーバ・モジュールをAT91SAM7S256のUSART0とUSART1に直接つないでいるだけです。秋月では2個ひと組で販売しているので、これを向かい合わせに配置することで、片方のポートから送信したデータをもう片方で受信できることを確認しようというわけです。IrDAの規格にもいくつかの種類があり、それに応じてサポートできる通信速度も異なりますが、秋月のモジュールでサポートされているのはVer 1.0でSIRと呼ばれるものです。USARTでサポートされるのは、2400bps~から115200bpsということで、この速度はSIRがサポートする通信速度に相当するので、SIRをサポートしていると言い換えることもできます。

IrDAの規格ではIrLAPというリンク層があって、さらにその上にセッション層としてIrCOMMがあるようですが、物理層のリンクでの通信ができることを確認するのがとりあえずの目標です。そのうちにIrDAを勉強してIrCOMMまで実装してみたいものです。

この実験ボードに載っているもうひとつのモジュールは、同じく秋月で買ってきた3軸加速度センサKXP84-2050です。アナログに加えて、I2CとSPIでの出力もできるものです。秋月でデジタル出力のものを扱っているとは知らなかったので、ついついトランシーバと一緒に買ってきたのですが、特に目的があるわけでもありません。

タッチパネルの処理

2009-09-18 23:20:49 | Weblog
タッチパネル用のコントローラADS7846からはちゃんと座標が読み出せるようになったので、昨年タッチパネルジャケットを製作した際に書いたタスクをLPC2388用に修正して動くようにしてみました。

このタスクでは、ペンダウンをGPIO割り込みで検出し、ペンが離されるまでの間、連続してX座標とY座標をひろうというものです。ペンダウン、座標のレポート、そしてペンアップはイベントとしてTOPPERSのデータ・キューを使って通知することにしています。トラ技の8月号のタッチパネル特集でも言及されていましたが、コントローラから読みだしたデータをそのままイベントとして使うだけの単純な処理だと、タッチし続けているつもりでも意外と意図しないペンアップが発生してしまいます。昨年は、この問題を回避するために意識してペンを強めに押し続けて動画撮影をしていましたが、今年はソフト側で対策を施してみました。具体的にはUpに続いてDownが100ms以内に生じたならば、この両方のイベントを読み捨てるというものです。これ↓は、その動作の様子。



discardと表示されている箇所がUp/Downの読み捨てが発生している箇所です。軽く指先やツメ先でパネルをこすった程度だと、かなりの頻度で読み捨てが発生することが良くわかりました。

PSoC5

2009-09-16 22:26:24 | Weblog
PSoC5ですかぁ、ちょっと楽しみですねぇ。近頃じゃ秋月でもPSoC扱っているので、興味はあるものの、開発環境と8ビットCPUが独自なんでちょっと気が引けていたのですが、Cortex-M3なら自分でもいじれそうな気がしてきます。

そろそろCortex-M3に手をだすついでにTOPPERS/ASPも試してみたいとは思っているんですが、ついついAT91SAM7/LPC2388とJSPの組み合わせに甘んじてしまっています。LPC1700かAT91SAM3ベースのヘッダーボードをOLIMEXかPropoxあたりが出してくれたら、新たな一歩を踏み出すいい機会になると思っているのですが。。。

タッチパネルをつなげた

2009-09-12 22:30:29 | MP3プレーヤ
アイコン並べた画面を見るとかなり雰囲気でてきた感じがしてきましたので、つづいてタッチパネルの接続です。もともとLCD画面にタッチパネルが貼ってありますので、モジュールの未配線だったタッチパネル関連の線をつなぐだけです。使用しているLCDモジュールでは、1)4線式パネルの信号をマイコン側のADCにつなげて利用する方法と、2)モジュール上のコントローラADS7846をSPIでつなぐ方法の2つの方法を選択可能ですが、昨年と同じようにADS7846を利用することにしました。

ADS7846を使用する場合でも、X座標とY座標を別々に読みだして座標変換する処理が必要なので、ある程度の手間がかかります。ただし、ペンダウンにより割り込みを生成できるのが大きなメリットです。ADCを使う場合は、常時XY座標を測定していないとペンダウンが発生したことを検出できませんので、それだけCPUサイクルを消費することになります。ADS7846を使えば、割り込みが発生したら、XY座標の測定を開始すれば良く、ペンが離されたことが検出できたらその後は休んでいることができます。

LPC2388には、SPIをサポートする周辺機能として、SPIという名前のインターフェースと、SSPという名前のインタフェースが用意されています。どちらかというとSSPの方が高機能のようなので、今回はSSP0を使って接続。SPIではSSEL端子が入力端子としてしか使えないのに対して、SSP0ではSSEL0を出力として使えますので、マスター動作時にCS信号を自動的に出力できて便利です。ADS7846からはペンダウンを通知する割り込み信号/PENIRQも出力されてきます。LPC2388基板側のIRQ端子は他の用途に使われていたり、ヘッダに出ていなかったりしますので、GPIO割り込みを使うつもりでP2[8]につないでおきました。



配線ができたので、さっそく動作確認です。ADS7846はSPIで送った8ビットのコマンドに応じて、続くクロック中の10ビットあるいは12ビットで測定した座標を返してくれます。まずはX座標の測定から。下の画面では0xd1が送信しているコマンドで、X座標の測定を要求しています。矢印の右側の3バイトがSPIの受信結果です。最初の1バイトは、コマンド送信中のデータですので関係無し。後ろの2バイト中の12ビットが測定結果です。Valの値は12ビットを抜き出して10進数で表示しています。



タッチしていない状態では値として0が読めています。タッチして左から右に行くにしたがって、測定値が小さくなっていきます。続いて、Y座標の確認。同様に、0x91が送信しているコマンドです。



今度はタッチしていない状態では2047が読めています。そして上から下へ移動するにしたがって、測定値が小さくなっていきます。このように、測定される値は、画面右はじの方が値が小さく、オフセットをもった値になっていますので、これを画面描画の時に使用する座標に変換してやる必要があります。この変換処理は、/PENIRQ信号の処理と合わせて、ひとつ新たなタスクを設けて処理してやる予定です。

アイコンを準備する

2009-09-09 23:29:37 | MP3プレーヤ
MP3プレーヤの再生画面も日本語化できたので、次のステップとしては操作用ボタン使ってのGUIを用意しようかと思っています。そのためのアイコンを探してみました。適当に検索してみていくつかのサイトを見てみましたが、サイズ的にも良さそうたったのが、このサイトの無料アイコンです。そこで、ここのToolbar Icon Starter Kitのプレーヤ用ボタンを使ってみることにしました。どういうわけか、ストップ・ボタン用のアイコンが含まれていないのですが、いざとなれば適当に他のもので間に合わせることにします。

アイコン用のイメージはPNG形式で用意されていました。αチャンネル情報を持つことができる画像ファイル形式なので、アイコン用には都合がいいのでしょう。しかし、マイコンで処理するには、ビットマップとして埋め込んだ方が使いやすいので、いったんBMPファイルに変換して、そのビットマップ情報を配列データとして吐き出してやって、それを利用することにしました。試しに画面上に並べてみると。。。



なんだかボタンが妙に黒いです。もともとの画像はこうなのですが。。アイコン画像の表示ルーチンを確認したり、LCDの初期化時のガンマ補正の値を変えてみたりとかしてみたのですが、やはり黒いままです。どうやらわずかに暗い部分が、ほんらいあるべき明るさよりも暗く表示されてしまっているようです。これまでも、CMOSカメラでとった画像がやけに暗くしか表示されなかったりしていましたが、どうやら同じ原因でこのように見えてしまっているのではないかと思われます。

わざとデータを読み替えて少し明るめに表示してみたりとかもしてみたものの、あまり良い結果も得られず、どうしてこんな風にしか表示できないのかこの何日かずっーと悩んでいたのですが。。。

ヒョンなことから、ちょっと左横から画面を見てみたら。。。



あれっ?! なんか、ボタンがさらに黒っぽくなってしまったではないですか? どうして? と、いうことは、もしかして。。ひょっとすると。。



うわっ! やっぱり!! この向きなら、かなり良く見えるじゃん!!!

ハイ、斜め右方向から見れば、まっとうな色/明るさに見えるようです。画面に貼ってある液晶保護シートが悪さしているのかと思い、はがしてみましたが。変化なし。もともとのLCDの発光が不均一ということなのでしょうか。。。

問題の発生個所の切り分けはできたものの、これでは修正することもできません。しょうがないので、このまま使い続けるつもりではいますが、そのうちに違うLCD買ってつなげ換えようかなぁ。

再生画面を作ってみた -- その2

2009-09-05 19:41:35 | MP3プレーヤ
ふたたびLPC2388のMP3プレーヤの作業に戻ってきました。NANDフラッシュに焼いたIPAフォントが使えるようになったので、再生画面表示を変更して日本語の曲名/演奏者であっても表示できるようになりました。



MP3ファイルはWMP (Windows Media Player)の取り込み機能で作成していますが、この機能をつかってMP3ファイルを作成すると基本的にファイル名は曲名を使うようです。FatFsとしてはR0.07をLFNサポート無しで使っていたのですが、ファイルによってファイルをオープンしようとしてエラーが発生するという問題に遭遇してしまいました。どうやら、シフトJISファイル名の2バイト目に '[' が入っているとエラーになっている様子です。気がつくとFatFsがR0.07c になっているので、新しいコードに入れ替えるとともに、再度設定しなおしたところ問題解決してしまいました。どうやら、ちゃんと_CODE_PAGEを指定していなかったのが原因だったようです。LFNを使わない場合でも、ファイル名にSJISが混入する場合にはちゃんと_CODE_PAGEが指定されていないといけないということですね。