Raspberry Pi Picoに無線機能を付けてみました
Raspberry Pi Picoと無線モジュールESP8266が載ったBOARD_ESP02D(4MB)_SIMPLE
を組み合わせて、無線によるデータの取得をしました。
Picoで実現させなくてもよい話ですが、
Picoに持っていない無線機能を追加するのも面白いかと思い、
試してみました。
機能
・Rasberry Pi PicoとESP8266をUARTで接続。
・ESP8266をアクセスポイントとして動かし、スマホとESP8266を無線で繋げて、
Rasberry Pi Picoで取得したデータをスマホに表示。
・今回使用したセンサーはポテンショメータ。
ポテンショメータは回転させた角度によって電圧が変わります。
・5秒おきに表示データを更新。
・乾電池2本で動作。
外観
接続図
必要な物
・Raspberry Pi Pico
・BOARD_ESP02D(4MB)_SIMPLE (スイッチサイエンスから購入)
※無線モジュールESP8266の動作に必要な抵抗(プルアップ/プルダウン)
やバイパスコンデンサが実装されています。
・BOARD_ESP02D(4MB)_SIMPLE にプログラムを書き込む環境
例えば、ArduinoIDEとシリアル通信基板。
ネットに先人の情報はあるが、慣れないと構築は結構めんどうか。
・ポテンショメータ (他のセンサーでもOK)
UART
・UARTが非同期のためなのか、たまにタイミングによって、
データの取得が不完全になるので、データに「;」を付けて2回取得しています。
「;」が来たら取得終了。
その後、必要な部分のみ抽出していますが、他に方法があるかと思うため
要勉強したい所です。
Raspberry Pi Picoのソースコード
from machine import UART, Pin
import time
PIN_ADC = 26
VREF = 3.3
adc = machine.ADC( PIN_ADC )
uart0 = UART(0, baudrate=115200, tx=Pin(12), rx=Pin(13))
while True:
value = adc.read_u16()
volt = (value /65535 * VREF)
voltx = "{0:.3f}".format(volt) + ";" #ケタ数を揃えて;を追加
time.sleep(1)
uart0.write(voltx)
BOARD_ESP02D(4MB)_SIMPLE (ESP8266)のソースコード
・ネットにある先人の情報を組み合わせていきました。
your-ssidとyour-passwordは、自由に決めて入力してください。
ssidは他人からも見える名前なので注意。
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define WIFI_SSID "your-ssid" //ネットワーク名。各自入力する
#define WIFI_PWD "your-password" //パスワード。各自入力する
ESP8266WebServer server( 80 );
IPAddress ip( 192, 168, 10, 1 );
IPAddress subnet( 255, 255, 255, 0 );
void setup() {
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(ip, ip, subnet);
WiFi.softAP(WIFI_SSID, WIFI_PWD);
Serial.begin(115200);
server.on("/", [](){
String str = "";
String msg = "";
int strlen = 0;
String str_send = "";
if ( Serial.available() ) {
{
str = Serial.readStringUntil(';'); //「;」を検出したら終了
str += Serial.readStringUntil(';'); //「;」を検出したら終了
strlen = str.length();
str_send = str.substring(str.length()-5,str.length()); //データ抽出
};
}
msg += "<!DOCTYPE html>";
msg += "<html><head>";
msg += "<meta http-equiv='refresh' content='5'>"; //5秒おきに更新
msg += "<title>Sensor</title><body>";
msg += "<font size='5'>" + str + "</font>";
msg += "<br>";
msg += "<font size='5'>" + str_send + "</font>";
msg += "<br>";
msg += "</body></html>";
server.send(200, "text/html", msg);
});
server.begin();
}
void loop() {
server.handleClient();
}
スマホでの表示
ソースコードを書き込むことが出来たら、スマホでWiFiをONにすると
WIFI_SSIDが見えるはずなので、パスワードを入れて接続します。
そして、スマホのブラウザにアドレス「192.168.10.1」を入れると、
データが表示されます。
※スマホのネットワーク設定で、「モバイルネットワーク」がONになっていると
一旦外部ネットワーク経由になるのか上手く接続できないかもしれません。
「モバイルネットワーク」をOFFするとインターネットに繋がらなくなるため、
OFFにしても支障がない「普段使っていないスマホ」で行うことを推奨します。
マイコンは本業ではないので、プログラム的に足りない物や逆に要らない物が
あるとは思いますが、こんな感じで出来ました。