\ AmazonにてArduino UNO R4 発売中!! /

Arduino 入門 Lesson 21 【シリアルモニタによるLED制御編】

Arduino-lesson21-00 Arduino入門編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 21
【シリアルモニタによるLED制御編】

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

 

本日は「Lesson 21 シリアルモニタによるLED制御編」です。

Arduino シリアルモニタを利用してPCからLEDを制御することに挑戦です。

PCから直接UNOを制御することで、LEDのON、OFF制御をさせるといったことか可能です。

 

本Lessonでは、「Lesson 20 8bitシフトレジスタによる複数LED制御編」の回路をそのまま使用します。

Lesson 20に関しては下記を参照ください。

 

本Lesson解説で使用しているのはArduino互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

スポンサーリンク

はじめに

今回はシリアルモニタ(PCから)からArduinoを介してLEDを制御します。

PCから制御することができれば、今後色んな事に応用できそうです。

やり方は、色々あります。

まずは、Arduinoのシリアルモニタから制御することが一歩目でしょうか。

 

スケッチ(コード)はLesson20のコードを修正する形で進めていきます。

スケッチ(コード)をLesson 20にて確認することをおすすめします。

 

Lesson 21 目標

シリアルモニタ(PCから)からArduinoを介してLEDを制御」することを理解します。

また、「コードの関数化」についても併せて理解したいと考えています。

最後に、本Lessonも、「遊ぶというところが一番大事」なところです。

 

準備

ではLessonの準備に取り掛かりましょう。

今回も部品は多くないので、すぐに実践に移ることができます。

 

必要なもの

Lesson 20で使った電子部品と同じです。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!

という方は、「電子工作基本部品セット」が使い勝手が良い。

 

使用部品説明

使用部品の8bitシフトレジスタについてはLesson 20で詳しく説明しています。

詳細は下記を参照ください。

Arduino 入門 Lesson 20 【8bitシフトレジスタによる複数LED制御編】
本日は「Lesson 20 シフトレジスタによる複数LED制御編」です。複数のLEDを直接Arduinoに抵抗と合わせて接続して制御するということではありません。これをしてしまうと、Arduino UNOのピンが足りなくなり、センサーやボタ…

 

使用するICは「SN74HC595N」となります。

本Lessonでのシフトレジスタの使用目的は以下となります。

少ないピンで多くの出力制御をする。
※直列入力並列出力(SIPO:Serial In Parallel Out)と呼ばれます。

 

Arduino-lesson20-01

 

データシートは以下から入手可能です。

http://akizukidenshi.com/download/ds/ti/sn74hc595.pdf

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、LEDの点灯、消灯で動作を確認していきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

Lesson 20と同じ回路となります。

Lesoon 21から始めた方は、参考に回路を作成してみてください。

LEDと抵抗が多いので接続が大変ですが、ある意味繰り返しの接続なので単純と言えます。

LEDが焼き切れるのを防ぐために電流制限抵抗は忘れずに入れてください。

Arduino-lesson20-04

 

こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。

Arduino-lesson20-05

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

Lesson 20と同じですので、Lesson 20を実践されたかたはそのまま使用できます。

Lesson 21から始めた方は、下図に示すように、用意した部品を使用して接続しましょう。

部品は8bitシフトレジスタ、LED、抵抗です。

LEDと抵抗の数が多いですが、頑張って接続しましょう!

Arduino-lesson20-06

 

使用するポートは、デジタル入出力ピンの「9、11、12」。

電源の「5V」、「GND」です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

 

8bitシフトレジスタを使う最大の理由
デジタルピン3つのみで8個のLEDを制御できるというところです。

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

今回は、Lesson 20のスケッチ(コード)を修正、追記する形です。

 

参考にして、実践してみてください。

もちろん、サンプルコードをそのまま使っていただいてかまいません。

 

サンプルコードは一例です。

書き方は色々ありますので、ネットなど検索して見るのもよいかと思います。

 

コマンド説明

Lesson 20で解説していないシリアル系のコマンドについて説明しておきます。

 

また、今回は繰り返し処理を関数化してスケッチ(コード)を見やすくします。

同じ処理を、関数化することで、メモリを軽くすることもできますしデバックも容易となります。

コードの関数化に関しては、下記を参照してください。

詳しく解説しています。

 

