Arduino用の7セグメントLEDライブラリを調査しました。探したところ、次の4つが見つかりました。
注意:7セグLED用BCDデコーダは使わず、全部のピンをArduinoに接続する前提です。
DeanIsMe/SevSeg
「Arduino Playground - SevenSegmentLibrary」の筆者によるライブラリ。2014年に書き直されているためか、fork数などは少ない。
- 良い点
- 初期化メソッドがインターフェースとして綺麗
- 整数を表示する分には不満が無い
- コモンにトランジスタを入れる場合にも対応している
- 悪い点
- 表示関数の処理が1桁ごとに2ms(デフォルト)点灯して消す、という処理になっている
- タイマー割り込みから使うことがほとんど考慮されていない
- 任意のパターンを表示できる機能は無い
- 表示関数の処理が1桁ごとに2ms(デフォルト)点灯して消す、という処理になっている
以下、0から99までカウントアップする例。タイマー割り込みにはFlexiTimer2を利用。
# include <SevSeg.h>
# include <FlexiTimer2.h>
SevSeg sevseg; //Instantiate a seven segment object
void refresh() {
sevseg.refreshDisplay();
}
void setup() {
byte numDigits = 2;
byte digitPins[] = {14, 3}; // 左が上位桁
byte segmentPins[] = {4, 10, 16, 21, 18, 2, 8, 7}; // A..G, DPの順
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
FlexiTimer2::set(6, refresh); // 6ms period
FlexiTimer2::start();
}
void loop() {
volatile int i;
for (i = 0; i < 100; i++) {
sevseg.setNumber(i, 0);
delay(100);
}
}
sparkfun/SevSeg
上のDeanIsMe/SevSegの旧バージョンからのfork。任意のLEDを光らせることができるが、数値型を受け取るメソッドは無い。コンストラクタ引数が多すぎるなど、ソースコードも若干いけてない気がする。SparkFunがメンテナンスしているという安心感はある。
- 良い点
- アポストロフィやコロンがあるLEDにも対応
- 表示パターンは文字列(
char*
)の形で指定する- 既知のパターンのみ表示できる(
"z"
などは表示できない)
- 既知のパターンのみ表示できる(
- 悪い点
- 初期化メソッドがインターフェースとしてわかりにくい
- 18引数
- 4桁までしか対応していない
- ベタ書きで4桁分の処理が書いてあり、5桁以上に対応させるのが大変そう
- 表示関数の処理が1桁ごとに2ms(デフォルト)点灯して消す、という処理になっている
- タイマー割り込みから使うことがほとんど考慮されていない
- 数値で表示パターンを指定するメソッドは無い
- 初期化メソッドがインターフェースとしてわかりにくい
Arduino 7 segment LEDDisplay library download
- 良い点
- 整数・浮動小数点数を表示するメソッドがある
- アルファベットなど、既知のパターン表示を指定するメソッド
setValueRaw()
がある - 明るさの調節を0,1,2,3の4段階で行えるメソッドを提供している
- 悪い点
- ピンをシーケンシャルに使う前提で実装されている
- 例:4桁7セグならn番ピンから(n+11)番ピンまでの12個を使う
- ピン数の少ないボードでの利用や、結線の都合などを考えると制限として厳しすぎる
- タイマー1を使った割り込みでLEDの表示を実装している
- 割り込みを使わず
loop()
で表示する場合に対応していない - ライブラリのロードに副作用があるのは実装として汚い
- 割り込みを使わず
-
setup()
内で'new'して他の場所ではシングルトンで呼び出す- 7セグLEDを2個以上使いたいときに使えない
- ピンをシーケンシャルに使う前提で実装されている
Arduino Library for 7 Segment LCD/LED Displays
supercrab/arduino-seven-segment
あまり確認できてないですが、ソースコードが長々しくてイマイチ印象良くないですね…。
まとめ
そんなわけで、見つけた中ではDeanIsMe/SevSegくらいしか実用レベルのものが無さそうです。僕個人は次のような要求を持っており、改造より自作の方が近そうだと感じています。
- 割り込みからの利用も
loop()
からの利用も考慮したインターフェースが欲しい - PWM対応ピンの場合は
analogWrite()
でLEDの明るさを制御したい- カソードコモンの場合はPWM対応ピンを8本消費する鬼仕様
- AVRマイコンであれば
digitalWrite()
を使わずレジスタを直接操作したい- これによりチラツキを抑えられるのではないか?
- 既知のパターンだけでなく、任意のパターンを指定できるメソッドが欲しい
- 2.5桁など変則的なLEDへの対応を考えると必須だろう
- 遠い未来の野望
- シフトレジスタ74HC595への対応も考えたい
- 高機能な7セグドライバはそれぞれ別ライブラリがあるはずなので構想外
- 7セグ液晶も統一的に扱えたらカッコいいけど厳しそう