2021年8月16日作成
2023年4月18日最終更新※2023年4月18日 LED&KEYの書き込みタイミングには注意が必要です。
今更ですがLED&KEY(TM1638)について纏めたいと思います。
LED&KEYは安価な入出力モジュールとして大変重宝しています。比較的容易に安定的に動作するため、細かな調査はしてきませんでした。しかし、何かのタイミングで輝度が下がってしまったり、表示されなくなったりしたことがあり、このモジュールだけ再起動したりする方法を探しました。そんなことに起因して、このページを書き留めることにした次第です。
TM1638を採用した表示ボードは何種類か有ります。8桁7セグLED、8桁7セグLED+8-タクトスイッチ、8桁7セグLED+8-タクトスイッチ+8-LED、8桁7セグLED+24-タクトスイッチ、、、まだまだ有ると思います。
ここでは 8桁7セグLED+8-タクトスイッチ+8-LED の通称:LED&KEYをターゲットにしています。※TM1638を採用していれば基本同じですが。幾つかのライブラリが提供されていますが、使いやすいライブラリを選ぶ必要はあります。STM32miniShieldではrjbatista氏のライブラリを採用しています。
rjbatista氏のライブラリは接続Pinを自由に設定出来る点に好感が持てます。当然ですがSTM32duinoでもビルド出来ますのでとても重宝です。pin接続ですが、STM32miniShieldではBluepillのPA15/PB3/PB4pinを優先割り付けしています。しかし,ほぼ自由な割付変更が可能です。
LED&KEY BluePill VCC
3.3V GND
GND STB
PA15 CLK
PB3 DIO
PB4
/* * Library examples for TM1638. * 2019/12/23 T.Wanibe * TM1638ライブラリは URL:https://github.com/rjbatista/tm1638-library より取得します。 */ #include <TM1638.h> #define dataPin PB4 #define clockPin PB3 #define strobePin PA15 // TM1638 module(dataPin, clockPin, strobePin); void setup() { // 16進数を表示し、左の4つのドットをONに設定します module.setDisplayToHexNumber(0x1234ABCD, 0xF0); } void loop() { byte keys = module.getButtons(); // 8個のLEDとボタンにおいて、押された位置のLEDが点灯します。 module.setLEDs((keys & 0xFF)); }ライブラリには無い機能拡張をします。ライブラリをレタッチすることは避けるべきです。独自にライブラリを追加することもあるのですが、必要ならスケッチに追加すれば良いように思います。
LED&KEYに対してコマンドを送ることで実現出来る機能が多々あります。
/* * Library examples for TM1638. * 2021/08/16 T.Wanibe * TM1638ライブラリは URL:https://github.com/rjbatista/tm1638-library より取得します。 */ #include <TM1638.h> #define dataPin PB4 #define clockPin PB3 #define strobePin PA15 // TM1638 module(dataPin, clockPin, strobePin); //TM1638にコマンド送信する void sendCommand(uint8_t value){ digitalWrite(strobePin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, value); digitalWrite(strobePin, HIGH); } //-------------------- void setup() { sendCommand(0x8f); // activate and set brightness to max }
/* * Library examples for TM1638. * 2021/08/16 T.Wanibe * TM1638ライブラリは URL:https://github.com/rjbatista/tm1638-library より取得します。 */ #include <TM1638.h> #define dataPin PB4 #define clockPin PB3 #define strobePin PA15 // TM1638 module(dataPin, clockPin, strobePin); //TM1638にコマンド送信する void sendCommand(uint8_t value){ digitalWrite(strobePin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, value); digitalWrite(strobePin, HIGH); } //リセット void reset() { sendCommand(0x40); // set auto increment mode digitalWrite(strobePin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, 0xc0); // set starting address to 0 for(uint8_t i = 0; i < 16; i++){ shiftOut(dataPin, clockPin, LSBFIRST, 0x00); } digitalWrite(strobePin, HIGH); } //-------------------- void setup() { reset(); }
2023年4月18日 LED&KEYの書き込みタイミングには注意が必要です。
Timer割込で時刻表示を実施すると共に、MainLoopでタクトボタンチェックをする様なコードを書いてしまう場合、何らかの弾みでTM1638は誤動作してしまい、LED&KEYが消灯してしまう等の不具合が発生します。これは是非避けたいです。
LED&KEYをMainLoopで更新すると、相当な更新頻度になる可能性がありますが、目の残像等も考慮すると無意味かと思います。
一方で時刻表示をする場合、1秒或いは0.5秒に1回の更新頻度となり、MainLoopのLoopTimeを短縮できます。
※0.5秒更新としたのは、ドットの点滅をする場合、0.5秒点灯0.5秒消灯とすることを検討する為です。
※0.5秒更新としたとき、タクトボタンの入力反応に支障がでます。チャタリング対策だと考え1秒程度の長押しをすることに注意してください。Arduinoに標準でQueueの仕組みは用意されていませんが、先人がライブラリとして提供されているかと思います。消費する側にLED&KEYの入出力を割り当てるとスマートに対策出来るかと思います。
免責事項
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権は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社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。