スキップしてメイン コンテンツに移動

Wi-Fi 接続といろいろ

 今回は Raspberry Pi Pico W を使って、MicroPython で Wi‑Fi に接続する方法を紹介します。これまでの Pico には Wi‑Fi 機能がなかったんですが、Pico W になってついに無線が使えるようになりました!

これからは、この Wi‑Fi 機能を使って、インターネットにつないだり、他のデバイスとやりとりしたり、いろんなことにチャレンジしていきたいと思います。

1. MicroPython で Wi-Fi 接続

import network
import time

# SSID とパスワードを指定
SSID = 'あなたのSSID'
PASSWORD = 'あなたのパスワード'

# Wi-Fi ステーション(クライアント)モードで起動
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)

# 接続待ち
print("Wi-Fiに接続中...")
while not wlan.isconnected():
    time.sleep(1)

print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])



【実行結果】

2.【HTTP GET】Web APIからデータを取得(例:天気)

import urequests
import network
import time

# SSID とパスワードを指定
SSID = 'あなたのSSID'
PASSWORD = 'あなたのパスワード'

# Wi-Fi ステーション(クライアント)モードで起動
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)

# 接続待ち
print("Wi-Fiに接続中...")
while not wlan.isconnected():
    time.sleep(1)

print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])

# 天気コード→日本語訳
weather_codes = {
    0: "快晴",
    1: "ほぼ快晴",
    2: "一部曇り",
    3: "くもり",
    45: "霧",
    48: "霧(霧氷)",
    51: "霧雨(弱)",
    53: "霧雨(中)",
    55: "霧雨(強)",
    61: "雨(弱)",
    63: "雨(中)",
    65: "雨(強)",
    71: "雪(弱)",
    73: "雪(中)",
    75: "雪(強)",
    95: "雷雨",
    # 必要なら追加で対応可能
}

# 風向(度数)→方角
def wind_deg_to_jp(deg):
    dirs = ['北', '北北東', '北東', '東北東', '東', '東南東', '南東', '南南東',
            '南', '南南西', '南西', '西南西', '西', '西北西', '北西', '北北西']
    ix = int((deg + 11.25) / 22.5) % 16
    return dirs[ix]

# UTC→JSTに変換
def utc_to_jst(utc_str):
    # 文字列 "2025-04-18T01:15" を分解
    date_part, time_part = utc_str.split('T')
    year, month, day = map(int, date_part.split('-'))
    hour, minute = map(int, time_part.split(':'))

    # UTC時刻のstruct_time相当を作成
    utc_tuple = (year, month, day, hour, minute, 0, 0, 0)

    # MicroPythonではtime.mktimeでタプルを秒に変換可能(ただし6要素まで対応)
    jst_seconds = time.mktime(utc_tuple) + 9 * 3600
    jst_tuple = time.localtime(jst_seconds)

    return "{:04}-{:02}-{:02} {:02}:{:02}".format(*jst_tuple[:5])
# Open-Meteo API 呼び出し
response = urequests.get("https://api.open-meteo.com/v1/forecast?latitude=35&longitude=139&current_weather=true")
data = response.json()['current_weather']
response.close()

# 日本語表示(JST)
print("■ 現在の天気({})".format(utc_to_jst(data['time'])))
print("天気:{}".format(weather_codes.get(data['weathercode'], "不明")))
print("気温:{}℃".format(data['temperature']))
print("風速:{} km/h".format(data['windspeed']))
print("風向:{}".format(wind_deg_to_jp(data['winddirection'])))
print("昼夜:{}".format("昼" if data['is_day'] else "夜"))



【実行結果】

3.【NTPで時刻取得】

import ntptime
import network
import time

# SSID とパスワードを指定
SSID = 'あなたのSSID'
PASSWORD = 'あなたのパスワード'

# Wi-Fi接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)

print("Wi-Fiに接続中...")
while not wlan.isconnected():
    time.sleep(1)

print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])

# NTPで時刻取得(UTC)
ntptime.settime()

# 9時間ずらしてJSTにする
JST_OFFSET = 9 * 60 * 60
t = time.localtime(time.time() + JST_OFFSET)

# 日本時間で表示
print("現在時刻(JST): {:04}-{:02}-{:02} {:02}:{:02}:{:02}".format(*t[:6]))



【実行結果】

4.【Webサーバー】ブラウザから Pico を操作

import socket
import network
import time
from machine import Pin

# SSID とパスワードを指定
SSID = 'あなたのSSID'
PASSWORD = 'あなたのパスワード'

# LED ピン設定(GP16)
led = Pin(16, Pin.OUT)

# Wi-Fi ステーション(クライアント)モードで起動
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)

# 接続待ち
print("Wi-Fiに接続中...")
while not wlan.isconnected():
    time.sleep(1)

print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])

# ソケット作成(ポート番号を8080に変更)
addr = socket.getaddrinfo('0.0.0.0', 8080)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)

print('Webサーバー起動! http://%s:8080' % wlan.ifconfig()[0])

