Micropythonコード解説 並列処理、ブラウジング、サーボ制御

本記事では下記記事に貼り付けたコードを解説してみたいと思います。
色々な処理をしていますが、一つのコードにしているので、ブロックに分けて解説します。

インポート文

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()

この部分では、必要なライブラリがインポートされています。networksocketはネットワーク接続のため、machinepicozeroは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)

core0core1関数では、それぞれ異なるタスクを担当します。core0はネットワークからのリクエストを処理し、core1はサーボモーターを制御します。_thread.start_new_threadを用いてcore1関数を新しいスレッドで実行し、メインスレッドではcore0を実行しています。

サーバー応答とサーボモーター制御

core0関数内では、クライアントからのHTTPリクエストに基づいてロボットの動作を制御するための状態変数が更新されます。一方、core1関数では、サーボモーターを実際に制御するロジックが含まれており、状態変数に基づいてサーボモーターを動かします。

このコードは、ネットワーク機能と物理デバイス制御を組み合わせた複雑なアプリケーションの例です。マルチスレッディングを使用して、ネットワーク処理とデバイス制御を同時に行っています。

コメント

タイトルとURLをコピーしました