Arduino + Grove (1)

##Blinkプログラムの解説
[前回記事の最後](https://qiita.com/KNBK/items/1c8afdf743d3f732eb33#led%E3%82%92%E3%83%81%E3%82%AB%E3%83%81%E3%82%AB%E3%81%95%E3%81%9B%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF)に書き込んだプログラムをよく見てみます



```javascript

void setup() { //起動時に一回だけ実行される関数
  pinMode(LED_BUILTIN, OUTPUT);  //内蔵LEDに割り当てられているピンを出力モードに設定
  
}

void loop() {  //この関数内はループ実行される
  digitalWrite(LED_BUILTIN, HIGH);   // LEDを点灯する
  delay(1000);                       // 1000ミリ秒（1秒）まつ
  digitalWrite(LED_BUILTIN, LOW);    // LEDを消灯する
  delay(1000);                       // 1000ミリ秒（1秒）まつ
}
```

####プログラム解説
`pinMode()`は、ピンをどのように設定すべきかをArduinoに伝える関数です。D2, D3等のデジタルピンは入力（INPUT）か出力（OUTPUT）のどちらかとして使えます。今回は、LED出力なのでOUTPUTに設定します
`digitalWrite()`は、HIGHまたはLOWの信号をピンに送ることができる関数です
内蔵LEDに対してHIGHを送ると電圧が上がりLEDが点灯します
LOWを送ると電圧が下がってLEDが消灯します
`delay()`は、カッコ内に記載された値の時間だけ待つ関数です
値はミリ秒で指定でき、**1000ミリ秒＝1秒になります**

>`delay(1000)`を`delay(500)`に変更して書き込むと何が起こる？

##ArduinoIDEにおけるプログラムの作法
Arduinoではプログラムのことを「スケッチ」と呼びます
書き方には作法があるので、主なものを確認していきます


####スケッチの構造
setup()にはスケッチが動き始めた時に1度だけ実行したいコードを書きます
loop()は以降繰り返し実行したいコードを書きます。
Seeduinoの電源を入れると自動的にsetup()が1度だけ実行され、以降はloop()内に書かれているプログラムを繰り返し実行します

>`setup()`には主として設定（ピンのモード設定など）が書かれ、それ以外の振る舞いを示すコードを`loop()`内に書く と覚えておくと良いでしょう

####コメントについて
スケッチがどんな動きをしているかを表記するためにコメントを使います
**//**をつけると、その部分はコメントとして認識され、実行時に無視されます
コメントは、自分がコードを読む時に内容を思い出したり、他人がコードを理解する参考になります
スケッチを書く際には、コメントをしっかりつけることを意識すると良いでしょう

####関数について
　命令の集合に**中括弧 {}**をつけると、機能を持った一つのまとまり（関数）として表現することができます。上のコードにある`void setup()`は、このまとまりにsetup()という名前をつけたことを表しています。

上に示したのは基本的なもののみなので、さらに詳しく知りたい場合は下記URLを参考にしてください
https://garretlab.web.fc2.com/arduino_reference/language/functions/math/map.html

公式リファレンスは下記URLになります（英語）
https://www.arduino.cc/reference/en/



##Groveシールドの取り付け
Seeduino本体にGroveシールドを取り付けます。microUSBが刺さっている場合は抜いてから作業します
![IMG_6831.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499213/ff0bc563-304d-e546-fac8-084d996e64b3.jpeg)

シールドのコネクタ部分とSeeduinoのコネクタ部が合うように、重ねます
![IMG_7573.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499213/9d35c7dc-6d14-131d-354e-a8547727c9fc.jpeg)

次に、ピンが曲がらないように、シールド基板をそっと水平方向に押し込みます
![IMG_3757.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499213/fd1f58c9-e123-e99d-2d28-79c2ac20b1a4.jpeg)

ピンが側面から5mmほど見えますが、これでOKです
![IMG_7573.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499213/225ff5a6-833f-0000-71d7-e0474d7024c8.jpeg)

microUSBをPCに接続した際、シールド上の緑色LEDが点灯していれば取り付けは完了です
![IMG_5716.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499213/1fdf9cb4-e672-9e9b-daf6-45a5f01e71e4.jpeg)

##GroveシールドにLEDを取り付け、LEDチカチカを試す
LEDボードをケーブルで繋ぎ、シールド上の「D3」と書かれているソケットに差し込みます
![IMG_8075.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499213/5e9b3fd2-a10e-a9e1-3e6f-09eae7e208e9.jpeg)

下記のコードをコピー、ArduinoIDEのエディット画面上にペーストして「➡」を押してSeeduinoに書き込みます
書き込み前にスケッチ（プログラム）の保存先を求められますので、Desktop上に「DEbasic」フォルダを作り、その中に「ArduinoSketch」というフォルダを作り、その中に保存します
初期のファイル名は「sketch_(今日の日付)」となりますが、わかりにくいので仮に「LEDblink」にします

※プログラムは下記を参考に改変したもの
http://wiki.seeedstudio.com/Grove-Red_LED/

```javascript
//LEDblink

void setup() {
  // initialize digital pin3  as an output. LEDが刺さっているピンD3を出力モードに設定
  pinMode(3, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level) LEDを点灯
  delay(1000);                       // wait for a second 1000ミリ秒待つ
  digitalWrite(3, LOW);    // turn the LED off by making the voltage LOW LEDを消灯
  delay(1000);                       // wait for a second 1000ミリ秒待つ
}
```
書き込みが終了すると、D3に刺さっているLEDが明滅します

##ボタンでLEDのON/OFFを行う
Groveシールド上の「D2」にボタンを接続します
![IMG_5636.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499213/4ce7e892-a845-db84-ac1c-100950df3340.jpeg)

下記のコードをコピー、ArduinoIDEのエディット画面上にペーストして「➡」を押してSeeduinoに書き込みます
スケッチの保存先を求められますので、Desktop上の「DEbasic」フォルダ→「ArduinoSketch」フォルダ内に「buttonLED」という名前で保存します

※プログラムは下記を参考に改変
http://wiki.seeedstudio.com/Grove-Button/

```javascript
//buttonLED

const int buttonPin = 2;     // the number of the pushbutton pin ボタンが刺さっているピンを指定
const int ledPin =  3;      // the number of the LED pin　LEDが刺さっているピンを指定

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status　ボタンの状況を示す変数を宣言

void setup() {
    // initialize the LED pin as an output: LEDが刺さっているピンを出力モードに設定
    pinMode(ledPin, OUTPUT);
    // initialize the pushbutton pin as an input: ボタンが刺さっているピンを入力モードに設定
    pinMode(buttonPin, INPUT);
}

void loop(){
    // read the state of the pushbutton value: 
    buttonState = digitalRead(buttonPin); //ボタンが刺さっているピンの状態を確認し、buttonStateに記録

    // check if the pushbutton is pressed.
    // if it is, the buttonState is HIGH:　
    if (buttonState == HIGH) { //もし、ボタンが押されていたら
        // turn LED on:
        digitalWrite(ledPin, HIGH); //LEDをON（HIGH）に
    }
    else {                    //ボタンが押されていなければ
        // turn LED off:
        digitalWrite(ledPin, LOW); //LEDをOFF（LOW）に
    }
}
```

書き込みが完了すると、ボタンを押しているときだけLEDが点灯し、指を離すとLEDが消灯します

####プログラム解説
`digitalRead()`は、()内に記載されたピンの電圧がHIGHまたはLOWであるかを確認する関数です
ボタンを押している間はHIGH, ボタンから指を離すとLOWになります

##if文による条件分岐
上のプログラムには、`if()`という関数が使われています。これは`()`内の条件に当てはまった際に`{}`内の関数を実行するものです

`else{}`の内容は、上の条件式に当てはまらなかった場合に実行されます

```javascript
 if (buttonState == HIGH) { //もし、ボタンが押されていたら
        // turn LED on:
        digitalWrite(ledPin, HIGH); //LEDをON（HIGH）に
    }
    else {                    //ボタンが押されていなければ
        // turn LED off:
        digitalWrite(ledPin, LOW); //LEDをOFF（LOW）に
    }
```
`()`内の条件を示す式を**条件式**といいます
条件式は`== (等しい)`以外にも`!= (等しくない)`や
`x > y (xがyより大きい)`, `x < y (xがyより小さい)`
`x >= y (xがy以上)`, `x <= y (xがy以下)`
等の表記法があります

>buttonLEDの条件式を`!=`にしてみたら何が起こる？
D2のボタンスイッチを傾斜スイッチに変えてみたら何が起こる？