「ドングリ」こと8ピンDIPのARMマイコン、LPC810で遊んでみました。
#個人的には「ドングリ」よりは「黒豆」の方が見た目は近いかなあと思いましたが…。
1.Lチカを試す
2.I2Cデバイスを繋いで動作させてみる
3.時計付き温度計を作ってみる
まずは、SysTickタイマーを使ってLチカを試してみます。
恒例のLチカですが、普通にLチカを試すだけでは何となく面白くありません。
何か面白いことが無いかなぁ…と考えながらドングリを眺めていたら、IC555とピン数もパッケージも全く同じ事を思い出しました。
(左:LPC810、右:IC555の互換チップ)昔、よく「子供の科学」で見ていたIC555(タイマIC)は1個500円くらいしていたと記憶していますが…何と!!!今や80円の32ビット・マイクロコントローラでLチカの時代ですヨ!(良いのか悪いのか判りませんが)
ということで、妙にIC555でもLチカしてみたくなり、両者を使って同じ土俵(ブレッドボード)でLチカしてみることにしました。
IC555では、「不安定マルチバイブレーター」という回路を組みます。コンデンサと抵抗器2個で点滅サイクルとデューティーを変えることができます。
対してドングリでは、ソフトウェアカウンターを回して、0〜99までが点灯、100〜199までが消灯というようにしてLEDを点滅させます。
LPC810へのファームウェアの書き込みは、自作のFT-232RLシリアル変換ケーブルを使いました。これはAE-FT2321Xと等価のもので、秋月電子のホームページにある書き込み方法を参考にしました。
ということで、「ドングリの背比べ」でした(笑)
次に、ドングリならばドングリらしく、もっと深く遊んでみることにしました。
そこで気になったのが、SWM(Switch Matrix)という機能です。
LPC810のピンアサインを見ると、デフォルトではデジタルI/Oピンとアナログコンパレータが使える程度ですが、このSWMという機能を使うことにより、I2CやSPI、UARTやタイマ(SCT)の機能を電源ピン以外の任意のピンに割り当てることができます。そこで今回は、SWMの実験も兼ねて、I2Cデバイスを繋げてみることにします。
まず、SWMの設定ですが、NXPのサイトにある「Switch Matrix Too(要JRE)」を使うことで、初期化用のソースコードを自動的に生成することができます。生成されるソースコードには2種類あり、一つはSWMのピンアサインを設定する「swm.c」と、もう一つはIOCONを操作してピンの機能を設定する「iocon.c」です。それぞれ、main関数から1度だけ呼び出すことで初期化することができます。
Switch Matrix Toolの使い方ですが、これは結構簡単で、最初にパッケージの形状を選んだあと、「Switch Matrix」タブでSWMのピンアサインを設定し(写真1)、次に「Configure I/O」タブでピンの機能を設定した後(写真2)、「Export」ボタンでそれぞれのソースコードを出力するだけです。
I2Cの初期化と通信ですが、CMSISと一緒にインポートされるlpc800_driver_libの中にある、lpc8xx_i2c.cを使うことができます。データシートを見ながら初期化ルーチン、送受信ルーチンを呼び出してみたら、あっさりと動作しました。lpc800_driver_libの中で多少コンパイルエラーは出ますが、今回はMasterで使うので、Slave関連のコードはサクッとコメントアウトして黙らせます。
後は普通にI2Cデバイスを使うことができます。
今回は、キャラクタLCDと温度センサ、RTCを使ってみることにしました。向かって左からLPC-Link2(書き込み器/デバッガ)、LPC810、キャラクタLCD、RTC、温度センサが並んでいます。
結果的に2日程度でキャラクタLCDを駆動することができました。LPC1114で作ったICM1602表示プログラムのコードをベースにしているのですが、RSビット(データ/コマンド指定ビット)がコントロールバイトのbit7からbit6に移動していたのに気付かず、「なんでコントラストは設定できるのに、キャラクタは表示されないんだ?」とハマっていました(笑)
温度センサーについてはデータシートが読みづらくて(しかも計算式が間違ってる)、理解するのに1日掛かったにも関わらず、動作は10分で確認できました。
RTCは実績があったので、1時間程度で動作させることができました。RTCは電源投入時に時刻が不定値になるので、電源低下フラグを見てリセットするなど、初期化には注意する必要があります。
色々と試して気付いた注意点をメモとして残しておきます。
組み込んでコンパイルしてみたところ、ROMを1KByte弱使用しました。LPC810に対しては、やや大きめのオブジェクトです。ブートROMの中にI2C関係のAPIが組み込まれていて、それを利用することができるのですが、未調査です。面倒なので、本当にROMが足りなくなったら考えることにしました。
なお、今回はCMSIS + lpx800_driver_libを使ってCでガリガリ書いてみましたが、それほど複雑なICではありませんので、ハマることもなく、大した苦労もありませんでした。気軽に遊べて良いICだと思います。
次に、月並みですが、繋いだI2Cデバイスを使って時計付き温度計を作ってみました。時計を設定できるように、ボタンを2個追加します。
【部品表】
部品番号 部品名 備考U1 LPC810M021FN8 主役のドングリ君 U2 AQM082A-RN-GBW (DIP化キット) I2C キャラクタLCD U3 RTC-8564NB (DIP化キット) I2C RTC U4 ADT7410 (DIP化キット) I2C温度計 U5 MicroChip TCM809 リセットIC U6 3.3V StepUp DIP Ver.2 電池(0.7V〜3.3V)から3.3Vを作り出すIC C1 積層フィルムコンデンサ 0.1uF 電源ノイズのバイパス用コンデンサ C2 電解コンデンサ 100uF 10V 電源電圧の安定用(リプル除去) SW1 タクトスイッチ 時設定用 SW2 タクトスイッチ 分設定用 BATT 電池ボックス 単三電池×2用 ※いずれも秋月電子で入手可能
【機能の説明】
- LCDに時刻(HH:MM:SS形式)と温度(摂氏)を表示
- SW1押下で時刻を1時間進める(時刻合わせ用)
- SW2押下で時刻を1分進める(時刻合わせ用)
【回路図】
※クリックで拡大します
- I2Cのプルアップ抵抗は、RTC-8564NBのDIP化キットに内蔵されているものを使用します。DIP化キットのJP1とJP2をショートしてください
- 電池駆動にするため、秋月の3.3VステップアップDIPを使っています。本当は電源電圧低下検出回路を付けた方が良いのですが、何かを制御するようなクリティカルな用途ではないため、バッサリと省略しています
- スイッチのプルアップ抵抗は省略し、ドングリ内部のプルアップ抵抗を使うことにしました。スイッチのチャタリング除去はソフトウェア処理(ソフトウェア積分)で行うため、外付けの回路はありません
- RTCのバックアップ回路はありません。電池を入れ替える度に時計の時と分を設定するだけなので、そんなに大変ではないだろうと考え、バッサリと省略しています
- U5はリセットICです。電池駆動の場合、AQM082Aがちゃんと初期化されないため追加しました
【外観】
基板に組み、秋月のプラスチックケースに入れてみました。
【ソースコード】
TempClockR20.zip 2014/1/8 Update
使い方:
LPCExpresso用のソースコードです。
LPC810のCMSISと、lpc800_driver_libをインポートしたプロジェクトに追加してください。
コンパイル後のバイナリサイズは約3.7KByteです。※参考用として公開しております。無保証です。
2014/01/01作成