コマンド 説明
Serial.begin(speed) シリアル通信のデータ転送レートをbpsを指定します。
bpsはビット/秒。
speed:転送レート
転送レートは下記が指定可能です。
300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
戻り値:なし
Serial.available() シリアルポートにデータがあるかどうかの確認をする。
戻り値:シリアルバッファにあるデータのバイト数
Serial.read() 受信データの読み込み。
戻り値:
読み込み可能なデータの最初の1バイトを返す。
-1の場合はデータなし。
Serial.print(data,format) ASCIIテキストでシリアルポートにデータを出力する。
data:出力する値
format:基数または有効桁数(BIN,DEC・・・など)
戻り値:送信したバイト数
Serial.println(data,format) データの末尾に改行を入れて送信。
Serial.print()と同じフォーマットが使えます。

上記以外のコマンドについてはLesson 20を参照ください。

 

サンプルコード

サンプルコードを下記に示します。

関数化するコード部分は以下となります。

Lesson 20 のスケッチ(コード)内のシフトレジスタ部分を関数化します。

繰り返し使いますので、関数化した方が便利です。

void funcShiftReg(byte x)
{
    digitalWrite(rclkPin, LOW);                //送信中のRCLKをLowにする
    shiftOut(dsPin, srclkPin, LSBFIRST, leds); //シフト演算を使って点灯するLEDを選択
    digitalWrite(rclkPin, HIGH);               //送信終了後RCLKをHighにする
}
補足
本Lessonのコードではbyte xを定義(記載)しなくても動作します。
ない場合、引き渡す値が何なのかが私はわかりずらいと考えますので定義しています。

 

コードの関数化に関して詳細を知りたい方は下記を参照してください。

Arduino 入門 番外編 09 スケッチ(コード、プログラム)の関数化

 

次にシリアルモニタの制御を使えるように編集していきます。

 

//Lesson 21 シリアルモニタによるLED制御編
//https://omoroya.com/

int tDelay = 200;   //200ms遅延設定
int rclkPin = 11;   // (11) ST_CP [RCLK] on 74HC595
int srclkPin = 9;   // (9)  SH_CP [SRCLK] on 74HC595
int dsPin = 12;     // (12) DS [SER] on 74HC595

byte leds = B00000000; //ledsをbyte型としてb00000000で定義

//シフトレジスタ動作の関数化
void funcShiftReg(byte x)
{
    digitalWrite(rclkPin, LOW);             //送信中のRCLKをLowにする
    shiftOut(dsPin, srclkPin, LSBFIRST, x); //シフト演算を使って点灯するLEDを選択
    digitalWrite(rclkPin, HIGH);            //送信終了後RCLKをHighにする
}

void setup() 
{
  pinMode(rclkPin, OUTPUT);   //11番ピンをOUTPUTとして定義
  pinMode(dsPin, OUTPUT);     //12番ピンをOUTPUTとして定義
  pinMode(srclkPin, OUTPUT);  //9番ピンをOUTPUTとして定義
  funcShiftReg(leds);         //led選択なし状態でsetup
  Serial.begin(9600);         //シリアル通信のデータ転送レート設定しポート開放
  Serial.println("Enter LED Number 0 to 7 or 'y' all on 'x' all off"); //表示
}

void loop() 
{
  if (Serial.available() > 0 )     //受信したデータが存在した場合以下を実行
  {
    
    char val = Serial.read();      //char文字として受信データの読み込み

    //char文字'1'以上、'8'以下で選択したLEDをON
    if (val >= '1' && val <= '8')
    {
      int led = val - '1';             //char文字1を引いてchar文字0-7に変換
      bitSet(leds, led);               //bitbyte操作関数で指定したビットを1にする
      funcShiftReg(leds);              //点灯するLEDの選択
      Serial.print("Turned on LED. "); //シリアルモニタ表示
      led = val - '0';                 //char文字0を引いてchar文字1-8に変換
      Serial.println(led , DEC);       //選択したLEDの番号10進数で表示
    }
    
    //char文字'y'ならLEDを全てON
    else if (val == 'y')
    {
      leds = B11111111;                //全てのbitを1にする
      funcShiftReg(leds);              //点灯するLEDの選択
      Serial.println("turned on all LED. ");
    }

    //char文字'x'ならLEDを全てOFF
    else if (val == 'x')
    {
      leds = B00000000;                //全てのbitを0にする
      funcShiftReg(leds);              //点灯するLEDの選択
      Serial.println("turned off all LED. ");
    }
  }
}

 

補足事項
char val = Serial.read();

valをchar文字として定義しています。

そのため、valの演算はASCIIコードを意識する必要があります。

たとえば

int led = val – ‘1’;
とありますが、val の値がキーボードの’5’だった場合
実際の演算を10進数で表すと下記となります。
53-49 =4

そのため、4bit目のbitが1となり5番のLEDが点灯するということになるのです。

 

