💡

Raspberry Pi Pico W で温度計付きデジタル時計を製作する②

2024/12/30に公開

はじめに

この記事では、「Raspberry Pi Pico W で温度計付きデジタル時計を製作する①」に引き続き、Raspberry Pi Pico W を使った温度計付きのデジタル時計の製作を解説します。
後編の②は、Raspberry Pi Pico W のプログラミングに関する内容です。

環境構築

Raspberry Pi Pico で使用できる言語はMicroPythonとC言語です。はじめはMicroPythonのみで開発しようと思っていたのですが、どうしてもうまくいかなかったので最終的に完成したコードはC言語になっています。ここでは、ひとまず行った作業を順番に書いていきます。動作するC言語のコードを早く見たい人はスキップしてください。

MicroPython開発環境の構築【ただし、最終的には使用しません】

はじめに、Raspberry Pi Pico WでMicroPythonを使用するために、ファームウェアを書き込みます。以下の記事を参考にインストールします。

https://www.fabshop.jp/pico_w_setup_soft/

https://www.raspberrypi.com/documentation/microcontrollers/micropython.html

Rapsberry Pi シリーズでMicroPython開発をするには、ThonnyというPython IDEを使用します。以下のリンクからお使いのPCのアーキテクチャに合ったバージョンをダウンロードし、exeファイルを実行してインストールしてください。

https://thonny.org/

インストールとセットアップは以下の記事を参考にしました。

https://logikara.blog/raspi-pico-thonny-micropy/

インストールできたら、上のタブの「実行」→「インタプリンタ設定...」→(どのインタプリンタを使用してコードを実行しますか?)のプルダウンの「MicroPython (Raspberry Pi Pico)」を選択します。
つぎに、TM1637を駆動するためのライブラリをインストールします。上のタブの「ツール」→「パッケージを管理...」を選択します。画像のように検索窓に「tm1637」と入力して検索するとライセンスがMITの「micropython-tm1637」がでてくるので、それをインストールします。インストール後はThonnyを再起動しましょう。

画像2

micropython-tm1637 を使ってみる

ライブラリ提供元が提供している使い方を参考に簡単なコードを書いてみました。

disp_test.py
import tm1637
from machine import Pin
import time

clk = Pin(14, Pin.OUT)
dio = Pin(15, Pin.OUT)
tm = tm1637.TM1637(clk = clk, dio = dio)

tm.numbers(88, 88)
time.sleep(5)
tm.numbers(12, 34) 
time.sleep(5)

時計機能【失敗?】

時計機能には、RTC(リアルタイムクロック)を使用しようと思っていました。これがうまくい機能しなかったので、最終的にはC言語での実装になります。先ほどのコードに追記し、以下を実行しました。

rtc_test.py
import tm1637
from machine import Pin
import time

clk = Pin(14, Pin.OUT)
dio = Pin(15, Pin.OUT)
tm = tm1637.TM1637(clk = clk, dio = dio)

def clock():
    current_time = time.localtime(time.time() + 9 * 3600)
    # UTC:協定世界時に +9h してJST:日本標準時に変換 
    hours = current_time[3]
    minutes = current_time[4]

    return hours, minutes

while True:
    hours, minutes = clock()
    tm.numbers(hours, minutes)
    time.sleep(1)

このコードは00:00から1秒おきにRTCによって時を刻むはずです。しかし、私の環境では不規則な時間(3時間~8時間程度)でなぜかプログラムが停止してしまいました。エラーを吐くわけでもなかったので、原因は全く分かりませんでした。gc.collect()で定期的にガベージコレクション(メモリ最適化)を行うようにしてみたが、それも効果なしです。たぶんPython特有のメモリ最適化不足が原因であろうと考えられます。(よくPythonはメモリを多く使うと言われるし...)
さらに悪いことに、一度動作停止してしまうと、Thonnyでボードを認識しなくなってしまいます。これではどうしようもないので、C言語での実装に変更しました。

ちなみに、Thonnyで認識しなくなった時の対処法は、Raspberry Pi Pico 公式サイトのこのページの一番下の「Resetting Flash memory」より「flash_nuke.uf2」をダウンロードして、ファームウェア書き込みをもう一度行います。

C言語開発環境の構築

Arduino IDEを使用してプログラミングを行います。以下の記事を参照して、Raspberry Pi Pico 用のボード情報をインストールすることで、Arduino IDEで認識してくれます。

https://cotechworks.ltt.jp/2023/07/17/post-705/

https://logikara.blog/raspi-pico-arduinoide/#mokuji_5

#include <TM1637Display.h>を使ってみる

TM1637用のライブラリはC言語用もあり、https://github.com/avishorp/TM1637 より入手できます。
Arduino IDEの「ツール」→「ライブラリを管理...」の検索窓に「tm1637」を入力して、「TM1637 by Avishay Orpaz」をインストールすることで、以下のコードを実行できます。

disp_test.c
#include <TM1637Display.h>
#include "hardware/gpio.h"
#include "pico/stdlib.h"

#define CLK 2
#define DIO 3

TM1637Display display(CLK, DIO);

void setup()
{
}

void loop()
{
    display.showNumberDec(8888);
    delay(1000);
    display.showNumberDec(1234);
    delay(1000);
}

時計機能

C言語では、TimeLibライブラリを使用して時刻管理を行います。

clock_test.c
#include "hardware/gpio.h"
#include "pico/stdlib.h"
#include <TimeLib.h>

void set_time(){
  setTime(0, 20, 0, 24, 12, 2024); // 時, 分, 秒, 日, 月, 年
}

void setup() {
    set_time();
 }

void loop() {
  int now_hour = hour();
  int now_minute = minute();

  printf("Current Time: ");
  printf(now_hour);
  printf(":");
  printf(now_minute);

  delay(1000);
}

最終的なコード

回路図と一緒にGitHubで公開しています。電源投入時にデモLEDパターンの点灯・Wi-fiに接続し現在時刻を取得します。その後、押しボタンスイッチで時計機能・温度計機能・ストップウォッチ機能を切り替えられるようにしました。

https://github.com/Meron3/raspberry_pi_pico_w_7seg_clock

まとめ

プログラミングに関しては、かなりごちゃごちゃしてしまっているので、そこはご容赦いただきたいです。Raspberry Pi Pico Wは小さいながらもこの程度の電子工作では不足なく実用できるのでとても便利だと思いました。次回はBluetooth機能を利用したデバイスを製作してみたいと思います。

Discussion