monodukuri-life’s blog

モノづくりで日常を楽しく

Arduinoでリレーを使ってみよう!

こんにちは!今回は Arduinoを使って「リレー」 を制御する方法をご紹介します。
リレーは、小さな電気信号で大きな電流を安全に制御できるとても便利な電子部品です。
LEDやモーターの次のステップとして、「家電をArduinoで動かす」工作をするときに欠かせません。

リレーとは?

リレーは、電気の力でON/OFFを切り替えるスイッチです。
内部に「電磁石」が入っており、電流を流すと磁力でスイッチが切り替わる仕組みになっています。

Arduinoなどのマイコンは、出力できる電流がとても小さい(数十mA程度)ため、
そのままではモーターや家電のような大きな電力を必要とする機器を直接動かすことはできません

そんなときに活躍するのがリレーです!
リレーを使えば、Arduinoの小さな信号で外部の大きな電力を安全にON/OFFできます。

 リレーの仕組み(原理)

リレーの内部は次のような構造をしています。

  1. コイル(電磁石):電流を流すと磁力が発生します。

  2. 可動接点:磁力で動く金属のアーム。

  3. 接点(スイッチ部分):電磁力でON/OFFを切り替えます。

Arduinoから信号を送ると、コイルに電流が流れて磁力が発生し、スイッチが切り替わります。信号を止めると磁力がなくなり、スイッチは元の位置に戻ります。

このように、電気のON/OFFで別の回路のスイッチを切り替えるのがリレーの基本動作です。

 

通常はバネによりb接点(ブレーク接点)に繋がっています。端子eとfに電流を流すことでコイルを巻いた鉄心に磁力が発生することでレバーが動作し、a接点側に繋がります。これによりa接点に接続された電子部品が動作します。

リレーを使うメリット

リレーを使うことで、Arduinoの制御の幅が大きく広がります。

1. 小さな電流で大電流・高電圧を制御できる

Arduinoは5V・数十mAしか扱えませんが、リレーを使えば
AC100Vの家電やDC12Vのモーターなど、高電力機器も安全に制御できます。

 

2. 一つの信号入力で複数の出力を出す

モーター・ヒーター・照明・ポンプなど、AC/DCを問わずさまざまな機器をON/OFFできます。

 

3 自動制御ができる

センサーと組み合わせることで、「暗くなったらライトをON」や「温度が上がったらファンをON」など、自動スイッチ制御が可能になります。

Arduinoで使ってみよう!

用意するもの

ここでは直流モータ1個をArduinoで制御する例を紹介します。

    • Arduino Uno

    • L293DモータドライバーIC

    • ブレッドボード

    • 電源モジュール

    • 9Vバッテリー+アダプター

    • DCモータ

    • ジャンパーワイヤ

    • リレー(SRD-05VDC-SL-C)

回路図

  • Arduinoのデジタルピン(7) → L293DのEnable(1,2EN)

  • Arduinoのデジタルピン(3,5) →L293Dの入力(1A,2A)
  • L293Dの出力ピン(1Y) →リレー e接点

  • L293Dの出力ピン(2Y) →リレー f接点
  • リレー a接点→モータ
  • L293DのVcc1(5V) → 電源モジュールの出力

  • L293DのVcc2(モータ電源) → 電源モジュールの出力

  • GNDは必ずArduino・L293D・電源モジュールで共通化

  • 電源モジュールにはDCプラグから9V電池を接続

※下記リンク記事の直流モータ動作接続からリレーを追加しています。

サンプルコード

// 変数の設定
const int ENABLE = 7;
const int CH1 = 5;
const int CH2 = 3;
void setup() {
  //Pinの方向を定義
  pinMode(ENABLE,OUTPUT); // 7番ピンをOUTPUT指定
  pinMode(CH1,OUTPUT);    // 5番ピンをOUTPUT指定
  pinMode(CH2,OUTPUT);    // 3版ピンをOUTPUT指定
  Serial.begin(9600);
  //シリアルモニタに説明を表示
  Serial.println("1:SW ON");
  Serial.println("2:SW OFF");
  Serial.println("0:Forced STOP");
  // 初期化 DCモータが突然動きださないように
  digitalWrite(ENABLE,LOW); // disable
  delay(500);
}
void loop() {
  if (Serial.available() > 0 )     // 受信したデータが存在した場合以下を実行
  {
    char val = Serial.read();      // char文字として受信データの読み込み
    
    // 1の場合 SW ON CH1:High CH2:Low
    if (val == '1')
    {
      Serial.println("1:SW ON");
      digitalWrite(ENABLE,HIGH); // enable on
      digitalWrite(CH1,HIGH);    
      digitalWrite(CH2,LOW);
    }
    // 2の場合 SW OFF CH1:Low CH2:Low
    else if (val == '2')
    {
      Serial.println("2:SW OFF");
      digitalWrite(ENABLE,HIGH); // enable on
      digitalWrite(CH1,LOW);
      digitalWrite(CH2,LOW);
    }
    // 0の場合 強制停止
    else if (val == '0')
    {
      Serial.println("0:Forced STOP");
      digitalWrite(ENABLE,LOW); // disable
    }
  }
}

コード解説

Serial.println:パソコンの「シリアルモニタ」に文字や数値を表示する。
Serial.available:Arduinoに送られてきたデータがあるかどうかを確認する。
         戻り値は「受信している文字の数」です。
