1-4.Arduinoで7セグLEDを制御しよう

 

今回は、前回の続き、

今回は、1-3.と同じ回路で、数字を表現します。

 

 

数字が表示できたら、

表現の幅が広がりますね。

 


前回は、7セグのハード的なつくりを理解できたと思います。

 

 

例えば、

BとCだけON残りをOFFにすれば、数字のになりますね。

 

 

マイコンのスピードはとっても高速ですので、

8この端子をON/OFF切り替えて、

1秒間待機する。

 

これを、0~9の間で繰り返せば、

タイマーみたいに見えるはずです。

 

それでは、試してみましょう。

 

回路

回路は、前回と全く一緒です。

↓の写真をみて、頑張って接続してください。

 

①デジタルピン6-13は、180Ωの抵抗に接続しています。

②抵抗の先の片方はLEDを経由してGND

③抵抗の先のもう一方は、線を経由して7セグLEDのA-GとDot端子に接続しています。

④LEDの先と、7セグLEDのGNDを、ArduinoのGNDに接続しています。

 

※Pinが隣接するところは、念のため熱収縮チューブでガードしてます。

  (本当は収縮させるべきだろうけど、はめてるだけ)

 

 

スケッチ(コード)

 ※コードは、日記の最後に書いています。

 デジタル出力は、前回と同様の方法です。

 後で、コードを書き込んでみてね

 

それでは、Arduinoに書き込んで動かしてみましょう。

 

数字の”0”用の端子にセットして1秒待機

数字の”1”用の端子にセットして1秒待機

数字の”9用の端子にセットして1秒待機

 

これを繰り返していくと・・・

 

 

 

 

 

見た目はちゃんと数字ですね!

 

いかがでしょうか?

 

このセグメント表現は、

 

タイマー、カウンター、時計、メーター、記号表現

 

色々応用が利きます。

 

部品化、またはクラス化して、応用しやすくするといいと思います。

 

ところで、今回は1桁を表現しました。

 

1桁の表現には、8端子必要でしたね。

では、4桁表現するには、どうするのでしょうか?

 

Arduinoは、デジタル出力は14端子しかありません。

どうするのでしょうか?

 

次回、説明しようと思います。

 

 

 

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

雑談

 

今回は、数字の0~9を表現してみました。

 

ほかにもアルファベットを表現する方法を、

過去の偉人たちが考えてます。

 

最近のデジタル機器は、

セグLEDではなくLCDやTFTが増えてきて見ることはなくなりましたが、

よく考えたものだと思います。

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

 

それでは、コードです。

今回は、数字を定義するのでちょっと長いですよ。

 

宇宙人しっぽ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人あたま

/*
 * Author: SAI
 */
/* *** Define 定義 *** */
//      A
//     ----
//  F | G  |B
//     ----
//  E |    |C
//     ----    . Dot
//      D


const int ASeg = 13;
const int BSeg = 12;
const int CSeg = 11;
const int DSeg = 10;
const int ESeg = 9;
const int FSeg = 8;
const int GSeg = 7;
const int DotSeg = 6;

const int LED_ON = HIGH;
const int LED_OFF = LOW;


/* initial setting 初期設定 */
 void setup() {
  /* IO output setting  IO出力設定 7Seg用端子を出力 */
  pinMode(ASeg, OUTPUT);
  pinMode(BSeg, OUTPUT);
  pinMode(CSeg, OUTPUT);
  pinMode(DSeg, OUTPUT);
  pinMode(ESeg, OUTPUT);
  pinMode(FSeg, OUTPUT);
  pinMode(GSeg, OUTPUT);
  pinMode(DotSeg, OUTPUT); 
}

//Display function 0
void zero() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_ON);
  digitalWrite(ESeg, LED_ON);
  digitalWrite(FSeg, LED_ON);
  digitalWrite(GSeg, LED_OFF);
}

//Display function 1
void one() { 
  digitalWrite(ASeg, LED_OFF);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_OFF);
  digitalWrite(ESeg, LED_OFF);
  digitalWrite(FSeg, LED_OFF);
  digitalWrite(GSeg, LED_OFF);
}

//Display function 2
void two() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_OFF);
  digitalWrite(DSeg, LED_ON);
  digitalWrite(ESeg, LED_ON);
  digitalWrite(FSeg, LED_OFF);
  digitalWrite(GSeg, LED_ON);
}

