自由に工作中

マイコンについて学習しています

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本で動作。

 

外観

f:id:goma483549:20211001200448j:plain

接続図

f:id:goma483549:20210925204337j:plain

 

必要な物

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にしても支障がない「普段使っていないスマホ」で行うことを推奨します。

 

マイコンは本業ではないので、プログラム的に足りない物や逆に要らない物が

あるとは思いますが、こんな感じで出来ました。