Serial.read:シリアル通信で受け取ったデータを読み取ります。
digitalWrite:デジタルピンの出力を「HIGH(5V)」または「LOW(0V)」に設定する。

動作確認

シリアルモニタを開いてテンキーの数字を押すと、下記のプログラムしたモータ動作をします。

1:SW ON
2:SW OFF
0:強制停止

 

しかし。。。。。シリアルモニタで『1』を入れてもモータは動きませんでした。

原因調査

今回の制御ではシリアルモニタで『1』を入力するとドライバからリレーのe接点からf接点に流れることでコイルを動作させることです。このコイルを動作させるのに5Vで71.4mA程度必要になります。テスターでe接点を測定したところ3Vほどしかないことが判明。これではコイルが動作せず、モータが動きません。もう少し調べたところ、電源モジュールからは5Vが供給されていました。ドライバにて 出力電圧降下(ドロップ電圧)している可能性があるようです。

対策

電源供給を電池にて9V供給することで、リレーに十分な電流供給することに変更

 

電源供給を変えてシリアルモニタを開いてテンキーの数字を押すと、プログラム通り動作しました。

 まとめ

リレーは、Arduinoの小さな信号で大きな電力を安全に制御できる便利なスイッチです。電気的に絶縁されているため、Arduinoを保護しながら家電やモーターを制御できます。

 

Arduinoで直流モータを動かそう!〜モータドライバー(L293D)と電源モジュールの使い方〜

こんにちは!今回は Arduinoを使って直流モータ(DCモータ)を動かす方法 をご紹介します。Arduinoの出力だけではモータを直接動かすことが難しいため、今回は モータドライバーIC(L293D)電源モジュール を使って制御していきます。

直流モータ(DCモータ)の原理と特性

直流モータは、電気を流すと回転運動を生み出す装置 です。

  • 仕組み:モータ内部にはコイルと磁石があり、コイルに電流が流れることで電磁力が発生し、回転軸が回ります。

  • 特性

    • 電圧を上げると回転数が速くなる

    • 電流が大きいほどトルク(回す力)が強くなる

    • 回転方向は電流の向きを反転させると逆回転

Arduinoの出力ピンは20mAほどで電流がとても小さいため、モータを直接動かすと 電流不足で動かない か、Arduinoを壊してしまう 危険があります。そこで登場するのが モータドライバーです。直流モータをArduinoを直接繋がず、間にモータドライバーを入れます。

今回はモータにファンを取り付けてミニ扇風機にします。

モータドライバー(L293D)の役割

L293D は有名なモータドライバーICで、Arduinoとモータの間に接続して、大きな電流をモータに供給する役割 を持ちます。

  • 主な特徴

    • 1つのICでモータを2個まで制御できる

    • 入力信号に応じてモータを「正転・逆転・停止」できる

    • 最大600mA程度の電流を出力可能

    • 外部電源(電池や電源モジュール)からモータ用電力を供給

つまり、Arduinoは「回れ!」「止まれ!」という信号を出すだけで、実際にモータに力を供給するのはL293Dが担当します。

ドライバICのL293D外観

ピン仕様

電源モジュールの役割

モータはArduinoの5Vピンから電力を取ると、電流不足 で動作が不安定になります。そのため、外部電源モジュール を利用するのがおすすめです。

  • 特徴

    • 単3電池や9V電池、USB電源などを使える

    • 5Vや3.3Vに安定化して供給できる

    • モータ専用の電源をArduinoと分けることで、誤作動を防げる

外部電源をモータ用に使うことで、Arduino本体が安定して動作します。

電源モジュール

※5V出力で使用する為、黄色枠線にジャンパーをつけます。

Arduinoで使ってみよう!

用意するもの

ここでは直流モータ1個をArduinoで制御する例を紹介します。

  • 必要な部品

    • Arduino Uno

    • L293DモータドライバーIC

    • ブレッドボード

    • 電源モジュール

    • 9Vバッテリー+アダプター

    • DCモータ

    • ジャンパーワイヤ

回路図

  • Arduinoのデジタルピン(7) → L293DのEnable(1,2EN)

  • Arduinoのデジタルピン(3,5) →L293Dの入力(1A,2A)
  • L293Dの出力ピン(1Y,2Y) → モータの両端

  • L293DのVcc1(5V) → 電源モジュールの出力

  • L293DのVcc2(モータ電源) → 電源モジュールの出力

  • GNDは必ずArduino・L293D・電源モジュールで共通化

  • 電源モジュールにはDCプラグから9V電池を接続

回路図

【説明】

また、本Lessonではドライバーのch1とch2を使用します。

モータを正回転、逆回転させるためです。

回転を正回転のみ、逆回転のみとする場合は使用するchは1つでかまいません。

その場合、モーター負極をGNDに接続するなどしてください。

サンプルコード