//Display function 3
void three() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_ON);
  digitalWrite(ESeg, LED_OFF);
  digitalWrite(FSeg, LED_OFF);
  digitalWrite(GSeg, LED_ON);
}

//Display function 4
void four() {
  digitalWrite(ASeg, LED_OFF);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_OFF);
  digitalWrite(ESeg, LED_OFF);
  digitalWrite(FSeg, LED_ON);
  digitalWrite(GSeg, LED_ON);
}

//Display function 5
void five() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_OFF);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_ON);
  digitalWrite(ESeg, LED_OFF);
  digitalWrite(FSeg, LED_ON);
  digitalWrite(GSeg, LED_ON);
}

//Display function 6
void six() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_OFF);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_ON);
  digitalWrite(ESeg, LED_ON);
  digitalWrite(FSeg, LED_ON);
  digitalWrite(GSeg, LED_ON);
}

//Display function 7
void seven() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_OFF);
  digitalWrite(ESeg, LED_OFF);
  digitalWrite(FSeg, LED_OFF);
  digitalWrite(GSeg, LED_OFF);
}

//Display function 8
void eight() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_ON);
  digitalWrite(ESeg, LED_ON);
  digitalWrite(FSeg, LED_ON);
  digitalWrite(GSeg, LED_ON);
}

//Display function 9
void nine() {
  digitalWrite(ASeg, LED_ON);
  digitalWrite(BSeg, LED_ON);
  digitalWrite(CSeg, LED_ON);
  digitalWrite(DSeg, LED_ON);
  digitalWrite(ESeg, LED_OFF);
  digitalWrite(FSeg, LED_ON);
  digitalWrite(GSeg, LED_ON);
}


/* Mail loop 通常処理(繰り返し) */
void loop() {
  /* 1sec counter 1秒ごと、数字をカウントアップ */
  zero();
  delay(1000);
  one();
  delay(1000);
  two();
  delay(1000);
  three(); 
  delay(1000);
  four();
  delay(1000);
  five(); 
  delay(1000);
  six(); 
  delay(1000);
  seven();
  delay(1000);
  eight();
  delay(1000);
  nine();
  delay(1000);
}

宇宙人しっぽ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人あたま

 

SAIでした。

フォローしてね…

 

 

 

 

1-3.Arduinoで7SegLEDを連続で光らせよう(準備①)

 

今回も応用編です。

Arduinoで7セグLEDの点灯を制御してみたいと思います。

 

 

その前に、7セグLEDを理解せねばなりません。

それも、複数桁のセグLEDを制御する前に、

まずは1桁セグの制御を理解しましょう。

 

 

1桁の7セグの場合

7セグは一つのCom(GND側)と8つのコントロール端子できています。

 


Com側はGND、コントロール側はデジタルピンに設定します。

 

中身はLED(ダイオード)ですので、逆に接続すると電気が流れません。

というわけで、

今回はHIGHにすることで、光らせます。

 

◆回路

回路は、基本的には前回と一緒です。

↓の写真をみて、頑張って接続してください。

 

①デジタルピン6-13は、180Ωの抵抗に接続しています。

②抵抗の先の片方はLEDを経由してGND

③抵抗の先のもう一方は、線を経由して7セグLEDのA-GとDot端子に接続しています。

④LEDの先と、7セグLEDのGNDを、ArduinoのGNDに接続しています。

 

※Pinが隣接するところは、念のため熱収縮チューブでガードしてます。

  (本当は収縮させるべきだろうけど、はめてるだけ)

 

 

◆スケッチ(コード)

※今回からコードは最後に書くことにしました。

 デジタル出力は、前回と同様の方法です。

 後で、コードを書き込んでみてね

 

 

それでは、Arduinoに書き込んで動かしてみましょう。

AからG、そしてDot端子をHIGHにしていくと、

こんな感じで光りますね。

 

※3ステップ目

※4ステップ目

※5ステップ目

 

この、LEDの光らせる組み合わせで、

数字として認識できるというわけです。

 

次回は、実際に1から0まで制御してみましょう。

1コード1日記にするため、この日記はここまでとします。

 

 

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

雑談

 

一般的に、7セグといいますが、

最近は斜線を設けたり、丸みを帯びた形にしているものもあります。

 

今回の7セグも、ドットがあるので実際のところ8セグメントなんですよね。

 

1桁のセグは制御に8Pinかかります。

複数セグはどうするのでしょうか?

PIN数が足りなくなる?

 

そんなことはありません。

ただ、ちょっと制御が大変になってきますね。

それはまた追々説明します。

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

 

