Raspberry Pi Pico WでWiFi経由でセンサーデータをストリーミング

Raspberry Pi Pico W チュートリアル ストリームセンサーデータ

Raspberry Pi Pico Wでセンサーデータをストリーミングしたいと思ったことはありませんか?

Raspberry Pi Pico Wの最も優れた用途のひとつに、ウェブページを提供する機能がある。つまり、WiFiの範囲内であれば、携帯電話からセンサーデータをモニターするのに使うことができる。このプロジェクトでは、加速度データをモニターし、ADXL343センサーをタップすると起動するデジタルサイコロを作成する方法を簡単に説明します。

Raspberry Pi Pico WとADXL343を接続。

ビデオ

必要な部品

ADXL343とは?

アナログ・デバイセズのADXL343は、先代のADXL345に続く製品です。

センサーは3軸の測定が可能で、感度は+-2g、+-4g、+-8g、+-16gの4段階で設定できます。低域は低速の動きに対して分解能が高く、高域は高速のトラッキングに適しています。

ADXL343にはCircuitPythonのライブラリもあり、MicroPythonで使えるので、かなり簡単に始められるようになりました。

Pico Wでセンサーデータをストリームするには、Pico WだけでなくADXL343にもヘッダーをハンダ付けする必要があります。

ADXL343とPico Wの接続

Raspberry Piに接続するピンは4本です。

を接続します。 VIN にピンを刺す。 3.3V出力 をRaspberry Pi Pico Wにインストールします。

を接続します。 GND をPico Wのグランドピンに接続してください。

を接続します。 エスディーエー 宛がう GPIO0;

を接続します。 SCL 宛がう GPIO1.

Raspberry Pi Pico WのMicroPythonファームウェアをフラッシュする。

まず、MicroPythonのファームウェアをPico Wにフラッシュする必要があります(まだフラッシュしていない場合)。

こちらからダウンロードできます。

次に、BOOTSELボタンを押しながら、Picoをコンピュータに接続します。新しいドライブが表示されるはずです。ダウンロードした.UF2ファイルをそのドライブにコピーしてください。

Raspberry Pi Pico WにThonnyをセットアップする。

Thonnyを開いてください。ダウンロードしてない人は ここで入手する

インタプリタに設定する MicroPython (Raspberry Pi Pico) をクリックすると、Thonny IDEのウィンドウの左下に表示されます。

Pico Wにライブラリーをコピーする

ライブラリやファイルは、こちらのGithubリポジトリからダウンロードしてください。

ZIPファイルをダウンロードするには、そのリンク先に行き、緑色の""をクリックします。コード" ボタンをクリックし ZIPダウンロード.

ダウンロードしたら、どこか覚えのある場所で解凍してください。

次に、Thonny IDE で、次のようにクリックします。 表示 > ファイル をクリックすると、あなたのファイルシステムとPico Wのファイルシステムが表示されます。

解凍したファイルを移動し、フォルダに入る MicroPython > II Pico W センサーサーバー。 各項目を右クリックし、"Upload to /" をクリックして、すべてをPico Wにコピーします。

コードの修正

Raspberry Pi PicoをWiFiネットワークに接続させるためには、まず 秘密.py を変更し sid そして pwの値を入力します。前者にはネットワークのSSID(名前)、後者にはパスワードを入力します。ファイルを保存します。

のです。 索引.html は、配信されるウェブページです。行の"<p>X AccX|Y AccY|Z AccZ</p>" と <p>結果 DiceVal</p> は、プロジェクト実行時にセンサーデータに置き換わります。

Raspberry Pi PicoをWiFiに接続する。

のです。 main.py は、アクションが起こる場所です。

これらの線は、あなたのWiFiに接続します。の文字列を変更するのを忘れないでください。 RP2.カントリー あなたの国がドイツ(DE)でない場合。


# Set country to avoid possible errors
rp2.country('DE')

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# If you need to disable powersaving mode
# wlan.config(pm = 0xa11140)

# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac = ' + mac)

# Other things to query
# print(wlan.config('channel'))
# print(wlan.config('essid'))
# print(wlan.config('txpower'))

# Load login data from different file for safety reasons
ssid = secrets['ssid']
pw = secrets['pw']

wlan.connect(ssid, pw)