const int ENABLE = 7;
const int CH1 = 5;
const int CH2 = 3;
void setup() {
  //Pinの方向を定義
  pinMode(ENABLE,OUTPUT); // 7番ピンをOUTPUT指定
  pinMode(CH1,OUTPUT);    // 5番ピンをOUTPUT指定
  pinMode(CH2,OUTPUT);    // 3版ピンをOUTPUT指定
  Serial.begin(9600);
  //シリアルモニタに説明を表示
  Serial.println("1:Normal rotaion");
  Serial.println("2:Reverse rotation");
  Serial.println("3:PWM Low speed");
  Serial.println("4:PWM Middle speed");
  Serial.println("5:PWM High speed");
  Serial.println("0:STOP");
  // 初期化 DCモータが突然動きださないように
  digitalWrite(ENABLE,LOW); // disable
  delay(500);
}
void loop() {
  if (Serial.available() > 0 )     // 受信したデータが存在した場合以下を実行
  {
    char val = Serial.read();      // char文字として受信データの読み込み
    // 1の場合 正回転 CH1:High CH2:LOW
    if (val == '1')
    {
      Serial.println("1:Normal rotaion");
      digitalWrite(ENABLE,HIGH); // enable on
      digitalWrite(CH1,HIGH);    
      digitalWrite(CH2,LOW);
      //delay(500);                // 回転している時間を指定
      //digitalWrite(ENABLE,LOW);  // disable
    }
    // 2の場合 逆回転
    else if (val == '2')
    {
      Serial.println("2:Reverse rotation");
      digitalWrite(ENABLE,HIGH); // enable on
      digitalWrite(CH1,LOW);
      digitalWrite(CH2,HIGH);
      //delay(500);                // 回転している時間を指定
      //digitalWrite(ENABLE,LOW);  // disable
    }
    // CH1をPWM制御するこで回転スピードを調整
    // 4の場合 低速回転
    else if (val == '3')
    {
      Serial.println("4:PWM Low speed");
      digitalWrite(ENABLE,HIGH); // enable on
      analogWrite(CH1,255);      // 低速で回転させるためのきっかけ
      delay(100);                // 低速で回転させるための調整時間
      analogWrite(CH1,127);      // CH1をパルス変調 約50%
      digitalWrite(CH2,LOW);     // CH2はLow固定
    }
    // 5の場合 中速回転
    else if (val == '4')
    {
      Serial.println("5:PWM Middle speed");
      digitalWrite(ENABLE,HIGH);  // enable on
      analogWrite(CH1,255);       // 低速で回転させるためのきっかけ
      delay(100);                 // 低速で回転させるための調整時間
      analogWrite(CH1,181);       // CH1をパルス変調 約75%
      digitalWrite(CH2,LOW);      // CH2をLow固定
    }
    // 6の場合 高速回転
    else if (val == '5')
    {
      Serial.println("6:PWM High speed");
      digitalWrite(ENABLE,HIGH);  // enable on
      analogWrite(CH1,255);       // パルス変調 100%(High固定と同じ)
      digitalWrite(CH2,LOW);      // CH2はLow固定
    }
    // 0の場合 停止
    else if (val == '0')
    {
      Serial.println("0:STOP");
      digitalWrite(ENABLE,LOW); // disable
    }
  }
}
コード解説

Serial.println:パソコンの「シリアルモニタ」に文字や数値を表示する。
Serial.available:Arduinoに送られてきたデータがあるかどうかを確認する。
         戻り値は「受信している文字の数」です。
Serial.read:シリアル通信で受け取ったデータを読み取ります。
digitalWrite:デジタルピンの出力を「HIGH(5V)」または「LOW(0V)」に設定する。
analogWrite:PWM(パルス幅変調)で出力ピンに「疑似アナログ信号」を出力。

動作確認

シリアルモニタを開いてテンキーの数字を押すと、下記のプログラムしたモータ動作をします。

1:正回転
2:逆回転
3:低速回転
4:中速回転
5:高速回転
0:停止

まとめ

  • 直流モータは電圧・電流で回転数やトルクが変化する

  • Arduinoの出力だけではモータは動かせない

  • L293Dモータドライバー を使うと、安全に正転・逆転が可能

  • 電源モジュール を使うと安定した動作ができる

この仕組みを応用すれば、ロボットカー自動扇風機 など、さまざまな工作に発展させられます!

Arduinoで4桁7セグメントLEDを使ってみよう!

こんにちは!今回はArduinoを使って 4桁7セグメントLED を紹介します。時計や温度計、カウンターなど、数値を表示する場面でよく使われるパーツです。この記事では、4桁7セグメントLEDの仕組みや使い方、特に複数桁を効率よく制御する「ダイナミック点灯方式」について分かりやすく解説していきます。

7セグメントLEDとは?

7セグメントLEDは、数字を表示するための表示デバイスです。
「a〜g」と呼ばれる7つの発光ダイオード(LEDセグメント)で構成されており、それらを組み合わせることで「0〜9」までの数字を表示できます。特に、今回紹介するのは

『4桁タイプ』になります。

0~9の表示方法

ピンの割付がわかっていれば0~9の表現方法はわかると思います。

【表の数字】

『1』:電流を流してLED店頭

『0』:電流を流さずLED消灯

4桁7セグメントLEDの構造

4桁の7セグメントLEDは「7本のセグメント × 4桁」=28本の制御が必要…と思いきや、実際は共通端子方式を使って配線を簡略化しています。

  • 共通アノード型:各桁ごとにアノード(+側)を共有

  • 共通カソード型:各桁ごとにカソード(−側)を共有

この仕組みによって、セグメント線は7本+ドット1本、さらに桁選択用の4本を加えて、合計12本程度のピンで制御できます。

ダイナミック点灯方式とは?

