NXP LPC810を使った電子工作


はじめに

「ドングリ」こと8ピンDIPのARMマイコン、LPC810で遊んでみました。
#個人的には「ドングリ」よりは「黒豆」の方が見た目は近いかなあと思いましたが…。


目次

1.Lチカを試す

2.I2Cデバイスを繋いで動作させてみる

3.時計付き温度計を作ってみる


1.Lチカを試す

 まずは、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と等価のもので、秋月電子のホームページにある書き込み方法を参考にしました。

ということで、「ドングリの背比べ」でした(笑)


2.I2Cデバイスを繋いで動作させてみる

 次に、ドングリならばドングリらしく、もっと深く遊んでみることにしました。

 そこで気になったのが、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」ボタンでそれぞれのソースコードを出力するだけです。


(写真1:SWMのピンアサイン)


(写真2:ピンの機能を設定)

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は電源投入時に時刻が不定値になるので、電源低下フラグを見てリセットするなど、初期化には注意する必要があります。

色々と試して気付いた注意点をメモとして残しておきます。

 なお、今回はCMSIS + lpx800_driver_libを使ってCでガリガリ書いてみましたが、それほど複雑なICではありませんので、ハマることもなく、大した苦労もありませんでした。気軽に遊べて良いICだと思います。


3.時計付き温度計を作ってみる

 次に、月並みですが、繋いだ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用

※いずれも秋月電子で入手可能

【機能の説明】

【回路図】

※クリックで拡大します

【外観】

基板に組み、秋月のプラスチックケースに入れてみました。

【ソースコード】

TempClockR20.zip 2014/1/8 Update

使い方:

LPCExpresso用のソースコードです。
LPC810のCMSISと、lpc800_driver_libをインポートしたプロジェクトに追加してください。
コンパイル後のバイナリサイズは約3.7KByteです。

※参考用として公開しております。無保証です。


YokoMuMu's Contentsに戻る

2014/01/01作成