3つのLチカ
プログラミング言語を学ぶ際、手始めのプログラムとして文字列「Hello World!!」を画面に出力することが定番になっていますが、マイコンボードを初めて手に取る際にも定番になっているお作法があります。LEDの点滅(チカチカ)。通称「Lチカ」です。
PSoC BLE Pioneer kitもマイコンボードであることにはかわりませんので、初めての実践として、Lチカにチャレンジしてみましょう。
以下、PSoC BLE Pioneer kit※1がお手元にあることが前提となります。
※1 PSoC BLE Pioneer kitは Cypress社直接購入の他、国内代理店から入手することが可能です。
また、PSoCデバイスをカスタマイズおよびプログラミングするには、PSoC Creatorが必要です。本稿執筆時点の2017年4月末現在、PSoC Creator4.xが最新版ですが、本コラムでは、PSoC Creator3.3CP3を利用します。PSoC Creator3.3CP3は、Cypressサイトより入手可能です※2(要ユーザー登録)。
※2 PSoC Creatorのインストール方法は、本コラムでは触れません。PSoC BLE Pioneer kitに付属の文書「Getting Started」をご覧ください。なお、PSoC CreatorはWindows OSのみの対応のため、他OSユーザーの方は仮想環境等を別途用意していただく必要があります。
本文中、PSoC Creator上の操作手順を紹介しますが、紙面の関係ですべてを掲載することが難しい状況です。今回扱うLチカ実行環境とともに、仔細を記載したドキュメントを用意しましたので、必要に応じて以下からダウンロードください。
Lチカ実行環境および補助資料のご提供
本稿で紹介する、Lチカ実行環境を以下のリンクからダウンロードいただけます。ぜひ、こちらも参照しながら、解説をご覧ください。
ファイルには実行環境に加えて補足資料も同梱しております。筆者が主宰するPE-BANK IoT研究会でのワークショップ向けに作成した資料を、本コラム向けに修正加筆したものです。
なお、サンプルアプリケーションは、利用する環境によっては動作しない場合があります。お問合せへの対応は難しいため、大変恐縮ですが、動作しない場合は、周囲の経験者などに支援してもらってください。こちらの条件にご同意のうえ、ダウンロードをお願いいたします。
S/W制御バージョン(シンプル版)
PSoC BLEチップのとある入出力端子に接続されたLEDに加える電圧をソフトウエアによってON/OFFすることで、Lチカを点滅する方法です。人の目で判別しやすくするためにおおよそ500m秒の待ち時間(CPUからすれば、ものすご~く長い時間)を入れて実現します。
手順1は、回路作成(図1)。PSoC Creator上で適切なワークスペース(Projectと称します)が生成されていることが前提です。PSoC BLE Pioneer Kitのベースボード上には既に LEDや抵抗は実装されていますので、PSoC Creator上のTopDesign画面上にて、GPIOポートをドラック&ドロップで配置して、ポートの入出力と内部状態を設定(Configuration)するのみです(図2)。
PSoC的にはここまででもいいのですが、人には何をしているのか一見では判りづらいので、LEDとの接続状態も追加します(図3中 青色の部分)。
次は、ピンの割り当てを行います。PSoC BLE Pioneer Kitでは、LEDは 端子 に接続されています。そのことをPSoC Creatorに知らせます※3(図4)。
※3 PSoC Creatorは、PSoCデバイス専用ツールではありますが、複数タイプのPSoCデバイスに対応できるようになっているため、ボード固有の情報を知りません。したがって、PSoCデバイスのどのピンをどのように利用するのかを知らせる必要があるのです。
ここで、一度ビルド(プリビルド)を行います。必要なライブラリを生成するためです。その後、ソースコードを作成します(図5)。
ソースコードの作成が終わりましたら再びビルドを行います。
最後に、生成されたイメージをPSoCデバイスに書き込みを行います。
なお、PSoC CreatorをインストールしたPCとPSoC BLE Pioneer Kit間は キット付属のUSBケーブルで接続しておく必要があります。以降の実践も同様です。
書き込みが正常終了すると、ボード上に搭載されているLED3の点滅していることが確認できます(図7)。
H/W制御バージョン(PWM制御版)
PWM(Pulse Width Modulation)という機能ブロックをPSoCのCPUコアとLEDの間に挿入して、PWMが有する定期的に出力をON/OFFしくみを使ってLEDに加わる電圧を制御する方法です。ただし、PWMブロックを設定するためのソフトウェアコードの作成は必要です。
S/W制御バージョンと同様、回路図作成を行います。図中、青線での描画は人が理解しやすくするために記載してものです。
PWMブロックの場合、周波数(ON/OFFの繰り返し速度)とDUTY(ON時間とOFF時間の比率)を設定する必要があるのですが、Configuration画面にて行います。
今回は、周波数: 1KHz, DUTY: 1対1(Period値は499を設定)としています。
もちろん、今回も、ピンの割り当てを行います。
最後にソースコードですが、PWMモジュールを初期化するためのコードPWM_*_Start()関数が必要となるのみです。今回主処理は、組み入れていませんので、for文による無限ループ内は、空実行です。
ソースコードの入力が終わりましたら、「ビルド > ターゲットへのダウンロード」で PWM版Lチカは完成です。ボード外見上の動作は、上述のS/W版と変わりませんが、CPUがON時間/OFF時間を測定してLED制御する必要はなくなりますので、他のタスクに専念することができます(サンプルでは、他のタスクを実装していないので、シンプル版と大きな差が無い様に見えるかもしれません)。
S/W制御バージョン(ISR版)
3つめの方法は、ソフトウエア制御による方法ではあるのですが、シンプル版とは異なり割り込み処理(ISR: Interrupt Service Routine)を使って、Lチカを実現します。
シンプル版は、ON時間/OFF時間の時間経過処理をメインルーチンで行うため、LED点滅間隔を一定に保ったまま他の処理(多くの場合、Lチカを行うことが目的ではないでしょう)を行うことが難しくなってしまいます。
また、ISR版は、PWMの様なロジック回路も利用しないので、多くに場合CPUとLEDがあれば実現できてしまうので、簡単かつ実用的ということで、実務の場では、この方式が採用されます。
回路図ですが、シンプル版と変わりません。ピンアサインも変更はありません。異なるのはソースコードのみです。図12がISR版のサンプルソースコードとなります。
ソースコード中、CY_ISR(SysTick_Handler)が 割り込み処理ルーチンISRです。
ISRは、一定間隔でコールされ、コールされる都度、カウンタを+1します。カウンタ値が所定の値の達した時点で、フラグをセットします。メインルーチンでは、フラグを適宜チェックし、フラグがセットされた状態の時のみ、LEDに印可する電圧を反転させるとともに、フラグをリセットします。これを繰り返すことで、Lチカが実現できます。
割り込み要因としては、PSoC4のコアCPUであるARM Cortex-M0が持つSysTick割り込み(システムタイマ割り込み)を利用します。
SysTick割り込みは、割り込み番号15(ベクタ15)※4とあらかじめCPU側で決められているので、PSoC用ライブラリ関数CyIntSetSysVector()を使って、ベクタ15と割り込みハンドラ SysTick_Handlerを紐付けます。また、ライブラリ関数SysTick_Config()を使って、割り込み発生間隔が1000Hz(==1msec)になる様、調整しています。
※4 ARM社Webサイト「Cortex-M0 Devices Generic User Guide」参照
* * *
以上3つのLチカ実現方法を紹介させて頂きました。PSoCを用いると、いずれの方法でも簡単に実現できてしまうこと - アイデアを形にする便利な道具 - がお判りいただけたかと思います。
次回以降、こんなPSoCを使って、Observer、Braodcaster、GATTプロファイルの実装を紹介していきます。
著者紹介
飯田 幸孝 (IIDA Yukitaka)
- アイアイディーエー 代表 / PE-BANK 東京本社所属プロエンジニア
計測機器開発メーカ、JAVA VMプロバイダの2社を経て、2007年独立。組込機器用ファームウェア開発に多く従事。2015年より新人技術者育成にも講師として関わる。PE-BANKでは、IoT研究会を主宰。
モノづくり好きと宇宙から地球を眺めてみたいという思いが高じて、2009年より宇宙エレベータ開発に、手弁当にて参画。 制御プログラムを担当。一般社団法人宇宙エレベータ協会主催「宇宙エレベータチャレンジ2013」にて、世界最長記録1100mを達成。
宇宙エレベータ開発のご縁で静岡大学の衛星プロジェクトStars-Cに参画。2016年12月、担当ユニットが一足先に宇宙に行き、地球を眺める。