さて、4桁の数字を同時に光らせるにはどうするのでしょうか?
ここで使われるのが ダイナミック点灯方式(桁ごとの高速切り替え) です。

仕組み
  1. まず「1桁目」の共通端子をONにして、表示したい数字のセグメントを点灯

  2. 次に「2桁目」に切り替えて、その数字を点灯

  3. 続けて3桁目、4桁目へと切り替え

これを 高速(数百Hz程度)で繰り返す ことで、人間の目には残像効果で「4桁同時に点いているように見える」仕組みです。

メリット
  • 必要なArduinoのピン数が少なくて済む

  • 消費電流を抑えられる

  • シンプルな配線で多桁表示が可能

Arduinoで使ってみよう!

用意するもの

  • Arduino Uno(または互換ボード)

  • 7セグメントLED(共通カソード型がおすすめ)

  • 抵抗220Ω (8個)
  • シフトレジスタ 74HC595(SN74HC595Nなど)
  • ジャンパー線

  • ブレッドボード

  • USBケーブル(ArduinoとPC接続用)

回路図

  1. 7セグメントLEDの共通端子をGNDへ接続

  2. 各セグメント(a〜g)をArduinoのデジタルピンへ接続

  3. それぞれに抵抗を入れて電流を制御

「SN74HC595N」の出力QA~QH7セグメントLEDに対して以下の割り当てをしています。

シフトレジスタ(74HC595)の詳細は下記記事でも紹介しています。

monodukuri-life.hatenablog.com

1桁7セグメントLEDの詳細は下記記事でも紹介しています。ご参照ください。

monodukuri-life.hatenablog.com

サンプルコード

int tDelay = 1;   // 1ms遅延設定←ここの時間を短くしていく。
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
int dig1 = 1;       // DIG1を1番ピンに割り当て
int dig2 = 2;       // DIG2を2番ピンに割り当て
int dig3 = 3;       // DIG3を3番ピンに割り当て
int dig4 = 4;       // DIG4を4番ピンに割り当て
// seven_ledsをbyte型として定義
// 配列にDisplay表示用のデータ0~9と全消灯を設定
// 1 = LED on, 0 = LED off
byte seven_leds[12] =       { B11111100,  // 0
                              B01100000,  // 1
                              B11011010,  // 2
                              B11110010,  // 3
                              B01100110,  // 4
                              B10110110,  // 5
                              B10111110,  // 6
                              B11100000,  // 7
                              B11111110,  // 8
                              B11100110,  // 9
                              B00000001,  // D.P 
                              B00000000,  // OFF
                             };
//シフトレジスタ部分を関数化
void funcShiftReg(int x)
{
  digitalWrite(rclkPin, LOW);           //送信中のRCLKをLowにする
  shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[x]); //点灯するLEDを選択
  digitalWrite(rclkPin, HIGH);             //送信終了後RCLKをHighにする
}
void setup()
{
 pinMode(rclkPin, OUTPUT);   //11番ピンをOUTPUTとして定義
 pinMode(dsPin, OUTPUT);     //12番ピンをOUTPUTとして定義
 pinMode(srclkPin, OUTPUT);  //9番ピンをOUTPUTとして定義
 pinMode(dig1, OUTPUT);      //1番ピンをOUTPUTとして定義
 pinMode(dig2, OUTPUT);      //2番ピンをOUTPUTとして定義
 pinMode(dig3, OUTPUT);      //3番ピンをOUTPUTとして定義
 pinMode(dig4, OUTPUT);      //4番ピンをOUTPUTとして定義
 digitalWrite(dig1, HIGH);    //1番ピンをHIGH DI1 OFF
 digitalWrite(dig2, HIGH);    //2番ピンをHIGH DI2 OFF
 digitalWrite(dig3, HIGH);    //3番ピンをHIGH DI3 OFF
 digitalWrite(dig4, HIGH);    //4番ピンをHIGH DI4 OFF
 funcShiftReg(11);           //信号初期化
}
void loop()
{
//DIG1の表示
  delay(tDelay);
  digitalWrite(dig1, LOW); 
  digitalWrite(dig2, HIGH);
  digitalWrite(dig3, HIGH);
  digitalWrite(dig4, HIGH);
  //DIG1に1を表示
  funcShiftReg(1);
  delay(tDelay);
  funcShiftReg(11);

  //DIG2の表示
  delay(tDelay);
  digitalWrite(dig1, HIGH); 
  digitalWrite(dig2, LOW);
  digitalWrite(dig3, HIGH);
  digitalWrite(dig4, HIGH);
  //DIG2に2を表示
  funcShiftReg(2);
  delay(tDelay);
  funcShiftReg(11);

  //DIG3の表示
  delay(tDelay);
  digitalWrite(dig1, HIGH); 
  digitalWrite(dig2, HIGH);
  digitalWrite(dig3, LOW);
  digitalWrite(dig4, HIGH);
  //DIG3に3を表示
  funcShiftReg(3);
  delay(tDelay);
  funcShiftReg(11);

  //DIG4の表示
  delay(tDelay);
  digitalWrite(dig1, HIGH); 
  digitalWrite(dig2, HIGH);
  digitalWrite(dig3, HIGH);
  digitalWrite(dig4, LOW);
  //DIG4に4を表示
  funcShiftReg(4);
  delay(tDelay);
  funcShiftReg(11);
 }
  
