Arduino入門 第4回 良いスケッチとは?

目次

YouTube動画

あわせて読みたい
- YouTube YouTube でお気に入りの動画や音楽を楽しみ、オリジナルのコンテンツをアップロードして友だちや家族、世界中の人たちと共有しましょう。

良いスケッチを書くために

「Arduino入門 第3回 プログラミングの第一歩」では次のスケッチを作成しました。

でもこのスケッチは「読みやすさ、変更しやすさ」の観点からあまり良いスケッチとは言えないんです。

void setup() {
  // put your setup code here, to run once:
pinMode(12, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
}

そこで、今回はこのスケッチを読みやすく、変更しやすいように書き換えます。

良いスケッチにするための手法

今回の動画では、良いスケッチを書くためのいくつかの手法をご紹介します。ぜひこのような書き方を使って読みやすく、変更しやすいスケッチを書くように心がけてみてください。

コメント

スケッチの内容がどのようなものか、またスケッチの中でどのような制御をしているのか、という内容をスケッチに直接メモ書きできる仕組みがあります。

スケッチの中に書くメモ書きを「コメント」と呼びます。

C++言語では、コメントの書き方が2通りあります。

複数行コメント

次のように書くと、「/*」から「*/」までがコメントとなります。

文章を途中で改行することもできますので、多くの情報を書くことができます。

/* これはコメントです。Arduino IDEはこの部分は無視します */

/*
   このコメントの書き方を使うと、
   このように複数行で書くこともできます
*/

1行コメント

次のように書くと、「//」から改行までがコメントとなります。

行の途中から書くことができますが、改行までがコメントになります。

// 1行で書く場合に便利な書き方です

// 次のように、行の途中から書くこともできます
digitalWrite(12, HIGH);  // 12番端子の出力制御スイッチをONにする

数行のコメントであれば、次のように「//」を使う人もいます。

// 12番端子のLEDをONにして、
// そのまま1秒待つ
digitalWrite(12, HIGH);
delay(1000);

改行のルール

スケッチでは、基本的に1行に1つの命令を書くようにします。

ただしこれはあくまでも原則で、場合によっては1行に複数の命令を書くこともあります。その書き方は今後の動画で解説します。

インデント

前回の動画では、命令は波括弧「{」と「}」の間に書くことを説明しました。

今後スケッチが複雑になってくると波括弧の中にさらに波括弧で囲んだ命令が出てきます。

そのときにスケッチを見やすくするように、波括弧の中の命令は先頭にスペースを開けるようにします。

スペースを開けることを「インデント」、日本語では「字下げ」と呼んでいます。

インデントは半角スペース4個、または2個のケースがほとんどです。またインデントの半角スペースはTABキーを使って入力します。

次のスケッチはインデントを入れた例です。

/*
  Arduinoボードに接続したLEDを
  一定時間ごとにON/OFF制御
*/

void setup() {
  pinMode(12, OUTPUT);
}

void loop() {
  digitalWrite(12, HIGH);
  delay(1000);
  digitalWrite(12, LOW);
  delay(1000);
}

マクロ

スケッチの中の、特定の位置の内容を一度に指定したい場合、次の「マクロ」と呼ばれる機能が便利です。

#define マクロ名 置き換える内容

スケッチの先頭部分にこのように書くと、この行以降の「マクロ名」の部分を「置き換える内容」に置き換えてくれます。

例えば次のようにスケッチを書くと、pinMode命令とdigitalWrite命令の「LED_PIN」の部分は「12」に置き換えられます。

#define LED_PIN 12

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

書き直したスケッチ

コメント、インデント、マクロを使用して前回作成したスケッチを書き直すと、次のようになります。

/*
  Arduinoボードに接続したLEDを
  一定時間ごとにON/OFF制御
*/

#define LED_PIN 12    // LED接続端子
#define INTERVAL 1000 // 点滅間隔(ミリ秒)

void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // LEDをONにする
  digitalWrite(LED_PIN, HIGH);
  delay(INTERVAL);

  // LEDをOFFにする
  digitalWrite(LED_PIN, LOW);
  delay(INTERVAL);
}

最近はChatGPTでプログラムを作成してもらうことができます。

次のプロンプトでChatGPTにスケッチを作成してもらうようにお願いしてみました。

ChatGPTへのプロンプト

Arduino MicroでLEDを点滅制御するスケッチを作成してください。
条件は以下になります。
* LEDは12番端子に接続しています
* LEDは1秒ごとにONとOFFをずっと繰り返します
* なるべくわかりやすく、変更しやすいスケッチにしてください
* ‘#define’マクロを使用してください
よろしくお願いします。

結果として次のようなスケッチを作成してくれました。

// LEDが接続されたピン番号
#define LED_PIN 12

// 点滅の周期(ミリ秒)
#define BLINK_INTERVAL 1000

void setup() {
  // LEDピンを出力に設定
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // LEDを点灯
  digitalWrite(LED_PIN, HIGH);
  delay(BLINK_INTERVAL);

  // LEDを消灯
  digitalWrite(LED_PIN, LOW);
  delay(BLINK_INTERVAL);
}

チャレンジ課題解答例

LEDは2つの端子に接続しますので、接続端子名を「BLUE_LED」と「RED_LED」というマクロ名で定義してみました。

また、点滅の時間間隔は「INTERVAL」というマクロ名で定義してあります。

なお、これが唯一の正解ではありませんので、ご自身で読みやすいスケッチを工夫して書いてみてください。

/*
  Arduino入門 第4回 良いスケッチとは?
    チャレンジ課題解答例
    2個のLEDを交互に点灯する
*/

#define BLUE_LED 12  // 青色LED接続端子
#define RED_LED  8   // 赤色LED接続端子
#define INTERVAL 1000  // 点滅間隔(ミリ秒)

void setup() {
  // LED接続端子を出力制御にする
  pinMode(BLUE_LED, OUTPUT);
  pinMode(RED_LED,  OUTPUT);
}

void loop() {
  // 片方をON、片方をOFFにする
  digitalWrite(BLUE_LED, HIGH);
  digitalWrite(RED_LED,  LOW);
  delay(INTERVAL);

  // ONとOFFを逆にする
  digitalWrite(BLUE_LED, LOW);
  digitalWrite(RED_LED,  HIGH);
  delay(INTERVAL);
}
通知の設定
通知タイミング
guest
2 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
RIKI
RIKI
6 月 前

こんにちは
プラモデルのデコトラの飾りでLEDを使って光らせたいのですが
何を買い揃えれば良いのでしょうか?ナイトライダーみたいに順番に光らせたいです
よろしくお願いします

目次