初心者歓迎!Arduinoで初めるC言語プログラミング(実践編1:LED,温度センサ)‐サンプルプログラムあり!

知識勉強

今回で第3弾となります。Arduino初めて使う方は、ぜひ導入編文法編
ご覧になると理解しやすいかと思います。

この記事は、こういった声をサポートしていきます!
Arduino初心者歓迎シリーズ:機器導入文法編実践①(今ここ)、実践②実践③実践④

・Arduinoやってみたいけど、よくわかんないや!

・順番に手取り足取り教えてほしい!

サンプルプログラムに、解説もふんだんに入れていきますので、初めての方にも理解しやすいように進めていきます。もう知ってるよって項目は、読み飛ばしちゃってください。

それでは、ゆっくりやっていきましょう。

2. ArduinoでのC言語プログラミングの実践

1. LEDの点灯、消灯をするプログラムを作成する。

// LEDを接続するピン番号
const int LED_PIN = 13;
void setup() {
  // LEDのピンを出力に設定する
  pinMode(LED_PIN, OUTPUT);
}
void loop() {
  // LEDを点灯
  digitalWrite(LED_PIN, HIGH);
  // 1秒待つ
  delay(1000);
  // LEDを消灯
  digitalWrite(LED_PIN, LOW);
  // 1秒待つ
  delay(1000);
}

ArduinoでLEDを制御するプログラムを作成します。LEDを制御するというと堅いですが点灯、消灯するプログラムを作成します。

Lチカと言われるやつです。プログラムを勉強した方だと、”Hello, World”をプリントしてみましょう!というの見たことあるんじゃないかなと思います。それのマイコン版になります。
シリアル通信やディスプレイも、モチロン扱うことできますが、最初に扱う例題ではなくなっちゃうので、それは後程やっていきましょう。

作成するにあたって、File⇒Examples⇒01.Basics⇒Blinkのサンプルプログラムを開いてもOKです。
シリアル通信を使用してArduinoの動作状況を確認できるようにしましょう。
setup関数の中に、

serial.bigin(9600);     //エラーが出るコードですが、分かる方は修正して、分からない方は、そのまま書き足しましょう

を書き足して、左上のVerify(チェックマークボタン)を押してください。
すると、下図のようにエラーが表示されます。

コード中のハイライトされている場所がエラーが出ているところです。図だと29行と35行です。
画面下のOutputウィンドウにもエラーの内容が表示されています。

C:\Users\Blink\Blink.ino: In function 'void setup()': ←setup関数の中の
C:\Users\Blink.ino:29:3: error: 'serial' was not declared in this scope ←29行目3文字目エラー。serialが定義されてない
   serial.bigin(9600);
   ^~~~~~    ←三角の上から波々がエラー箇所
C:\Users\Blink\Blink.ino:29:3: note: suggested alternative: 'Serial' ←'Serial'に変更を提案します
   serial.bigin(9600);
   ^~~~~~
   Serial

英語ではありますが、エラーでても、ネットで検索したら記事があるし、
翻訳すれば、なんでエラーでているのか、分かってきます。
うわっと拒否反応ださずに対処していきましょう。
もう一回、Verifyしてください。
今度は、エラー内容と提案が変わりますよね。指示に従い、変更してみましょう。

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  Serial.println(HIGH);
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  Serial.println(LOW);
  delay(1000);                      // wait for a second
}

Serial.println(HighかLOW);の2行を足してみましょう。
LEDが点灯したら、PC側シリアルモニタにそのときの値を表示。
LEDが消灯したら、PC側シリアルモニタにそのときの値を表示。

ボードにアップロード(右矢印アイコン)してみましょう。
下記のような出力になります。LEDの点滅にあわせて、出力がでています。

このシリアルモニタは、ボードとのデータのやり取りができる便利機能です。
今は、ボードからPCに受信していますが、PCからボードに送信もできるので、後程に試してみましょう

この機能を使うと、プログラムが正しく動いているのか、モニタリングができます。
エラーがでなくて、ボードに書き込めるんだけど、うまく動いてないってときなんかも、これでデバッグ(エラーの修正)が行いやすくなります。

ちなみに、値が”HIGH”と”LOW”で出ると思った方、いや”1”と”0”だと思ったよって方、どちらでしょうか。

LEDを光らせるdigitalWrite関数は引数が2つ書かれています(カンマで区切られた2つ)。
第1引数に書いているLED_BUILTINが光らせるピン番号で、
第2引数のところがHIGHが電圧をHi(5V)にするか、になります。

LED_BUILTINやHIGHのところに、カーソルを合わせてみてください。情報が表示されます。

#define LED_BUILTIN 13 //LED_BUILTINを10進数の13として定義します
#define HIGH 0x1 //HIGHを16進数の1として定義します   といった内容が書かれています。

Arduinoがよく使うやつを、標準で定義してくれているため、
自分でいちいち宣言しなくても、文字で指定が可能となっています。自分で宣言しない分、「これはなんだ?」と逆に疑問に思うこともあるかもしれませんが。。。

話は戻り、そのため、HIGHは、文字としてではなく1として扱われており、printlnで表示した(HIGH)は1を表しています。

もし文字としてHIGHを表示したい場合は、”で文字として表したいことを挟んでください。
ボードに書き込んでみましょう。

Serial.println("HIGH");   //文字として表示します

2. ボタンを使ったLEDの点灯、消灯をするプログラムを作成する。

Arduinoでボタン入力を処理する方法を学び、ボタンを使用してLEDを点灯、消灯するプログラムを作成します。また、シリアル通信を使用して、ボタンの状態を確認するプログラムも作成します。

