RoboTry

ROSを使ってロボットを動かすぞ

ESP-IDFとIFTTTを使ってツイートする

ESP-IDFを使った記事があまり見つからないので書きました。

(みんなArduinoライブラリが好きなのね)

できる限りESP-IDFのサンプルプログラムを流用します。

f:id:macakasit:20190127214120p:plain

実行環境の紹介

以下の環境でテストしました。

事前準備

ESP-IDFの環境を整える

このページに従って、開発環境を構築してください。

docs.espressif.com

Hello Worldを実行する

ESP-IDFのサンプルプログラムを実行します。

このページに実行手順が書かれています。

https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#start-a-project

HTTPS Requestのサンプルを実行してWiFi接続を確認

esp-idf/examples/protocols/https_request at master · espressif/esp-idf · GitHub

ESP-IDFのHTTPS Request Exampleを編集すれば、 ESP32でツイートできます。

まずはサンプルコードをそのまま実行します。

サンプルコードを開発ディレクトリ(~/esp)にコピーします。

cd ~/esp
cp -r $IDF_PATH/examples/protocols/https_request .

menuconfigを実行します。

cd ~/esp/https_request
make menuconfig

こんな画面が出ます。 Example Configurationを選んでください。

f:id:macakasit:20190127183455p:plain
menuconfig1

こんな画面が出ます。接続したいWiFiSSIDとパスワードを入力します。

f:id:macakasit:20190127183524p:plain
menuconfig2

SSIDを入力します。

f:id:macakasit:20190127183609p:plain
menuconfig3

パスワードを入力します。(****みたいに隠されないので注意)

f:id:macakasit:20190127183700p:plain
menuconfig4

Save & Exitで画面を抜けます。

ディレクトリにsdkconfig というファイルが生成されます。ここにSSIDとパスワードがそのまま入力されているので、絶対に他人に見せないように!!!

プログラムをmakeし、ESP32に書き込みます。

# ESP32をPCに接続していること
make flash

プログラムが正しく動いたのか、ターミナル画面で確認します。

make monitor

# ~~~ 以下実行結果 ~~~
Toolchain path: /home/akshota/esp/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
Toolchain version: crosstool-ng-1.22.0-80-g6c4433a
Compiler version: 5.2.0
Python requirements from /home/akshota/esp/esp-idf/requirements.txt are satisfied.
MONITOR

# ~~~ 省略 ~~~

I (5345) example: Reading HTTP response...
HTTP/1.0 200 OK
Content-Length: 2091
Access-Control-Allow-Origin: *
Content-Type: application/json
Date: Sun, 27 Jan 2019 09:46:48 GMT
Strict-Transport-Security: max-age=631138519; includeSubdomains; preload

# ~~~ 省略 ~~~

正常な応答が返ってきました。WiFiの接続確認は終了です。

IFTTTの準備

ESP32から直接ツイートすることも可能ですが、今回はIFTTTを経由してつぶやきます。

Webhookという仕組みを使います。

kintone-blog.cybozu.co.jp

信号(メッセージ)の流れは、ESP32 → IFTTT → Twitter という関係になります。

一度、ESP32 - IFTTT間のWebhookを用意しておけば、ESP32のソースコードを書き換えなくても、 TwitterFaceBook・LINE・GMail・Discord等のサービスと連携できます。

IFTTT Appletの作成

IFTTTにアクセスします。 初めてIFTTTを使う人はアカウントを作成してください。

Discover IFTTT and Applets - IFTTT

右上のアカウントボタンからNew Applet を開きます。

f:id:macakasit:20190127202717p:plain
ifttt1

IF を開き、Webhookを選択します。

f:id:macakasit:20190127203035p:plain
ifttt2

Event NameはESP32にしました。

f:id:macakasit:20190127203127p:plain
ifttt3

THATを開き、Twitterを選択します。 Actionは、Post a tweetにしました。

Add Ingredientで、Tweet Textの末尾にOccuredAtを追加します。

Twitterの仕様で、連続して同じツイートを投稿できません。 OccuredAtを追加すると、ツイートの末尾にAction実行時刻を追加します。 これにより何度でもツイートできます。(1日に投稿できる最大数は決まってるので注意)

f:id:macakasit:20190127203419p:plain
ifttt4

WebhookのKeyを確認

右上のアカウントボタンからServices を開きます。

f:id:macakasit:20190127202717p:plain
ifttt1

webhookを開きます。

f:id:macakasit:20190127204258p:plain
ifttt6

右上のDocumentationを開きます。

f:id:macakasit:20190127204355p:plain
ifttt7

Your key is:~ と書かれたページが表示されます。Keyは絶対に他人に見せないように!!!

f:id:macakasit:20190127204739p:plain
ifttt7

{event}ESP32を入力します。

