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作成