このコードのおかげで、WiFi接続が成功すると、オンボードのLEDが3回点滅します。また、メッセージとThonnyで見ることのできるIPアドレスが表示されます。 このIPアドレスは、後でサーバーにアクセスするのに便利です。

   led = machine.Pin('LED', machine.Pin.OUT)
    for i in range(wlan.status()):
        led.on()
        time.sleep(0.2)
        led.off()
        time.sleep(0.2)
    print('Connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

エラーが発生した場合は、エラーコードの値に基づいてLEDが点滅します。

エラーの意味

  • 0 = リンクダウン
  • 1 = リンクジョイン
  • 2 = Link NoIp
  • 3 = リンクアップ
  • -1 = リンクフェイル
  • -2 = Link NoNet
  • -3 = Link BadAuth

Pico WとADXL343の接続

I2Cオブジェクトを初期化します。

# Initialize I2C
# busio.I2C(SCL, SDA)
i2c = busio.I2C(board.GP1, board.GP0)

そして、この2本の線は加速度センサーを作成し、タップ検出(サイコロ読み用)を可能にします。

# Create Accelerometer object
accelerometer = adafruit_adxl34x.ADXL343(i2c)

accelerometer.enable_tap_detection()

コードの実行時間

コードを実行するには、Thonnyの実行ボタン(上部のツールバーの緑色のボタンの中に再生アイコンがあるボタン)を押します。

そして、Raspberry Pi Pico WのIPアドレスに接続し、Thonnyのシェルを開いていれば、そこで見ることができます。さもなければ、ルータにログインして、Pico WのIPアドレスを調べます。

Pico W はソケット接続で HTTP サーバを動作させており,ここで定義された接続を待ち受けます.

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

Pico WのIPアドレスに接続すると、このコードが起動し、index.htmlが1秒ごとに最新のデータで更新されます。

   cl, addr = s.accept()
        print('Client connected from', addr)
        cl_file = cl.makefile('rwb', 0)
        while True:
            line = cl_file.readline()
            if not line or line == b'\r\n':
                break
            
        response = get_html('index.html')
        data = accelerometer.acceleration
        tapped = accelerometer.events['tap']
        response = response.replace('AccX', str(data[0]))
        response = response.replace('AccY', str(data[1]))
        response = response.replace('AccZ', str(data[2]))
        if tapped:
            dice_val = str(random.randint(1,6))
        response = response.replace('DiceVal', dice_val)
        
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(response)
        cl.close()

main.py は、Pico W のサーバに接続したときに、値を現在の読みに置き換えます。

ご覧のように、AccX、AccY、AccZをセンサーのデータに置き換えています。

センサーがタップされたら、1〜6のランダムな整数をHTMLページの "DiceVal "文字列に出力します。

次はどうする?

このチュートリアルでは、Raspberry Pi Pico Wを使ってセンサーデータをウェブページにストリーミングする簡単な方法を紹介します。

実はこれ、他のセンサーにも使えるコードなんです。

方法論は変わりません。センサーのための正しいライブラリを見つけて、main.py と index.html を修正し、センサーデータを取得して正しい値をウェブページにプッシュできるようにする必要があります。

他にも、温度・湿度センサーやDHT22を使った空気清浄プロジェクトなど、着手できるプロジェクトはたくさんあります。 BME688または、光抵抗付きの明るさセンサー。

7コメント

  1. Ken Anderson on 7月 15, 2022 at 7:24 am となります。

    HTML5の機能を使うことで、HTML5がどのように作られているかを知ることができるのは良いことだ。

  2. Terry Young on 9月 24, 2022 at 6:47 pm となります。

    データをWebページ形式ではなく、TCP/UDPでポートに文字列として流し、他のコンピュータで読めるようにできないか(ゲージを作ったりするため?)
    みたいなもの
    192.168.1.24:9060
    AccX, 7.923, AccY, 1.093, AccZ, -5.452
    AccX, 6.423, AccY, 1.241, AccZ, -8.769

  3. Ingo on 1月 10, 2023 at 9:11 pm となります。

    ある人がPico Wを購入し、そのPico Wが家庭内で使用されている場合、WLANを使用して他のPico Wからどのようにメッセージを取得することができますか?
    このサンプルコードでは、Pico WがHTMLで書かれたときに、何か変なことをするようです。私の場合は、次のようなものを作りました。
    "getvaluefromotherpico(192.178.2.44, variablename)" - このメッセージは、WLANで実行され、中断されることなく、WLANごとに更新されます。
    どのようにすればいいのでしょうか?

    ありがとうございます。
    インゴ

    • raspi berry on 2月 4, 2023 at 11:51 am となります。

      最初のPicoからのREST APIによるWerteはどうなるのでしょうか?
      私は、この問題点を理解していますが、まだ完全ではありません。

      このようなプロジェクトでは、技術的なコンサルティングを積極的に行います。

  4. Luis on 1月 11, 2023 at 3:30 pm となります。

    そのデータをthinspeakに送るにはどうしたらいいですか?

  5. Eddi Baars on 3月 18, 2023 at 1:02 pm となります。

    guten Tag, I have dasselbe Problem.curl や wget ではうまくいきません。私は、Picoからのメッセージを私のRaspi4で表示し、その後、グラフィックを表示し、統計的に分析することができます。???

  6. andrew on 7月 19, 2023 at 10:31 pm となります。

    thonnyからnetwrkモジュールを追加すると、networkという名前のモジュールがない。

コメントを残す