本記事では下記記事に貼り付けたコードを解説してみたいと思います。
色々な処理をしていますが、一つのコードにしているので、ブロックに分けて解説します。
インポート文
import network # Network library
import socket # Socket library
from time import sleep # Sleep library
from picozero import pico_temp_sensor, pico_led # GPIO library
import machine
from machine import Pin, PWM
import utime
import time
import _thread
import gc
gc.enable()
この部分では、必要なライブラリがインポートされています。network
やsocket
はネットワーク接続のため、machine
やpicozero
はGPIOピン制御のために使用されます。また、マルチスレッディングを扱うために_thread
が、メモリ管理のためにgc
が使われています。
ネットワーク設定とウェブページ
# Network setting
ssid = 'SSID'
password = 'PASSWORD'
def connect():
...
def open_socket(ip):
...
def webpage():
...
このセクションでは、Wi-Fiに接続し、IPアドレスを取得、ソケットを開くための関数が定義されています。また、ロボットの制御に使用されるウェブページのHTMLがwebpage
関数内に定義されています。
メインのサーバー処理
try:
ip = connect()
connection = open_socket(ip)
html = webpage()
except (KeyboardInterrupt, OSError) as e:
machine.reset()
Wi-Fi接続の試み、ソケットのオープン、ウェブページの読み込みを行います。エラー発生時にはデバイスをリセットします。
サーボモーターの設定
servo = []
servo.append(PWM(Pin(2))) #Front Right Leg
...
このブロックでは、サーボモーターのGPIOピンを設定し、PWM信号で制御するための準備をしています。
マルチスレッディングでの処理
def core0(params, servo):
...
def core1(params, servo):
...
_thread.start_new_thread(core1, (params, servo))
core0(params, servo)
core0
とcore1
関数では、それぞれ異なるタスクを担当します。core0
はネットワークからのリクエストを処理し、core1
はサーボモーターを制御します。_thread.start_new_thread
を用いてcore1
関数を新しいスレッドで実行し、メインスレッドではcore0
を実行しています。
サーバー応答とサーボモーター制御
core0
関数内では、クライアントからのHTTPリクエストに基づいてロボットの動作を制御するための状態変数が更新されます。一方、core1
関数では、サーボモーターを実際に制御するロジックが含まれており、状態変数に基づいてサーボモーターを動かします。
このコードは、ネットワーク機能と物理デバイス制御を組み合わせた複雑なアプリケーションの例です。マルチスレッディングを使用して、ネットワーク処理とデバイス制御を同時に行っています。
コメント