第3回 初めてのLPCマイコン、Lチカプログラミング〜プログラミング編


さあ、今回は実際にプログラムを体験していきます。プログラム初心者向けに書いてきます。

初心者向けのプログラミングなので、できるだけ簡単にLEDを光らせることができることを目指します。でも、ただ光らせるだけではなく、アクションを加えていきます。

この記事でプログラミングの面白さを体験してもらえると幸いです。

では、早速行ってみましょう。

プログラムで赤色のLEDを光らせよう

前回NXPが用意しているお手本のプログラムを動作出来ていることを前提に進めます。

まだ、SDKのダウンロード、お手本プログラム(サンプルコード)の動作はまだという人は、前回の記事を参考にしてください。

参考
第1回 初めてのLPCマイコン、Lチカプログラミング〜第1回 環境構築編〜

初めてのLPCマイコン、Lチカプログラミング〜第2回プログラムの実行〜

まずは、MCUXpresso IDEを開いて、「led_Blinky」プロジェクトを開こう、前回お手本をインポートしていれば、既に左上のプロジェクト管理ウィンドウには、下のように現れているはず。

プロジェクト管理ウィンドウ
プロジェクト管理ウィンドウ

赤色のLEDを光らせるプログラム

次に、プロジェクト管理ウィンドウ内であるled_blinky.cというファイルをダブルクリックします。そうすると、右側のウィンドウにプログラムが現れます。

led_blinky.cのプログラムを次のように変えてみよう。

led_blinky.c


38行目
/*******************************************************************************
* Definitions
******************************************************************************/
#define BOARD_LED_PORT 0U
#define BOARD_LED_PIN  7U //グリーンLED
#define BOARD_LED_PIN_RED  17U //赤LED <---新しい行を追加、わかりやすいようにREDとした

92行目
/* Init output LED GPIO. */
GPIO_PortInit(GPIO, BOARD_LED_PORT);
GPIO_PinInit(GPIO, BOARD_LED_PORT, BOARD_LED_PIN, &led_config);
GPIO_PinInit(GPIO, BOARD_LED_PORT, BOARD_LED_PIN_RED, &led_config); //<---この行を追加しよう

104行目から
while (1)
{
/* Delay 1000 ms */
SysTick_DelayTicks(1000U);

//GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN); //この行はコメントアウト
GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED);//この行を追加しよう

これで、緑色のLEDから赤色のLEDが光ようになったはずです。

#define BOARD_LED_PIN_RED 17は、赤色のLEDを光らせるピンを使用しLEDピンの制御(オン、オフ)をします。17番という数字は、マイコン基板の赤色LEDに繋がっているピン番号です。

GPIO_PinInit()という関数(ある処理をひとまとまりにしたプログラム)でデバイスのピン設定(ピンの振る舞い出力か入力かなど)をしています。

GPIO_PinInit()で赤色LEDを制御するピンを出力に設定しています。

そして、GPIO_PortToggle()関数で実際にLEDのオン、オフのスイッチを制御している感じです。GPIO_PortToggleは、オンだったらオフ、オフだったらオンといういうように反対の制御をする関数です。


コメントアウト

//(ダブルスラッシュ)で始まる行は、コメントとして扱われ、プログラムとしては実行されないことです。/* xxx */ スラッシュと米印で囲まれた部分もコメントアウトとなります。

GPIO_xxx 等の関数について

NXPのSDK(ソフトウェアの部品キットみたいなもの)には、良く使用される処理を予めプログラムしてあり、この事前にプログラムされた関数を使うことで、簡単にその機能を使うことが出来ます。

ビルド

トンカチマークをクリックして、ビルドしてみよう。入力ミスがなければ、エラーなくビルドが完了するはずです。

ビルドが完了したところ
ビルドが完了したところ

デバッグとプログラムの実行

早速、デバッグして動作を確認してみよう。

デバッグの開始
デバッグの開始
プログラムの実行
プログラムの実行

動作している様子。

もし、上手く動かない時は、ここからプログラムをダウンロードして、自分のプログラムと比べてみてください。GiuHubにアクセスしたら、”Download”というボタンがあるので、ダウンロードしてZipファイルを入手してください。解凍すると、お手本のプログラムがみれると思います。

GitHub: 赤色のLEDを光らせるプログラム→

 

うまく、赤色のLEDが光ったら、成功です。

もし、興味があれば、SysTick_DelayTicks(1000U);部分の1000Uの値を色々変えてみてください。LEDの点灯している時間が変わります。

