QX電装講座 #2 Arduinoを使ってみた

## はじめに
今回から本格的にプログラミングを行っていきましょう。

## IDEの基本的な使い方
ArduinoIDEはそのまま起動するとこのような画面が出てきます。なんだかSetupとかLoopとか書いていますが、これらがArduinoを使う上で必要になってくる基本的なプログラムの原型になってきます。
<img width="612" alt="スクリーンショット 2019-09-02 0.10.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/e4cf0461-9588-4cc9-b8d8-3825957a8564.png">
では、それぞれについて説明をしていきましょう。
### Setup
Setupのプログラムは以下の部分です。

```c++:Arduino
void setup() {
  // put your setup code here, to run once:

}

```

ここで書くのは初期設定にあたるプログラムです。なので、例えばピンの属性の説明であったり、書き込むファイルの名前を決めたりといった**動かすのは最初の一回限りでいい**ものをここで書きます。

### Loop
Loopのプログラムは以下の部分です。

```c++:Arduino
void loop() {
  // put your main code here, to run repeatedly:

}

```

ここで書くのはずっと行ってほしいプログラムです。なので、例えばセンサーで得た情報の読み取りや、書き込みといった**このプログラムの根幹になる部分**を書く場所です。

## 基本的な動作
Arduinoの動き方は決まっており、
setup
 ↓
loop
 ↓
loop
 ↓
loop
 ↓
 ︙

といった感じで永遠と繰り返されます。恐らく使っていくうちにここらへんには慣れてくるんじゃないかなと思います。

##Lチカをしてみよう
ということで、早速ですがLEDをチカチカさせる、通称「Lチカ」をやってみましょう!
### 必要なモノ
- Arduino(1枚)
- ブレッドボード(1枚)
- LED(1個)
- 抵抗(330Ωぐらい)
- ジャンパー線(2本)

### 動作の概形
LEDをチカチカさせるということは、LEDを…

<details><summary>答えはここから</summary><strong>点けたり消したりを繰り返す</strong>ことになります。ということは<strong>loopで点ける、消すという動作をプログラムしてやればいい</strong>ということになります。</details>

では、そのためのプログラムを作っていきましょう。

### プログラムしてみよう
それでは実際にプログラムを書いていきます。
と、その前にプログラムをより見やすいようにするための方法を紹介しておきます。

### define
例えば2番ピンにLEDをつけたとします。もちろん、ピン番号を毎回覚えておいて「2番ピンに〜」で指定するのもありかもしれないです。でも、これが何個ものLEDを扱うようになると大変なことになりますよね？
そこで登場するのがdefineです。
書き方はこんな感じ。

```c++:Arduino
#define LED 2

```

これは「LEDって書いてたら2って読み替えて」ということです。
C/C++に詳しい方には特に注意ですが、;や=は入らないです。入れてしまうと適切に定義ができずにエラーを吐きます。

### コメントアウト
コメントアウトとはプログラムとして認識されない文字のことです。なんでこんなものが必要かというと、流石にパッと見ではプログラムが何をしているのかわからないので共有するときに他の人にも何をしているのか分かるようにするため、そして自分が久しぶりに見たときに分かるようにするという意味もあります。
書き方は

```c++:Arduino
//これがコメントアウト
/*これもコメントアウト*/

```

コメントアウトされると文字の色自体が変化します。そのためコメントアウトされるたことは簡単にわかるとは思います。
種類は2種類あり、//と書く方法と/* */と書く方法がありますが、用法が異なります。
1つ目で書くと、その行の中で以降の文字がコメントアウトされます。
2つ目で書くと、これらで囲まれた部分は何行先まで囲まれていても、囲まれている部分全てがコメントアウトされます。
勿論ですが、わかりやすい言葉で書くほうが良いです。

### setupまで
それでは、実際にプログラムを書いていきましょう。

```c++:Arduino
#define LED 2

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

では、確認していきましょう。

```c++:Arduino
#define LED 2
```
前述のように、ここでは2番ピンにLEDを付ける予定なので定義しておきます。

```c++:Arduino
void setup() {
  // put your setup code here, to run once:
pinMode(LED,OUTPUT);
}
```

ここではsetup、つまり一回限りの動作をプログラムしています。

### pinMode

```c++:Arduino
pinMode(LED,OUTPUT);
```

ここではそれぞれのピンがどういう属性なのかを書いていきます。
[pinMode](http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2014)については、この記事に書いていますが、括弧内に関しては前(ここでいうLEDのところ)でピンを指定して、後(ここでいうOUTPUT)で属性を書きます。打ち込める属性は

- OUTPUT:出力を行うピン
- INPUT:入力を行うピン
- INPUT_PULLUP:INPUTでのHIGHとLOWの定義が逆転する

を入れることができます。

### loop
loopには以下のように書き込みます。

```c++:Arduino
void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(LED,HIGH);
delay(1000);
digitalWrite(LED,LOW);
delay(1000);
}
```

では、これについても説明していきます。

### digitalWrite

```c++:Arduino
digitalWrite(LED,HIGH);
```

[digitalWrite](http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2051)に関しては、指定したピン(ここでいうLED)に出力をおこなうというものです。出力に関してはHIGHとLOWが存在し、HIGHだと5V(ものによっては3.3V)を出力しLOWだと0Vになります。
これで指定されたHIGHやLOWに関しては再び指定されるまでずっと保持されるので、例えばHIGHの状態を保持したければ一回だけHIGHと書けばいいです。

### delay

```c++:Arduino
delay(1000);
```

delayは括弧内の時間だけ待つという関数です。ここで書かれる数字は単位がmsとなるため、例えば1000と書けば1000ms(=1s)となります。

さて、ここまでくるとこんな感じになっているのではないでしょうか?

```c++:Arduino
#define LED 2

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

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

