最終修正日:2023/2/10
4桁の7セグLEDモジュール用のコントローラとしてTM1637が用意されています。便利に使えるので重宝しています。
一方で4桁の7セグLEDモジュール側は仕様が一意ではありません。判っている限りでは、
- 時刻表時用にコロンが付いているもの
- 時刻表示と数値表示のためドットが4つ用意されているモノ
- 数値表示のためドットだけ4つ用意されているモノ
が存在します。コントローラはいずれもTM1637で有るため、ライブラリによる挙動差があるようです。
自分は時刻表示用として、このモジュールを利用することが多いためコロンが付いていて欲しいと考えていますが、amazonで購入したら4つのドットしか付いていないモジュールを掴まされてしまいました。
一秒毎にドットの点滅を行っているプログラムに、この4つのドットしか付いていないモジュールを接続したところ、4つのドットが点滅してしまうのです。使用しているライブラリは Grove 4Digital Display (TM1637.h) で、定義として、
/**** definitions for the clock point of the digit tube *******/ #define POINT_ON 1 #define POINT_OFF 0とあり、ドット毎の制御を考慮していないようです。
モジュールの選択を間違えたことがいけなかったのですが、ちょっと対策を検討しておく必要があります。
このライブラリ自体は安定した動作をしており敢えて他のライブラリに変更する必要もないのですが、この機会にちょっと調べておくことにしました。
TM1637.hを読むと
- コンストラクタでCLKpinとDATApinを指定します。
- INITでDispTypeを指定します。
#define D4036B 0
#define D4056A 1
違いは7セグLEDのいなのかと思うのですが、明確な情報がありません。4036が4桁高さ0.36"、4056が4桁高さ0.56"なのかなと思ったのですが、たコードを読む限り、D4056Aを指定するとDOTの点滅は出来ません。
※ 0.56" LED 4-Digit Tube Display (D4056A) という記述がありました。- SETで明るさが変更出来ます。3つの引数があり、set(uint8_t brightness,uint8_t SetData,uint8_t SetAddr)となっているのですが、
brightness:0−7
SetData:よく判らない。初期値は0x40
SetAddr:よく判らない。初期値は0xC0 値を変更するとローリング表示になったりするがTM1637Display.hというライブラリも存在します。どちらのライブラリが良いのかよく判りませんが、以前STM32を使っていたときはTM1637Display.hはコンパイラが通らなかった記憶があります。
TM1637.hライブラリのサンプルスケッチ“ClockDisplay.ino”をPico用に書き直して見ました。Pinは8pin9pinを使用して、Timer割込をPico用に書き直しました。Pinアサインの変更だけでは動かないExampleは注意が必要ですね。
/* * 2023年2月10日 T.Wanibe * このコードのオリジナルは、以下の通りです。PICO用にレタッチしました。 * Catalex だけの 4 桁表示のデモ * ハードウェア: 4 桁表示 * ボード: Catduino または Arduino UNO R3、ArduinoMega2560... * IDE: Arduino-1.0 * 機能: デジタル管に時刻を表示します。 * Store: http://www.aliexpress.com/store/1199788 既にリンク切れのようです */ //#include <TimerOne.h> #define TIMER_INTERRUPT_DEBUG 1 #define _TIMERINTERRUPT_LOGLEVEL_ 4 #include "TM1637.h" #include "RPi_Pico_TimerInterrupt.h" #define ON 1 #define OFF 0 #define CLK 9 //TM1637 のピン定義であり、PICO用に変更しました。GPIOのpinアサインです。 #define DIO 8 #define TIMER0_INTERVAL_MS 1000 int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; unsigned char ClockPoint = 1; unsigned char Update; unsigned char halfsecond = 0; unsigned char second; unsigned char minute = 0; unsigned char hour = 12; RPI_PICO_Timer ITimer0(0); TM1637 tm1637(CLK,DIO); //------------ bool TimerHandler0(struct repeating_timer *t){ halfsecond ++; Update = ON; if(halfsecond == 2){ second ++; if(second == 60){ minute ++; if(minute == 60){ hour ++; if(hour == 24)hour = 0; minute = 0; } second = 0; } halfsecond = 0; } // Serial.println(second); ClockPoint = (~ClockPoint) & 0x01; return true; } //------------ void TimeUpdate(void){ if(ClockPoint) tm1637.point(POINT_ON); else tm1637.point(POINT_OFF); TimeDisp[0] = hour / 10; TimeDisp[1] = hour % 10; TimeDisp[2] = minute / 10; TimeDisp[3] = minute % 10; Update = OFF; } //------------ void setup(){ //void init ( uint8_t = D4036B ); 0:D4036B 1:D4056A //D4036BでないとDOTの点滅は出来ない tm1637.init(D4036B); //void set ( uint8_t = BRIGHT_TYPICAL、uint8_t = 0x40、uint8_t = 0xc0 ); //次回表示するときに有効になります。 //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7 0-7; //set(uint8_t brightness,uint8_t SetData,uint8_t SetAddr) tm1637.set(5,0x40,0xC0); //Timer1.initialize(500000);//timing for 500ms //Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR //マイクロ秒単位の間隔 if (ITimer0.attachInterruptInterval(TIMER0_INTERVAL_MS * 500, TimerHandler0)){ if(Serial){ Serial.print(F("Starting ITimer0 OK, millis() = ")); Serial.println(millis()); } }else{ if(Serial){ Serial.println(F("Can't set ITimer0. Select another freq. or timer")); } } } //------------ void loop(){ if(Update == ON){ TimeUpdate(); tm1637.display(TimeDisp); } } |
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。
Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。