次に、ボード上のボタンを押して、LEDを制御してみましょう。

ボード上にあるボタンでLEDの色を変えてみよう

今度は、ボード上のボタンを使ってLEDを制御してみましょう。LPCXpresso802ボード上にある「ISP」ボタンを押している間だけ、赤色のLEDが光るプログラムです。

では、早速プログラムしてみましょう。


38行目あたり
/*******************************************************************************
* Definitions
******************************************************************************/
#define BOARD_LED_PORT 0U
#define  BOARD_LED_PIN_GREEN 7U //グリーンLED 分かりやすいように、GREENと名付けなした
#define BOARD_LED_PIN_RED 17U //赤LED 赤色のLEDと分かりやすいようにREDとしました
#define  UserButton 12U //ISPボタン ボタン用の信号を用意

78行目あたり
int main(void)
{
	uint32_t pState=0; //この行を付け加えます。ピンの状態を表す変数

110行目あたり
//元々あった行をコメントアウトします
/* Delay 1000 ms */
        //SysTick_DelayTicks(1000U);
        //GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN);
        //GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED);
//ここから以下を新しく書き加えます
    	pState = GPIO_PortRead(GPIO, 0); //ピンの状態を読み込みます
    	        if (!(pState & (1<<UserButton))) //ピンの状態によって、条件分岐します
    	        {
    	            GPIO_PortSet(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED); //ISPボタンが押されていたら赤色のLEDをオン
    	        }else{
    	        	GPIO_PortClear(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED); //ISPボタンを放したら赤色LEDをオフ
    	        }

これで、「ISP」ボタンを押している間、赤色のLEDが点灯するようになります。
このプログラムは、while(1)文を使って、永久に繰り返すプログラムです。

 while()文は、()の中の条件が真(1)の間、同じ処理を繰り返す構文です。今回は、()かっこの中が1なので、永久に同じ処理を繰り返えします。

プログラムを書き終えたら、先程と同じようにビルド後に実行します。

動作している様子は、こんな(下の動画)感じです。どうでしょうか?うまく、LEDは光りましたか?

どうしても出来ないという時は、下のボタンからプログラムをダウンロード(GitHub)して自分のプログラムと見比べてみましょう。

GitHub: ボード上のボタンで赤色のLEDを光らせるプログラム→

 

デバッガが途中で止まってしまう時には。。。
時々、ビルド後にデバッガを起動すると、途中で止まってしまうことがあります。そんな時には、以下を試してみてください。

デバッグウインドウのプロジェクトを選択して、デバッグ停止ボタン(赤四角ボタン)を押してデバッグを一旦終了します。

その後、Clean Up Debugボタンを押します。そして、もう一度、デバッグ開始ボタン(紫色の虫マークのボタン)を押してデバッグを開始すると上手く起動すると思います。

キーボードでLEDの点灯を制御する

最後に、キーボードの入力からLEDを制御して、赤、緑、青のLEDを点灯させてみましょう。

キーボードの、「r」「g」「b」に対応して、赤、緑、青のLEDとします。


34行目あたり
#include "board.h"
#include "fsl_gpio.h"

#include "pin_mux.h"
#include "fsl_debug_console.h" //この行を足します

38行目あたり
/*******************************************************************************
 * Definitions
 ******************************************************************************/
#define BOARD_LED_PORT 0U
#define BOARD_LED_PIN_GREEN  9U //グリーンLED <<--番号を変更しました
#define BOARD_LED_PIN_RED  17U //赤LED
#define BOARD_LED_PIN_BLUE  8U //青LED <<--新しくこの行を追加します。
#define UserButton 12U//ISPボタン

53行目あたり
/*******************************************************************************
 * Variables
 ******************************************************************************/
volatile uint32_t g_systickCounter;
char ch; // この行を足します。


98行目あたり
 /* Init output LED GPIO. */
    GPIO_PortInit(GPIO, BOARD_LED_PORT);
    GPIO_PinInit(GPIO, BOARD_LED_PORT, BOARD_LED_PIN_GREEN, &led_config);
    GPIO_PinInit(GPIO, BOARD_LED_PORT, BOARD_LED_PIN_RED, &led_config);
    GPIO_PinInit(GPIO, BOARD_LED_PORT, BOARD_LED_PIN_BLUE, &led_config); //この行を足します。青色LEDの設定

112行目あたり
while (1)
    {
//元々あったコードをスラッシュを使ってコメントアウトします。
        /* Delay 1000 ms */
        //SysTick_DelayTicks(1000U);
        //GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN);
        //GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED);

    	/*pState = GPIO_PortRead(GPIO, 0);
    	       // if (!(pState & (1<<UserButton)))
    	       // {
    	       //     GPIO_PortSet(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED); //赤色LED ISPボタンを押している間オン
    	       // }else{
    	       // 	GPIO_PortClear(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED); //ISPボタンを話したら赤色LEDをオフ
    	        //}*/
		
            //ここから新らしいプログラムを書いていきます。
            ch = GETCHAR();//キーボードからキー入力を受け付けて、ch文字変数に格納します。

	    switch (ch){ //キー入力で入手したch変数の文字の条件分岐します。
			 case 'r': // 「r」 :赤のとき
				 GPIO_SetPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED); //赤色のLEDを点灯
				 GPIO_SetPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_BLUE); // 青色のLEDを消灯
				 GPIO_SetPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_GREEN);//緑色のLEDを消灯
				 break;
			 case 'b'://「b」青のとき
				 GPIO_ClearPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_BLUE);//青色のLEDを点灯
				 GPIO_ClearPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED);//赤色のLEDを消灯
				 GPIO_SetPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_GREEN);//緑色のLEDを消灯
				 break;
			 case 'g'://「g」緑のとき
				 GPIO_ClearPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_GREEN); //緑色のLEDを点灯 
				 GPIO_ClearPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_RED);//赤色のLEDを消灯
				 GPIO_SetPinsOutput(GPIO, BOARD_LED_PORT, 1u << BOARD_LED_PIN_BLUE);//青色のLEDを消灯
				 break;
			 default://おまじないでつけておきましょう。他のキーを押したら、何もしない
				 break;
	    }

 

