ESP-12をRaspberryのWifiモジュールとして使う


ESP-12E/ESP-12FにはSDIOピンと呼ばれるピンがあります。
赤枠内がSDIOピンです。


このピンを使って、ESP-12E/ESP-12FをRaspberryPiのWifiモジュールとして使う方法がこちらで 紹介されています。
最初、このページを見たときにRaspberryPi側のGPIO0が意味不明でしたが、こちらで GPIO0のピン位置が分かりました。
GPIO0はPin#27でTypeA+/TypeB+以降だけにあります。
そこで、TypeB+を使って実験してみました。
まず、最新のRaspbianをクリーンインストールします。
私が使ったのは「2016-09-23-raspbian-jessie-lite」です。



ESP-12E/ESP-12Fとの接続とインストールはこちらで 紹介されているとおりですが、
手元に33オームの抵抗が無かったので22オームの抵抗を使いました。
インストール中にカーネルソースをダウンロードしますので少し時間がかかります。
インストール終わってリブートすると、見事にwlan0ができていました。


後は「/etc/network/interface」にアクセスポイントの設定を加えて再度リブートすればWifiでアクセスできます。


上の写真で分かる様にUSBポートにはドングルがありませんがwlan0を認識しています。
ESP-12を使ったログインも問題ありません。


これ、考えた人、すごいです。
技術的な詳細仕様がこ ちらのページに書かれていますが、ESP8266のGPIO15をPullDownせずに起動すると、
ESP8266はBoot from SDIOのモードで起動します。
Raspberryにはこちらの ESP8089に対応したLinuxドライバーを組み込んでいます。
このドライバーはSDIOを介してカスタムファームウェアをESP8266にロードします。
これにより、ESP8266はESP8089 WiFiモジュールとして動作するようになります。

Raspberry ZEROにはMicroBのUSBポートしかないので、変換アダプターを介さないとUSB-Wifiドングルが使えません。
Wifi接続で困っている方はこれで解決です。
ちなみに、ESP-12をWifiモジュールとして使っても、もともとESP-12に書き込まれていたスケッチ(Flushの中身)は何も影響を 受けません。
元の基盤に戻したら、元のスケッチがちゃんと動作しました。



Raspberryのカーネルを更新したらドライバーのビルドが通らなくなりました。
こちらに dkms版のドライバーとインストール手順が公開されています。
このドライバーは、カーネルに合わせて自動的に再構築してからインストールします。
公開されている[esp8089-dkms_1.9.20210626_all.deb]は、こちらのソースをdkmsでビルドしたもので す。
stretchの最終バージョン(4.19.66-v7+)にインストールしました。
モジュールを有効にするとwlan0が出現しますが、アクセスポイントが見つかりません。
$ sudo modprobe esp8089

$ sudo ifconfig wlan0
wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 18:fe:34:ca:e7:95  txqueuelen 1000  (Ethernet)
        RX packets 2  bytes 226 (226.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2  bytes 310 (310.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ sudo iwlist scan
eth0      Interface doesn't support scanning.

lo        Interface doesn't support scanning.

wlan0     Interface doesn't support scanning : Device or resource busy



このような商品が発売されています。
Pimoroni ESP8266 IoT pHAT
こ ちらに使用方法が紹介されていますが、ATコマンド経由でネットワークにアクセスするようです。