それでは、巻末に移動させたコード(スケッチ)です。

宇宙人しっぽ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人あたま

/*
 * Author: SAI
 */

/* *** Define 定義 *** */
//      A
//     ----
//  F | G  |B
//     ----
//  E |    |C
//     ----    . Dot
//      D


const int ASeg = 13;
const int BSeg = 12;
const int CSeg = 11;
const int DSeg = 10;
const int ESeg = 9;
const int FSeg = 8;
const int GSeg = 7;
const int DotSeg = 6;

const int LED_ON = HIGH;
const int LED_OFF = LOW;


/* initial setting 初期設定 */
 void setup() {
  /* IO output setting  IO出力設定 7Seg用端子を出力 */
  pinMode(ASeg, OUTPUT);  
  pinMode(BSeg, OUTPUT); 
  pinMode(CSeg, OUTPUT);
  pinMode(DSeg, OUTPUT);
  pinMode(ESeg, OUTPUT);
  pinMode(FSeg, OUTPUT);
  pinMode(GSeg, OUTPUT);
  pinMode(DotSeg, OUTPUT); 
}

/* Mail loop 通常処理(繰り返し) */
void loop() {
  /* 0.5msec sequence ON 0.5秒ごと、各PINを点灯流れる点灯 */
  digitalWrite(ASeg, LED_ON);    // LED ON 
  delay(500);
  digitalWrite(BSeg, LED_ON);    // LED ON 
  delay(500);
  digitalWrite(CSeg, LED_ON);   // LED ON
  delay(500);
  digitalWrite(DSeg, LED_ON);   // LED ON
  delay(500);
  digitalWrite(ESeg, LED_ON);   // LED ON
  delay(500);
  digitalWrite(FSeg, LED_ON);   // LED ON 
  delay(500);
  digitalWrite(GSeg, LED_ON);   // LED ON 
  delay(500);
  digitalWrite(DotSeg, LED_ON);   // LED ON 
  delay(500);


  /* 0.5msec sequence OFF 0.5秒ごと流れる消灯 */
  digitalWrite(ASeg, LED_OFF);    // LED OFF 
  delay(500);
  digitalWrite(BSeg, LED_OFF);    // LED OFF 
  delay(500);
  digitalWrite(CSeg, LED_OFF);    // LED OFF 
  delay(500);
  digitalWrite(DSeg, LED_OFF);    // LED OFF 
  delay(500);
  digitalWrite(ESeg, LED_OFF);    // LED OFF 
  delay(500);
  digitalWrite(FSeg, LED_OFF);    // LED OFF 
  delay(500);
  digitalWrite(GSeg, LED_OFF);    // LED OFF 
  delay(500);
  digitalWrite(DotSeg, LED_OFF);    // LED OFF 
  delay(500);
}

宇宙人しっぽ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人あたま

 

フォローしてね…

 

 

 

1-2.ArduinoでLEDを連続で光らせよう

 

今回は応用です。

Arduinoでは、デジタルPIN (D0~D13)をON/OFF制御することによりLEDを光らせられます。

 

前回はD13のみを使用しましたが、

今回はD8-D13の、合計6PINを使って、

流れるLEDを作ります。

 

前回記載したとおり、以下の設定さえすれば、

Degitalピンは出力制御できます。

 

① 対象PINの設定を出力に設定する

  pinMode(13, OUTPUT)

② 対象PINの端子をON/OFF制御する

  出力ON時   digitalWrite(13, HIGH)

  出力OFF時 digitalWrite(13, LOW)

 

ということは、

D8~D13を順番にON/OFFすることで、流れるような光らせ方が出来ます。

 

各PINをで出力に設定して、でON/OFF制御をずらして行えば

LEDが徐々に流れて点灯し、流れて消灯しているように見えるはずです。

 

それでは、コードを書いてみましょう。

各データのPINは直書きするより、定義をしたほうがよいですね。

今回は、PIN番号を定義してコードを書きます。

 

ここからは、C言語を判っている前提で、癖付けも考慮して書かせていただきます。


 

宇宙人しっぽ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人あたま

/*
 * Author: SAI
 */
/* *** Define 定義 *** */

 int IO_led8 = 8;     // IO_8 LED
 int IO_led9 = 9;     // IO_9 LED
 int IO_led10 = 10;   // IO_10 LED
 int IO_led11 = 11;   // IO_11 LED
 int IO_led12 = 12;   // IO_12 LED
 int IO_led13 = 13;   // IO_13 LED

