ProMicroを使って電子工作の勉強を進めていくための環境構築

# 用意するもの

* パソコン1台…Windows/Linux/Mac問わず。今回はWindowsで動かすことを前提にしています。Mac/Linuxを使用する際は、pythonのインストールにpyenvを使うのが楽かも。
* Arduino機…この記事ではProMicro互換機を利用しています。
* 半田ごて…ブレッドボードを利用するためはんだ付けは必要ないのですが、ProMicroをはんだ付けするため、最初だけ必要です
* ブレッドボード1枚…回路の規模次第ですが、今回は小規模な実験なので408穴のものを使用。
* 抵抗1kΩ～10kΩ数本…回路保護のためLEDやタクトスイッチからGNDに戻る回路上に設置。
* タクトスイッチ数個
* LED数個
* ジャンパワイヤ数本
* USBケーブル1本

# 環境構築

## python 2.7のインストール

ここに従ってインストール。
http://docs.platformio.org/en/latest/installation.html

Python 2.7ダウンロードサイト（今回は2.7.15）
https://www.python.org/downloads/release/python-2715/
各プラットフォームにあったものをインストール。Windows 64bitなら「Windows x86-64 MSI installer」を使う。

注意書きに書いてある通り、Pythonインストール時に「Add python.exe to Path」を選択状態にしておかないと、pipコマンドが有効にならないらしい。  

## pipコマンドからplatformioのインストール

基本以下のコマンドをコマンドプロンプトから実行して待つだけ。

```
> pip install platformio

Collecting platformio
  Downloading https://files.pythonhosted.org/packages/53/1a/05eb8ff68c4f8193a5b9110edc79f55c77a2659a931c9a29958fb54ccbf3/platformio-3.5.3-py27-none-any.whl (138kB)
    100% |################################| 143kB 572kB/s
Collecting semantic-version<3,>=2.5.0 (from platformio)
  Downloading https://files.pythonhosted.org/packages/72/83/f76958017f3094b072d8e3a72d25c3ed65f754cc607fdb6a7b33d84ab1d5/semantic_version-2.6.0.tar.gz
Collecting lockfile<0.13,>=0.9.1 (from platformio)
  Downloading https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl
Collecting requests<3,>=2.4.0 (from platformio)
  Downloading https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl (91kB)
    100% |################################| 92kB 622kB/s
Collecting bottle<0.13 (from platformio)
  Downloading https://files.pythonhosted.org/packages/bd/99/04dc59ced52a8261ee0f965a8968717a255ea84a36013e527944dbf3468c/bottle-0.12.13.tar.gz (70kB)
    100% |################################| 71kB 738kB/s
Collecting pyserial!=3.3,<4,>=3 (from platformio)
  Downloading https://files.pythonhosted.org/packages/0d/e4/2a744dd9e3be04a0c0907414e2a01a7c88bb3915cbe3c8cc06e209f59c30/pyserial-3.4-py2.py3-none-any.whl (193kB)
    100% |################################| 194kB 572kB/s
Collecting click<6,>=5 (from platformio)
  Downloading https://files.pythonhosted.org/packages/8f/98/14966b6d772fd5fba1eb3bb34a62a7f736d609572493397cdc5715c14514/click-5.1-py2.py3-none-any.whl (65kB)
    100% |################################| 71kB 930kB/s
Collecting colorama (from platformio)
  Downloading https://files.pythonhosted.org/packages/db/c8/7dcf9dbcb22429512708fe3a547f8b6101c0d02137acbd892505aee57adf/colorama-0.3.9-py2.py3-none-any.whl
Collecting idna<2.8,>=2.5 (from requests<3,>=2.4.0->platformio)
  Downloading https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
    100% |################################| 61kB 722kB/s
Collecting certifi>=2017.4.17 (from requests<3,>=2.4.0->platformio)
  Downloading https://files.pythonhosted.org/packages/7c/e6/92ad559b7192d846975fc916b65f667c7b8c3a32bea7372340bfe9a15fa5/certifi-2018.4.16-py2.py3-none-any.whl (150kB)
    100% |################################| 153kB 628kB/s
Collecting urllib3<1.24,>=1.21.1 (from requests<3,>=2.4.0->platformio)
  Downloading https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c53851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl (133kB)
    100% |################################| 143kB 553kB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests<3,>=2.4.0->platformio)
  Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |################################| 143kB 559kB/s
Installing collected packages: semantic-version, lockfile, idna, certifi, urllib3, chardet, requests, bottle, pyserial, click, colorama, platformio
  Running setup.py install for semantic-version ... done
  Running setup.py install for bottle ... done
Successfully installed bottle-0.12.13 certifi-2018.4.16 chardet-3.0.4 click-5.1 colorama-0.3.9 idna-2.7 lockfile-0.12.2 platformio-3.5.3 pyserial-3.4 requests-2.19.1 semantic-version-2.6.0 urllib3-1.23
```

