Windows環境でRaspberry Pi 用のIoTプロジェクトを開発する前提で、初期の理想的なフォルダ構成とそれぞれの役割をご説明します。

企画・構想のページでは、二つのプログラミングファイルを企画しましたが、複数のセンサーや表示器を追加していく場合、後でフォルダやファイルを整理するのはとても大変なので最初に詳細設計しておきます。

開発のやり易さ、デバック、運用、保守、デバイス追加、修正などや、長期に渡り稼働させていく場合は、Thonny で扱いやすいように、PC上に以下のようなフォルダ(参考)を作成します。

フォルダ構成

フォルダーの種類と開発の方法

PJ_IoT_00\の中に、大きく2種類のフォルダーを設置しています。

  • A ひとつは、pc_dev\
  • B もうひとつは、pico_app\

pico wを動作させる方法が大きく2種類あります。

  • a ひとつは、PCとpico wをUSB接続して、Thonnyから実行する場合
  • b もうひとつは、pico wを単体で動作させる場合

aの場合、Aが必要になります。
bの場合、Bが必要になります。

たとえば、温湿度センサーをdhtとした場合、

a : Thonnyから実行する場合

センサーなどのデバイスを動作させるプログラムを作成して、動作検証する場合、開発のしやすさから「a」のスタイルになり、「A」のpc_dev\内のデバイス.py(具体的には、sensor_test_dht.py)で動作検証します。

b : pico wを単体で実行する場合

「a」で完成したプログラムファイルをmain.py(内容はsensor_test_dht.py同等)として単体動作。
または、デバイス.py(具体的には、dht.pyや他のデバイス.py)とmain.pyを連携させてpico w単体で実行する(動作させる)場合、「b」のスタイルになり、「B」のpico_app\dht.pyやデバイス.pyをpicoにインストールして単体動作させます。

a Aとb Bは同等か?

同等でも、同等でなくても、どちらで良いです。

デバイスが少ない場合

pico wと接続するデバイスがひとつだけや少ない場合でプログラムの行数が多すぎない場合は、「a」で動作検証したdht.pyをコピーしてmain.pyにファイル名を変更してpico wにインストールしてそのまま動作できます。

デバイスが複数の場合

pico wと接続するデバイスが複数の場合は、ひとつのファイルに統合するのはPythonのルール上ふさわしくないので、デバイス毎にファイルが存在していることが望ましくなります。

具体的に、
my_dht.py
bme280.py
oled.py
wifi_manager.py
を1台のpico wで動作させようとする場合は、各ファイル内の共通要素、パスワードなどの機密情報をconfig.pyへ移行します。

main.pyのプログラムで上記4つのファイルとcofig.pyを制御するようにします。
必要に応じて、boot.pyも設置します。

これらは、pico_app/内にすべて存在しています。これをpico wにインストールして単体動作させます。

この場合は、a Aとb Bは同等ではない状態になっています。

実務での活用

テストフェーズ活用場所備考
開発初期(単体)pc_dev/sensor_test_*.py各センサー個別に確認・トラブル対応しやすい
実装・統合main.py に組み込んで全体動作確認センサーが複数接続された環境での動作検証
単体→統合後の整理動作済センサーは sensor_test_*.py にログ用途・再テスト用として残すリファレンスや社内用メンテ資料にもなる

my_dht.pyを例にすると、

ファイル・場所主な目的関係・連携補足
pc_dev/sensor_test_dht.py
PC(Thonnyなど)から Pico に接続し、DHT22の動作をUSB経由で確認するlib/my_dht.py をインポートして使う(またはコピー)lib/の関数を使って値を取得し、PCで表示・ログ化など
pico_app/lib/my_dht.pyPico上で動作するDHT22用のドライバmain.py などからインポートして使う軽量・MicroPython向け

フォルダー構成(参考例)

C:\Users\あなたの名前\Documents\RaspiProjects\PJ_IoT_00\

