マイコンを用いたRSSリーダを2種類製作した。 ひとつは、RSSフィードの項目を英数字のキャラクタLCDにスクロールさせて表示する。 加速度センサを搭載しており、傾きにより表示のスクロール速度が可変する。 もうひとつは、RSSフィードの項目をグラフィックLCDに表示する。 漢字を表示でき、日本語のRSSフィードの表示ができる。 両者ともARM Cortex M3 コアを搭載するLuminary Micro社のStellarisファミリーのマイコンを用いて製作した。 TCP/IPプロトコルスタックとしてuIP 1.0を用いた。
最近のARMチップを使ってみたかったのと、 マイコンでEthernetを使うのに興味があったので、 ためしにARMコアが載ったマイコンでRSSリーダで製作しました。 2種類の構成で製作しました。 作業を楽にするために(実際に楽になったかは微妙ですが)プリント回路基板は 海外の業者に作ってもらいました。
ひとつは、RSSフィードの項目をキャラクタ液晶でスクロールさせて表示します。 加速度センサを搭載しており、傾きで表示のスクロール速度が変わります。
もうひとつは、RSSフィードの項目をグラフィックLCDに表示します。 漢字を表示でき、日本語のRSSの表示ができます。
両者ともARM Cortex M3 コアを搭載するLuminary Micro社のStellarisファミリーのMCUを用いています。 前者にはLM3S811、後者にはLM3S6965を用いました。 後者のMCUにはEthernetコントローラ(MACとPHYの両方が含まれる)がついているのですが、 前者のMCUにはないので、 SPIバス接続でMicrochip社のEthernetコントローラENC28J60を接続しています。 TCP/IPプロトコルスタックは自作が大変なのでuIP 1.0をつかっています。 uIPはマイコン向けに設計されたTCP/IPのプロトコルスタックです。
写真左のチップがMCUのLM3S811、右のチップがEthernetコントローラのENC28J60、 下のチップが加速度センサ。 ヒートシンクまでは必要ありませんがLM3S811とENC28J60は熱くなります。 LM3S811は、発熱を抑えるために、50MHzまで動作するところを20MHzで動かしています。 左のコネクタはJTAG用、右のコネクタはシリアル通信用、上のコネクタはLCD接続用。 RJ45のコネクタはパルストランス内蔵のSteward ConnectorのSI-60024-F。
LCDに接続して動かした様子。時刻はNTPで取得しています。 新幹線によくある、ニュースをスクロールさせながら表示するLEDの表示板が欲しかったので作りました。 製作後に気づいたのですが、LCDは残像が残るのでスクロールさせるのには向かないようです。 画面ではわからないですが、読みやすいとは言えないです。
加速度センサを搭載していて、基板の傾きでスクロールのスピードが変化します。 たとえば、文字の流れる方向と逆に傾けていくと、スクロールがゆっくりになり、 最後には文字が逆向きに流れるようになります。
回路図。図中ではMCUがLM3S613となっていますが、この回路の場合、LM3S811でもLM3S613どちらでも大丈夫です。 LM3S811のほうがプログラム用のフラッシュメモリが大きいです。 MCUは3.3V、LCDは5Vの電源で動かします。MCUのGPIOは5Vトレラントなので、MCUとLCDの間は直結しています。
ソフトウエアは、TCP/IPのプロトコルスタックのuIPに、 NTPクライアント、XMLのパーサ、LCD制御等のコードを加えた構成になっています。 ツールチェーンにはCodeSourcery社の提供するGNU Toolchainを用い、 プログラムの開発にはEclipse, OpenOCD, JTAGデバッガなどを使用しました。 MCUの依存部分の記述にはLuminary Microが提供するDriver Libraryを用いました。
RSSフィードのダウンロードは、uIP付属のサンプルのリゾルバやwebクライアントのコードを使うことで実現できるので、 ダウンロードしながらRSSフィードのパースをして必要な文字列を取り出してきます。 英字だけを考える場合、文字コードの変換は必要ないので、それを適当な方法でLCDに表示します。
プログラミングで特に難しいところはなかったと思いますが、uIPのコードに怪しい部分がある気がするので (DHCPクライアントのコードがそのままではうまく動かなかった)、 そういった部分の微調整は必要です。
中央にあるのがMCUであるLM3S6965。その右にある8ピンのチップがフォントを格納するためのシリアルフラッシュメモリ(AT25DF321, 容量:32Mbit)。 LM3S6965も熱くなるため、20MHzで動かしています。 チップ内部の温度センサの値では20MHz動作でも45℃前後になります。
LCDは背中あわせの形で写真の基板と接続しています。
起動後、RSSフィードを読み込んでいる状態。IPアドレスはDHCPで取得します。
フォントにはM+フォントの10ドットのものを利用しています。 LCDは 128 x 64 ドットで2階調。
写真のように、RSSフィードの項目の見出しを表示します。 駅などにあるニュースを表示するディスプレイが手元に欲しかったので作ってみました。
これはこれで悪くない気がしますが、解像度の高い、カラーのLCDが欲しいところです。
Webサーバも動いていて、LCDで表示するRSSフィードやMACアドレスの設定ができます。設定はシリアルフラッシュメモリ(AT25DF321)に保存します。
回路図
ソフトウエアの構成は、キャラクタLCDを用いたものとほぼ同様ですが、 シリアルフラッシュメモリやグラフィックLCDの制御、フォントやグラフィックの処理、文字コード変換等のコードが追加で必要でした。 シリアルフラッシュメモリにフォントを書き込むためのコードなども必要になります。
プリント回路基板はブルガリアのOlimex社に発注しました。 基板データを送ってから約3週間程度で手元に届きました。 基板データをメールで送ると、発注書類のデータがメールで送られてくるので、 これに記入して送って発注が完了するまでに大体5日。製造が終わるまでに約1週間。 手元に届くまでに約1週間という流れでした。 最小線幅とクリアランスが10mil以上の場合だと、もう少し製造が速いかもしれません (最小線幅やクリアランスが10mil未満だと製造に時間がかかるようです)。 回路と基板の設計にはCadSoft Computer社のEagleを用いました。
左の写真が送られてきた基板です。写真には2種類の基板、各1枚ずつが写っています。 実際には、DSS(160x100 mm)で注文し、2種類の基板が各2枚となるように 面付けしてもらったので、4枚が送られてきました。
シルク印刷が少し右に寄っているように見えます(ICのピンとシルクの位置関係を見るとわかる)。 4枚のうち2枚は組み立て後の正常な動作を確認できました。 写真の未使用の2枚についても、目視では問題無さそうです。
マイコンを用いたRSSリーダを2種類設計し、製作した。 ひとつは表示装置としてキャラクタLCDを用い、もうひとつは表示装置としてグラフィックLCDを用いた。
ARMコアを用いたMCUは、(ホビー)ユーザのコミュニティが大きく、OpenOCDなどの開発に便利なツールや 開発のためのドキュメントが整っている印象をうけた。 ただ、ARMコアを用いたMCUを使う場合、ARMのドキュメントとMCUメーカのドキュメントの併読が 必要になることがあり、面倒だと感じた。 また、同じARMコアを用いたMCU間でもメーカによって差異があり、 同じコアを使っていてもメーカが異なるとかなり勝手が違うと思われる (ここで開発したプログラムもMCU固有のドライバライブラリを用いているので、 同じCortexM3コアのSTマイクロのSTM32に移植するにもそれなりに書き換える必要がある)。 それでも、開発ツールが共通化できるのは魅力的かもしれません。