## 確認

```
>platformio
Usage: platformio [OPTIONS] COMMAND [ARGS]...

Options:
  --version          Show the version and exit.
  -f, --force        Force to accept any confirmation prompts.
  -c, --caller TEXT  Caller ID (service).
  -h, --help         Show this message and exit.

Commands:
  account   Manage PIO Account
  boards    Embedded Board Explorer
  ci        Continuous Integration
  debug     PIO Unified Debugger
  device    Monitor device or list existing
  home      PIO Home
  init      Initialize PlatformIO project or update existing
  lib       Library Manager
  platform  Platform Manager
  remote    PIO Remote
  run       Process project environments
  settings  Manage PlatformIO settings
  test      Local Unit Testing
  update    Update installed platforms, packages and libraries
  upgrade   Upgrade PlatformIO to the latest version
```

## IDEのインストール

　コマンドラインからでもPlatformIOは利用できるが、今回はVSCodeの拡張機能でPlatformIO IDEを用意した。

https://code.visualstudio.com/

　「表示」→「拡張機能」から「PlatformIO IDE」を検索してインストール。

![PlatformIO.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/af9afd8b-e98f-1512-9d64-b1db86d6e242.jpeg)

## プロジェクトの作成

　PlatformIO IDEの「New Project」を選択して、Project Wizardに以下を入力。

* Name: プロジェクト名。何でもよいが今回はLチカなので「led_blink」とした。
* Board: 接続するボードを選択する。今回はProMicro互換機なので、「SparkFun Pro Micro 5V/16MHz」を選択する。ここの選択を間違えて「5V/16MHz」のProMicroを使っているにもかかわらず「3.3V/8MHz」とかにすると、ProMicroが文鎮化するので、気を付ける。（文鎮化した場合でも復旧は可能。手順は後述する。）
* Framework： Arduino
* Location： 特に何もなければ「Use default location」を選択してよい。

![PlatformIO_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/4e79f770-a936-78aa-e9c9-752490dcd540.jpeg)

Wizard実行直後のプロジェクトのフォルダ構成

![PlatformIO_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/332bf51f-2e29-1420-6b64-97c14e13306c.jpeg)

## 回路の作成

　ブレッドボード上に下記の回路を作成する。

![写真 2018-07-02 0 42 26.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/94d45ac5-c7d5-4efe-b913-286de7c8ddb2.jpeg)

　斜めからの様子

![写真 2018-07-02 0 45 38.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/30318363-0958-e43f-e602-9fdf46f249c8.jpeg)

　ProMicro側の番号ピン（ここでは7番）からGNDに向けて電流が流れるように回路を作成します。またGPIOに過電流が流れないように、間に1kΩ抵抗を挟みます。

* 事前に上部をはんだ付けをしたProMicroをブレッドボードの中央の溝にまたがるように配置する。足が太いため、ProMicroに初めから同梱されていたピンを使用するとブレッドボードの奥まで刺さらないようになっているが、接地していれば通電するので、無理に差し込まなくてよい。
* ProMicroの7番（ブレッドボードの10b）からブレッドボードの21aをジャンパワイヤで接続する。
* LEDを21eと20eにかけて差し込む。LEDの足の長い方が＋になるため、21e側に足の長い方を差し込む。逆に差し込むと通電しない。
* 1kΩ抵抗を20dから20bにかけて差し込む。
* 20aから3aをジャンパワイヤで接続する。

## Lチカプログラムの作成

`src/main.cpp`を以下のように編集する。

```
#include <Arduino.h>

#define LED 7

void setup()
{
    pinMode(LED, OUTPUT);
}

void loop()
{
    digitalWrite(LED, HIGH);
    delay(1000);
    digitalWrite(LED, LOW);
    delay(1000);
}
```

　プログラムを保存したら、「タスク」→「タスクの実行」からPlatformIO: Uploadを選択し、ProMicroにプログラムを書き込みます。差し込んだLEDが1秒ごとに点滅すれば成功です。

# うっかり文鎮化した場合の復活方法

　「5V/16MHz」のProMicroに「3.3V/8MHz」のブートローダを書き込んでしまうと、シリアルポートが不明なデバイスとなってしまい、以後プログラムが書き込めなくなってしまいます。このような状態になってしまった場合、Arduino機を書き込み用デバイスとして1台用意し、ブートローダを書き込んで復活させるのが一般的ですが、SparkFunの公式ページのチュートリアルではこのような場合の救済方法として「RSTとGNDを素早く2回ショートする」という方法が記載されています。

https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide#ts-reset

　この方法を実行すると、8秒間ブートローダがCOMポートを開いてくれるため、その間に正しいブートローダを書き込めば復活します。8秒間でコンパイルして、ブートローダを書き込むまでの時間はシビアなので、コンパイルして書き込みを始める前にRSTとGNDをショートさせると良いです。