PJ_IoT_00\
├─ pc_dev         ← PC補助スクリプト・開発環境
│  ├─ .venv/        ← 仮想環境(Pythonライブラリ用)
│  ├─ requirements.txt   ← PCで使うライブラリ定義(matplotlib 等)
│  ├─ sensor_test_dht.py  ← DHT22センサーテスト 動作確認用(USB経由 or テスト信号)
│  ├─ sensor_test_bme280.py ← BME280センサーテスト 動作確認用(USB経由 or テスト信号)
│  ├─ sensor_test_oled.py  ← OLED表示テスト 動作確認用(USB経由 or テスト信号)
│  └─ …
│  ├─ plot_data.py      ← センサーデータをCSVからグラフ表示
│  ├─ wifi_logger.py     ← Picoから受信したデータをログに記録
│  ├─ wifi.py       ← PC側のWi-Fi設定確認/スキャン用(補助ツール)
│  ├─ data/         ← 保存されたセンサーデータやログ
│  │  ├─ thm_log_20250619.csv
│  │  └─ wifi_data.json
│  └─ utils/         ← PC用ユーティリティ(CSV整形など)
│    └─ file_utils.py
├─ pico_app/        ← Pico W用(転送対象)
│  ├─ lib/         ← Pico Wで使うライブラリ・機能別モジュール群
│  │  ├─ my_dht.py     ← DHT22センサー用ドライバ(温湿度取得)
│  │  ├─ bme280.py   ← BME280センサー用ドライバ(気圧取得)
│  │  ├─ display/      ← 表示器(OLEDやLCD)制御クラス・関数(例:oled.py)
│  │  │ └─ oled.py   (I2C接続のOLEDにテキストやセンサーデータを表示)
│  │  ├─ net/       ← Wi-Fi通信関連の関数・MQTT/HTTP送信など
│  │  │ ├─ wifi_manager.py  (Wi-Fi接続・切断・再接続処理)
│  │  │ └─ mqtt_client.py   (MQTT通信ユーティリティ)
│  │  │  └─ wifi.py   ← Pico WのWi-Fi初期化・接続補助(簡易用/再利用向き)
│  │  └─ utils/       ← 時刻取得、文字列整形、NTP同期などの補助関数
│  │    ├─ time_sync.py  (NTPで時刻同期)
│  │    └─ formatting.py   (ログやJSONの整形)
│  ├─ main.py       ← Pico Wのメイン処理(ループ、センサーデータ取得&送信)
│  ├─ boot.py       ← Pico起動時に1回だけ実行される初期設定(省略可)
│  │            ※REPL制御やNTP同期、LED点灯などに使える
│  ├─ config.py      ← Wi-Fi設定・定数定義(SSID/PASS、送信間隔など)
│  └─ README_pico.md  ← Pico W側だけに関する説明書(使い方・ファイル構成など)
├─ README.md       ← 全体の概要説明

パソコンのCドライブの中にUsers\あなたの名前\Documents\のフォルダが既にあると思います。
Documents\フォルダの中に、RaspiProjectsを作ります。
RaspiProjects\フォルダの中に、PJ_IoT_00\を作ります。
PJ_IoT_00\フォルダの中には、以下のフォルダを配置してそれぞれ作成したファイル.pyを格納します。

プロジェクト構成一覧表(PJ_IoT_00 全体)

フォルダー構成(参考例)を解説します。
pc_dev/pico_app/完全に分離することで、転送・実行・保守が整理されます。

pc_dev/

パス / ファイル名役割・内容注意点・補足
pc_dev/PC側開発・テスト・ログ記録用のフォルダPicoとは別のPython環境。USB経由やWi-FiでPicoを補助
├─ .venv/仮想環境フォルダ(pip管理)Windowsでは Scripts/ 内に python.exe あり。VSCodeやThonnyから選択
├─ requirements.txtPCで使用するライブラリ一覧pip install -r requirements.txt で一括導入。例:matplotlib, paho-mqtt など
├─ sensor_test_dht.pyDHT22の動作確認(USB経由)Pico接続 or テスト信号(モック)で確認可能。Pico用ライブラリを流用
├─ sensor_test_bme280.pyBME280のセンサーテスト同上。センサー単体の不具合確認にも有効
├─ sensor_test_oled.pyOLEDディスプレイテストI2C接続確認・表示テスト用途
├─ plot_data.pyCSVからグラフを描画matplotlibを使って視覚化。記録データの可視確認用
├─ wifi_logger.pyPicoからのWi-Fiデータ受信&記録MQTTやHTTPで受けたデータをCSV/jsonなどに保存
├─ data/センサーログ・受信データの保存先デバイスごとにファイル名で分類推奨。バックアップも忘れずに
│ ├─ thm_log_20250619.csv温湿度センサーのログデータ日付・デバイス名入りで管理推奨
│ └─ wifi_data.jsonWi-Fi経由の受信データJSON形式でMQTTのpayloadなどを記録
└─ utils/PC側の補助処理・ツール類CSV整形、ファイル名生成などに使える
└─ file_utils.pyファイル操作用の関数群CSV出力やバックアップ処理の共通関数などを記述

