フェーズ1

E1-02 点滅周期を変える(定数→変数):値を変えると動作が変わることを体験する

シリーズ:実験シリーズ(フェーズ1)
対応ロードマップ:フェーズ1 / E1-02
この記事の役割:オンボードLEDの点滅周期を変数にして、値を変えると点滅速度が変わることを体験する。

1. 目的

オンボードLEDの点滅周期を 定数から変数に置き換え、値を変えると実際の動作も変わる ことを確認します。
今回のゴールは次の3つです。

  • LEDの点滅周期を変数で指定できる
  • 1005001000 のように値を変えると、点滅速度が変わることを確認できる
  • 「コードの値を変えると、実際の動作も変わる」と説明できる

2. 前提・環境

  • 評価ボード:EK-RA8M2
  • 開発環境:e² studio + FSP
  • 前回までにできていること
    • GPIOでオンボードLEDを点滅できる
    • R_BSP_PinWrite() を使って P600 を切り替えられる
    • R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS) を使って点滅できる
    • ビルドと書き込みができる

今回は 「E1-01 GPIOレジスタ(LEDのポート)の値を確認する方法」を土台にして進めます。

3. 今回の変更点(差分)

前回は、待ち時間をコードに直接書いていました。
↓前回コード

#include "hal_data.h"
  
void hal_entry(void)  
{
  R_BSP_PinAccessEnable();

  while (1)  
  {  
    /* ON側 */  
    R_BSP_PinWrite(BSP_IO_PORT_06_PIN_00, BSP_IO_LEVEL_HIGH);  
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
  
    /* OFF側 */  
    R_BSP_PinWrite(BSP_IO_PORT_06_PIN_00, BSP_IO_LEVEL_LOW);  
    R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
  }  
}

今回は、この 500 を変数に置き換えます。

int wait_ms = 500;  
R_BSP_SoftwareDelay(wait_ms, BSP_DELAY_UNITS_MILLISECONDS);

今回の差分はこれだけです。
つまり今回は、新しい機能を増やすというより、同じ点滅処理を“調整しやすい書き方”に変える 実験です。

4. 手順

4-1. 前回のLED点滅コードを用意する

まず、「E1-01 GPIOレジスタ(LEDのポート)の値を確認する方法」で使ったコードを用意します。

4-2. 待ち時間を変数にする

500 を直接書く代わりに、変数 wait_ms を使います。

#include "hal_data.h"
  
void hal_entry(void)  
{  
  int wait_ms = 500;

  R_BSP_PinAccessEnable();
  
  while (1)  
  {  
    /* ON側 */  
    R_BSP_PinWrite(BSP_IO_PORT_06_PIN_00, BSP_IO_LEVEL_HIGH);  
    R_BSP_SoftwareDelay(wait_ms, BSP_DELAY_UNITS_MILLISECONDS);
  
    /* OFF側 */  
    R_BSP_PinWrite(BSP_IO_PORT_06_PIN_00, BSP_IO_LEVEL_LOW);  
    R_BSP_SoftwareDelay(wait_ms, BSP_DELAY_UNITS_MILLISECONDS);
  }  
}

4-3. 値を変えて書き込みする

まずは wait_ms = 500; で動かします。
その後、次のように値を変えて、それぞれ書き込みます。

  • wait_ms = 100;
  • wait_ms = 500;
  • wait_ms = 1000;

4-4. LEDの点滅速度を確認する

値を小さくすると速くなり、値を大きくすると遅くなります。
評価ボード上のLEDを見て、点滅速度の違いを確認します。

5. 実行結果

確認できたこと:

  • wait_ms = 100; では、LEDが速く点滅した
  • wait_ms = 500; では、見やすい速さで点滅した
  • wait_ms = 1000; では、LEDがゆっくり点滅した

6. ハマりポイント/原因と対策

6-1. 100 にしても 1000 にしても速さが変わらない

原因

  • wait_ms の数字を変えたつもりで、別の場所を直している
  • ビルドしていない
  • wait_msの数字を変えてビルド後に、評価ボードへ書き込みしていない

直し方

  • int wait_ms = 500;500 を直しているか確認する
  • 直したあとに、もう一度ビルドする
  • そのあと、評価ボードへもう一度書き込む

6-2. 点滅が速すぎて違いが分からない

原因

  • 500400 に変えても、差が小さいので見た目では分かりにくい
  • 変数を変えた前後で、数字が近いと、速さの違いを感じにくい

直し方

  • まずは 1005001000 のように、大きく差をつけて試す

6-3. ビルドエラーが出る

原因

  • ; を付け忘れている
  • {} の数が合っていない
  • int wait_ms = 500; を書く場所を間違えている

直し方

  • int wait_ms = 500; の末尾に ; があるか確認する
  • while (1) の前に int wait_ms = 500; があるか確認する
  • エラー一覧のいちばん上に出ている内容から順に直す

6-4. 点く時間と消える時間の感じが思ったのと逆

原因

  • オンボードLEDが Lowで点灯するタイプ(Active-Low) になっている

直し方

  • HIGH にしているところと LOW にしているところを入れ替えて試す
  • 「Highにしたら必ず点く」とは限らないことを思い出す

7. 次回やること

次は、E1-03 外付けLED(ブレッドボード+抵抗) に進みます。
GPIOで外付けLEDを点灯させ、配線・抵抗・LEDの向き・GNDの役割を確認します。ロードマップでも E1-03 は、LED+抵抗を配線し、配線と回路の基本を実感する回です。

8. 関連リンク

  • 基礎シリーズ:C言語のはじめ(main / while / 関数 / 変数)(リンク)
  • 基礎:マイコンとは?RA8M2でLEDを点滅するための超入門(リンク)
  • 前回:E1-01 GPIOレジスタ(LEDのポート)の値を確認する方法(リンク)

-フェーズ1