surga Lab

営業部でも開発したい!!

Arduinoで7セグLEDとシリアルドライバを使ってみました

Arduinoは取得したデータをシリアルモニタなどで確認することができますが、
その場ですぐ知りたい時に7セグは便利かもしれないですね。

ということで秋月電子で購入しました。

f:id:hisurga:20161031215905j:plain

akizukidenshi.com

7セグLEDとシリアル通信可能なドライバが付属したキットということではんだ付けが必要です。
初めてのはんだ付け、楽しいけど難しかったです。
はんだミスをしてしまい、動作させると一部光らなかったこともありました。なんとか直りましたが。

回路

説明書はこちら(秋月電子)
説明書ではセグを2つ使っていますが、1つの場合はこんな感じになります。

f:id:hisurga:20161108215213p:plain:w400

少しピンがたくさんあって複雑そうですね。 ちなみに5V電源とGNDは繋げなくても光りました。光量はもちろん減りますが。

コード

秋月電子のサンプルコードを参考にしました。

#include<SPI.h>

int sck = 13;
int latch = 10;
int sdi = 11;
int d_time = 300;
const byte digits[] =
  {
    0b11111100, // 0
    0b01100000, // 1
    0b11011010, // 2
    0b11110010, // 3
    0b01100110, // 4
    0b10110110, // 5
    0b10111110, // 6
    0b11100000, // 7
    0b11111110, // 8
    0b11110110, // 9
  };

void setup()
{
  pinMode(latch,INPUT);
  pinMode(sck, OUTPUT);
  pinMode(sdi, OUTPUT);
  //SPI通信の準備
  SPI.begin();
  //ビットオーダを指定します(LSBFIRST or MSBFIRST)
  SPI.setBitOrder(LSBFIRST);
  //データモードの設定
  SPI.setDataMode(0);
}

void loop()
{
  //digits分ループさせます
    for (int i = 0; i < 10; i ++)
    {
      //latchのON OFFで更新します
      digitalWrite(latch, 0);
      //引数をSPIで送信します
      SPI.transfer (digits[i]);
      digitalWrite(latch, 1);
      //一定時間待つ = 表示時間
      delay(d_time);
    }
}

byte配列はA,B,C,D,E,F,G,DPの順になっています。(例:0b11111100で0に見える)
詳しくはLED部の仕様書に乗ってます。(リンクは赤月電子)

f:id:hisurga:20161109215714p:plain

11ピンと13ピンは使用していないのに繋げているように見えますが、Arduino UNOでのSPI通信では
10ピン:SS
11ピン:MOSI(SDI)
12ピン:MISO
13ピンSCK
となっているため必要です。

ビットオーダーの指定

  SPI.setBitOrder(LSBFIRST);

LSBFIRSTとMSBFIRSTがあります。
SPIで送信する配列の順番であり、ABCDEの配列があったとき、
LSBFIRSTならABCDE
MSBFIRSTならEDCBA
の順番で処理します。

データモードの指定

  SPI.setDataMode(0);

SPIのアイドリング状態と処理タイミングを決めます。

SPI_MODE アイドリング 処理タイミング
0 Low 立ち上がり
1 Low 立ち下がり
2 High 立ち下がり
3 High 立ち上がり

SPI送受信

 SPI.transfer (digits[i]);

1バイトの引数を送信します。

完成

うまくいくと数字が表示されます。
0-9を順番にひたすらループします。

f:id:hisurga:20161031215906j:plain

7セグLEDだけだと回路が複雑になりますが、シリアル通信を行うことでシンプルに実装できました。