かさごでもわかるArduino -環境構築編

# はじめに
この記事はこれからArduinoをつかった電子工作を始めたいという方や, プログラミングを始めてみたいけど 漫然と言語の勉強をするのは嫌だ という方向けに書いております.
プログラミングを目的に据えてしまって, 途中で挫折してしまうような後輩や友人を何人か見てきたので, ｢Arduinoを動かす｣という目的に対する, 手段としてのプログラミングを紹介できたらいいかな なんて考えて書いてます.
この記事では環境構築をメインにしています.言語編は完成次第公開します.

# 環境
- Arch Linux(スクリーンショット等は著者環境のものです.Windowsのものも追加しました.)
- Visual Studio Code
- Arduino Nano(ここでは互換品についても触れます.また,プログラムについてはArduino Uno等でもある程度共通です)
- Platform IO(VSCode拡張機能)

# 用意するもの
 <dt> PC </dt><dd>USBポートがあるもの.WindowsとArch Linuxで動作を確認しております</dd>
 <dt>USBケーブル</dt><dd>Nanoの場合は USB Type-A - USB Type-B Mini</dd>
 <dt>Arduino Nano</dt><dd>AliExpress等で激安で入手したものについては下記ドライバの項にて説明あり</dd><br>

# インストールするもの
## Visual Studio Code
[公式サイト](https://code.visualstudio.com)で自分の使っているOSにあったものをダウンロードし,インストーラに従ってインストールを進めてください. もしくは,Linuxのパッケージマネージャを使い,

```bash 
yay -S visual-studio-code-bin
```
というふうにインストールしても良いでしょう.(例はArchLinuxの場合) 
日本語化については, 他記事で詳細に解説されているでしょうから, ここでは省きます.

## PlatformIO
VSCodeの拡張機能よりインストールします.
四角が集まったような, 上から5つめの赤丸で囲まれたアイコンで｢拡張機能｣タブを開き, 黄色い矢印で示された検索窓に `platformio` と入力します.

![Extension_tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/be181194-aea4-54f4-7797-7042f8b38018.png)

おそらく上の方に`PlatformIO IDE`と書かれた拡張機能が出てくるかと思うので, そちらをインストールします.

![PIO_Extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/671692b7-bd07-40b5-9203-1c2ac96caedb.png)

インストールすると, 右下にぴょこって下の画像のようなメッセージが出てくると思います.これは｢Pythonのポータブルインタプリタをダウンロードしています｣となっていますが, いくつか必要なものをダウンロードしてインストールするようです.PlatformIOを導入したあとはしばらくオンラインに保ってこれらのパッケージが揃うまで待ちましょう.

![Screenshot 2020-11-12 010222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/a19637e6-f346-6274-95ee-a98ad0c99398.png)

必要なものが揃うと,次の画像のような表示がでてきます. ｢Reload Now｣をクリックするとVSCodeが再起動します.
![Screenshot 2020-11-12 010536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/e29361d4-32a1-2d30-8977-0604c279ee84.png)



これで, PlatformIOはインストールできました. 再起動後, VSCodeの左下に家のアイコンがあり, それをクリックすると下のようなPlatformIOのホーム画面が開くかと思います.

![PIO_Home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/5bf576e6-bb18-7003-a95a-c06119e1209c.png)

これでPlatformIOのインストールはOKです.

## シリアルドライバ
こちらの項は, 安い互換品のArduino Nanoなどを買ったときに, CH340という安いUSBシリアルチップが載っている場合の手順です.

***純正品をご購入の方は読み飛ばしてください.***
### Windowsの場合
Windowsの場合は,互換Arduinoをつなぐと, デバイスマネージャー(左下のWindowsアイコンを右クリック→"デバイスマネージャー")に画像のようにでてくると思います.("COM3"の部分は環境によって違うかもしれません)

![Screenshot 2020-11-12 005811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/fe919486-2a17-9dd5-0d56-7397cc108850.png)

ドライバを入れないと, Arduinoとのデータのやり取りができないので, ドライバをインストールします. "CH340" でググってみると,

![Screenshot_2020-11-12 CH340 - Google 検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/042ba346-8c80-51be-7d69-9f5f37795d3c.png)

天下の秋月電子通商さんのページがトップにでてきました. [このページ](https://akizukidenshi.com/catalog/g/gI-13544/) にある"ドライバーソフト"のリンクからzipファイルをダウンロードします.
ダウンロード後, 解凍すると,`CH341SER` と `INSTALL`の2つのディレクトリがあります.このうち, `CH341SER`の中にある `SETUP.EXE`ファイルを実行し, でてきた画像のようなウィンドウで`INSTALL`をクリックすることでドライバのインストールが完了します. 

![Screenshot 2020-11-12 011734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/37bd87a4-db74-3c30-71fd-ca33fcea4079.png)

### Linuxの場合
Linuxを使っている場合, ググって出てくるインストール用のドライバソースファイルのアーカイブでは上手にビルド出来ず, インストール出来ないという沼に陥ります. 公式にドライバのソースコードが作られたときのヘッダファイルが, 新しい現在のバージョンのLinuxカーネルには無いようなのです.

それでも, 諦めが悪くて貧乏で純正が買えない僕は, LinuxでなんとしてもやっすいArduino互換を使いたかったので探し回りました. ありました. すばらしき人類の英知 OSSの宝庫, GitHubに.

<https://github.com/juliagoda/CH341SER>

これがあればあとは早いです. ターミナル上で

```bash
sudo pacman -S arduino arduino-docs avr-binutils avr-gcc avr-libc avrdude #必要なパッケージをインストール
git clone https://github.com/juliagoda/CH341SER #Gitレポジトリをクローン
cd CH341SER #クローンしたディレクトリに移動
make #コンパイル
sudo make install #インストール
```

で使えるようになります. 

# Arduinoを動かそう

## プロジェクトの作成
先程のPlatformIOのホーム画面の右側に, Quick Accessと大きく書いてある下, `New Project`とあります. 新しいプロジェクトはここをクリックして作成できます.
クリックすると, `Project Wizard`が立ち上がり,この中でプロジェクト名, 使うArduinoの種類, フレームワークを指定して, プロジェクトの保存先を指定します. 

Boardは使うマイコンボードの種類で, 今回僕はArduino Nano(安い互換品)を使うので画像のように指定しています.各自使うものに合わせて設定してください.

Locationの`Use default location`のチェックを外すと, 自分のPC内の好きなところにプロジェクトを保存できます.

それぞれ指定したあと, 右下のFinishでプロジェクトのディレクトリが作られ, VSCodeで開きます.

![Screenshot from 2020-12-18 00-17-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/4f4455d6-23c2-368a-4b45-92e30ce945a3.png)

最初はしばらく待たされるかもしれません. プロジェクトのディレクトリが開かれたら,左側にプロジェクトディレクトリの中身が表示されています.プロジェクトのディレクトリには,
- .pio/     - 隠れて表示されないかも
- .vscode/  - これも隠れて表示されないかも
- include/  - **重要** *意図して含む*インクルードファイルが置かれる
- lib/      - **重要** 自分で*プライベートな*ヘッダファイルとかを記述したときにここに置く
- src/      - **重要** `main.cpp` (一番メインのファイル)がここにある
- test/     - ユニットテストやプロジェクトテストのためのディレクトリ
- .gitignore - Git(バージョン管理システム)の追跡対象外を定義するファイル.
- platformio.ini - PlatformIOの設定を記述するファイル.後で編集します

があります.まずは`src/main.cpp`を開いてみましょう.(>srcのようになっているときはクリックすると展開されてｖsrcのようになります)

```cpp
#include <Arduino.h>

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

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

といった風になっているかと思います.ここに次のように書き加えてみましょう.

```cpp
#include <Arduino.h>

void setup() {
  // put your setup code here, to run once:
  //ここに設定を書きます.
  pinMode(13,OUTPUT);//基板の上にあるLのLEDにつながっている13番ピンを出力にします
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(13,HIGH); //13番のピンの出力をHIGH(5V)にします
  delay(1000); // 1000ms そのまま待機します
  digitalWrite(13,LOW); //先程HIGHにした13番のピンをLOW(GND)にします
  delay(1000);
}
```

コピペせずに打っていると,次のような補完が出てくることに気づくでしょう. 頭のいいVSCodeくんは途中まで書かれた内容から｢これかな〜｣ってのを出してくれるんですね.

![Screenshot from 2020-12-18 00-48-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/4510e8b7-65dd-ae80-2cda-1970c443d288.png)

Enterで青く選択されている候補が入力されます.べんりですね. 便利な機能を使いこなしながら入力したら,次はコンパイルします.

左下の家のマークで先程はHOMEを呼び出しましたが,その隣にチェックマークと右矢印が出ていますね.

![g1240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/f471028c-9705-061a-c3be-211979c440d7.png)

これらのマークはそれぞれ,｢コンパイル｣と｢書き込み｣です.まずはチェックマークでコンパイルをします.文字が流れて,

```
===== [SUCCESS] Took X.XX seconds ===
Terminal will be reused by tasks, press any key to close it.
```
というような表示が下に出たら成功です.あなたの書いたプログラムはその通りにコンパイルされました.

コンパイルの次は書き込みですが, 書き込みの際にWindowsとLinuxでPlatformIOの設定が違います.

### Windowsの場合
複数のArduinoをつないでいなければ, 単に右矢印をクリックで書き込みができると思います.

```
avrdude done. Thank you.
===== [SUCCESS] Took X.XX seconds =====
```
となれば書き込み成功です. 

### Linuxの場合
まず, LinuxのなかでArduinoがどこに置かれているか確認します.そして, 書き込みの許可を与えます.

```bash
ls -la /dev/serial/by-id #これでデバイスが表示されます.
#lrwxrwxrwx usb-XXXX_USB2.0-Serial-XXXX-port0 -> ../../ttyUSB0 というふうに表示がされると思います
sudo chmod 666 /dev/ttyUSB0 #ttyUSB0の部分は表示によって変えてください.書き込み許可を与えています
```

先程説明した`platformio.ini`ファイルを開いてください.

```ini
[env:nanoatmega328]
platform = atmelavr
board = nanoatmega328
framework = arduino
```
となっていると思います.このファイルの末尾に先程の`chmod 666 XXXXX`の`XXXXX`を思い出して,

```ini
[env:nanoatmega328]
platform = atmelavr
board = nanoatmega328
framework = arduino
upload_port = /dev/ttyUSB0
```
というふうに付け加えます. これでPlatformIOに｢ここにArduinoがつないであるから書き込んでね｣と伝えるわけです.

編集して保存したら, Windowsと同様に右矢印で書き込みが出来ます.

書き込みが出来たら,Lと書いてある端っこのチップLEDが1秒間隔で点滅を始めます.
# おわりに
実はこのページの内容は, PlatformIOの公式チュートリアルの内容ほぼそのままなんです.より詳しい解説は[こちら](https://docs.platformio.org/en/latest/)で見ることが出来ます. 
｢かさごでもわかる Arduinoで始めるプログラミング｣は執筆中です. 完成したら公開します.
この記事は初心者が書いているので, ご意見, ご指摘等ありましたらコメントいただけると幸いです. 読んでくださりありがとうございました.