動作確認

コード内のtDelayの値を変えてみてください。

int tDelay = 1;   // 1ms遅延設定←ここの時間を短くしていく

この時間を、10、100などに変えてみてください。

時間を遅くしていくと各桁の表示が順番に表示されていくのが分かります。

つまり、実際は、1桁づつ表示しています。

時間を速くすることで4桁表示になっているのがわかるはずです。

活用例

4桁7セグメントLEDは、以下のようなプロジェクトに使えます。

  • デジタル時計(時:分の表示)

  • 温度計・湿度計(センサーと組み合わせて表示)

  • カウンター(ボタンやセンサー入力に応じてカウントアップ)

  • ストップウォッチ(タイマー機能付き実験やゲームに便利)

まとめ

4桁7セグメントLEDは、Arduinoで数値をわかりやすく表示できる便利なデバイスです。
特に「ダイナミック点灯方式」によって、少ないピン数で複数桁を表示できる仕組みは電子工作の基本的なテクニックのひとつです。

初心者の方もぜひ、時計やカウンターなどのプロジェクトで挑戦してみてください!

 

Arduinoで7セグメントLEDを使って数字を表示しよう!

こんにちは!今回は Arduinoを使った「7セグメントLED」 をご紹介します。
7セグメントLEDは、数字や簡単な文字を表示できる電子部品で、電子工作やデジタル時計などによく使われています。

7セグメントLEDとは?

7セグメントLEDは、数字を表示するための表示デバイスです。
「a〜g」と呼ばれる7つの発光ダイオード(LEDセグメント)で構成されており、それらを組み合わせることで「0〜9」までの数字を表示できます。

例えば、数字「8」を表示するときは、7つすべてのセグメントが点灯します。
逆に「1」の場合は、右側の2つのセグメント(bとc)だけが点灯します。

0~9の表示方法

ピンの割付がわかっていれば0~9の表現方法はわかると思います。

【表の数字】

『1』:電流を流してLED店頭

『0』:電流を流さずLED消灯

主な種類

  • 共通アノード型:プラス(VCC)が共通。点灯したい部分をGNDに接続。

  • 共通カソード型:マイナス(GND)が共通。点灯したい部分にVCCを接続。

Arduinoで使うときは、どちらのタイプかを確認することが大切です。

点灯したい部分に電源を供給する方が感覚的に分かりやすいと考え、今回の例では共通カソード型を使用します。

Arduinoで使ってみよう!

用意するもの

  • Arduino Uno(または互換ボード)

  • 7セグメントLED(共通カソード型がおすすめ)

  • 抵抗220Ω (8個)
  • シフトレジスタ 74HC595(SN74HC595Nなど)
  • ジャンパー線

  • ブレッドボード

  • USBケーブル(ArduinoとPC接続用)

回路図

  1. 7セグメントLEDの共通端子をGNDへ接続

  2. 各セグメント(a〜g)をArduinoのデジタルピンへ接続

  3. それぞれに抵抗を入れて電流を制御

「SN74HC595N」の出力QA~QH7セグメントLEDに対して以下の割り当てをしています。

※7セグメントLEDが焼き切れないようにするため、抵抗が必要です。今回の抵抗は220Ωとしますが、LEDが焼き切れない抵抗値であれば220Ωである必要はありません。

 

シフトレジスタ(74HC595)の使用

今回は『シフトレジスタ(74HC595)』は必ずしも必要ではないです。7セグメントの各LEDに対してAruduinoのデジタルピンがそれぞれ接続させても7セグメントLEDの使用は可能です。シフトレジスタを使って制御した方が少ないデジタルピンで7セグメントLEDを制御する事が出来ます。

シフトレジスタ(74HC595)の詳細は下記記事でも紹介しています。

monodukuri-life.hatenablog.com

サンプルコード

例として「0〜9」を順番に表示するプログラムを書いてみましょう。

 int tDelay = 500;   //500ms遅延設定
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
// seven_ledsをbyte型として定義
// 配列にDisplay表示用のデータ0~9と全消灯を設定
// 1 = LED on, 0 = LED off
byte seven_leds[11] =       { B11111100,  // 0
                              B01100000,  // 1
                              B11011010,  // 2
                              B11110010,  // 3
                              B01100110,  // 4
                              B10110110,  // 5
                              B10111110,  // 6
                              B11100000,  // 7
                              B11111110,  // 8
                              B11100110,  // 9
                              B00000000,  // OFF
                             };
void setup()
{
 pinMode(rclkPin, OUTPUT);   //11番ピンをOUTPUTとして定義
 pinMode(dsPin, OUTPUT);     //12番ピンをOUTPUTとして定義
 pinMode(srclkPin, OUTPUT);  //9番ピンをOUTPUTとして定義
}
void loop() 
{
  delay(tDelay);
  // 7セグメントLEDに0~9を順番に点灯する。
 for (int i = 0; i < 11; i++)
 {
  digitalWrite(rclkPin, LOW);  //送信中のRCLKをLowにする
  shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[i]); //シフト演算を使って点灯するLEDを選択
   digitalWrite(rclkPin, HIGH);  //送信終了後RCLKをHighにする   
  delay(tDelay);  
 }
}

動作確認

「0〜9」の数字が順番に表示されます。

7セグメントLEDの応用例

