シリーズ:基礎シリーズ(C言語)
この記事のねらい:実験シリーズ「評価ボードでLEDを点滅」に入る前に、C言語の基本の流れを先につかむ。
※C言語を全部は扱いません。まずは 読める/少し直せる をゴールにします。
はじめに:初心者が最初につまずくのは「流れが見えない」こと
C言語が難しいというより、最初は
- どこから始まるの?
- どこが繰り返し?
- 何が「命令」なの?
- 何を覚えておくの?
が見えなくて止まります。
LED点滅に必要なC言語は単純なので、まずは この4つの形だけを把握します。
要点(これだけ覚えればOK)
main():ここから始まる(入口)while(1):ずっと繰り返す(組み込みの基本)func();:命令のまとまりを実行する(関数呼び出し)- 変数:値や状態を覚える箱(回数、ON/OFF、待ち時間)
1. まず日本語で処理を書く
実験シリーズにて、最初に行うLED点滅の処理は、やっていること自体はこれだけです。
- 準備をする(必要なら)
- ずっと繰り返す
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(条件で動作を変える:ボタンや状態)