9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Arduino用7セグメントLEDライブラリの調査

Last updated at Posted at 2015-07-07

Arduino用の7セグメントLEDライブラリを調査しました。探したところ、次の4つが見つかりました。

注意:7セグLED用BCDデコーダは使わず、全部のピンをArduinoに接続する前提です。

DeanIsMe/SevSeg

Arduino Playground - SevenSegmentLibrary」の筆者によるライブラリ。2014年に書き直されているためか、fork数などは少ない。

  • 良い点
    • 初期化メソッドがインターフェースとして綺麗
    • 整数を表示する分には不満が無い
    • コモンにトランジスタを入れる場合にも対応している
  • 悪い点
    • 表示関数の処理が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セグ液晶も統一的に扱えたらカッコいいけど厳しそう
9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?