Raspberry pi pico W
ゴールデンウイークに突入し、まとまった時間ができたので、以前から構想を練り、ブレッドボードで試運転まで行っていた、多機能時計を完成させました。
実装した機能は以下の通りです
- raspberry pi pico W でインターネットに接続
- NTPサーバより時刻取得し、正確な時計機能
- センサーBME280より、気温(室温)、湿度、気圧を表示
- 取得した気温、湿度より、暑さ指数(WBGT)を近似式で計算
- 暑さ指数(WBGT)に閾値を決め、閾値以上で赤色LEDが光る
多機能かな?市販の置き時計でもありそうだけど・・・
備忘録 & Githubに初めてコードをUploadしたので来歴補助簿に記します。
開発動機
同様の時計は以前、RTC DS1307を使って作成していましたが、結構時刻のずれが結構あり、あとは完全にバグフィックスができず、時計にも関わらず止まってしまうので(笑)、新たな多機能時計作成を以前より検討していました。
やはり、時計なので正確な時刻は欲しいので、GPSを使うか、NTPを使うかで悩んでいましたが、WiFiモジュールを積んだ、PICO W が発売されたので、手軽く作れそうなNTPを使う方法を選択。
Network Time Protocol(ネットワーク・タイム・プロトコル、NTP)は、パケット交換による遅延時間が変動するネットワーク上のコンピュータシステム間で時刻同期させるための通信プロトコルである。1985年以前から運用されており、現在使用されている中で最も古いインターネットプロトコルの1つである。
wikipediaより引用
構成
出来上がりは、以下の見た目です。
右下の縦に刺さっているセンサーがBME280です。
回路図らしき図面は以下の通り。Drawioで書きました。
Raspberry pi pico W
Raspberry pi pico Wは2023年3月ごろ発売され、以前秋葉原で購入していました。WiFiでLチカできること確認したら、ずっとお蔵入りしていました。もちろん技適マーク付きを購入しています。
ネットワークにつなげることができるので、時刻をNTPサーバから取得することをもくろみ、先ずはWebを読み漁り、先人のお知恵を拝借して、MicroPythonでコードを書き、ブレッドボードで試作品を作成しました。
コードを書いたぁ?そんな高度なことはしていないでしょ!!
拝借して、つなぎ合わせただけだろ!!
BME280
今回センサーで用いた、BME280はベランダ百葉箱でも使っており、なじみのあるセンサーです。
ただ今回はつまずきました。理由は不明ですが、ベランダ百葉箱では、BME280基板のJ3をジャンプせずとも、I2Cで使えたのですが、今回はちゃんとJ3をジャンプしないとI2Cでは通信できませんでした。あと、J1(SDA) / J2(SCL)もジャンプをしてプルアップしないと、I2C通信が不安定な状態になり、まれにETIMEDOUTが発生して止まってしまいます。
J1 – J3のはんだジャンプですが、めちゃくちゃ小さい箇所にはんだをするので、老眼の目では全く見えませんでした(笑)
BME280の製品詳細は以下のリンク参照。
LCD2004A
液晶キャラクターディスプレイでラズパイ工作では、16文字X2行の 1602Aが定番です。今回は時刻や気温、暑さ指数(WBGT)を表示させたく、20文字X4行の2004Aを用いました。I2Cで使いたかったので、I2CシリアルIFモジュール (PCF8574T)でI2C通信しています。
ただ、本来は5V駆動のLCDをPICO Wの3V3(OUT)を使って駆動させていますので、電圧不足の状態で使っていますが、何とか普通に動いています。本来はダメな使い方とは思いますが、動いているので目をつぶっています(笑)
正しい使い方は、秋月電子等で購入できる、3.3V/5VのレベルコンバータモジュールPCA9306使う必要があるようです。図面に起こすと、以下の通りかな?
LCD1602A / LCD2004Aの詳しい解説は以下のページ参考にさせてもらいました。
赤&緑 LED
赤 / 緑のLEDはWBGT(暑さ指数)が28を超えたら、熱中症注意の意味を込めて、赤が光るようにしています。WBGTが28未満であれば、緑が光ります。
220Ωの抵抗は、LEDの明るさを落とすために入れています。
コード
コードはいつも通り、MicroPythonを使っています。
初めて、Githubにコードを上げてみましたので、興味のある方は以下ご覧ください。
動作解説
コードの解説ですが、自分で書こうと思いましたが、chatgptにコードを読ませて、”解説して”とお願いをしたら、以下の説明が生成されました。(若干加筆しています)
もしかして、要件定義を正しく、簡潔に書ければ、chatgptのほうが美しいコード書いてくれそうですね。
このコードは、マイコンを用いて、温度、湿度、気圧、WBGT(暑さ指数)を計測し、LCD画面に表示するためのものです。以下に各部分の概要を説明します。
1. 必要なモジュールをインポートします。
2. LEDの設定を行います。
3. BME280センサーの設定を行います。
4. LCDディスプレイの設定を行います。
5. ネットワーク接続のクラスを作成します。SSIDとパスワードを指定し、ネットワークに接続します。
6. HTTPリクエストを送信するメソッドを作成します。
7. NTPサーバーから時刻を取得するメソッドを作成します。
8. ネットワークに接続します。
9. オープニングメッセージをLCDに表示します。
10. NTPサーバーから時刻を取得し、RTCに設定します。
11. カウンターをリセットします。
12. 温度、湿度、気圧を読み取り、WBGTを計算し、LCDに表示します。
13. 時刻と日付を表示します。
14. JSTの秒数が30の倍数になったら、温度、湿度、気圧、WBGTを更新します。
15. WBGTに基づいて、赤色または緑色のLEDを制御します。
16. LEDを点滅させます。
17. カウンターが100になったら0にします。
18. カウンターをインクリメントします。(カウンターを一つ増やす)
このコードは、温度、湿度、気圧、WBGTを計測し、LCDに表示するためのものです。ネットワークに接続して、NTPサーバーから時刻を取得し、RTCに設定します。温度、湿度、気圧を定期的に読み取り、WBGTを計算して、LCDに表示します。また、WBGTの値に応じて、LEDを制御します。
ちょっとchatgptの解説にちょっと補足。
9. オープニングメッセージをLCDに表示します。
オープニングメッセージにはPICO W の IPアドレスを表示するようにしています。
10. NTPサーバーから時刻を取得し、RTCに設定します
時刻は、UTCとJSTの両方を取得しています。表示もJST / UTCの両方をLCDに表示させています。
また、曜日も計算しており、LCDの日付には曜日表示も行っています(JST)。
16. WBGTに基づいて、赤色または緑色のLEDを制御します。
閾値は28にしています。28以上で赤色LEDが点灯します。28未満の場合、緑色LEDが点灯します。
17. LEDを点滅させます。
PICO W 本体のLEDで点滅させることにより、動作表示灯の代わりにしています。
カウンターを使っているのは、Thonny の Shellで動き続けていること見た目で確認するためです。
実は、Bug Fixは今回はchatgptに頼りました。サクサク直してくれるので、驚きでした。
NTPサーバ
NTPサーバは国立研究開発法人情報通信研究機構 の ” ntp.nict.jp ” を使わせてもらっています。定時にアクセスして自動的に時刻補正もできますが、公共のNTPであることも鑑み、時計の電源を入れた際に一回だけ、NTPサーバより時刻情報を取得する方法としました。
すなわち時刻補正は、時計の電源を一回切る必要があります(笑)
まとめ / 雑感
久々に電子工作してみました。何を感じたかというと、やはり老眼の進行です。はんだ付けする際は老眼鏡必須であること、再認識しました。
あとchatgptの偉大さを今回改めて感じました。webから集めた先人の知恵を拝借しコード書きましたが、TYPO、Bug Fixや追加機能の実装等は、定義を明確に書けば、すらすらとコードを生成&修正してくれる点に脱帽でした。
コードを見てもらうと、似たようなコードの部分の表記が違う点が多々あります。美しいコードの部分がchatgptが直してくれて部分になります。
生成AIとは、仕事でも、趣味でも上手に付き合うことは、今後必須になりそうですね。
コメント