// LEDを接続するピン番号、内臓LED
const int LED_PIN = 13;
// ボタンを接続するピン番号
const int BUTTON_PIN = 2;
void setup() {
  // LEDのピンを出力に設定する
  pinMode(LED_PIN, OUTPUT);
  // ボタンのピンを入力に設定。プルアップ抵抗を使用する
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
  // ボタンが押されたかどうかを取得する
  bool buttonState = digitalRead(BUTTON_PIN) == LOW;
  // ボタンが押された場合
  if (buttonState) {
    // LEDを点灯
    digitalWrite(LED_PIN, HIGH);
  } else {
    // LEDを消灯
    digitalWrite(LED_PIN, LOW);
  }
}

ボタンを押すと、LEDが光る。放すと消えるプログラムです。
接続は写真を参考にしてください。使用しているボタンは押すとつながるプッシュスイッチです。

接続の仕方

プルアップ抵抗って何?って方

入力端子にしているピン2ですが、プルアップ抵抗というのを使わない状態だと、スイッチ押してないときの電圧はいくつだと思いますか?

答えは「分からない」です。とても電圧が不安定な状態となります。0Vかもしれないし5V出るかもしれません。
入力端子は、電圧を受けるだけの状態ですし、高抵抗な状態となります。
抵抗が高いということは、ちょっとの電流で電圧がでます。

これです ⇒ V(電圧)=I(電流)×R(抵抗) オームの法則

ちょっとの電流は、どこからやってくるかというと、ノイズを入力端子に受けたときです。
蛍光灯なんかは50/60Hzで動いてますし、そのほかのもろもろも電気で動いているものは外部にノイズを漏らします。そういったノイズを受けて、入力端子の電圧はフラフラします。

スイッチを押すと、スイッチを介してGNDにつながるので0Vで安定するのですが、
スイッチを押していないときは、何も繋がってないので、電圧がフラフラして、もしかすると
スイッチを押してないのに、LEDが点灯したり消えたりするかもしれません。

そうならないように、Arduinoのマイコンの中にプルアップ抵抗の機能が入っていて、それを有効にするのが、

// ボタンのピンを入力に設定。プルアップ抵抗を使用する
pinMode(BUTTON_PIN, INPUT_PULLUP); これになります。

内臓のプルアップ抵抗を使わない場合は、以下のようなコードと、接続になります。
pinMode(BUTTON_PIN, INPUT); //第2引数が変わります
上に引っ張るということで、抵抗を介して電源に吊り上げます。
(プルダウン抵抗とあったら、抵抗を介してGNDに接続します)

3. 温度センサー(アナログタイプ)を使った温度測定プログラムを作成する。

Arduinoで温度センサーを使用する方法を学び、温度センサーからの入力を処理するプログラムを作成します。また、シリアル通信を使用して温度の値を表示するプログラムも作成します。

センサがない方は、可変抵抗か、固定抵抗をつかって分圧することで、センサの出力値を模擬してもOKです。

int lm35Pin = A0;    // LM35温度センサーの接続ピン
float voltage;       // LM35の出力電圧
float temperature;   // 温度
void setup() {
  Serial.begin(9600); // シリアル通信を開始する
}
void loop() {
  voltage = analogRead(lm35Pin) * 5.0 / 1023.0;  // LM35の出力電圧を計算する
  temperature = voltage * 100.0;                // 温度に変換する
  Serial.print("Temperature: ");                // 温度をシリアルモニタに出力する
  Serial.print(temperature);
  Serial.println(" C");
  delay(1000);                                   // 1秒間の待機
}

ここで使用する温度センサはLM35DZです。仕様は以下。

  • 動作温度範囲:0~100℃
  • 動作電圧:4~30 V
  • 出力電圧:10.0 mV/℃

なので出力電圧が0.1Vだったら、100倍して10度だな、と分かるということです。

アナログ電圧を計測(AD変換)することが、Arduinoは可能です。だいたいのマイコンは可能ですが。
アナログ電圧を出力できる(DA変換)のは少ないです。もしやりたい場合は、外付けのDA変換モジュールを使いましょう。でアナログ入力は以下のコード。
voltage = analogRead(lm35Pin) * 5.0 / 1023.0; // LM35の出力電圧を計算する

アナログ電圧を読んでいるのは、ここ ⇒ analogRead(lm35Pin)  lm35PinはピンA0です
Arduinoは10bitのAD変換です。5Vのときに1024。0Vのときに0。2.5Vのときに512の数字が結果になります。

デジタル値 20のとき、20*5*1023で0.1Vに換算できます。
0.1Vを100倍して10度が求めれます。

こうやって、センサが出力するアナログ電圧から、温度を求めることができます。

まとめ

今回はここまで。ほかにもサンプルプログラムを使いながら、コードやArduinoの説明をしていきます。今回のも例題通りにできたら、ぜひ少し書き換えてみて、理解を深めてみましょう。

どんな風に書き換えるかというと、例えば、
温度センサ(可変抵抗でも可)が、ある値になったら、LEDを光らせる。といった具合にです。

それぞれは、今までにやった内容です。それを組み合わせれるようになれば
どんどん理解が深まりますし、ネットに転がっている情報が宝の山に変わっていきます。

この記事を書いた人
ユカタキ

私、気になります!
自分でやってみたくなる性格の私は、電子工作、プログラム、3Dプリンター関連の事などの情報を発信しています。
社会人から電子工作を始め14年、電験3種一発合格、2021年から3DプリンタをDIYに活用。
そんな私が、まだまだ調べながらではありますが、ほかのDIYユーザー皆さんのためになるようなことを心がけています

ユカタキをフォローする
知識勉強
ユカタキをフォローする

コメント