Arduino覚え書き

# 概要

Arduinoについての覚え書き。Arduino単体でできることについて。常時更新です。

# 統合開発環境のセットアップ

* [arduino.cc](https://www.arduino.cc/)を表示
* 「Download」から「Mac OS X 10.7 Lion or newer」をクリック
* JUST DOWNLOADをクリック
* ダウンロードしたzipファイルを展開し、Arduinoをアプリケーションフォルダに移動
* Arduinoをダブルクリック

以下のように統合開発環境が起動する。
![スクリーンショット 2015-08-22 16.49.50.png](https://qiita-image-store.s3.amazonaws.com/0/20474/3ad3a2b2-6e6f-4a24-9a6e-7b283b962f23.png)

## スケッチを書く
* 「TX」と「RX」のLEDが細かく点滅した後、「L」のLEDがゆっくり点滅する
* 以下のスケッチ(プログラムをArduinoではスケッチと言う)を書く

``` shell
void setup() {
  pinMode(13, OUTPUT);

}

void loop() {
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
}
```
* 左上のチェックマークアイコンを押すと以下のように表示される
![スクリーンショット 2015-08-22 16.59.04.png](https://qiita-image-store.s3.amazonaws.com/0/20474/fe548776-a283-a8c8-0bc8-91126aac43fc.png)

## Arduinoに転送する (Arduino Uno)
* 「ツール」-> 「ボード」-> 「Arduino Uno」を選択

![スクリーンショット 2015-08-22 17.03.50.png](https://qiita-image-store.s3.amazonaws.com/0/20474/30a12e49-954f-cebf-5c00-d2fcea7216c6.png)

* 「ツール」->「ポート」-> 「/dev/cu.usbmodem1421 (Arduino Uno)」を選択

![スクリーンショット 2015-08-22 17.05.40.png](https://qiita-image-store.s3.amazonaws.com/0/20474/7b7c2aba-9c9a-de5a-c6ba-5ef13194983d.png)

* 左から２番目の「→」のアイコンをクリックし、「マイコンボードへの書き込みが完了しました。」と表示されることを確認する

![スクリーンショット 2015-08-22 17.07.53.png](https://qiita-image-store.s3.amazonaws.com/0/20474/ba1c98a9-a5a3-f77e-a81b-fa924a744f05.png)

* LEDが光ったことを確認する

![写真 2015-08-22 17 09 52.jpg](https://qiita-image-store.s3.amazonaws.com/0/20474/11141cf0-b429-69a6-0e27-7680e63a9d25.jpeg)

# [Arduino Uno](Arduino / Genuino UNO)

最もスタンダードなArduino。

## 特徴

* 作成中

# [Arduino Due](https://www.arduino.cc/en/Main/ArduinoBoardDue)

mrubyを動かすために32bit版のArduinoであるDueを購入。
まだまだ開発途上な感じです。

## 特徴

* CPU
    * ARM (Cortex-M3)ベースのCPUであるAtmel SAM3X8Eを採用
        * それまで(Arduino Unoなど)はAtmelのAVRシリーズ
    * ARMは組み込み用途に使われるパワフルなCPUのひとつで32bit、84Mhz
        * Unoは8bit
* メモリ
    * SRAM : 96KB, Flash memory(for code) : 512KB
* I/O
    * 3.3Vしかない
        * 一般的なArduinoの場合I/Oは5V
            * ほとんどのシールドは5Vで動作する
                * まれに(Pro, Pro miniなど)3V
        * 現状そのままDueに使えるシールドがほとんど無い
* USB
    * 2ポート
        * Miro USBです
            * UnoはA-Bタイプ
* ホストになれる機能がある
    * 今は難しい
        * ケーブルが入手しにくい
        * ライブラリが不十分
            * 接続できるデバイスは限られている

## 統合開発環境の設定

* ツール -> ボード -> Boards Manager

![スクリーンショット 2015-08-25 22.29.57.png](https://qiita-image-store.s3.amazonaws.com/0/20474/e5634b56-038c-25d0-fdd1-05fb63a5dc7a.png)

* Arduino SAM Boards (32-bits ARM Cortex-M3) by Arduinoの「Install」をクリック
    * 100MBほどデータがダウンロードされます

![スクリーンショット 2015-08-25 22.31.47.png](https://qiita-image-store.s3.amazonaws.com/0/20474/09f75842-d2e5-5292-738c-c075baecde30.png)


* 「閉じる」を押し、ツール -> ボード -> Arduino Due (Programming Port)を選択
    * [Programming Port](https://www.arduino.cc/en/uploads/Main/DueUSBPorts.jpg)に接続している前提

![スクリーンショット 2015-08-25 22.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/20474/08048357-9822-7dd5-9cf0-92c151dc6a76.png)

* 後はArduino Unoと同様

# スケッチの例

## 「L(13番ピン)」のLEDを点滅させる

 2.5秒点灯し、0.5秒消えるを繰り返す

``` shell
#define LED_PIN 13
void setup() {
  pinMode(LED_PIN, OUTPUT);

}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(2500);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}
```

* void setup()
    * 初期化の処理を書く
        * 使いたい機能の部分を明示的に書くだけで良い
            * ポート類がデジタルだったりアナログだったりという初期化は自動的に行われている
    * pinMode(LED_PIN, OUTPUT);
        * ここではpinModeという初期化だけ行っている
        * LED_PIN : 最初の#defineで定義されており、「13」が入る
        * OUTPUT : 出力として使用する
            * 13番ピンを出力として使用している
* void loop()
    * 繰り返される処理を書く
        * digitalWrite(LED_PIN, HIGH);
            * 13番ピンをHIGH(1)にする。つまりLEDが点灯する
        * delay(2500);
            * 単位はミリ秒
            * 次の処理に進むまで2.5秒待機する
        * digitalWrite(LED_PIN, LOW);
            * 13番ピンをLOW(0)にする。つまりLEDが消灯する

## キーボードからの入力で「L」のLEDをつけたり消したりする

* 「o」を押すとLEDがつく
* 「p」を押すとLEDが消える
* 「b」を押すとLEDが点滅する

``` shell
#define LED_PIN 13

void blink10(){
  int i;
  for(i=0;i<10;i++){
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);    
  }
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int inputchar;
  inputchar = Serial.read();
  if(inputchar != -1){
    switch(inputchar){
      case 'o':
        Serial.print("LED ON\n");
        digitalWrite(LED_PIN, HIGH);
        break;
      case 'p':
        Serial.print("LED OFF\n");
        digitalWrite(LED_PIN, LOW);
        break;
      case 'b':
        Serial.print("LED Blinking\n");
        blink10();
    }
    Serial.print("READY\n");
  }
}
```

* void blink10()
    * LEDを10回点滅させる関数
* Serial.begin(9600);
    * Arduinoのシリアルポートを9600bpsで初期化する
    * Arduinoはだいたいこの値の例が多い
* inputchar = Serial.read();
    * シリアルポートから1文字読み込む
    * 読み込むものが無ければ-1を返す
        * 読み込むものがない場合は後ろのif文で処理される

* 実行
    * ツール ->  シリアルモニタ
    * oを入力して「送信」を押すとLEDがつく
    * pを入力して「送信」を押すとLEDが消える
    * bを入力して「送信」を押すとLEDが点滅する

![スクリーンショット 2015-09-06 8.41.05.png](https://qiita-image-store.s3.amazonaws.com/0/20474/29e1c0d0-9d77-6937-77bb-19e0d0abd2e4.png)

![スクリーンショット 2015-09-06 8.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/20474/2eb5f8b4-772b-5882-c456-5a2ddfaa4bc6.png)


### screenで接続してターミナルから操作する
「キーボードからの入力で「L」のLEDをつけたり消したりする」でArduinoのマイコンボードにスケッチを転送している状態で実施する

``` shell
### デバイスの確認
$ ls /dev/tty*usb*
===========================
/dev/tty.usbmodem1421
===========================

### screenで接続
$ screen /dev/tty.usbmodem1421 9600

### screenから出る
ctl-A ctl-\
```

キーボードのキーを押すと以下のように表示され、キーに合わせてLEDが点灯する

![スクリーンショット 2015-09-06 21.46.53.png](https://qiita-image-store.s3.amazonaws.com/0/20474/316c1aef-36a8-0685-7cec-cc93f14b3c9c.png)

### screenをバックグラウンドでアタッチし、セッションにコマンドを流し込む

「シェル芸 Arduino」でググって出てくるSlideShareの記事参照。じゃっかんR指定な記事です（笑）

``` shell
### screenをバックグラウンドでアタッチ
nohup screen -S arduino /dev/tty.usbmodem1421 9600 &

### LEDを消す(pを送信する)
$ screen -S arduino -X stuff p

### LEDをつける (oを送信する)
$ screen -S arduino -X stuff o

### LEDを点滅させる (bを送信する)
$ screen -S arduino -X stuff b
```

* screen
    * -S : セッションに名前をつける
    * -X : セッションに特定のコマンドを送る
* stuff : 引数を標準入力に入力する


### シェルスクリプトでコマンド化

screeをバックグラウンドでアタッチした状態で以下作成して実行する

``` shell
### シェルスクリプトを作成
$ vi led_control.sh
===========================
echo "LED on:o, LED off:p, LED blink:b"
echo "input? (o/p/b)"
read input_key

screen -S arduino -X stuff $input_key
===========================

### 実行
$ sh led_control.sh
===========================
LED on:o, LED off:p, LED blink:b
input? (o/p/b)
b   # <- bを入力してLEDを点滅させている
===========================
```

回路を組むものについては[Arduino回路を組んで遊ぶ](http://qiita.com/ftakao2007/items/2309abe79f391b43bd71)で。

# 開発言語

## 参考
* [Language Reference](https://www.arduino.cc/en/Reference/HomePage)