趣味のマイコンいじり

安価なマイコンを利用して作成したアプリの紹介です。

UNO + ESP-01 (AT command) で IOT して見ました

ESP-01と言うESP8266(WiFi機能付き)チップ搭載で外部にUARTを含めて
合計4本のI/Oしか出ていないものが安かったので、購入して調べて見ました。
このESP-01には、ATコマンドのインターフェイスがプリインストールされていた
ので、まずは、このESP-01そのままでどの様に利用できるかを調べたのが次の
内容となります。(ESP-01に別のコードを書いて利用する方法は次に調べる
予定です。)結果としては、簡単なもので有ればESP8266に直接コードを
書き込んで利用する場合とほぼ同等なものが実現できる事が判りました。
(UNOのI/Oもそのまま使える) 以下がその内容となります。

<ESP-01 AT command での利用>
  購入したESP-01は次の様なもので、ここではプリインストール済みの
  ATコマンドをそのまま利用する場合の検討を行いました。

 [ESP-01の概要]
   イメージ 1


  1.メインチップはESP8266EX
  2.搭載のフラッシュメモリはPN25F08
   (8M-BIT SERIAL FLASH MEMORY)
  3.ATコマンドプログラムをプリインストール
  4.デホルトUART転送速度は115200bps
      (ATコマンドでの設定で変更可能)
  5.外部接続ポートは4本(2本はUARTで使用)

 [使用した主要部品]
    イメージ 2

  1.ESP-01 WIFI 基板
  2.Arduino UNO
  3.Proto shield for UNO & MEGA
  4.SSH1106 1.3" OLED (I2C対応品)
      (SSD1306 0.96" OLED でも可能)
  5.手作りのオリジナル基板
        - ESP-01用ブレッドボードソケット
        - I/Oテスト基板 (Red & Green LED, slide switch, pre-set resister が実装)

<関連資料>
  ESP8266のATコマンドに関しては次のURLから入手可能です。
   URL : https://cdn.sparkfun.com/assets/learn_tutorials/4/0/3/4A-ESP8266__AT_Instruction_Set__EN_v0.30.pdf
   
  次のURLの記事からのものを参考にしました。
      URL : http://www.jayconsystems.com/tutorials/esp01-arduino/
        (コード作成上の概要は上記のものを参照しています)
      URL : https://www.hackster.io/rayburne/esp8266-01-using-arduino-ide-67a124
        (OLEDへの表示に関しては上記の0.96”のものを1.3”にも
           対応できる様に変更して利用しています)

  使用しているデバイスのデータシートは次のURLから入手可能です
       ESP8266EX URL : https://www.espressif.com/sites/default/files/0a-esp8266ex_datasheet_en_1.pdf
       PN25F08 URL : http://www.xtxtech.com/upfile/2016082517095182.pdf

  ライブラリ関係
       OLEDの駆動にはライブラリは不要ですが、ESP-01とUNO間UARTの通信用に
       次の「ライブラリを管理」からインストールできるものを利用しています。
        Library : SoftwareSerial
      
<テスト内容と結果>
   ESP-01のATコマンドテストは次の様な内容で、スマホからWIFIでUNOに目的の
     動作を行わせる事にしました。

       1.UNOに接続されたLEDのON/OFFの制御
       2.スマホのスライドバーでのUNOに接続されたLEDの明るさの制御
       3.スマホからUNOに接続されたアナログおよびデジタル入力の確認
       4.スマホからUNOにメッセージの送信
       5.スマホからUNOに接続されたアナログおよびデジタル入力の定期的な確認

   動作させた結果としては、次の様なものでした。

       1.ATコマンドのみの利用でも、URL上で公開されている他のESP-xxに直接
             コードを書き込んだものと同様な動作ができる事が判りました。
       2.ただし、スマホに表示する情報を送るデータの作成に関しては、RAMの
             消費が大きく、RAMサイズの制限で複雑な表示データを送る事は難しい
             事が判りました。(上記の目標の為の簡単な表示でも合わせて7割近い
             RAMを使いました。)
       3.UNOでは、UARTのポートが一つなのでESP-01とのUARTの通信には
             ソフトのUARTの利用が必要でその為にESP-01との高速通信が実現
             できませんでした。(動作が遅くなり、時々通信エラーも出る様です。)
       4.でも、UNOの利用上に簡単なスマホからの制御を付加する時には非常に
             有効な手段かと思いました。

 [テストでの機器の接続]
    イメージ 3

    ESP-01用の3.3Vは、UNOの3.3Vの電源では容量が足りないので、
    ダイオード2本分の電圧降下を利用して5Vから作っていますが3.3Vの
    レギュレータをお持ちの場合はそちらを利用するのが良いかと思います。
    また、UNOにリセットがかかるとESP-01のUARTの通信速度等もデホルト
    状態にする必要が有りますが、ESP-01はUNOのリセットよりも広い幅の
    パルスが必要な為、UNOのリセット後の立ち上がりでESP-01用のリセット
    パルスを生成する様にしています。

    イメージ 4

    イメージ 5
       I/Oテスト基板の回路図

 [操作画面]
   操作画面としては次の2種類用意していて、それぞれ切り替えて使える様に
   しました。

       1.Control page
           スマホからUNOのテスト基板上のものを制御および、テスト基板上の
           スイッチやボリュームの値を確認したり、また、UNOのOLEDへ
           メッセージの送信を行うもの

       2.Monitor page
           5秒毎にUNOのテスト基板上のスイッチやボリュームの値を読み出して
            表示するもの

     イメージ 6

       <Control page>
         Monitor button  : Monitor page への切り替え
         ON/OFF button  : UNOのテスト基板上の赤のLEDのオンとオフ
         Set brightness button  : スライドバーで設定した値に緑のLEDの輝度を設定
         Read inputs button  : UNOのテスト基板上のデジタルポートとボリューム
                                         の値を読み込んで更新
         Message TX button  : ボックス内に書き込んだ内容をUNOのOLEDに送信

       <Monitor page>         
         Control button  : Control page への切り替え
          (5秒毎にUNOのテスト基板のデジタルポートとボリュームの値を読み
              込んで表示)

  [コード作成上の注意]
   コードを作成する上で次の点の注意が必要でした。

       1.スマホへ表示するデータの書き方でRAMが節約できるのが判りました。
            スマホに表示するためのWebページのデータを定義する必要が有り、
            これを通常の方法で行うとRAMをかなり消費して必要な内容が書けない
            事が判りました。この問題点を解決する為に、Web上で調べた次の方法で
            対応しました。
            イメージ 7

            WString.hをインクルードしてprintlnの引数にF("xx")を利用する。

       2.ESP-01とIDEのモニター用には2種類の無手順のUART通信を利用して
             おり、2つの通信のタイミングが競合しない様にStringバッファに
             貯めこんだ後に交互に通信する方法を検討して見ました。コンパイル
             にはStringバッファの実際の大きさが評価できない為、問題無しとして
             コードを生成しましたが、動かして見ると、Stringバッファの内容が
             乱れていて、RAM利用の競合が起きている様でした。その為、コード的
             にはRAMを消費しない1バイト毎の交互通信にせざるを得ませんでした。

       3.割り込み処理とのタイミング調整の為にループ処理に適宜 yield() を
             入れてIDEモニターへの出力にエラーが少なくなる様に調整しました。 


  [スケッチコード]
   コードは下記のリンクからダウンロードできますが、利用する場合は次の点を
     注意して下さい。

       1.ESP-01とのUARTの通信速度はプリインストールしたものの値
           (115200bps)を想定し、最初はその値で起動して、その後に目標の
             速度に変更する処理を行っています。その為、このデホルトの速度を
             変更された場合は、コード上のデホルトの通信速度の値を変更するか、
             ESP-01のデホルトの通信速度を元の値に戻して下さい。
       2.WIFIのアクセスポイントへの接続には、SSID(アクセスポイント名)と
             それのパスワードが必要です。コード上のその部分をご利用の環境に
             合わせて使って下さい。

             イメージ 8

     コードのダウンロード先はこちらです。 (Link of code download)


 [動作状況]
   

 [ATコマンドプログラムの再書き込み]
   既にESP-01に別のプログラムを書き込んで利用している場合は、ATコマンドの
   プログラム(バイナリ)を書き込む必要が有ります。Web上には数種類公開
   されていますが、次のURLからダウンロードしたものがプリインストールの
   ものと同様に動作する事を確認しています。(デホルトのUART速度が
   9600bpsのものも有ります。)

      URL : http://www.electrodragon.com/w/ESP8266_AT-Command_firmware

   バイナリのコードを書き込むツールも数種類有る様ですが、操作の簡単な次の
   ものを利用しました。

      URL : https://github.com/Stadslab/ESP8266_example/tree/master/ESP8266_flasher_V00170901_00_Cloud%20Update%20Ready
              (esp8266_flasher.exeを利用)

   利用方法は、IDEの代わりに上記の書き込みソフトを起動して行います。
   ESP-01の書き込みモードの設定等はIDEから行う場合と同じです。(RSTと
   GPIO0を順不同でGNDに接続後、先にRSTを開放する。)

   利用したATコマンドのバイナリコードと書き込みツールのダウンロード先は
   こちらです。(Link of flasher download)

 [OLEDのI2Cへの変更]
   手持ちのSPIとI2Cのり両方に対応している1.3”と0.96”のOLEDは、
   SPIが標準となっている為I2Cにするには各々次の変更が必要でした。

    <SSD1306 0.96"OLED>
      イメージ 9
        - R3をR1に移動
        - マウントされていないR8の部分を短絡(代替抵抗が無いので)

    <SSH1106 1.3"OLED>
      イメージ 10
        - SPIの抵抗をIICの部分に移動