VScode でarduinoしたいし、C++で書きたい！

# 買っちった

Adruino uno互換ボードと、Arduino nano互換ボード。nanoのほうはまだ届かないけれど。

## TL;DR

* ArduinoをVScodeで実装する。
* ArduinoをC++で実装する。

## ArduinoをVScodeで実装する。

Arduinoのプログラムには Arduino IDEやArduino Web Editorを使うのがArduinoが示している方法なのですが。
私の場合、Arduino IDEを起動した瞬間そっとじしました。これはあかん、やりづらい。

ということで、使い慣れているVisual Studio Codeを使用しようと思います。
設定については、先陣の記事があるので詳しくはそちらを参照してください。対して難しくないです。

[Arduino IDEつらい・・・、Visual Studio Codeでスケッチを書く方法](https://qiita.com/narikei/items/847613a8f01a9e1527d7)

ちなみに、私の環境はこんな感じです。

|  |  |
|:-:|:-:|
| OS  | Lubuntu 17.10 |
| VScode  | 1.20.1 |
| Arduino IDE | 1.8.5 |

なお、私の場合、ユーザ設定として Arduino IDEのパスを設定する必要がありました。

``` json
{
    // arduino
    "arduino.path": "${Arduino IDEの実行ファイルのあるディレクトリ}"
}

```

## ArduinoをC++で実装する。

ArduinoはArduino言語で実装するわけですが、結局の所、C/C++にArduinoのライブラリをくっつけたようなもの。
だったらC++で実装したいよね。ソース分割とかクラスとか使えるから。

ということで、参考にしたのは以下のサイト。

[blog 渓鉄 - Arduino - ソースコードを複数ファイルに分割して記述する（2）](https://keitetsu.blogspot.jp/2014/11/arduino-2.html)

↑の方法を使ってC++で実装を進めてみたわけですが、VScodeだと、いちいち関数やヘッダに警告がたくさん表示されるようになります。
これは、VScodeから見たときに、各ヘッダファイルの参照設定がないからです。

というわけで、設定をする必要があります。

```c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "<<arduino.path>>/hardware/arduino/avr/cores/arduino",
                "<<arduino.path>>/hardware/arduino/avr/variants/standard",
                "<<arduino.path>>/hardware/tools/avr/avr/include",
                "<<arduino.path>>/hardware/tools/avr/lib/gcc/avr/4.9.2/include",
                "${workspaceRoot}"
            ],
            "defines": [],
            "intelliSenseMode": "clang-x64",
            "browse": {
                "path": [
                    "<<arduino.path>>/hardware/arduino/avr/cores/arduino",
                    "<<arduino.path>>/hardware/arduino/avr/variants/standard",
                    "<<arduino.path>>/hardware/tools/avr/avr/include",
                    "<<arduino.path>>/hardware/tools/avr/lib/gcc/avr/4.9.2/include",
                    "${workspaceRoot}"
                ],
                "limitSymbolsToIncludedHeaders": false,
                "databaseFilename": ""
            }
        }
    ],
    "version": 3
}
```

WindowsでもMacでもこのあたりはあまり変わらないと思います。これをすることで警告はなくなるし、IntelliSenseも機能するようになります。
``<<arduino.path>>`` はそれぞれのAdruino IDEのパスを指定してください。
また、使用するボードによっては、 ``<<arduino.path>>/hardware/arduino/avr/variants/standard``の `` standard``を変更する必要があるかもしれません。このパスは、ボードのPIN配置を設定するヘッダファイルが格納されているためです。少なくともleonardoやmegaについては専用のヘッダファイルがあります。

## C++版Lチカサンプル

```blink_test.ino
/*
 * ダミーファイル
 * File:   blink_test.ino
 * Author: FilunK
 */
```

```std_arduino.hpp
/*
 * std_arduino.hpp
 * ArduinoをC/C++で実装するに当たって必須のヘッダファイル
 */
#ifndef STD_ARDUINO_HPP
#define STD_ARDUINO_HPP

#include "Arduino.h"    // ここでArduino.hをインクルードする
 
// Arduinoで必須な関数をここで宣言しておく。
void setup();
void loop();

#endif //STD_ARDUINO_HPP
```

```entrypoint.cpp
/*
 * entrypoint.cpp
 * setup関数、loop関数の実装
 */
#include "std_arduino.hpp"


void setup()
{
    // LED_BUILTINはそれぞれのボードのテスト用LEDのピン番号を表します。大体は13番ピン。
    // 少なくともunoは13番でした
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
    // 1秒ごとにLチカ
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}
```
C++らしいことはしていませんが。
std_arduino.hppあたりはどんな要件でも使いまわしができるものだと思います。