マルチファンクションデバイスを作る

それではいよいよ今回筆者が作ったマルチファンクションデバイスについてちょっと御紹介したいと思う。

もともとPSoC 4は、発売からそれほど間もないにも関わらず、案外にサンプルが豊富である。PSoC CreatorでExample Projectを参照すると(Photo24)、結構な数がHitする(Photo25)。またelement14では現在"100 PSoC 4 Pioneer Kit Projects in 100 days"を開催しており、執筆時点では55ほどのPSoC 4用のプロジェクトが登録されており、これらも色々参考になるのではないかと思う。

Photo24:PSoC CreatorでFile→Open→Example Project...を選ぶと、サンプル一覧が表示される

Photo25:アーキテクチャにPSoC 4を選ぶと38ほど選ばれる。ただ中にはPSoC 1のサンプルとかも入っており、そのまま動かせるわけではないが、参考にはなるだろう

とりあえず今回筆者が作ったものは

  1. 温度を測定して、結果をLCD表示
  2. USBの消費電力を測定して、結果をLCD表示
  3. (1)ないし(2)の結果をUSB-UART経由でPCに転送
  4. (1)~(3)の動作をCapSense経由のボタンで選択。ついでにLEDで現在動作を表示

という動作をするものである(Photo26~29)。

Photo26:デバイス全景。ブレッドボード2枚を使う結構大掛かりなものに。といっても、ユニバーサル基板を使えば1枚で収まる範囲のものだが

Photo27:+5V/GNDなども含むと全部で16本のジャンパが。ちなみに実際はタッチパネルはKit上のものを流用しているので、これも引き出すと20本のジャンパになる。また周辺回路が5V動作を前提にしているので、J9は5V側に設定する

Photo28:温度センサとLED/LEDの分圧抵抗、LCDの輝度調整用ポテンショメータなどはこちらの基板に

Photo29:消費電力測定はこちらのモジュールを流用、I2Cで接続することに。手前の2本のジャンパは、I2C用のプルアップ抵抗

全体の回路図は図1の様になっている。

図1 全体回路図

PSoC Creator側の設定はこんな感じだ(Photo30,31)。

Photo30:利用したのはADCとUART/CapSense/LCD/I2Cの各モジュール。およびLED接続用と温度センサ接続用にピン5本である

Photo31:ピン配置はこんな感じ。一応まだ12ピンほど未使用ピンがあるので、もう少し何かを追加することは可能

プロジェクトファイルは「Design02.zip」としてまとめてあるので、これをダウンロード後に任意のフォルダに展開し、この中のDesign02.cywrkをPSoC Creatorで読み込むとプロジェクトがロードできる。

以下、各機能ごとにもう少し説明したい。

温度測定をどうやるのか?

実はPSoC 4自身も内部に温度センサを持っており、これをそのまま使うことも可能であるが、これはあくまでチップの周辺温度ということになり、もしPioneer Kitをケースなどに収めた場合、そのケース内温度ということになってしまい、ちょっと都合が悪い。そこで今回はNational Semiconductor(現TI)のLM35DZという温度センサを使った。ちなみに秋月電子通商で1個100円で販売されていたので、安さで選択した。これは10mV/℃という解像度で、温度を電圧に変換してVoutから出力してくれるので、これをADCで受けて温度を取得するというものだ。

ソースの側は、まず初期設定で

    ADC_SAR_Seq_Start();        // ADC初期化
    ADC_SAR_Seq_StartConvert(); // ADCサンプリング開始

の2つを呼んでおく。これによりADCは常時温度センサからのサンプリングを行なう設定となる。頻度そのものはADCのConfigurationにあるが166666SPS、解像度は12bitとした。ちなみにPSoC 4のADCはデフォルトはDifferential入力なので、これは設定を変えてSingle Endにしておく。

また電圧リファレンスはVDDA(3.3V)となるので、あまり高い温度だとLM35DZの出力がこれを超えてしまう関係で分圧回路などを挟む必要があるが、室温程度であれば問題ないということで、今回は直接入力してサンプリングをした。

そのサンプル結果の取り込みは

        ADC_SAR_Seq_IsEndConversion(ADC_SAR_Seq_WAIT_FOR_RESULT);
        Temp = (float)ADC_SAR_Seq_GetResult16(0);
        Temp = Temp * 3300.0 / 4096.0 - 77.0;

で行なっている。ADC_SAR_Seq_IsEndConversion()は「直前のサンプリングが終了するまで待つ」ルーチンで、次のADC_SAR_Seq_GetResult16()が値の取り込みである。次の計算はLM35のデータシート及び実測値に沿ってADCの出力を実際の温度に変換する部分で、これはLM35の個体差があるので、校正などして値を修正してほしい。

PSoCのADCはこんな具合に簡単に利用できる。