タイムコードみたいな表示をする時計 * 仕様 [#b71a2902] - RaspberryPi OS Stretch - Python3 - SPI 7セグ 8桁 LEDモジュール(MAX7219使用)を2個カスケード~ https://amzn.to/3gw7GpT - NTP同期 - 1/30秒のケタをそれっぽく表示(正確ではなくフェイクです) * RasPi側の準備 [#b0aa73f9] ** NTP [#ua324fd6] そのままでもInternetにつながっていれば時刻同期している模様。~ ntpdをインストールしても良い。 ** SPIを有効にする [#w7bbecee] sudo raspi-configでSPIを有効にする ** MAX7219ドライバーのインストール [#v86ead9f] $ sudo apt-get install python3-dev python3-pip $ sudo pip3 install max7219 $ git clone https://github.com/rm-hull/max7219.git $ cd max7219 $ sudo pip3 install -e . $ sudo python setup.py install * RaspPiにLEDモジュールを接続 [#ma0d10c3] ** 接続順 [#f288d855] |GPIO|LED1(IN)|LED1(OUT)|LED2(IN)| |2(5V)|VCC|VCC|VCC| |20(GND)|GND|GND|GND| |19(MOSI)|DIN|DOUT|DIN| |24(CE0)|CS|CS|CS| |24(CLK)|CLK|CLK|CLK| ** RasPiのGPIO [#s657f2a5] |3.3V |1 |&color(black,yellow){2}; |5V | |I2C_SDA |3 |4 |5V | |I2C_SCL |5 |6 |GND | |GP04 |7 |8 |TxD | |GND |9 |10 |RxD | |GP17 |11 |12 |GP18 | |GP27 |13 |14 |GND | |GP22 |15 |16 |GP23 | |3.3V |17 |18 |GP24 | |SPI_MOSI |&color(black,yellow){19}; |&color(black,yellow){20}; |GND | |SPI_MISO |21 |22 |GP25 | |SPI_CLK |&color(black,yellow){23}; |&color(black,yellow){24}; |SPI_CE0 | |GND |25 |26 |SPI_CE1 | |ID_SD |27 |28 |ID_SC | |GP05 |29 |30 |GND | |GP06 |31 |32 |GP12 | |GP13 |33 |34 |GND | |GP19 |35 |36 |GP16 | |GP26 |37 |38 |GP20 | |GND |39 |40 |GP21 | * ソースコード [#d064ba1e] $ cat date_time.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- import time from datetime import datetime from luma.led_matrix.device import max7219 from luma.core.interface.serial import spi, noop from luma.core.virtual import viewport, sevensegment def opening(seg): seg.text = " v1.00TC CLOCK" def clock(seg): """ Display current time on device. """ interval = (1/60)*2-0.007 frm = 0 old_sec = "" while True: now = datetime.now() if old_sec != now.strftime("%S"): frm = 0 old_sec = now.strftime("%S") if frm <= 2: seg_text1 = now.strftime("20%y.%m.%d") seg_text2 = now.strftime("%H%M%S") elif frm >= 3: seg_text1 = now.strftime("20%y.%m.%d") seg_text2 = now.strftime("%H.%M.%S.") if frm < 10: frm2 = "0" + str(frm) else: frm2 = str(frm) seg_text2 = seg_text2 + frm2 # LED output seg.text = seg_text2 + seg_text1 frm = frm + 1 time.sleep(interval) def main(): # create seven segment device serial = spi(port=0, device=0, gpio=noop()) device = max7219(serial, cascaded=2) seg = sevensegment(device) opening(seg) time.sleep(3) clock(seg) if __name__ == '__main__': main() システムクロックを取得してLEDに表示させている。~ 1/30秒でループを回してカウンターを回し、1/30秒の桁を作っている。~ 1/30秒の桁のリセットは、システムクロックの秒の値が変わった時に行っている。~ ループの速度はRasPiの種類で少し変わる。~ デジマルポイントを点滅させている。(00.00〜00.03が消灯)~ 7セグライブラリは、カスケードすると後ろのモジュールから表示されるみたい。~ * 実行 [#k14c78fb] $ sudo python3 date_time.py * Pi4またはBusterでエラーが出る場合 [#ma5c08ce] - spidevのバージョンが3.5にアップされているとエラーになる~ $ pip3 list | grep spidev spidev 3.5 - 3.4に落とす~ $ sudo pip3 install spidev==3.4 --force-reinstall $ pip3 list | grep spidev spidev 3.4 * メモ書き [#y3368384] - RasPi3B+でテスト&調整 -- CLI/GUIでの負荷の差は無い -- 更新周期1/60は厳しい - PiZeroでは1/30桁の表示が間に合わない~ シングルコアではCLIでもPythonはきついみたい