ページ下のTest it を押して、ツイートされるか確認しましょう。

f:id:macakasit:20190127205107p:plain
ifttt8

続いてpemファイルのダウンロードをします。このページは閉じないでください。

pemファイルのダウンロード

maker.ifttt.comの証明書をpemファイルとしてダウンロードします。

ブラウザはGoogle Chromeを使用します。ブラウザによって方法は変わると思うので調べてください。

URLバーの鍵マークを開き、証明書を選択します。

f:id:macakasit:20190127210347p:plain
pem1

詳細タブを開き、証明書の階層の一番上を選択します。 その状態でエクスポートを押します。

f:id:macakasit:20190127210431p:plain
pem2

ダイアログが表示されるので、 ~/esp/https_request/main/server_root_cert.pem に上書き保存します。

f:id:macakasit:20190127210823p:plain
pem3

これでpemファイルのダウンロードは終了です。

IFTTT以外のサービス(例えばZapier)を使う場合、サービスごとにpemファイルを準備してください。

HTTPS Requestのサンプルを編集してツイートする

IFTTTに対してリクエストを送るようにサンプルを編集します。

以下のように、~/esp/https_request/main/https_request_example_main.cを書き換えてください。

key/以下はユーザによってちがうので注意

/* Constants that aren't configurable in menuconfig */
#define WEB_SERVER "maker.ifttt.com"
#define WEB_PORT "443"
#define WEB_URL "https://maker.ifttt.com/trigger/ESP32/with/key/----------------------------------------"

ファイルを保存したら、プログラムをmakeし、ESP32に書き込みます。

# ESP32をPCに接続していること
make flash

プログラムが正しく動いたのか、ターミナル画面で確認します。

make monitor

# ~~~以下実行結果~~~
Toolchain path: /home/akshota/esp/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
Toolchain version: crosstool-ng-1.22.0-80-g6c4433a
Compiler version: 5.2.0
Python requirements from /home/akshota/esp/esp-idf/requirements.txt are satisfied.
MONITOR

# ~~~省略~~~

Congratulations! You've fired the ESP32 eventI (5865) example: connection closed

ツイートできました!

確認できたらUSBケーブルを抜きましょう!電源OFFです!

10秒おきにツイートしてしまうので、タイムラインが荒れます!!!

応用例(課題?)

GPIOのサンプルコードを参考にして、ボタンが押されたらツイートするプログラムを書きましょう。

esp-idf/examples/peripherals/gpio at master · espressif/esp-idf · GitHub

(力尽きたので記事にはしてません)

失敗例

WiFiのパスワードを間違えた

接続しようと何回も挑戦してる。(かわいい)

make monitor

# ~~~以下実行結果 一部省略
I (275) example: Setting WiFi configuration SSID unko_wifi_g...
I (375) phy: phy_version: 4007, 9c6b43b, Jan 11 2019, 16:45:07, 0, 0
I (375) wifi: mode : sta (30:ae:a4:cb:02:8c)
I (1225) wifi: new:<7,0>, old:<1,0>, ap:<255,255>, sta:<7,0>, prof:1
I (2205) wifi: state: init -> auth (b0)
I (2215) wifi: state: auth -> assoc (0)
I (2215) wifi: state: assoc -> run (10)
I (9185) wifi: state: run -> init (fc0)
I (9185) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1
I (11725) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1
I (11725) wifi: state: init -> auth (b0)
I (11725) wifi: state: auth -> assoc (0)
I (11735) wifi: state: assoc -> run (10)
I (18685) wifi: state: run -> init (fc0)
I (18685) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1
I (21225) wifi: new:<7,0>, old:<7,0>, ap:<255,255>, sta:<7,0>, prof:1
I (21225) wifi: state: init -> auth (b0)
I (21235) wifi: state: auth -> assoc (0)
I (21235) wifi: state: assoc -> run (10)

pemファイルを変更し忘れた

esp-tls: mbedtls_ssl_handshake returned -0x2700 とエラーが発生する

make monitor

# ~~~以下実行結果 一部省略
I (3215) example: Connected to AP
E (3955) esp-tls: mbedtls_ssl_handshake returned -0x2700
I (3955) esp-tls: Failed to verify peer certificate!
I (3955) esp-tls: verification info:   ! The certificate is not correctly signed by the trusted CA
  ! The certificate is signed with an
E (3975) esp-tls: Failed to open new connection
E (3975) example: Connection failed...

I (3985) example: Completed 1 requests
I (3985) example: 10...
I (4985) example: 9...
I (5985) example: 8...
I (6985) example: 7...
I (7985) example: 6...

参考ページ

ESP32からIFTTTを使ってLINE Notifyで通知を送ってみた - Qiita

knaka Tech-blog: esp32, HTTPS で、IFTTT(Maker Webhooks)に接続する, ESP-IDF