「ドングリ」こと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作成