Arduinoと初めて戯れる（Arduino入門）

# Arduino初心者がおもちゃを作るまで
デジタルアートが好きなので、IoT機器の組み立て勉強もできるだろうと思いArduinoに触れ始めました。
この記事ではArduinoの準備から作ったもの、躓いたポイントを紹介します。

# Arduino入門
普段ソフト面のエンジニアリングばかりでハード的な知識はあまり無い人間です。電子回路図も雰囲気で読んでるし、抵抗の計算とか便利なソフトあるでしょ！？と他力本願な状態の自分がArduinoをいじり始めました。

## 準備
始めるに当たって機器が必須です。
自分が用意したのはある程度パーツが揃っているキットを購入しました。
(以下、Amazonのリンクになります）

### Arduino機器
+ [UNIROI 30種セット arduino用キット 初心者 uno r3ボード+LEDセット+ブレッドボード UA002](https://amzn.to/2NXrfKq)
  + （使ったもの：Arduino Uno本体、LED、ジャンパーピン）
+ [OSOYOO(オソヨー) Arduino RFIDセキュリティシステムDIYスターターキット RFID実験研究キット](https://amzn.to/2WYGNC7)
  + （使ったもの：人感センサー、サーボモーター）
+ [HiLetgo® 3個セット HC-SR501人体赤外線感応モジュール](https://amzn.to/2QbE5rB)
  + （買っただけで使いませんでした…）

### 参考書
始めるにあたって事前情報としてこの書籍を購入してます。

+ [実践Arduino! 電子工作でアイデアを形にしよう](https://amzn.to/2X1LKtF)

### ツール
参考書に必須アイテムとして載っていたので念のため電圧テスターを購入。

+ [Miniデジタル・マルチメータ C-Timvasion LCDディスプレイ](https://amzn.to/2NSUa2l)
  + （買ってまだ使ってません…）

### Arduinoアカウント
Arduinoのアカウントを作成してArduinoのプログラムを作成するツールを入手。
[Arduino - Home](https://www.arduino.cc/)

### プログラミング環境

+ **Windows10**
  + Arduino Web Editor
  + Arduino Create Agent プラグインのDL/インストール
+ **Mac OS 10.15**
  + Arduino IDE(1.8.10~) DL/インストール
  + Arduino Create Agent プラグインのDL/インストール

ArduinoではWebでオンラインエディターがあるため、最初のうちはIDEのダウンロードはしませんでした。
始めにWindows 10でArduinoをいじって、組み上げたものを調整する時にMacでいじるようにしました。

### Arduinoの台
センサーやサーボモーターを固定しないと正確な動作確認ができないのでLEGOを買いました。

+ [LEGO クラシック 黄色のアイデアボックス スペシャル](https://amzn.to/2Q2BlMU)
  + 全パーツの半分ちょっとくらいを使いました。広めの地盤がついてるのでコレに

とりあえずArduinoをいじりたいという人には必要ないかもしれません。100円ショップでワイヤーネットを買ってビニタイで固定するでも良いかと。

## 作った物
「人感センサーで明かりを付けたい」と漠然と考えていたので、当初はArduino+人感センサー+LEDでライトを作ることを考えてました。
Arduinoをいじっていくうちにやりたいことが増えたので、最終的にArduino+人感センサー+LED+サーボモーター+LEGOでおもちゃを作りました。

### 参考サイト
+ [PWMを使ってLEDの明るさと出力を制御する](http://www.japanese-makers.com/archives/157)
+ [【Arduino】Arduino Nano(互換機)で人感センサ付けてLEDを光らせる - かっこいいブログ名つけたい](http://engetu21.hatenablog.com/entry/2019/05/11/211315)
+ [Arduino電子工作の基本④ LEDの明るさを調節する](https://deviceplus.jp/hobby/arduino_f04/)
+ [マイクロサーボ SG-90 を Arduino で制御する](http://am1tanaka.hatenablog.com/entry/2016/09/09/231454)

### 外観
写真の通り

![Sensor_house_outview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113090/518a14d4-f97d-b617-b535-c114eed2ed80.jpeg)

写真右上にLEDライトを仕込んでます。
ドアの中のなめこさんをサーボモーターで動かしてます。
中央のコアみたいなドーム状のが人感センサーです。


### Arduino本体とブレッドボード接続
各パーツは次の通りに接続しています。
**ポイント**

+ LEGO組み立ての邪魔にならない配線（片側にピンの差込を寄せてます）

![arduino_sensor_LED.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113090/dfd902bd-2873-decb-7d8c-f7bf1d4be48d.jpeg)


### LEGO
LEGO組み立ては、細く作り方説明できないのでざっくりと紹介します。
**ポイント**

+ Arduino本体とブレッドボードを固定
+ サーボモーターの可動域確保
+ 人感センサーの固定
+ LEDを剥き出しにしない工夫

![sensor_led_build_images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113090/f17c6c56-ad62-aa75-7453-ba35f34fee67.jpeg)

### プログラム
```C#
// Servo - Version: Latest
#include <Servo.h>

#define LED_PIN 3
#define PIR_PIN 8
#define SERVO_PIN 9

const bool IS_DEBUG = false;
const int INITIAL_ANGLE = 86;
const int ACTIVE_ANGLE = 176;

bool is_reacts = false;
bool is_active = false;
int count = 0;
int cycle = 15;

Servo servo;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(PIR_PIN, INPUT_PULLUP);
  servo.attach(SERVO_PIN);
  servo.write(INITIAL_ANGLE);

  Serial.begin(9600);

  // 初期化時は点灯状態
  is_active = true;
  // 初回サイクルを短めに設定
  count = cycle - 5;
  Serial.println("initialized UNO");
}

void loop() {
  // 1秒間隔
  delay(1000);
  count++;

  if(IS_DEBUG) {
    String s_active = String(is_active);
    String s_reacts = String(is_reacts);
    Serial.println("info[so,ten]:" + s_reacts +", " + s_active);
    s_active = s_reacts = "";
  }

  // 1サイクル区切りでチェック
  if (count == cycle){
    count = 0;

    if (is_active && !is_reacts){
      // Light off
      is_active = false;
      analogWrite(LED_PIN, 0);

      // Servo Reset
      servo.write(INITIAL_ANGLE);

      Serial.println("off");

    }
    is_reacts = false;
  }

  if (count < cycle){

    // 消灯時にセンサーの反応があったら
    if (!is_active && is_reacts){
      // 点灯
      analogWrite(LED_PIN, 250);

      is_active = true;
      servo.write(ACTIVE_ANGLE);

      // 再カウント
      count = 0;  
      Serial.println("on");
    }
  }

  // センサに反応があった場合
  if (digitalRead(PIR_PIN) == HIGH){
      is_reacts = true;
  }
}
```

### 動作
![sensor_led_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113090/76626b17-dbb3-9df1-0b59-55c52096d9db.gif)

人が近づくと玄関に明かりが灯り家主が覗いてきます。カヮィィ…
15秒間隔で人がいるかいないかを判定し、いなければ消灯して家の中に戻ります。
残念ながらまだドアの開閉はできません。

## つまづいた事（2019年11月時点
Windows10でArduinoの制御を作成している時は問題なかったのですが、Macで調整を始めた時につまづきました。
WebEditorでArduinoに書き込みしようとするとエラーとなります。

```
Start command: 
fork/exec /Users/xxxx/.arduino-create/arduino/avrdude/6.3.0-arduino14/bin/avrdude: 
bad CPU type in executable
```


Mac 10.15（Catalina）でのシリアルポートへのアクセス方法が違うようで、IDEのVer.1.8.10ではこれに対応されているようです。
OnlineEditorの方がまだ対応仕切れていない？ようで、MacではIDEから書き込むようにしました。
（いずれ直ると思いますが。

## 作成後感
Arduinoの組み立てとプログラミングにそれぞれ3時間ほど使い、LEGOの組み立てに5〜6時間かかりました。

入門レベルの工作なので、これからArduinoに触れようと思っている方の一助になれば。

今回は人感センサーとサーボモーターを使いましたが、これを基にグレードアップさせつつ、LED電飾やIoT機器作成の足掛かりにしていこうと思います。

作ったおもちゃで遊んだ記録も残してます。技術的なことから離れるため続きはブログに書きました。
[デジタルアートに憧れて（Arduino始めました）](https://blog.shinotatwu.online/entry/2019/11/11/000104)