/* initial setting 初期設定 */
 void setup() {
  /* IO output setting  IO出力設定 8-13を出力 */
  pinMode(IO_led8, OUTPUT);     
  pinMode(IO_led9, OUTPUT);     
  pinMode(IO_led10, OUTPUT);     
  pinMode(IO_led11, OUTPUT);     
  pinMode(IO_led12, OUTPUT);     
  pinMode(IO_led13, OUTPUT);     
}

/* Mail loop 通常処理(繰り返し) */
void loop() {
  /* 0.5msec sequence ON 0.5秒ごと流れる点灯 */
  digitalWrite(IO_led8, HIGH);    // IO ON 
  delay(500);
  digitalWrite(IO_led9, HIGH);    // IO ON 
  delay(500);
  digitalWrite(IO_led10, HIGH);   // IO ON 
  delay(500);
  digitalWrite(IO_led11, HIGH);   // IO ON 
  delay(500);
  digitalWrite(IO_led12, HIGH);   // IO ON 
  delay(500);
  digitalWrite(IO_led13, HIGH);   // IO ON 
  delay(500);
  /* 0.5msec sequence OFF 0.5秒ごと流れる消灯 */
  digitalWrite(IO_led8, LOW);    // IO OFF 
  delay(500);
  digitalWrite(IO_led9, LOW);    // IO OFF 
  delay(500);
  digitalWrite(IO_led10, LOW);    // IO OFF 
  delay(500);
  digitalWrite(IO_led11, LOW);    // IO OFF 
  delay(500);
  digitalWrite(IO_led12, LOW);    // IO OFF 
  delay(500);
  digitalWrite(IO_led13, LOW);    // IO OFF 
  delay(500);
}

宇宙人しっぽ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人からだ宇宙人あたま

 

回路は写真を見てもらえればと思いますが、

 

各D8-D13端子にLEDを接続し、

その先を180Ωの抵抗でつないで5Vに接続しています。

抵抗は、150~500Ωの間なら大丈夫だと思います。


 

◆Arduino UNOの場合

 

◆Arduino Nanoの場合

 

どうでしょうか?

 

期待通り流れて光って見えますか?

 

気づいた方はいると思いますが、

LOWで点灯します。

 

原因は、接続先をGNDではなく5Vにしているから、LOWのときに光るのです。

 

なぜこんな回路にしたかという理由は、

マイコンは一般的に

吐き出し(ソース)電流より、 吸い込み(シンク)電流のほうが耐性があり

制御する際はこのような処理になることが多いので、

意識付けしてるんだと思って下さい。

 

-> というわけで、ソースコメントが逆になってますね。

 

それらを考慮して、ディレイの時間を変えたり、一区間に複数のPINを操作したら、

いろんな流れ方が出来ます。

 

遊んでみてください。

 

それではSAIでした。

 

 

 

やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木

雑談

 

今回、定義の名称をわかりやすくするために「IO_led8」なんて定義してます。

 

ただ、

LED制御する8番Pin「IO_led8」なんて定義する人は馬鹿です。

 

 

定義をするメリットは、

もしデバイスが変わったり、回路構成が変わった際に、

定義の数値を変える事で、修正差分を減らすことが最大のメリットになります。

 

これを考慮して今回のソースを見てみると

「IO_led8」の対象Pinである8番Pinを回路の都合で仕方なく2番Pinに変えるとすると、

 

 int IO_led8 = 2;     // IO_8 LED

 

定義がIO_led8なのに、接続すべきポートは2番Pin

 

見ている人は大混乱です。

 

前回は、Arduino上にあるLEDを駆動させるため、

LOWがOFFという同じコメントを使用しました。

 

今回、定数定義としてLOWとHIGHを定義していないので、

GNDとV5を逆にしたら、動作とコメントがあっていないですよね。

 

こういうのこそ、本当は定義すべきなのです。

(フラグ回収 笑)

 

機能によってはどうしても仕方ない事もあるんですが、

本当は、Pinの番号ではなく役割を定義値にするべきです。

端子番号、レベルや数値の定義で、このような記載が時々見られます。


 

私が現役時代は、

実装前ならまだしも、既に実装されてるコードを見かけたら、

「他機種へのソース流用や仕様変更する時に、この定義名はどうするんだろう」

なんて思いながら眺めていました。

 

 

実際にお仕事する人は、気をつけましょうね。

 

やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木やしの木

 

 

SAIでした。

フォローしてね…