# HTMLテンプレート
html = """\
HTTP/1.1 200 OK

<html>
<head><title>Pico LED Control</title></head>
<body>
<h1>Pico W LED Control</h1>
<p>LED is currently: <strong>{state}</strong></p>
<form>
    <button name="led" value="on" type="submit">LED ON</button>
    <button name="led" value="off" type="submit">LED OFF</button>
</form>
</body>
</html>
"""

while True:
    cl, addr = s.accept()
    print('クライアント接続:', addr)
    request = cl.recv(1024)
    request = request.decode("utf-8")
    print("リクエスト内容:", request)

    # LED制御パラメータ取得
    if 'led=on' in request:
        led.value(1)
    elif 'led=off' in request:
        led.value(0)

    # 現在のLED状態
    state = "ON" if led.value() else "OFF"

    # レスポンス送信
    response = html.format(state=state)
    cl.send(response)
    cl.close()




【実行結果】


コメント

このブログの人気の投稿

Raspberry Pi Pico Wを使ってみよう

   Raspberry Pi Pico W(ラズベリーパイ ピコ ダブリュー) は、英国 Raspberry Pi 財団が 2022 年に発売した Wi-Fi 搭載マイコンボードです。従来の「Raspberry Pi」と聞くと Linux が動くシングルボードコンピュータ(SBC)を思い浮かべがちですが、Pico W は マイクロコントローラ (MCU)に分類され、いわゆる “組み込み開発” を手軽に始められるデバイスです。搭載 MCU はデュアルコア Arm Cortex-M0+(133 MHz 動作)の RP2040 。ここに Infineon 製 CYW43439 チップが追加され、 2.4 GHz IEEE 802.11 b/g/n Wi-Fi(BLE 対応 FW も提供中) が使えるのが最大の特徴です。  開発言語は MicroPython や CircuitPython が真っ先に紹介されることが多いのですが、 公式 Pico SDK を使えば C/C++ でも本格的に開発 できます。SDK は CMake ベースで Windows/macOS/Linux いずれでも利用可能。さらに、Arduino Core RP2040 が整備されたことで Arduino IDE 2.x からも “スケッチ感覚” で書き込みが可能 になりました。したがって、 「まずは Python でサッと試す」 「より高速化や省メモリ化が必要になったら C/C++ へ移行」 といった二段構えの学習ルートが取れるのが魅力です。 メニュー(基礎編) 01. Raspberry Pi Pico Wの開発環境を整える。 02. スイッチで 発光ダイオード(LED) を点灯・消灯させる 03. タイマーで発光ダイオード(LED)を1秒ごとに点滅させる 04. シリアル通信(オウム返し ) 05. シリアル通信(発光ダイオードの点灯・消灯) 06. サーボモーターを動かしてみよう(SG90制御入門) 07. DCモータを動かす(PWM) 08. IRリモートでRGBLED点灯 09. アナログ電圧を測定する(ADCの基本) 10. GPIO割り込み処理 11. リレーを駆動してLEDを制御する 12. DFPlayer で MP3 再生 13. 7 セグ 4 ...

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。 1.回路 GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。 【ソースコード】 # スイッチで LED を ON / OFF する簡単な例 #   GPIO15 : LED(出力)— LOW で消灯、HIGH で点灯 #   GPIO16 : スイッチ(入力)— 内部プルアップ抵抗を使用 # # ※ 配線例 #   LED のアノード → 1 kΩ 抵抗 → GPIO15 #   LED のカソード → GND #   スイッチ片側   → GPIO16 #   スイッチ反対側 → GND # # ★ 動作 #   スイッチを押す(GPIO16 が LOW)   → LED 点灯 #   スイッチを離す(GPIO16 が HIGH) → LED 消灯 from machine import Pin    # GPIO 制御ライブラリ import utime               # 時間関連(今回は使用しないが拡張用に読み込み) led = Pin ( 15 , Pin.OUT)                 # GPIO15 を出力モードに設定(LED 用) sw   = Pin ( 16 , Pin.IN, Pin.PULL_UP)     # GPIO16 を入力モード+内部プルアップ有効 while True:     if sw. value () == 1 :      # プルアップなので押していないときは 1   ...

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。 そこで今回は「シリアル通信」について紹介します。 まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。 シリアル通信とは? シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。 接続回路  id      TX       RX        baudrate     parity    stopbit  0  GPIO0 GPIO1   9600  なし  1  1  GPIO4 GPIO5   9600  なし  1 今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。 ソースコード例 from machine import UART, Pin # UART1ポートを9600bpsで初期化(ボーレートを指定) sirial = UART ( 1 , 9600 ) # UARTの詳細設定: 9600bps 、データビット8、パリティ無し、ストップビット1で初期化 sirial. init ( 9600 , bits = 8 , parity = None, stop = 1 ) # UARTで文字列を送信する(※MicroPythonではバイト列で送るのが正しいため b '' にしたほうが安全) sirial. write (b 'Hello World \n\r ' )  # 起動時に「Hello World」を送信 # メインループ while True:     # 受信バッファにデータが存在するかチェック     if sirial. any () > 0 : ...