キノコの自省録

テクノロジーとコンテンツの融合を目指して

RaspberryPi ZeroとESP-WROOM-02を繋いでみる

RaspberryPi ZeroにはWiFiモジュールがないので、単独ではネットワークに接続できません。解決方法として、ZeroをホストにしてUSBでWiFiドングルを繋ぐ、というのが一番早そう(試してはいませんが)ですが、ESP-WROOM-02なるWiFiモジュールが巷で評判だったので、繋いでみました。今回は、秋月のDIP化キットを使用しました。

akizukidenshi.com

ESP-WROOM-02って何?

正直、「WiFiモジュールならなんか繋がるんだろう」程度で、ろくに下調べもせず買いました……。まあ650円ですし。

WiFiモジュールなのは確かですが、バスで接続するわけではなく、モジュール単品で動作します。実はArduino IDEを使ってファームを書き換えることができます。Arduinoそのものではないですが、いわばWiFi積んだ疑似Arduinoです。SPIやI2Cなどのピンがなんで出てるんだろう?と不思議でしたが、そういうことです。

デフォルトのファームでは、これらのピンは使用せず、UARTを介してATコマンドで会話します。組み込み機器なんかではよくある、外部マイコンとメインボードが通信するというような感じですね。ということで、面倒くさいです。ラズパイならドングル挿した方が楽でしょう。

回路

ESP-WROOM-02の動作電圧は3.0V~3.6Vということで、3.3Vの電源ピンから供給できそうに見えますが、電流が平均でも80mAで、RaspberryPi3.3Vの最大出力50mAを超えてしまいます。そのため、5Vを使って、3.3Vへ3端子レギュレータでドロップしました。使用した3端子レギュレータはNJU7223F33です。

それ以外は、こちらのエントリを参考にして配線しました。

ESP-WROOM-02 の配線 - Qiita

実物写真はこちら。タイトルにZeroと書いておいて3B使ってますが、まあ同じということで……。あと、送信(Tx)と受信(Rx)はちゃんとクロスするように配線しましょう。たまにTx-Tx, Rx-Rxを結線する人がいますが、それだと動きません。

f:id:kinokorori:20170812223627j:plain

バイスの確認

RaspberryPiは、デフォルトでSerialが無効になっているので、有効化する必要があります。RaspberryPiのコンソールを開いて、

$ raspi-config

から、Serialを有効にします。

正しく機器が接続されているならば、/dev/ttyS0が出現すると思います。とりあえず、

$ ls /dev/tty*

でチェックしてみてください。挿抜で出たり消えたりするデバイスがあれば、それがWROOM-02です。

ターミナルソフトを利用した通信コマンドの送信

物理的な結線が確認できたら、次にシリアルを介してWROOM-02にコマンドを送信してみます。コマンドはいろいろあるのですが、とりあえずは、ATを送信して、OKが返ってきたら成功です。

多くの人はssh経由でRaspberryPiを操作していると思いますが、それだとssh用ターミナル - シリアルターミナル - WROOM-02というように、ターミナルを複数経由することになってしまいます。特に、WROOM-02のコマンドは、改行コードCR+LFを送信、WROOM-02からはLFで受信というようになっており、大抵わけのわからないことになります。

なので、今回はcutecomというUI付きアプリを使って、RaspbianのGUIから直接操作する方法を紹介します。cutecomは、普通にaptから取得できます。

$ sudo apt-get install cutecom

インストールしたら、

$ cutecom &

で起動します。画面はこんな感じです。

f:id:kinokorori:20170813202924p:plain

設定はこのスクリーンショットの通り、Deviceを/dev/ttyS0に、通信設定を115200baud,8bit,1にします。ウィンドウ下部に改行コードの設定がありますので、そこでCR+LFを指定します。Open Deviceボタンで接続した後、Inputから”AT”と入力して送信してみましょう。そこでOKと返ってきたら成功です。”AT+GMR”を送信すると、バージョンが確認できます。

VNC

少々脇道にそれて、VNCリモートデスクトップ)の設定について。HDMI繋いで、キーボードとマウス繋いで……とやっていると非常に面倒なので、直接RaspberryPiのデスクトップを触りたい場合、VNCを利用しましょう。最近のRaspbian Jessieには、デフォルトでVNCがインストールされていますので、利用は簡単です。

  1. raspi-configからVNCを有効にします
  2. $ vncserverを実行して、RaspberryPiのVNCサーバを起動します
  3. クライアント側から、vnc://xxx.xxx.xxx.xxx:5901に接続します

Macの場合、Finderのメニューから、Go->Connect to serverで、上記vnc://~を入力すると接続できます。

http通信のテスト

ほぼこちらのエントリ通りです。

ESP-WROOM-02: ATコマンドによるWifi動作確認 - Qiita

流れとしては、

  1. WiFiルータに接続
  2. TCPコネクション確立
  3. HTTP GET送信

という感じです。まず、WiFiルータへ接続するには、以下のコマンドを実行します。

AT+CWMODE_DEF=1
AT+CWLAP
AT+CWJAP=“SSID”,”passwd”

AT+CWMODE_DEFでWROOM-02のStationモード設定、AT+CWLAPでSSIDリスト取得、AT+CWJAPで接続しにいきます。AT+CWJAPが成功すると、以下のような応答が返ってきます。

AT+CWJAP=“foobar”,"hogehoge12345”

WIFI CONNECTED
WIFI GOT IP

OK

これでWiFiルータに接続できました。次にTCPコネクションをどこか適当なところに張ります。

AT+CIPSTART=“TCP”,”192.168.1.10”,80
AT+CIPMODE=1
AT+CIPSEND
>

AT+CIPSENDが受け付けられると、コマンドプロンプトよろしく、>が出現します。この状態になれば、TCPコネクションが確立されていますので、HTTP GETがリクエストできるようになります。

GET / HTTP/1.0

実際、googleにGETリクエストを投げて取得した応答がこちらです。

>HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.co.jp/?gfe_rd=cr&ei=U46OWb62O5DR8gfkybeQBg
Content-Length: 261
Date: Sat, 12 Aug 2017 05:12:51 GMT

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gfe_rd=cr&amp;ei=U46OWb62O5DR8gfkybeQBg">here</A>.
</BODY></HTML>

上記コマンドは一体何をやっているのか、他にどんなコマンドがあるかは、こちらのページが非常に見やすいです。

ATコマンド集 — ESP-WROOM-02-Note 1.0 documentation

まとめ

RaspberryPiのUARTを通してESP-WROOM-02と接続してみました。シリアル間通信なので、ブラウジングなどの複雑な用途には不向きですが、サーバにセンサデータをPOSTするなどには使用できると思います。RaspberryPiとWROOM-02を併用しなければならない事態というのはなかなか想像しにくいところですが、覚えておいて損はないかもしれません。