わかりずらいでしょうか・・・。

もし、コメントいただければもう少し詳しく解説します!

 

ASCIIコード表は以下サイトなどを参考にしてください。

 

動作確認

では、さっそく動作を確認していきます。

といっても、動画ではないのでシリアルモニタとLEDの挙動を示します。

ぜひ、実践して確かめてみてください。

 

シリアルモニタは下に示す箇所で開くことができます。

または、「ツール」⇒「シリアルモニタ」でも開くことができます。

Arduino-lesson21-01

 

結果がこちら

シリアルモニタ LED挙動
1を送信
Arduino-lesson21-02
Arduino-lesson21-03
7を送信Arduino-lesson21-04 Arduino-lesson21-05
yを送信
Arduino-lesson21-06
Arduino-lesson21-07
xを送信Arduino-lesson21-08 Arduino-lesson21-09

いかがでしょうか?

ばっちり制御できました。

 

まとめ

今回は以下の内容について理解しました。

今回も項目3の遊ぶことが一番の目標でした。

1.「シリアルモニタ(PCから)からArduinoを介してLEDを制御を理解」する。
2.「コードの関数化を理解」する。
3.楽しんで遊ぶ。

※2のコードの関数化は、使えるようになるととても便利です。

 

最後に、本Lessonも、「遊ぶというところが一番大事」なところです。

 

いかがだったでしょうか。

Lesson 21 シリアルモニタによるLED制御編」はここまで。

ぜひ、みなさんも実践してみてください。

 

次回Lesson 22は「Arduino 入門 Lesson 22 【フォトレジスタ編】 其の1」です。

Arduino 入門 Lesson 22 【フォトレジスタ編】 其の1
本日はLesson 22 【フォトレジスタ編】 其の1です。フォトレジスタは別名で色々な言い方がありますが、要は「光センサー」です。【フォトレジスタ編】についてはLessonを2回に分けます。「其の1」では、基本的なコードを理解します。「其…

 

フォトレジスタは手軽に遊べて実用的な電子部品。

使いこなせるようになれば、色々なことに応用ができます。

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分) 一般 プライム会員
5,000円~19,999円 0.5% 1.0%
2,0000円~39,999円 1.0% 1.5%
40,000円~89,999円 1.5% 2.0%
90,000円~ 2.0% 2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. とし より:

    ASCIIコードの演算に関して、よくわかりません。もう少し詳しくおしえていただけないでしょうか?よろしくお願いいたします。

    • omoroya omoroya より:

      コメントありがとうございます。
      コンピュータは「0」「1」の2進数しか扱うことができません。
      スケッチも書き込むときに「コンパイル」していますよね。
      このコンパイルはコンピュータが理解できる機械語(数値)に変換しているんです。
      前置きはさておき・・・。
      上記前提があるため、文字も数値に置き換えて表現する必要があるわけです。
      それが「ASCIIコード」になります。
      ようするに、ある数値はこの文字だと認識するめに数値と文字を対応づけているということですね。
      例えば記事中で「5」を使って説明していますが「5」は数値ではと思われるかもしれまんが
      キーボードから入力される数値を全てchar文字として扱っているため
      5はASCIIコード上では10進数で表現すると「53」に割り当てられています。
      本Lessonのスケッチの動作ですが
      5を押したときは、5個目のLEDを点灯したいわけです。
      でも、bitのスタート位置は0から始まるんですね。
      そのため、4bit目が5個目のLEDということになります。
      そこで、5-1 = 4 としたいところですが
      キャラクタ文字の5は10進数で53ですから、4とするためには
      53-49=4とする必要があります。
      ASCIIコード表の49は何か?というと’1’になります。
      ‘ ‘で囲むことでキャラクタ文字として扱います。
      そのため’5’ – ‘1’ -> 53 – 49 = 4 となり
      4bit目を点灯させるといったしくみになります。
      たまたま、キャラクタ文字の5と1なので4で見た目上そのままの計算に見えるだけです。
      例えば’A’を押したときに4bit目(5個目のLED)を点灯させたい場合は
      ‘A’ – ‘=’ -> 65 – 61 = 4 とすれば良いわけです。(ASCIIコード表を、ぜひ見てみてください!)

  2. 高橋 より:

    すべて点灯させると右2つの青LEDの光が弱くなり光ってないように見えてしまいます。
    1から順に点灯させると最後の2つのLEDに十分な電流がながれていないようです。
    原因は何でしょうか?

    • omoroya omoroya より:

      こんにちは。
      1つだけ点灯させた場合は、青LEDはしっかりと点灯しているのでしょうか?

タイトルとURLをコピーしました