GR-CITRUS + WA-MIKANをC++で使う

Rubyなにそれおいしいのシリーズ(笑)


写真


GR-CITRUS+WA-MIKANは、Rubyの環境(Rubic)ではGR-CITRUSからWA-MIKANのWiFi機能を使うクラスが用意されていますが、ArduinoライクなC++環境であるIDE for GRではクラスが用意されていません。かたくなにC++でGR-CITRUS+WA-MIKANを使う方法を以下にまとめます。

WeeESP8266の導入

ArduinoからESP8266のWiFi機能を使うライブラリとして、WeeESP8266が知られています。ただしITEAD Studioのオリジナル版はコンストラクタの記述が不作法でGR-CITRUS等では動作せず。それを修正した名古屋大ERTL版も自分の環境ではなんかうまく動かない所があったので、さらに修正したものを作成しました。いずれもGitHubで公開されているので、ダウンロードするなりクローンするなりしてArduinoのlibrariesフォルダに入れます。

GR-CITRUSとWA-MIKANの接続

GR-CITRUSをWA-MIKANに挿します。初期状態のジャンパでは下記のような接続になっています。

GR-CITRUS WA-MIKAN
0 (ESP8266 RXD)
1 (ESP8266 TXD)
18 N.C.
19 SD SWI(カード検出)
2 SD CS
3 (ESP8266 IO13)
4 (ESP8266 RESET)
5 ESP8266 EN
6 (ESP8266 IO15)
7 / Serial3.TX ESP8266 RXD
8 / Serial3.RX ESP8266 TXD
9 (ESP8266 RXD)
10 (ESP8266 TXD)
11 / SPI MO SD MOSI
12 / SPI MI SD MISO
13 / SPI CK SD CLK
14 (ESP8266 IO4)
15 (ESP8266 IO2)
16 (ESP8266 IO5)
17 (ESP8266 IO0)

※()は初期状態ではジャンパ未接続


つまり、ESP8266のシリアルポートはGR-CITRUSのSerial3に接続されます。それ以外の両者のI/O接続はESP8266のENがGR-CITRUSの5ピンに接続されているのみです。必要に応じてESP8266のRESETやIO0をGR-CITRUSに接続してGR-CITRUSからESP8266のファームを書き換えたり、他のI/Oを接続することもできますが、ひとまず初期状態のジャンパと初期状態のESP8266ファーム(ATコマンド仕様)で使うことにします。

スケッチ

WeeESP8266のサンプルスケッチのConnectWiFiを少しだけ修正して動作を確認します。

#include "ESP8266.h"

// 適宜、自分のWiFi環境に合わせて
#define SSID        "HOGE"
#define PASSWORD    "HOGEHOGE"

ESP8266 wifi;
 
void setup(void)
{
    Serial.begin(115200);  
    Serial.print("setup begin\r\n");

    // ESP8266との接続はSerial3
    // またESP8266のデフォルトのボーレートは115200
    wifi.begin(Serial3, 115200);
    
    // ESP8266のENピンをHIGHに(正論理のイネーブル)
    pinMode(5, OUTPUT);
    digitalWrite(5, HIGH);

    Serial.print("FW Version: ");
    Serial.println(wifi.getVersion().c_str());
    
    
    if (wifi.setOprToStation()) {
        Serial.print("to station ok\r\n");
    } else {
        Serial.print("to station err\r\n");
    }

    if (wifi.joinAP(SSID, PASSWORD)) {
        Serial.print("Join AP success\r\n");
        Serial.print("IP: ");       
        Serial.println(wifi.getLocalIP().c_str());
    } else {
        Serial.print("Join AP failure\r\n");
    }
    
    Serial.print("setup end\r\n");
}

void loop(void)
{
}

その他の使い方については、WeeESP8266のサンプルなどを参考にしてください。とりあえずこれで、GR-CITRUSでWA-MIKANのWiFiが使えることが確認できました。

なぜC++なのか?

Arduino環境の良いところは、豊富なライブラリを利用してラクチンに簡潔なコードを書きつつ、自力でマイコンペリフェラルを直接叩けばどんなハードも使えるところ。そして意味不明なクソコードや俺々ルールを生みがちなピュアなC言語ではなく、いちおうC++だというところ。Rubyはけっして嫌いな言語じゃないけど、APIが提供されてるハードウェアしか使えないのは自分向きじゃないなと思ってます。低レイヤーを自分で作るとなると、面倒すぎてなんのために高級言語使ってるのか分からなくなりますし。