7セグメントLEDは、いろいろな場面で活用されています。

  • 電子時計(時間表示)

  • カウンター(来客数やスコア表示)

  • タイマー(残り時間の表示)

  • 計測器(電圧や温度の表示)

シンプルながら視認性が高く、工作に取り入れると一気に「電子機器っぽさ」が出て楽しいです!

まとめ

  • 7セグメントLEDは、7つのLEDを組み合わせて数字を表示するデバイス
  • 共通アノード型と共通カソード型があるので注意

  • Arduinoを使えば「0〜9」を簡単に表示できる

最初は1桁から試してみて、慣れてきたら複数桁の7セグメントLEDを使って時計やカウンターを作ってみると面白いですよ!

Arduinoでフォトレジスタを使って明るさを測ろう

こんにちは!今回は Arduino を使って、身近な光センサー「フォトレジスタCdSセル)」を紹介します。フォトレジスタは安価で手に入りやすく、明るさを検知するのにとても便利な電子部品です。LEDの自動点灯や暗さ検知など、いろいろな工作に応用できます。

フォトレジスタとは?

フォトレジスタCdSセル)は、光の強さによって抵抗値が変化する素子です。

  • 明るいとき:抵抗値が小さくなる

  • 暗いとき:抵抗値が大きくなる

この性質を利用することで、周囲の明るさを電気的に読み取ることができます。
例えば、夜になると街灯が自動的に点く仕組みなどに使われています。

フォトレジスタは抵抗器と同じく極性がないので、向きを気にすることなく使用することができます。

Arduinoとの接続方法

フォトレジスタは単体では電圧として読み取れないため、抵抗と組み合わせて分圧回路を作ります。

回路例(電圧分割回路)

 
5V --- フォトレジスタ --- A0ピン --- 抵抗 --- GND
  • フォトレジスタと抵抗を直列につなぐ

  • 中間点の電圧を Arduinoのアナログ入力(A0など) に接続

  • 抵抗は10kΩ前後が一般的

この構成で、明るさによって変化する電圧をArduinoが読み取れるようになります。

※10kΩを使用してみて輝度の変化がわかりづらい場合は、抵抗値を上げるなどして読み取り値の範囲の調整をしてください。

Arduinoで使ってみよう!

用意するもの

  • Arduino Uno(または互換ボード)

  • 抵抗10kΩ
  • フォトレジスタCdsセル)
  • ジャンパー線

  • ブレッドボード

  • USBケーブル(ArduinoとPC接続用)

回路図

サンプルプログラム

int val=0; //フォトレジスタの値を格納する変数
void setup() {
Serial.begin(9600); //モニターに出力するための設定
}
void loop() {
val=analogRead(0); //アナログ入力の0番からデータ読み取り
Serial.println(val); //入力された値をモニターに出力
delay(500);
}
コード解説

analogRead(pin)  :アナログ値を読み取るアナログ入力ピンを指定。(下記詳細)

【詳細】

Arduino のアナログ入力ピン(A0, A1, A2 ... など)に接続した電圧を 数値データに変換して取得する関数 です。
この変換には、Arduino に内蔵されている A/Dコンバータ(Analog to Digital Converter)が使われます。

A/Dコンバータでは、対象の電圧を数等分に分けます。Arduino Unoの場合は、0〜5Vの電圧の範囲で読み込みが可能です。この0~5Vの電圧を1023等分にします。ADコンバータで読み込んだアナログの電圧は、等分した一番近い値に変換します。

(返される値の範囲)

  • 0V    → 0

  • 2.5V → 512

  • 3V →614

  • 5V   → 1023

動作の確認

Arduino IDE の「シリアルモニタ」を開き、フォトレジスタに光を当てたり、遮ったりしてみましょう。

  • 光を当てる(窓辺で太陽光を当てるなど) → 数値が小さくなる

  • 光を遮る(カーテンを閉める、手で覆うなど) → 数値が大きくなる

この変化が確認できれば成功です!

■光を当てる(窓に持っていき太陽光をあてた)

■光を遮る(カーテン及び室内電気を落としてた)

光を当てると数字が小さくなり、光を遮ると値が高くなれば成功です!

応用例

フォトレジスタはとてもシンプルですが、工夫次第でさまざまな工作に使えます。

  • 自動点灯ライト
    暗くなるとLEDが自動的に点灯する仕組みを作れる。

  • 光を使ったセンサー
    手で光を遮ったときに反応する仕組みを作れる。

  • 環境データロガー
    温度センサーや湿度センサーと組み合わせて、環境の明るさを記録する。

  • おもちゃ・アート作品
    光に反応して音や動きが変わるインタラクティブな作品にも応用できる。

まとめ

フォトレジスタは安価で扱いやすく、Arduino初心者におすすめのセンサーです。
光の強さを「数値」として読み取れるので、ちょっとした仕掛けから本格的な自動制御まで幅広く使えます。

ぜひArduinoと組み合わせて、オリジナルの「光に反応する工作」にチャレンジしてみてください!

Arduinoでピン不足を解消!シフトレジスタ(74HC595)の使い方

Arduinoで複数のLEDやデジタルデバイスを制御しようとすると、すぐにピンが足りなくなってしまうことがあります。そんなときに役立つのが シフトレジスタ です。
今回は、その中でも代表的な 74HC595 を使って、少ないピンで多くの出力を制御する方法をご紹介します。

