7セグメントLEDをArduinoから操作
(無理やり「エレキ」にこじつけ感がある。)
秋月電子で購入した「7セグメントLED A-551SRD」をArduinoから操作するのであるが、少々ハマったので記録。
データシート
データシートはここにあるが、ピン配置記載が十分でない。
PIN1しか記載がない(最初はこれにも気が付かなかった)。トライ&エラーした結果、正しいピン配置は下記のとおり。
個人的には、アルファベット表記の代わりに、ピン番号を各LEDに割り付けたほうがわかりやすいと感じる。
やりたいこと
キーボード(シリアル)入力した数値を表示するのみ。
ソースコード
ArduinoのGPIOピンを、適当に各LEDに割り当てる。この7セグメントLEDはアノードコモンのため、LOWで点灯となるため、それを考慮し、0から9までのLEDテーブルを作成する。あとは入力値により、それぞれのLEDをdigitalWrite()するのみ。なお、エラー入力は未考慮。
#define A7_PIN 6
#define B6_PIN 9
#define C4_PIN 8
#define D2_PIN 2
#define E1_PIN 3
#define F9_PIN 5
#define G10_PIN 4
uint8_t ary[] = {A7_PIN, B6_PIN, C4_PIN, D2_PIN, E1_PIN, F9_PIN, G10_PIN};
int b_ary[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
void show_num(uint8_t num) {
int disp_ary[][sizeof(ary)/sizeof(uint8_t)] = {
// A B C D E F G
{LOW, LOW, LOW, LOW, LOW, LOW, HIGH}, // 0
{HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH}, // 1
{LOW, LOW, HIGH, LOW, LOW, HIGH, LOW}, // 2
{LOW, LOW, LOW, LOW, HIGH, HIGH, LOW}, // 3
{HIGH, LOW, LOW, HIGH, HIGH, LOW, LOW}, // 4
{LOW, HIGH, LOW, LOW, HIGH, LOW, LOW}, // 5
{HIGH, HIGH, LOW, LOW, LOW, LOW, LOW}, // 6
{LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH}, // 7
{LOW, LOW, LOW, LOW, LOW, LOW, LOW}, // 8
{LOW, LOW, LOW, HIGH, HIGH, LOW, LOW} // 9
};
for (int i = 0; i < sizeof(ary)/sizeof(uint8_t); i++) {
digitalWrite(ary[i], disp_ary[num][i]);
}
}
void setup() {
Serial.begin(9600);
for (int i = 0; i < sizeof(ary)/sizeof(uint8_t); i++) {
pinMode(ary[i], OUTPUT);
digitalWrite(ary[i], b_ary[i]);
}
}
void loop() {
if (Serial.available() > 0) {
String data = Serial.readStringUntil('\n');
uint8_t val = data.toInt();
// Serial.println(val);
show_num(val);
}
}
実験(&配線状況)
成功。
なお、抵抗が8個以上見えるが、同一値の抵抗が見つからず、複数の抵抗を並列接続して、できるだけ7箇所の抵抗値を近づけているため。
EOF