pico_app/

パス / ファイル名役割・内容注意点・補足
pico_app/MicroPythonで動くPico W用コード格納先Thonnyでこの中身をまるごと Pico に転送する運用が便利
├─ lib/Pico上で利用するライブラリ群モジュール化して import で活用。カテゴリ別に分割済み
│ ├─ my_dht.pyDHT22用ドライバGPIO操作、データ取得、値の補正等を含む
│ ├─ bme280.pyBME280用ドライバI2C通信で気圧/湿度/温度を取得。校正処理も実装可
│ ├─ display/表示器制御ライブラリ群OLED/LCDなどを抽象化。oled.py に代表処理を記述
│ │ └─ oled.pySSD1306 OLED向け表示処理温湿度、Wi-Fi接続状況、時刻などを表示可能
│ ├─ net/ネットワーク関連ユーティリティWi-Fi再接続、MQTT送信など
│ │ ├─ wifi_manager.pyWi-Fi接続・再接続・LED通知等NTP同期と組み合わせると高精度な時刻管理が可能
│ │ └─ mqtt_client.pyMQTT送信の基本処理サーバ接続・publish・keep-aliveなど
│ └─ utils/補助処理(共通関数)タイムスタンプ、文字列整形など
│ ├─ time_sync.pyNTPを使って時刻同期PicoにはRTCがないため、再起動で時刻リセットに注意
│ └─ formatting.py表示・記録用のフォーマット処理JSON整形や数値の桁揃えなどを担当
├─ main.pyセンサー取得・Wi-Fi送信の中心処理無限ループで定期取得・送信。センサー間の非同期処理推奨
├─ boot.pyPico起動時に最初に実行される処理REPL無効化、LED点灯、NTP同期などに使用。無くても動作可
├─ config.pySSID・パスワード・取得間隔などの設定個別設定をまとめて一元管理。外部公開に注意(Git管理時)
└─ README_pico.mdPico側の使い方・構成の説明誰が見ても構成が理解できるように整理(例:社内共有)

README.md

ファイル名役割・内容補足
README.mdプロジェクト全体の概要システム構成、使用法、構築手順などをまとめるドキュメント

ThonnyではPico上のファイル構成をGUIで操作できます:

  • メニュー [表示] → [ファイル] を有効にすると、Pico内のファイルが見えるようになります
  • 不要ファイルを削除・新ファイルをドラッグで追加
  • main.py を修正する際は必ず再保存&再起動

main.py

電源ONで自動起動