シフトレジスタ(74HC595)とは?

74HC595は、「シリアル入力 → パラレル出力」 を行うICです。
Arduinoから1ビットずつ順番にデータを送り、それをまとめて8ビットの出力に変換してくれます。

74HC595のピン説明

74HC595には16本のピンがあり、役割は次の通りです。

 

ピン番号 名称

    説明

1〜7, 15  QA〜QH  8ビットのパラレル出力端子
8  GND  グランド(0V)
9  QH'  次の74HC595へデータを送る出力(カスケード用)
10  SRCLR  マスタリセット(LOWで出力クリア)
11  SRCLK  シフトクロック(データを1ビット進める)
12  RCLK  ストレージクロック(データを出力ピンへ反映)
13  OE  出力有効(LOWで有効、HIGHで高インピーダンス
14  SER  シリアルデータ入力(Arduinoから送るデータビット)
16  VCC  電源(+5V)

動作

74HC595は、次のような流れで動作します。

  1. シリアル入力
    Arduinoから「データピン」を使って、1ビットずつデータを送ります。
    例えば「10110011」というパターンを順に送り込みます。

  2. クロック信号でデータをシフト
    「クロックピン」に信号を送るたび、入力データが内部レジスタ内で1ビットずつ右に移動(シフト)します。

  3. ラッチで出力更新
    「ラッチピン」に信号を送ると、内部レジスタの内容が一斉に出力ピン(Q0〜Q7)に反映されます。

この仕組みにより、Arduinoの3本のピンで8ビット分の状態をまとめて制御できます。

Arduinoで使ってみよう!

今回はLEDを順番に点灯させる回路例を紹介します。
ポイントはArduinoの3本の信号線で8個のLEDを制御できること。ピン節約ができます。

用意するもの

  • Arduino Uno(または互換ボード)

  • LED 8個

  • 抵抗220Ω 8個
  • シフトレジスタ 74HC595(SN74HC595Nなど)
  • ジャンパー線

  • ブレッドボード

  • USBケーブル(ArduinoとPC接続用)

回路図

  • 74HC595 RCLK → Arduinoのデジタルピン 11

  • 74HC595 SER → Arduinoのデジタルピン 12

  • 74HC595 SRCLK → Arduinoのデジタルピン 9

  • 74HC595 QA〜QH →LEDを接続(各LEDには抵抗を入れる)

  • 74HC595 VCC→ 5V(Arduinoの5V)

  • 74HC595 OE→ GND(ArduinoのGND)

  • 74HC595 GND→ GND(ArduinoのGND)

サンプルコード

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 = 0; //ledsをbyte型としてb00000000で定義
void setup() 
{
  pinMode(rclkPin, OUTPUT);   //11番ピンをOUTPUTとして定義
  pinMode(dsPin, OUTPUT);     //12番ピンをOUTPUTとして定義
  pinMode(srclkPin, OUTPUT);  //9番ピンをOUTPUTとして定義
}
void loop() 
{
  // LED1からLED8までを順に光らせる。
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i); //bitbyte操作関数で指定したビットを1にする    
    digitalWrite(rclkPin, LOW);                //送信中のRCLKをLowにする
    shiftOut(dsPin, srclkPin, LSBFIRST, leds); //シフト演算を使って点灯するLEDを選択
  digitalWrite(rclkPin, HIGH);               //送信終了後RCLKをHighにする  
    delay(tDelay);    
    bitClear(leds, i);                         //点灯させたLEDのbitを0にして消灯させるための設定
  }
}
コード解説

byte     :0〜255までの整数を扱う8ビット(1バイト)のデータを格納

bitSet(x, n):変数xの n番目のビット を 1(ON)にする

shiftOut(dataPin, clockPin, bitOrder, value):下記詳細説明