では、早速動かしてみましょう。

## 配線
配線は下のように行いましょう。
<img width="804" alt="スクリーンショット 2019-09-02 23.56.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/1939d178-be89-af02-c32c-0a226619f0a5.png">


さてここで、見慣れない白い板が出てきましたね。これについても説明していきます。

### ブレッドボード

白い板の正体はブレッドボードと呼ばれるものです。これは図の縦方向の5つの穴が電気的に繋がっていて、これによってはんだ付けや撚り線をしなくても接続ができるというすぐれものです。
ただし、上下の＋と−に関しては横で繋がっています。
要するに、下のような感じに繋がっています。
<img width="481" alt="スクリーンショット 2019-09-02 23.58.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/be949897-3f5f-abb8-50b0-5306706f586a.png">


### アナログピンとデジタルピン

arduinoにはアナログピンとデジタルピンが存在します。
これら自体はピンの番号にA0といった感じで最初にAが付いていればアナログ、無ければデジタルピンです。
アナログピンでは電圧の高さを細かく見ることができます。デジタルピンではそれができず、電圧が高い低いですべてを判別します。

### 5VピンGNDピン

また、これ以外にも一定の電圧を出力するピンやリセットを検知するピンなどが存在します。
その他のピンに関しては、[この記事](https://www.google.com/amp/s/omoroya.com/arduino-extra-edition-02/%3Famp%3D1)がわかりやすいかと思います。実はこのピンにはこういう意味もあるとか、難しすぎるので触れていない内容もあるので気になる方は調べてみてください。

## 実行してみよう
では、実際に作ったプログラムを実行してみましょう。実行するにはArduinoのバージョンや送信先を指定しなければいけません。その方法も含めて説明していきます。

### ボードの指定
Arduinoとひとくくりに言っても、たくさんの種類があります。そして、それぞれに実装されているチップも異なってくるので、使っているArduinoが何者かを教えてやる必要性があります。
では、Arduinoが何者か教えてみましょう。
<img width="710" alt="スクリーンショット 2019-09-02 16.56.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/76734fa8-bc05-1e09-b25a-b41cf3e039ff.png">
どのパソコンでも上の方に「ツール」というボタンがあります。ここからボードというところを選択します。
<img width="762" alt="スクリーンショット 2019-09-02 16.57.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/3e2853b5-4228-4655-04c6-e634027d7bf4.png">
ボードを選択すると、今選択されているボードにチェックマークがあります。ここから今使っているボードを指定します。例えばArduino UNOを使っている人はArduino/Genuino Unoと書かれたボードを指定します。
これでボードの指定が完了しました。

### シリアルポートの指定
次に、シリアルポートの指定を行います。これはどういう接続方法をしているかを指定するものです。
恐らく、刺しているボードの名前がそのまま表示されるかと思います。
<img width="774" alt="スクリーンショット 2019-09-02 23.35.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/3d6692e4-09ff-17e3-30c0-46f822fffbe6.png">

### ファイルの書き込み
これが完了したらいよいよ書き込みです。左上にこのようなボタン類があります。左から「検証(コンパイル)」「書き込み」「新規」「開く」「保存」ですが、基本的に右2つを押すだけで保存も行われます。
<img width="177" alt="スクリーンショット 2019-09-02 23.37.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/bd018252-6988-3b0a-23f1-c323f76e6fee.png">
では、実際に書き込みを行いましょう。左から2つ目のボタンをクリックするとコンパイルと書き込みが実行されて下のような表示が画面下に表示されたら成功です。
<img width="715" alt="スクリーンショット 2019-09-02 23.39.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/496c1d00-ef18-6e31-81e1-b8908b72a7f0.png">

もしうまくいかなかった場合は下のような画面が表示されて、エラーを吐きます。
黒背景の部分にエラーの原因が表示されるので、それに従って対処していってください。
<img width="560" alt="スクリーンショット 2019-09-02 23.42.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/7cb39c0b-e841-ee14-0274-7c3d22e0b66f.png">

### ところで…
これでチカチカとLEDが点滅して、目がチカチカして目がしんどいなと思っている方もいるかも知れません。
「これ、どうやったら終わるんですか?」
こんなことを聞きたくなるかもしれませんね。実際に聞かれたことがあります。でも、今回言いましたよね?

>Arduinoの動き方は決まっており、
setup
 ↓
loop
 ↓
loop
 ↓
loop
 ↓
 ︙

つまり、残念ながら消えません。でもご安心ください。3つ消す方法があります。

1.Lチカではない別のプログラムを書き込む
2.LEDをブレッドボードから抜く
3.USBをぶち抜く

そうすると、あら不思議電気が消えました!ちなみに、私のオススメは3です。過激っぽいのと手っ取り早いのでいいですよ。
(ただし、電源供給が再開されると直前のプログラムが再開されるのでLチカが再開します)

次回以降ではセンサーを扱っていきます。

[QX電装講座 #3 センサー使ってみた](https://qiita.com/GoshBird/items/1c0ad004c7150d83f9b7)