main.py を Pico 本体の直下に保存(/main.py
→ USB給電のみで自動実行されるようになります

Pico Wとセンサーとプログラムだけで動かないの?
答えは、動きます!

しかし、Pico Wに接続するセンサーや表示器などのデバイスが増えていったとき、ひとつのファイルの中に複数のデバイス処理をするプログラム追加していくと、PoC開発 IoT x AI ~Python~ | 優日堂 Lab | 優日堂で説明した基本的な記述ルール(文法)を満足できなくなり、解読しにくく、バグや保守・管理に苦労することになってしまいます。

理想とされるフォルダの構成やファイルの居場所(格納場所)を体系化して整理する方法を知っているだけで、意識した開発と管理ができるようになり、開発効率も格段に上がります。
これが、チームなどで手分けして作業する場合、自分だけが知っていれば良いことではなく、チーム全体で共有しあいながら進めることでミスや混乱を予防することにも繋がります。

config.py

config(コンフィグ)は、コンフィギュレーション(configuration)の省略形。
IT用語としては、設定、構成、配置、構造、形状、形態などの意味です。

ここでは、設定、構成、配置だけを集約したファイルになります。

Pico WのGPIO端子に複数のデバイスを割り当てます。
デバイス毎のそれぞれのプログラムファイルの中のコードでGPIO端子を割り当てを指定しても動作します。

dht_pin = Pin(10)   # 温湿度センサーのデータピン (GPIO10)

co2_pin = Pin(11)   # CO2センサーのデータピン (GPIO11)

他にも、それぞれのファイル内でGPIO端子を割り当てを指定します。

さらに、wifiのSSIDとPASSWORDもプログラムコードの中に記述するとします。
それぞれのファイルで同じコードが存在していると、動作させる場所のwifiが変更になると、すべて修正が必要になります。
また、そのファイルを誤って第三者に流出した場合、wifiのSSIDとPASSWORDが他人に知られてしまいセキュリティー上の危険があります。

そこで、config.pyファイルにまとめて一括管理と利便性、セキュリティーにおいても有効な方法になります。

config.py

WIFI_SSID = "your-ssid"
WIFI_PASSWORD = "your-password"

UPDATE_INTERVAL = 60 # データ送信間隔(秒)

SENSOR_PINS = {
"TEMP": 4,
"CO2": 5,
"LIGHT": {"i2c": True, "addr": 0x23},
}

DISPLAY = {
"I2C_ADDR": 0x3C,
"TYPE": "OLED_SSD1306"
}

ひとつ二つのセンサーや表示器だけを動かすだけ、お試しで開発してみる程度でしたらconfig.pyは不要かも知れませんが、デバイスが増えた時はこの部分は修正とconfig.pyの追加をオススメします。

仮想環境 venv

フォルダー構成の参考例では、pc_dev/の中にvenvが配置されています。
pico wにはインストールしません。

仮想ってなんでしょう、環境ってなんでしょうか。

仮想環境 venv は、PC上のPython環境をプロジェクトごとに独立させる仕組みです。

Pico W に直接影響はありませんが、「PC側でコード補完」「Thonnyでの開発支援」「依存ライブラリの分離」などに重要です。

仮想とは

**仮想(Virtual)**とは、「実物があるように見せて、実際はソフトウェアなどで作られたもの」のことです。

たとえば:

  • 仮想通貨 → お札や硬貨はないけど、価値を持っている
  • 仮想ドライブ → 実際に存在しないHDDやCD-ROMのように振る舞う

つまり、本物のように使える“作られた”空間や仕組みのことを「仮想」と呼びます。

環境とは

**環境(Environment)**とは、「ある目的に適した一式が整っている状態」のことです。

たとえば:

  • キッチン → 料理するための環境(コンロ・包丁・冷蔵庫など)
  • ゲームの開発環境 → プログラミング言語、ライブラリ、ツールなどがそろっている

プログラミングでも、**コードを書いて動かすために必要なもの一式(Python、ライブラリ、ツールなど)**を「開発環境」と呼びます。

Pythonの仮想環境とは

Pythonの仮想環境とは、**Python専用の「メニュー別のキッチン」**のようなものです。

例えば:

  • 複数のプロジェクトを並行して開発している
  • プロジェクトA → ライブラリのバージョン1.0が必要
  • プロジェクトB → 同じライブラリでもバージョン2.0が必要

こういうとき、グローバル環境(PC全体)でインストールすると衝突します。

→ なので、プロジェクトごとに「仮想環境」という専用のPython空間を作って分けて管理します。

📦 各プロジェクトに専用の「冷蔵庫」「道具箱(ライブラリ)」を置くイメージです。

Python環境とは:
  • Python本体(インタープリタ)
  • 標準ライブラリ
  • サードパーティライブラリ(pip installしたもの)
  • 実行するための設定

を含めた、Pythonが動く土台一式のことです。

これには以下の2種類があります:

種類内容
グローバル環境OSに最初から入れたPython環境
仮想環境プロジェクトごとに分離された環境

なぜ仮想環境が便利なのか?

1.複数のプロジェクトで異なるライブラリを使える
2.グローバル環境を汚さずクリーンに保てる
3.requirements.txt によるチーム共有が簡単

venv/フォルダの中身(Windows の場合)

前述の「プロジェクト全体フォルダ構成 PJ_IoT_00\」のトップに記載したvenv\フォルダの中は次のようになります。

venv/
├── Include/
├── Lib/
│   └── site-packages/  ← pip installしたPC用パッケージ
├── Scripts/
│   ├── activate.bat   ← 仮想環境を有効にするバッチ
│   ├── python.exe    ← このプロジェクト専用のPython実行ファイル
└── pyvenv.cfg

具体的な構築方法は⇩から。
PoC開発 IoT x AI ~仮想環境 venvと特有.py~ | 優日堂 Lab | 優日堂