Tanuki_Bayashin’s diary

電子工作を趣味としています。最近はラズベリーパイPicoというマイコンを使って楽しんでいます

【ラズパイPicoW】ボリュームの電圧値をPCに表示させた

※なにか気になる点がありましたらコメント欄にご記入ください。また、工作や回路を製作する場合には、細かい作業などに対して、細心の注意を払われるようお願いいたします。

【目次】

1.はじめに

ラズベリーパイPicoの学習のために『ラズパイPico完全ガイド』という本を購入しました(以下のリンク先を参照してください)。
そのなかにラズパイPicoWを用いて、温湿度センサーの値を読み取り、そのデータをクライアントである端末のブラウザの画面に表示させるというものがありました。

筆者はその追試を行うこととしましたが、温湿度センサを扱うことが少し面倒に思われたので、PicoWのA/D変換機能を用いてボリュームの電圧値を読み取り、それをブラウザに表示させることを行いました。

以下にその概要を示します。(この記事のメインは、Pico Wがサーバーとして動いている点です)

・参考にした書籍:『最新Pico W対応!ラズパイPico完全ガイド』
Amazon.co.jp: 最新Pico W対応!ラズパイPico完全ガイド eBook : 福田 和宏, ラズパイマガジン: 本

ラズベリーパイPico とラズベリーパイPico Wについて:
www.raspberrypi.com

写真1 ラズベリーパイPico Wにてデータを送信している様子

1.1 ライセンス条項

この記事はさきほどの文献の著者の方の意向により、MITライセンスを踏襲します。MITライセンスの全文を以下に掲示します。

The MIT Licence(以下引用文)

Copyright (c) 2023 たぬきばやし(@Tanuki_Bayashin: X)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。

上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。

ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。ここでいう保証とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるものではありません。 作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。

      • -

※この雛形の取得元
英語(http://www.opensource.org/licenses/mit-license.php
日本語(http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license

(引用はここまで)

引用元:
gist.github.com

2.回路構成

以下に今回の追試で使った回路の実態配線図を載せておきます。必要に応じてご利用ください。

図1 実体配線図

説明をすると、8本のGNDをつなぎます(1本でも動作します)。また、39番ピンに電源をつなぎます。(電池駆動するときは、動作させたいソースコードのファイル名は”main.pyy”とする必要があります)

可変抵抗器には左側の足をGNDにつなぎ、右側を3.3V、真ん中をA/Dコンバーターの入力ピンである、ラズPicoWの31番ピンにつなぎます。
配線はこれだけです。

3.ソースコード

今回用いたソースコードです。筆者が変更や追記した部分は、コメント文中に 「***」 にて示してあります。
※ブラウザはGoogle Chrome を利用しています。拡張機能である、”ページの自動更新”を用いて5秒おきにオートリロードしています。

またコード中、

# WiFi connection information  ***
ssid = "hikanet"
passwd = "wifipass"

とある部分は、それぞれお使いのwifi機器のssid とpassword を入力してください。
また、41行、44行、48行中の「# ***」のコメント文は削除してから動かしてください。

リスト1

# Import the required modules  ***
import machine # ***
import network
import socket
import utime  # ***

# Configure the ADC pin for conversion and set the conversion factor  ***
value = machine.ADC(26)  # Use GP26 as ADC0  ***
conv_fac = 3.3 / 65535   # Conversion factor to convert ADC value to voltage  ***

# Set the server port number  ***
server_port = 80

# WiFi connection information  ***
ssid = "hikanet"
passwd = "wifipass"

# Configure and wait for WiFi connection  ***
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(ssid, passwd)

while not wifi.isconnected():  #  ***
    print("Connecting to the WiFi network...")  #  ***
    utime.sleep(1)  #  ***

# Display WiFi connection information  ***
wifi_status = wifi.ifconfig()
print("Connected to the network.")
print("IP Address: {}  Netmask: {}".format(wifi_status[0], wifi_status[1]))
print("Default Gateway: {}  Name Server: {}".format(wifi_status[2], wifi_status[3]))
print("-----")

# Create and bind the socket  ***
s = socket.socket()
s.bind(('0.0.0.0', server_port))
s.listen(1)

# HTML template for the response  ***
web_html = """
<!DOCTYPE html>  #  ***
<html>
<head>
    <title>ADC0 Data</title>  #  ***
</head>
<body>
    <h2>ADC0 Data Read</h2>
    <p>ADC0 Data: <!--ADC0-->[V]</p>  #  ***
</body>
</html>
"""

# Main server loop  ***
while True:
    try:
        # Wait for a connection from the client  ***
        (cl, addr) = s.accept()
        print("Request received from {}".format(addr))
        
        # Receive the request from the client  ***
        req = cl.recv(1024)
        print("Client Request:")

        # Convert the request to a string and split it into lines  ***
        buf = str(req, 'utf-8')
        req_lines = buf.split('\r\n')
        
        # Parse the request  ***
        for r in req_lines:
            if r.startswith('GET / '):
                # Read ADC value and convert to voltage  ***
                ADC0 = value.read_u16() * conv_fac  #  ***
                # Insert data into the HTML template  #  ***
                out_html = web_html.replace("<!--ADC0-->", "{:.1f}".format(ADC0))  #  ***

                # Send the response  ***
                cl.send("HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n")
                cl.send(out_html)
                print("Message Sent")  #  ***
                break

        # Close the connection with the client  ***
        cl.close()
    except OSError as e:
        print("Error:", e)  #  ***
        try:  #  ***
            cl.close()
        except:  #  ***
            pass  #  ***
        print("Disconnected from Client")

(筆者の原案をChatGPTに添削したもらいました)

【解説】
このコードは、ラズベリーパイPico Wを用いて、WiFiネットワークに接続し、クライアントからのHTTPリクエストを受信して、ADC0(アナログデジタルコンバータの0番ピン)からデータを読み取ります。読み取ったデータはHTMLテンプレートに挿入され、クライアントにレスポンスとして返されます。
(この解説もChatGPTを用いて生成しました)


【動かし方】

  1. PicoW のファームウェアは書き込めているものとします。PCとPicoW をUSBケーブルでつなぎ、「Thonny」などのエディターを用意して開きます。
  2. 上のコードをコピペして貼り付け、PicoW もしくはPC側に保存します。(適当に名前を付けてください)
  3. エディタから実行します。コンソール画面にいろいろ表示されますが、wifiとつながるとその情報を表示します。
  4. そのうちの「IPアドレス」を、PCのブラウザのURLを入力するところに記述し、「Enter」を押せば、PicoW につながっている可変抵抗値の電圧値が表示されるはずです。

4.動画

観測データを表示しているシーンを以下に示します。(ご参考)

youtu.be


ボリュームのつまみを動かすごとに、画面の数値が(5秒間隔で)変更されている様子がうかがえます。
(画面では”ADC0 DATA readed” とありますが、”ADC0 DATA”の間違いでした。ご了承ください)

以上です。