LED&KEY(TM1638)

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でもビルド出来ますのでとても重宝です。

https://github.com/rjbatista/tm1638-library

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));
}

ライブラリには無い機能拡張をします。ライブラリをレタッチすることは避けるべきです。独自にライブラリを追加することもあるのですが、必要ならスケッチに追加すれば良いように思います。

  1. ボードをアクティブにし明るさを最大値に設定します。
  2. LED&KEY単体をリセットする。

ボードをアクティブにし明るさを最大値に設定】

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
}

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 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の入出力を割り当てるとスマートに対策出来るかと思います。


戯言(nonsense)に戻る


問い合わせ頁の表示


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権は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社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。