引数       説明
dataPin  データを送るピン(74HC595のDSピンに接続)
clockPin  クロック信号を送るピン(74HC595のSH_CPピンに接続)
bitOrder  送信するビット順(MSBFIRST または LSBFIRST
value  送信する8ビットのデータ(0〜255)
  • MSBFIRST(Most Significant Bit First)
    最上位ビット(左端のビット、bit7)から順番に送る。
    例:B100110101 から順に送信。

  • LSBFIRST(Least Significant Bit First)
    最下位ビット(右端のビット、bit0)から順番に送る。
    例:B100110100 から順に送信。

【ビット送信のイメージ】

もし value = B10011010(2進数で 154)の場合

送信順 MSBFIRSTの場合   LSBFIRSTの場合
1ビット目  1 (bit7) 0 (bit0)
2ビット目 0 (bit6) 1 (bit1)
3ビット目 0 (bit5) 0 (bit2)
4ビット目 1 (bit4) 1 (bit3)
5ビット目 1 (bit3) 0 (bit4)
6ビット目 0 (bit2) 0 (bit5)
7ビット目 1 (bit1) 0 (bit6)
8ビット目 0 (bit0) 1 (bit7)

応用例

  • 多数のLED制御(イルミネーション、7セグメント表示)

  • LEDマトリクス制御

  • リレーやモータードライバのON/OFF制御

  • スコアボードやメッセージ表示装置

まとめ

Arduinoのピン不足に悩んだら、74HC595は非常に便利な解決策です。
3本のピンで多くの出力を制御でき、回路も比較的シンプル。複数個を直列接続すれば、さらに制御数を増やせます。
LED制御から複雑なディスプレイ制御まで、幅広く活用できるので、電子工作の幅がぐっと広がります。

 

ArduinoでLCDディスプレイを使ってみよう!

Arduinoでセンサーの値やメッセージを見やすく表示したいときに便利なのが LCDディスプレイ です。今回は、Arduinoでよく使われる16×2キャラクLCDを例に、基本的な使い方と、液晶モジュールの通信方式である パラレル通信方式 と シリアル通信(I2C通信) の違いについて詳しく解説します。

LCDディスプレイとは?

LCD(液晶ディスプレイ)は、文字や数字を表示する小型の画面で、電子工作では16×2や20×4タイプがよく使われます。
センサーの測定値、時計表示、メニュー操作など、多くのプロジェクトで活躍します。

ArduinoLCDの接続方式

パラレル通信方式

パラレル通信は、複数のデータ線を同時に使って情報を転送する方法です。LCDの場合、4ビットまたは8ビットのデータ線に加え、制御信号用のピン(RS、E、RWなど)が必要になります。

特徴

    • 一度に複数ビットのデータを送信するため、高速通信が可能

    • Arduinoのデジタルピンを6~10本程度使用

    • 直接接続するため、追加モジュールが不要

    • LiquidCrystal ライブラリで簡単に制御できる

シリアル通信(I2C方式)

シリアル通信は、データを1ビットずつ順番に送る方法です。I2C(アイツーシー)方式では、SDA(データ線)とSCL(クロック線)の2本だけで通信ができ、LCDに接続する際はI2C変換モジュール(バックパック)を取り付けて使用します。

特徴

    • 必要な配線は2本(SDA、SCL)のみで非常にシンプル

    • Arduinoのピンを節約できる

    • 通信速度はパラレルより遅めだが、LCD表示には十分

    • LiquidCrystal_I2C ライブラリを使用

    • 複数のI2Cデバイスを同じ2本の線に接続可能(アドレスで識別)

パラレル通信とシリアル通信の違い

Arduinoで使ってみよう!

今回使用する通信方式は「パラレル通信方式」です。パラレル通信方式はディスプレイに表示させるための接続配線が多くなります。対応したピン(ポート)が1対1の関係の為、分かりやすいかと思います。

用意するもの

  • Arduino Uno(または互換ボード)

  • LCDディスプレイ(例:LCD1602モジュール)

  • ポテンショメータ
  • ジャンパー線

  • ブレッドボード

  • USBケーブル(ArduinoとPC接続用)

回路図

  • LCDモジュール VSS  → GND(ArduinoのGND)
  • LCDモジュール VDD → 5V(Arduinoの5V)
  • LCDモジュール V0 →5V+ポテンショメータArduinoの5V+可変抵抗)
  • LCDモジュール RS →デジタルピン(ArduinoのD7)
  • LCDモジュール RW  →GND(ArduinoのGND)
  • LCDモジュール E   →デジタルピン(ArduinoのD8)
  • LCDモジュール D4 →デジタルピン(ArduinoのD9)
  • LCDモジュール D5 →デジタルピン(ArduinoのD10)
  • LCDモジュール D6 →デジタルピン(ArduinoのD11)
  • LCDモジュール D7 →デジタルピン(ArduinoのD12)
  • LCDモジュール A      → 5V(Arduinoの5V)
  • LCDモジュール K      → GND(ArduinoのGND)

サンプルコード

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup() {
  lcd.begin(16, 2);          // LCDの桁数と行数を指定する(16桁2行)
  lcd.clear();               // LCD画面をクリア
  lcd.setCursor(0, 0);       // カーソルの位置を指定
  lcd.print("Hello!");       // 文字の表示
  lcd.setCursor(0, 1);       // カーソルの位置を指定
  lcd.print("Arduino Uno");  // 文字の表示
}
void loop() {
}  

上記スケッチを実行するとLCDディスプレイにこのように表示されます。

ポテンショメータコントラストの調整をしてください。液晶画面がうっすら白いだけで文字が出ない場合があります。

コード解説

LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7):

  LiquidCrystal型の変数を生成。

  rs: LCDのRSピンに接続するArduino側のピン番号
  rw: LCDのRWピンに接続するArduino側のピン番号
  enable: LCDのE(Enable)ピンに接続するArduino側のピン番号
  d0~d7: LCDのdataピンに接続するArduino側のピン番号

  ※RWピンはGNDに接続しているので省略
  ※4ビットでのやり取りなのでd0~d3は省略

begin(cols, rows):

  LCDの初期化。
  ディスプレイの桁数と行数の指定。
  cols:桁数(横方向の字数)
  rows:行数

clear():

  LCDの表示を消し、カーソルを左上隅に配置。

setCursor(col, row):

  LCDのカーソルの位置を指定。

print(data):

  テキストをLCDに表示

使用例

LCDディスプレイを使うと、次のようなプロジェクトが簡単に作れます:

  • 温湿度センサーの測定結果を表示

  • 時計やカウントダウンタイマー

  • ロボットの動作状態やメニュー選択画面

  • ゲームのスコア表示

まとめ

  • パラレル通信は高速で追加部品不要ですが、配線が多くピンも多く消費します。

  • I2C通信は配線が2本だけでシンプル、他のデバイスとも共存しやすいのが利点です。