今回のプログラムは、少し長いですが、頑張ってプログラムしてみてください。

main関数の中で、はじめに出てくる関数で、GETCHAR()があります。

ここでも、NXPのSDK(ソフトウェアの部品キットみたいなもの)の関数が出てきました。キーボードから文字を入力して取得する関数のプログラムが予め用意されています。

このGETCHAR()関数を使えば、自分でキーボードからキー入力を受け付けるプログラムを書かなくてもよく、簡単にキーボード入力を実装出来るんです。

ただし、この関数を使用する時は、#include “fsl_debug_console.h” というヘッダーファイルをインクルード(プログラムの最初に書くやつ)する必要があります。

次に、switch文が出てきました。

キーボード入力で取得した文字をch変数に格納し、取得した文字による条件分岐を行います。入力の文字は、「r」赤、「b」青、「g」緑で場合分けしているわけです。

ここで、LEDの制御ですが、GPIO_SetPinsOutput()関数とGPIO_ClearPinsOutput()関数でボードのLEDを制御しています。この関数もやはりSDKのソフトウェアの部品が用意されていて、簡単にピンの制御ができるようになっています。Setでピンがハイ(high)、Clearでピンがグランドに落ちます。

ただ、ボードのLEDがちょっと変則的な回路になっていて、SetしてもLEDが点かないものや、ClearしてもLEDが消灯しないものがあります。

赤色のLEDは、SetするとLEDが点灯し、Clearする消灯します。
ですが、青色と緑色のLEDは、その逆の動きをします。

これは、ボードの回路設計がそうなっているからです。

動作は、MCUXpresso IDEの下の方にある”Console”という画面を一回クリックして選択しておいて、そこにキーボードの文字(「r」「g」「b」)を打ち込みます。そして、エンターキーを押すと、その入力したキーの色のLEDが光るというプログラムです。

うまく動けば、以下のように動作するはずです。

上手く動かない場合は、こちらからお手本のプログラムをダウンロードしてください。
GitHub: キーボード入力からLEDを制御するプログラム→

Lチカプログラムは、非常に単純なプログラムですが、マイコンのプログラムの基本でもあります。

また、初めて動作させるボードの動作確認などにも使用されるプログラムですので、是非上手く動作させられるようになってください。

まとめ

いかがでしたでしょうか?

LEDを光らせるのは、基本中の基本ですが、初めての人にとっては、ちょっと難しかったかもしれません。

プログラムから直接デバイスのピンを制御する方法、ボードのボタンでLEDを制御する方法、さらにはターミナル(PC)のキーボード入力からLEDを制御する方法を紹介しました。

自分がプログラムした通りに動いてくれると、もの凄い感動しませんか?

是非これからもプログラムの面白さをシェア出来たらと思います。