C言語

C言語のはじめ:LED点滅で必要なところだけ(main/ループ/関数/変数)

シリーズ:基礎シリーズ(C言語)
この記事のねらい:実験シリーズ「評価ボードでLEDを点滅」に入る前に、C言語の基本の流れを先につかむ。
※C言語を全部は扱いません。まずは 読める/少し直せる をゴールにします。

はじめに:初心者が最初につまずくのは「流れが見えない」こと

C言語が難しいというより、最初は

  • どこから始まるの?
  • どこが繰り返し?
  • 何が「命令」なの?
  • 何を覚えておくの?

が見えなくて止まります。
LED点滅に必要なC言語は単純なので、まずは この4つの形だけを把握します。

要点(これだけ覚えればOK)

  • main():ここから始まる(入口)
  • while(1):ずっと繰り返す(組み込みの基本)
  • func();:命令のまとまりを実行する(関数呼び出し)
  • 変数:値や状態を覚える箱(回数、ON/OFF、待ち時間)

1. まず日本語で処理を書く

実験シリーズにて、最初に行うLED点滅の処理は、やっていること自体はこれだけです。

  1. 準備をする(必要なら)
  2. ずっと繰り返す
     a. LEDをつける
     b. 0.5秒待つ
     c. LEDを消す
     d. 0.5秒待つ

この「手順」を、そのままC言語に置き換えます。

2. 日本語→Cへの翻訳ルール(最低限)

初心者はここだけ守ればOKです。

  • 「最初にやる」→ main() の中に書く
  • 「ずっと繰り返す」→ while(1) を使う
  • 「動作(命令)」→ 関数名(); の形で書く
    • 関数名は、命令の名前(自分で付けたり、用意されていたりします。)
    • 例:led_on(); / delay_ms(500);

3. 翻訳するとこうなる

※LEDをON/OFFする具体的なAPI名は、実験記事側で評価ボードに合わせます。ここでは基本の流れをつかみます。

int main(void)
{
    // 1) 準備(必要なら)

    while (1)                // 2) ずっと繰り返す
    {
        led_on();            // a. LEDをつける
        delay_ms(500);       // b. 0.5秒待つ
        led_off();           // c. LEDを消す
        delay_ms(500);       // d. 0.5秒待つ
    }
}

ここで大事なのは「一行ずつ日本語に言い換えられる」ことです。
文法を暗記するより先に、まず意味を理解できるようにします。

4. main():入口(スタート地点)

main() は「最初に実行される場所」です。
LED点滅の最初は、まず main() 周辺だけ読めればOKです。

5. while(1):組み込みの心臓(ずっと動く)

組み込みは電源が入っている間、基本ずっと動きます。
だから while(1) のような「終わらない繰り返し」があるのが普通です。

while( ) のカッコの中が「続ける条件」を記述します。
1 は“常に続ける”として扱われるので、while(1) は止まらずに繰り返します。
(細かい理由は後でOK)

6. 関数:名前( );は「その命令を実行する」と思えばOK

「関数は覚えることが多い」ので、最初はこれだけで十分です。

  • led_on(); → LEDをONする命令
  • led_off(); → LEDをOFFする命令
  • delay_ms(500); → 500ms待つ命令

この段階では「関数の作り方」よりも、名前(); を見て“命令を実行している”と読めることが大事です。
(ロボットを作るようになると命令が増えるので、関数をたくさん使うようになります。今のうちに関数の使い方に慣れておくと後が楽です。)

7. 変数:値や状態を覚える箱(最初は無くても点滅できる)

LED点滅は、変数なしでもできます。
でも少し進むと「設定を変えたい」「回数を数えたい」が出てきます。

Cでは、まず 箱を作る(変数を宣言する) 必要があります。

int wait_ms;

次に、箱(変数)に値を入れます。(代入)

wait_ms = 500;

この箱を作ることと、その箱に値を入れることの2つをまとめて作る書き方もできます。(変数の初期化)

int wait_ms = 500;
  • int:整数(0, 1, 2, 500…)を入れられる箱
  • wait_ms:箱の名前(変数名
  • =:右の値を左の箱に入れる
  • ;:文の終わり

そして、次は待ち時間:500の箇所をこの変数に置き換えた場合の例です。

int wait_ms = 500;

while (1)
{
    led_on();
    delay_ms(wait_ms);
    led_off();
    delay_ms(wait_ms);
}

この例では「待ち時間」を変数にしたので、500を1か所変えるだけで点滅速度を変えられるようになります。
変数は「値を覚える箱」。まずはこれで十分です。

よくあるつまずき(LED点滅レベル)

1) エラーが大量に出たときの見方

1つのミス(例:; を忘れる、{} が崩れる)で、エラーが雪だるま式に増えることがあります。
まずは エラー一覧の先頭(最初の1個) から順に直していきます。

2) {} が崩れて、どこが繰り返しか分からなくなる

while(1){} の中が「繰り返し本体」です。
まずそこだけ確認します。

3) 待ちが効かず、点滅が速すぎる

ループ待ちは最適化で意図通りにならないことがあります。
最初は「確実に効く待ち(FSPのdelayなど)」を使う方針にします。

まとめ

  • LED点滅は「ON→待つ→OFF→待つ」を繰り返すだけ
  • main() が入口、while(1) が繰り返し
  • 関数は、まずは、名前(); と書くと、その名前の処理が実行される。
    括弧の中の値は、その処理を行うために指定する値であることが分ればよい
  • 変数は「覚えたい値」が出たら使う(待ち時間、回数、状態など)

次に読む

  • 実験シリーズ:評価ボードでLEDを点滅(手順・設定・コード・結果)
  • 次回(C言語):if(条件で動作を変える:ボタンや状態)

-C言語