デジタル技術大学校ゆかり先生のブログ

デジタル技術大学校ゆかり先生が、Arduinoを基礎から体系的に解説。はじめてのArduinoでも大丈夫!初心者の方に寄りそって、LED点滅からIoTまで楽しく学べるマイコン講座のブログです。

Arduino入門講座 第15回|I2C機器を2台同時接続!OLEDとLCD1602に情報を分けて表示しよう【温湿度・日時】


🏫 はじめに

こんにちは、デジタル技術大学校、専属講師のゆかりです 🌸

今回はArduino応用編として、
I2C機器を2台同時に接続する方法を解説します。

OLEDとLCD1602を使って、それぞれ異なる情報を表示するプログラムを作っていきます。


📺 動画はこちら

www.youtube.com


📌 概要

I2C機器には、それぞれ固有のアドレスが設定されています。

機器 I2Cアドレス
OLED(SSD1306) 0x3C
LCD1602 0x27

このようにアドレスが異なるため、
同じ配線上で同時に使用することが可能です。

⚠️ 注意
同じ種類の機器(例:OLED×2、LCD×2)を使用する場合は、
アドレス変更が必要になります。


🔌 配線図の解説

Arduinoの SCL / SDA をブレッドボードに接続し、
そこからOLEDとLCD1602へ配線します。

この接続方法を I2Cバス接続 と呼びます。

配線図


💻 今回作るプログラムの概要

今回は「表示の役割分担」を行います。

表示デバイス 表示内容
LCD1602 日付・時刻(NTPサーバーから取得)
OLED 温度・湿度(DHT11から取得)

1つのArduinoで
複数の情報を同時に扱う実践的な構成になります。


📝 プログラム作成

ヘッダファイルのインクルード

以下の機能に必要なライブラリを読み込みます。

  • Wi-Fi通信
  • LCD1602制御
  • OLED(SSD1306)制御
  • センサー関連

今回のようにプログラムが長くなる場合は、
過去に作成したコードをコピー&ペーストで再利用して問題ありません。


必要な値の設定

今回の設定ポイントは以下の通りです。

  • myssid.h:Wi-Fi接続情報(いつも通り)
  • NTPサーバー:NICTのNTPサーバーを使用
  • OLED設定:#defineで画面サイズを指定
  • DHT11:8番ピンに接続
  • LCD1602:I2Cアドレス 0x27

#include <WiFiS3.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <time.h>
#include "myssid.h"
 
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.nict.go.jp");
 
#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
#define DHTPIN 8  //DHT11のピン番号
 
DHT dht(DHTPIN,DHT11);
Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);
LiquidCrystal_I2C lcd(0x27,16,2);
 
void setup() {
  Serial.begin(115200);
 
  // WiFi接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
 
  // NTPクライアント初期化
  timeClient.begin();
  timeClient.setTimeOffset(32400); // JST (UTC+9)
 
  display.begin(SSD1306_SWITCHCAPVCC,0x3c);
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("OLED Ready!");
  display.display();
 
  // LCD1602の初期設定
  lcd.init();
  lcd.display();
  lcd.backlight();
  dht.begin();
}
 
void loop() {
  // put your main code here, to run repeatedly:
  timeClient.update();
  unsigned long epochTime = timeClient.getEpochTime();
 
  time_t rawtime = epochTime;
  tm* tm = localtime(&rawtime);
 
  int year = tm->tm_year + 1900;
  int month= tm->tm_mon + 1;
  int day = tm->tm_mday;
  int hours = tm->tm_hour;
  int minutes = tm->tm_min;
  int seconds = tm->tm_sec;
 
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
 
    //もしどちらかの値が空ならエラー
  if(isnan(humidity) || isnan(temperature)){
    display.setCursor(0, 0);
    display.print("Error reading");
    display.setCursor(0, 1);
    display.print("DHT sensor");
    return;
  }
 
  char formattedDate1[20],formattedDate2[20];
  sprintf(formattedDate1,"%04d/%02d/%02d",year,month,day);
  sprintf(formattedDate2,"%02d:%02d:%02d",hours,minutes,seconds);
 
  lcd.setCursor(0,0);
  lcd.print(formattedDate1);
  lcd.setCursor(0,1);
  lcd.print(formattedDate2);
 
  display.clearDisplay();
  display.setCursor(0, 10);
  display.print("Temp:");
  display.print(temperature);
  display.print(" C");
  display.setCursor(0, 30);
  display.print("Humidity:");
  display.print(humidity);
  display.print(" %");
  display.display();
  delay(1000);
}

✅ プログラムの検証・書き込み

間違いがないかチェックしてマイコンに書き込みます。

うまく動作したら完成です!

📚 今回学べること

  • I2C通信の基本的な仕組み
  • I2C機器を2台同時に接続する方法
  • OLEDとLCD1602を併用する表示テクニック
  • 温度・湿度データの取得と表示
    • 日時情報を表示する実用的なプログラム構成

📌 使用部品

🔧 使用ボード

  • Arduino Uno R4 WiFi

(※アフィリエイトリンクを使用しています)

使用部品

  • OLEDディスプレイ(I2C)

  • LCD1602(I2C)

  • 温湿度センサー(DHT11)

📦 電子工作キット


💬 質問・コメント大歓迎!

「UIDの比較がうまくいかない」 「LEDが思った色にならない」

など、遠慮なくコメントしてください 😊 ゆかり先生が丁寧にフォローします。



🏫 デジタル技術大学校 関連動画一覧

📺 ゆかり先生の講座をもっと学びたい方はこちら

www.youtube.com

🍓 まき先生のRaspberry Pi講座はこちら

www.youtube.com

💼 校長先生のチャンネルはこちら

www.youtube.com

Arduino入門講座 第14回|ICカードを使って入室管理システムもどきを作ってみよう

こんにちは、デジタル技術大学校、専属講師のゆかりです 🌸

今回は、いよいよ「認証システム」に挑戦します!


🏫 はじめに

ご覧いただきありがとうございます。

交通系ICカードや社員証など、
「登録されたカードだけが通れる」仕組みってありますよね。

今回は、
RFIDリーダー(MFRC522) × フルカラーLED を使って、

入室管理システム“もどき”

を作ってみます。


🔐 今回作るシステムの概要

この実習では、

  • ArduinoでMFRC522を使ってカードを読み取る方法
  • 登録されたカードと未登録カードの判定方法
  • LEDを「緑(入室OK)」「赤(入室NG)」で光らせる仕組み

を学びます。

登録できるカードは 1枚だけ ですが、
入退室管理システムの「基本ロジック」を体験できます。


🎥 今回の動画はこちら

📺 動画はこちら
👉

www.youtube.com


🎓 講座について

この動画は
「デジタル技術大学校」ゆかり先生による
初心者向けマイコンプログラミング講座 第13回
です。

これまで学んできた

  • RFIDによるカード読み取り
  • フルカラーLED制御

を組み合わせて、
「認証 → 判定 → 表示」という流れを作ります。


🧠 制御の流れ(入室管理の基本)

今回のロジックは、とてもシンプルです。

  1. カードのUIDを読み取る
  2. あらかじめ登録したUIDと比較する
  3. 一致すれば緑LED
  4. 不一致なら赤LED

この「比較判定」が、
実際の入退室管理システムの基本になります。


📌 使用部品

🔧 使用ボード

  • Arduino Uno R4 WiFi

(※アフィリエイトリンクを使用しています)

💳 RFIDモジュール

  • MFRC522

(※アフィリエイトリンクを使用しています)

🌈 出力装置

  • フルカラーLED(RGB LED)

📦 電子工作キット


🔌 配線のポイント

  • MFRC522はSPI通信で接続
  • RGB LEDは各色ピンをPWM対応ピンへ接続
  • GNDは必ず共通にする
  • 抵抗は220Ωを使用する

配線図


💻 プログラムの基本構造

#include<SPI.h>
#include<MFRC522.h>

const int RST_PIN = 9;
const int SS_PIN = 10;
const int ledpin_r = 3;
const int ledpin_g = 5;
const int ledpin_b = 6;

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance
const byte allowUID[] = {0x46, 0x84, 0xF6, 0x03}; //My Card ID
const size_t uidSize = sizeof(allowUID);          // size of UID(byte)

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(ledpin_r,OUTPUT);
  pinMode(ledpin_g,OUTPUT);
  pinMode(ledpin_b,OUTPUT);
  while(!Serial);
  SPI.begin();
  mfrc522.PCD_Init();
  mfrc522.PCD_DumpVersionToSerial();
  Serial.println(F("Scan PICC to see UID,SAK,Type and data blocks..."));  
}

void loop() {
  // put your main code here, to run repeatedly:
  if(!mfrc522.PICC_IsNewCardPresent()){
    return;
  }

  if(!mfrc522.PICC_ReadCardSerial()){
    return;
  }

  //check UID
  bool isMatch = true;
    if(mfrc522.uid.size != uidSize){
      isMatch = false;
    }else{
      for(byte i = 0;i < uidSize;i++){
        if(mfrc522.uid.uidByte[i] != allowUID[i]){
          isMatch = false;
          break;
        }
      }
    }

    if(isMatch == true){
      digitalWrite(ledpin_g,HIGH);
      Serial.println("Card matched!");
      digitalWrite(ledpin_r,LOW);
      digitalWrite(ledpin_b,LOW);
      delay(1000);
      digitalWrite(ledpin_g,LOW);
    } else {
      digitalWrite(ledpin_r,HIGH);
      Serial.println("Card not allowed");
      digitalWrite(ledpin_g,LOW);
      digitalWrite(ledpin_b,LOW);
      delay(1000);
      digitalWrite(ledpin_r,LOW);
    }
    //Stop Card
    mfrc522.PICC_HaltA();
}

🟢🔴 LED表示の意味

  • 緑LED → 入室許可

  • 赤LED → 入室拒否

  • 色で直感的に状態を示すことで、 「目で分かるシステム」になります。


⚙ この動画・記事で学べること

  • MFRC522によるカード読み取り

  • UIDの比較処理の考え方

  • 条件分岐(if文)の実践的な使い方

  • 認証システムの基本ロジック


🌱 こんな方におすすめ!

  • 入退室管理システムに興味がある

  • セキュリティ制御に挑戦したい

  • Arduinoで「実用的な仕組み」を作りたい

  • IoTシステム開発の基礎を学びたい


💡 応用の可能性

  • 今回の仕組みは、発展させると…

  • ログ管理(SDカード保存)

  • Wi-Fi経由でクラウド送信

  • 複数カード登録

  • サーボモーターでドア解錠

といった、本格的なIoTシステムへと進化できます。


💬 質問・コメント大歓迎!

「UIDの比較がうまくいかない」 「LEDが思った色にならない」

など、遠慮なくコメントしてください 😊 ゆかり先生が丁寧にフォローします。


🚀 次回予告

次回は、複数カード登録やログ管理への応用 に挑戦します!

より実用的な「小さなセキュリティシステム」へステップアップしていきます 🔐✨


🏫 デジタル技術大学校 関連動画一覧

📺 ゆかり先生の講座をもっと学びたい方はこちら

www.youtube.com

🍓 まき先生のRaspberry Pi講座はこちら

www.youtube.com

💼 校長先生のチャンネルはこちら

www.youtube.com

Arduino入門講座 第13回|ICカードの読み取りにチャンレンジしてみよう

こんにちは、デジタル技術大学校、専属講師のゆかりです 🌸

今回は、いよいよ「非接触認証」に挑戦します!


🏫 はじめに

ご覧いただきありがとうございます。

交通系ICカード社員証電子マネーなど、
「かざすだけで認証できる仕組み」って不思議ですよね?

今回は MFRC522(RFIDリーダー/ライター) を使って、
ArduinoICカードを読み取る実習 を行います。

この実習では、

  • ICカードをかざす(入力)
  • Arduinoがカード情報を読み取る(処理)

という流れを体験します。

身近な「非接触認証」の第一歩を学ぶことで、
セキュリティやIoT制御への応用にもつながります。


🎥 今回の動画はこちら

📺 動画はこちら
👉

www.youtube.com


🎓 講座について

この動画は
「デジタル技術大学校」ゆかり先生による
初心者向けマイコンプログラミング講座 第13回
です。

今回は、SPI通信を使って
RFIDモジュール(MFRC522)とArduinoを接続する方法を学びます。


💳 RFIDとは?

RFIDとは、

電波を使ってデータをやり取りする仕組み

です。

カード内部にはICチップが入っており、
リーダーが発する電波に反応してデータを返します。

つまり、

  • カードをかざす
  • データが無線で送られる
  • Arduinoが読み取る

という流れになります。


🔌 SPI通信とは?

MFRC522は SPI通信 を使ってArduinoと接続します。

SPI通信では、

  • MOSI
  • MISO
  • SCK
  • SS

といった専用の通信線を使用します。

通常のデジタル入力とは違い、
通信プロトコルを使ったデータ送受信になります。


📌 使用部品

🔧 使用ボード

(※アフィリエイトリンクを使用しています)

💳 RFIDモジュール

  • MFRC522

(※アフィリエイトリンクを使用しています)

📦 電子工作キット


🔌 配線図

配線のポイントは、

  • SPI通信ピンを正しく接続する
  • 3.3V動作であることに注意する
  • GNDは必ず共通にする

配線図


💻 プログラムの作成(基本例)

#include<SPI.h>
#include<MFRC522.h>

const int RST_PIN = 9;
const int SS_PIN = 10;

MFRC522 mfrc522(SS_PIN,RST_PIN);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while(!Serial);
  SPI.begin();
  mfrc522.PCD_Init();
  mfrc522.PCD_DumpVersionToSerial();
  Serial.println(F("Scan PICC to see UID,SAK,Type and data blocks..."));
}

void loop() {
  // put your main code here, to run repeatedly:
  if(!mfrc522.PICC_IsNewCardPresent()){
    return;
  }

  if(!mfrc522.PICC_ReadCardSerial()){
    return;
  }

  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

🧠 プログラムのポイント

  • SPI.begin(); → SPI通信を開始

  • mfrc522.PCD_Init(); → RFIDモジュールを初期化

  • PICC_IsNewCardPresent() → 新しいカードがあるか確認

  • PICC_ReadCardSerial() → カードのUIDを取得

この「UID(固有ID)」を使えば、 カードごとの識別制御が可能になります。


⚙ この動画・記事で学べること

  • RFIDの基本的な仕組み

  • SPI通信の概要

  • ICカードのUID取得方法

  • 非接触認証の基礎


🌱 こんな方におすすめ!


💬 質問・コメント大歓迎!

「ここが分からない」 「配線でつまずいた」など、

お気軽にコメントしてください 😊 ゆかり先生が丁寧にサポートします。


🚀 次回予告

次回は、 読み取ったICカードでモーターやLEDを制御する応用編 に挑戦します!

「認証 → 動作」という流れを作ることで、 本格的な制御システムへステップアップします。


🏫 デジタル技術大学校 関連動画一覧

📺 ゆかり先生の講座をもっと学びたい方はこちら

www.youtube.com

🍓 まき先生のRaspberry Pi講座はこちら

www.youtube.com

💼 校長先生のチャンネルはこちら

www.youtube.com

Arduino入門講座 第12回|超音波センサを使ってモーターの速度を変えられるようにしよう

こんにちは、デジタル技術大学校、専属講師のゆかりです 🌸

今回は、いよいよ センサー × アクチュエータ(モーター) の応用に入ります 🚗💨


🏫 はじめに

ご覧いただきありがとうございます。

「自動ブレーキって、どうして急に止まらずに自然に減速できるの?」
Arduinoを使って、その仕組みを分かりやすく解説します。

この回では 超音波センサー(HC-SR04)× DCモーター を使い、

  • なぜ ON/OFF 制御だけでは危険なのか
  • 距離に応じて、どうやって速度を落とすのか
  • センサーの値を、どのタイミングでモーター制御に使うのか

といった、初心者〜初級者が必ず疑問に思うポイントを整理しながら、

「距離に応じて減速 → 最後は停止する」自動ブレーキの基本

を実装していきます。


🎥 今回の動画はこちら

👉 車の自動ブレーキと同じ考え方|距離で減速するDCモーター制御

www.youtube.com


🎓 講座について

この動画は
「デジタル技術大学校」ゆかり先生による
マイコンプログラミング講座・DCモーター応用編(第26回)
です。

前回は「ポテンショメータで速度と方向を同時に制御」でしたが、
今回はさらに一歩進めて 「センサーの値でモーターを制御する」 に挑戦します。


🚗 今回のテーマ(自動ブレーキの基本形)

超音波センサーで障害物までの距離を測定し、距離に応じてモーター速度を制御します。

  • 遠い → 通常走行
  • 近づく → 徐々に減速
  • 危険距離 → 自動で停止

ポイントは、

距離(入力)→ 判定(処理)→ モーターPWM(出力)

の流れが、プログラムのどこに書かれているかを理解することです。


なぜ ON/OFF 制御だけでは危険なの?

もし「近づいたら止める」だけの制御だと、

  • 反応が遅れると 衝突する
  • ブレーキが急すぎて 不安定になる
  • 状況によって 止まったり止まらなかったり する

という問題が出ます。

そこで、距離に応じて速度を落とす(=減速制御)を入れて、
「安全に止まる」ロジックにしていきます。


📌 使用部品

- 使用ボード:Arduino Uno R4 WiFi

- モータードライバ:L293D

- DCモーター

- 超音波センサー:HC-SR04

-### ジャンパワイヤ / ブレッドボード ほか


🔌 配線図

配線のポイントは、

  • HC-SR04(Trig / Echo)で距離を測る
  • L293Dでモーターを安全に駆動する
  • GNDは必ず共通にする

です。


🧠 制御ロジック(距離 → PWM)

今回の「自動ブレーキ」は、ざっくり言うとこの考え方です。

  • 距離が遠い → PWMを大きく(速い)
  • 距離が近い → PWMを小さく(遅い)
  • ある距離より近い → PWM 0(停止)

距離の値をそのまま使うのではなく、
速度用の範囲(0〜255)に変換してからPWMに入れるのがコツです。


💻 プログラムの作成(サンプル)

※ピン番号は、ご自身の配線に合わせて調整してください。

#include <NewPing.h>

#define TRIG_PIN 7
#define ECHO_PIN 8
#define MAX_DISTANCE 400

#define motor1A 3
#define motor2A 4
#define pwm_motor 5

NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  pinMode(motor1A, OUTPUT);
  pinMode(motor2A, OUTPUT);
  pinMode(pwm_motor, OUTPUT);
}

void loop() {
  delay(50);
  unsigned int us = sonar.ping();
  unsigned int distance = us / US_ROUNDTRIP_CM;

  int pwmVal = 0;
  // 距離によってPWM値を決定
  if (distance < 10) {
    // 10cm未満: モーター停止
    pwmVal = 0;
  } else if (distance >= 50) {
    // 50cm以上: 最高速
    pwmVal = 255;
  } else {
    // 10cm〜49cm: 距離に比例して速度変化
    pwmVal = map(distance, 10, 49, 60, 254); // 速度範囲は用途で調整可
    pwmVal = constrain(pwmVal, 60, 254);     // 安全のため
  }
  
  // モーター正転
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor2A, LOW);
  analogWrite(pwm_motor, pwmVal);
  delay(500);
}

⚙ この動画で学べること

  • 超音波センサー(HC-SR04)の距離測定の仕組み
  • 測定距離をモーター制御に反映するロジック
  • PWMで速度を柔軟に変える設計方法
  • 「危険距離で停止」するブレーキ制御の作り方

🌱 こんな方におすすめ!

  • ロボット制御・自動走行に興味がある
  • Arduinoの「センサー × アクチュエータ制御」を体験したい
  • モーター制御にさらに応用力をつけたい
  • 卒業研究・自由工作・競技ロボットに活かしたい

💬 質問コメント大歓迎!

分からないところは遠慮なくどうぞ!

ゆかり先生がしっかりサポートします 😊


🔖 まとめ

  • HC-SR04で距離(入力)を取得
  • 距離に応じてPWMを変換(処理)
  • DCモーターの速度を変化させる(出力)

この「入力 → 処理 → 出力」が理解できると、センサー連動制御が一気に作れるようになります。


🏫 デジタル技術大学校 関連動画一覧

📺 ゆかり先生の講座をもっと学びたい方はこちら

www.youtube.com

🍓 まき先生のRaspberry Pi講座はこちら

www.youtube.com

💼 校長先生のチャンネルはこちら

www.youtube.com

Arduino入門講座 第11回|ポテンショメータでDCモーターの回転速度と方向を自在に操ろう【L293D】

こんにちは、デジタル技術大学校、専属講師のゆかりです 🌸

今回は、DCモーター制御の 一歩先 に進みます。

🏫 はじめに

ご覧いただきありがとうございます。

ポテンショメータでDCモーターを正転・逆転させたいのに、思った通りに動かない…
そんな経験はありませんか?

この回では Arduino × L293D × ポテンショメータ を使って、

  • なぜ逆転がうまくいかないのか
  • なぜ中立位置で止まらないのか
  • なぜ急に回転方向が変わるのか

といった、初心者〜初級者が必ずハマるポイントを整理しながら、

つまみ1つで「回転方向」と「回転速度」を同時に制御する考え方

を丁寧に解説します。


🎥 今回の動画はこちら

👉 ポテンショメータでDCモーターを正転・逆転させる方法(中級編)

www.youtube.com


🎓 講座について

この動画は
「デジタル技術大学校」ゆかり先生による
マイコンプログラミング講座・DCモーター中級編(第25回)
です。

「動くけど、なぜそうなるのか分からない」状態から
自分で制御を設計できる段階へ進むことを目標にしています。


なぜ「つまみ1つ制御」は難しいの?

ポテンショメータは、

  • 左に回す
  • 右に回す

だけでなく、
「どれくらい回したか」 という連続した値を出力します。

そのため、

  • どこから正転?
  • どこから逆転?
  • どこが停止位置?

プログラム側で決めてあげないと、制御が不安定 になります。

ここを理解せずに作ると、
「急に方向が変わる」「止まらない」といった現象が起きます。


今回の制御の考え方

今回のポイントは次の3つです。

これにより、

  • 左に回す → 逆転(速度アップ)
  • 中央 → 停止
  • 右に回す → 正転(速度アップ)

という、直感的な操作が可能になります。


使用する部品

🔧 使用ボード

🔧 モータードライバ

  • L293D

🔧 入力デバイス

🔧 出力デバイス


プログラムの作成

#define motor1A 3
#define motor2A 4
#define adcpin A0
#define pwm_motor 5

void setup() {
  // put your setup code here, to run once:
  pinMode(motor1A,OUTPUT);
  pinMode(motor2A,OUTPUT);
  pinMode(pwm_motor, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
int sensorValue = analogRead(adcpin);
Serial.println(sensorValue);
if(sensorValue < 485){
    int rev = map(sensorValue,0,485,255,0);
    analogWrite(pwm_motor,rev);
    digitalWrite(motor1A,HIGH);
    digitalWrite(motor2A,LOW);

  }else if(sensorValue > 545){
    int rev = map(sensorValue,545,1023,0,255);
    analogWrite(pwm_motor,rev);
    digitalWrite(motor1A,LOW);
    digitalWrite(motor2A,HIGH);
  }else{
    analogWrite(pwm_motor,0);
    digitalWrite(motor1A,LOW);
    digitalWrite(motor2A,LOW);
  }
}

実演:方向と速度を同時に制御

実際に、

  1. ポテンショメータを左へ回す
  2. モーターが逆転し、回転速度が変化
  3. 中央で停止
  4. 右へ回すと正転

という動きを確認します。

「回転方向」と「速度」が
同時に、なめらかに変化する のがポイントです。


この動画・記事で学べること

  • ポテンショメータの値の扱い方
  • DCモーターの正転・逆転制御
  • PWMによる回転速度制御
  • 不安定にならない制御設計の考え方

こんな方におすすめ!

  • DCモーター制御で一度つまずいた方
  • ポテンショメータ制御がしっくり来ていない方
  • ロボット・ラジコン制御に応用したい方
  • 次の「センサー連動制御」へ進みたい方

質問・コメント大歓迎です!

分からないところや
「ここがうまくいかない…」といった点があれば、
お気軽にコメントしてください 😊

講師目線で、できるだけ分かりやすくフォローします。


次回予告

次回はいよいよ、
超音波センサー × DCモーター に挑戦します!

障害物を検知して
自動で停止する制御 を作り、
より実践的なモーター制御へステップアップしていきます 🚗✨


🏫 デジタル技術大学校 関連動画一覧

📺 ゆかり先生の講座をもっと学びたい方はこちら
www.youtube.com

🍓 まき先生のRaspberry Pi講座はこちら
www.youtube.com

💼 校長先生のチャンネルはこちら
www.youtube.com

Arduino入門講座 第10回|DCモーターを正回転・逆回転させてみよう|L293Dの基本

こんにちは、デジタル技術大学校、専属講師のゆかりです 🌸
新年あけましておめでとうございます!

今回の記事は 2026年・新年第1回目の投稿 になります。
今年も「分かりやすく・楽しく」マイコンプログラミングを解説していきますので、どうぞよろしくお願いします。


DCモーターが思った方向に回らない…?

DCモーターを使っていて、

  • 思った方向と逆に回る
  • Arduinoにつないでも動かない
  • 配線が合っているのか不安

こんな経験はありませんか?

この記事では、
L293D モータードライバ を使って

  • 正回転
  • 逆回転

を切り替える DCモーター制御の基本 を、初心者向けに解説します。


この講座について

この内容は、YouTubeで公開している
「ゆかり先生のマイコンプログラミング講座」第24回 の内容です。

📺 動画はこちら
👉

www.youtube.com


なぜ Arduino だけでは DCモーターを動かせないの?

LEDと違い、DCモーターは

  • 電流の向きで回転方向が変わる
  • 動作時に大きな電流が流れる

という特徴があります。

ArduinoのI/Oピンでは
電流が足りず、直接モーターを動かすことができません。

そこで登場するのが…


専用IC「L293D」の役割

L293D は、DCモーターを安全に制御するための
モータードライバIC です。

主な役割は👇

  • Arduinoの信号をモーター用に変換
  • 電流を増幅
  • 正回転・逆回転の切り替えを簡単にする

これにより、Arduinoから
モーターの回転方向を自由に制御できるようになります。


配線の考え方

配線のポイントは以下の通りです。

  • Arduino → L293D(制御信号)
  • L293D → DCモーター(出力)
  • 電源とGNDは必ず共通にする


プログラムの作成

#define motor1A 3
#define motor2A 4

void setup() {
  // put your setup code here, to run once:
  pinMode(motor1A, OUTPUT);
  pinMode(motor2A, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  clockwise();
  delay(3000);
  stopmotor();
  delay(1000);
  anticlockwise();
  delay(3000);
  stopmotor();
  delay(1000);
}

void clockwise(){
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor2A, LOW );
}

void anticlockwise(){
  digitalWrite(motor1A, LOW);
  digitalWrite(motor2A, HIGH);
}

void stopmotor(){
  digitalWrite(motor1A,LOW);
  digitalWrite(motor2A,LOW);
}

プログラムでは、

  • IN1 / IN2 の HIGH / LOW を切り替えることで
  • 時計回り ↔ 反時計回り を制御します

難しい計算は不要で、
デジタル出力の考え方 が分かれば理解できます。


実演:正回転・逆回転

実際に、

  1. 正回転
  2. 少し停止
  3. 逆回転

という動きを確認します。

「おおっ、回った!」
この瞬間が、電子工作の一番楽しいところですね 😊


この動画・記事で学べること

  • DCモーターの基本的な仕組み
  • モータードライバ L293D の使い方
  • Arduinoで回転方向を切り替える方法
  • 実際に動かせるサンプルコード

こんな方におすすめ!

  • DCモーターを初めて使う方
  • ラジコン・ロボット制作に興味がある
  • Arduinoのステップアップをしたい
  • モーター制御を実プロジェクトで使いたい方

使用した部品

🔧 使用ボード

🔧 モータードライバ

🔧 DCモーター


質問・コメント大歓迎です!

分からないところや
「ここをもう少し詳しく知りたい!」などありましたら、
お気軽にコメントしてください 😊

ゆかり先生が、できるだけ分かりやすくお答えします。


次回予告

次回はいよいよ 応用編 🎉
PWM制御による「速度調整」 に挑戦します!

モーター制御が一気にレベルアップしますよ✨
どうぞお楽しみに!


🏫デジタル技術大学校関連動画一覧

📺 ゆかり先生の講座をもっと学びたい方はこちら www.youtube.com

🍓 まき先生のRaspberry Pi講座はこちら

www.youtube.com

💼 校長先生のチャンネルはこちら

www.youtube.com

【Arduino入門 番外編】WS2812でクリスマスイルミネーションを作ってみよう🎄(5パターン収録)【FastLED】【ゆかり先生の講座】

こんにちは!デジタル技術大学校・専属講師のゆかりです。
今回は 番外編 として、WS2812(NeoPixel互換)8連LEDFastLEDライブラリ で光らせて、 クリスマスっぽいイルミネーションを 5種類 作ってみます🎄✨

「点灯パターンを増やすと、一気に作品っぽくなる」ので、 ショート動画にも向いています!


✅ 今回やること(完成イメージ)

同じLED(8個)で、以下の 5パターン を順番に再生します。

  1. 1つずつ点灯(赤→緑→白)
  2. 流れる配色(赤・緑・金)
  3. キラキラ(Twinkle)
  4. 流れ星(Comet)
  5. イルミ配色パレット(Palette Flow)

最後まで行ったら、また最初から繰り返し再生します。


🧰 用意するもの

  • WS2812 LED(8連ストラップ)
  • ジャンパ線
  • (できれば)外部電源 5V
    ※ LED数が少ないのでUSB給電でも動きますが、明るくすると不安定になることがあります。

🔌 配線(基本)

WS2812は電源の取り方が重要です。
不安定なときは「GND共有」「外部5V電源」も検討してください。


🎥 今回の動画はこちら

www.youtube.com


📌 プログラム全体(コピペOK)

#include <FastLED.h>

#define LED_PIN     6
#define NUM_LEDS    8
#define LED_TYPE    WS2812
#define COLOR_ORDER GRB
#define BRIGHTNESS  80   // 撮影向け。明るすぎると白飛びします

CRGB leds[NUM_LEDS];

// ====== 共通ユーティリティ ======
void clearLeds() {
  FastLED.clear();
  FastLED.show();
}

// ====== ① 1つずつ点灯(赤→緑→白) ======
void oneByOneChristmas(uint16_t durationMs) {
  CRGB colors[] = {CRGB::Red, CRGB::Green, CRGB::White};
  unsigned long start = millis();

  while (millis() - start < durationMs) {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = colors[i % 3];
      FastLED.show();
      delay(120);
      if (millis() - start >= durationMs) return;
    }
  }
}

// ====== ② 流れる配色 ======
void flowingChristmas(uint16_t durationMs) {
  CRGB colors[] = {CRGB::Red, CRGB::Green, CRGB::Gold};
  unsigned long start = millis();

  while (millis() - start < durationMs) {
    for (int shift = 0; shift < NUM_LEDS; shift++) {
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = colors[(i + shift) % 3];
      }
      FastLED.show();
      delay(120);
      if (millis() - start >= durationMs) return;
    }
  }
}

// ====== ③ キラキラ(Twinkle) ======
void sparkle(uint16_t durationMs) {
  unsigned long start = millis();
  CRGB colors[] = {CRGB::Red, CRGB::Green, CRGB::White, CRGB::Gold};

  while (millis() - start < durationMs) {
    fadeToBlackBy(leds, NUM_LEDS, 40);
    int p = random(NUM_LEDS);
    leds[p] += colors[random(4)];
    FastLED.show();
    delay(30);
  }
}

// ====== ④ 流れ星(Comet) ======
void comet(uint16_t durationMs) {
  unsigned long start = millis();
  int pos = 0;
  int dir = 1;

  while (millis() - start < durationMs) {
    fadeToBlackBy(leds, NUM_LEDS, 50);
    leds[pos] = CRGB::White;
    FastLED.show();
    delay(40);

    pos += dir;
    if (pos == NUM_LEDS - 1 || pos == 0) dir = -dir;
  }
}

// ====== ⑤ イルミ配色パレット ======
void paletteFlow(uint16_t durationMs) {
  unsigned long start = millis();
  uint8_t index = 0;
  CRGBPalette16 palette = CRGBPalette16(
    CRGB::Red, CRGB::Green, CRGB::Gold, CRGB::White
  );

  while (millis() - start < durationMs) {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = ColorFromPalette(palette, index + i * 16);
    }
    index++;
    FastLED.show();
    delay(40);
  }
}

// ====== セットアップ ======
void setup() {
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
  FastLED.show();
  randomSeed(analogRead(0));
}

// ====== メインループ(ショート動画構成) ======
void loop() {
  oneByOneChristmas(4000);   // 0–4秒
  clearLeds();

  flowingChristmas(4000);   // 4~8秒
  clearLeds();

  comet(4000);               // 8–12秒
  clearLeds();

  sparkle(4000);             // 12–16秒
  clearLeds();

  paletteFlow(5000);         // 16–21秒
  clearLeds();
}

✨ コード解説(ここがポイント!)

① 明るさ(白飛び対策)

#define BRIGHTNESS  80

② 5つの点灯パターン

✅ 1) 1つずつ点灯(赤→緑→白)

  • LEDを1つずつ点灯
  • 赤・緑・白 を順番に割り当ててクリスマス感アップ🎄

✅ 2) 流れる配色(赤・緑・黄) *配色をズラしながら流すだけで、イルミっぽく見えます✨

✅ 3) キラキラ(Twinkle)

fadeToBlackBy(leds, NUM_LEDS, 40);
int p = random(NUM_LEDS);
leds[p] += colors[random(4)];
  • 全体を少しずつ暗くしつつ(フェード)
  • ランダムなLEDをキラッと光らせます

→ クリスマスの「ツリーの点滅」っぽい雰囲気になります!

✅ 4) 流れ星(Comet)

fadeToBlackBy(leds, NUM_LEDS, 50);
leds[pos] = CRGB::White;
  • 光る点(白)が左右に移動
  • 残像(フェード)がついて流れ星っぽく見えます🌠

✅ 5) パレットでイルミ(Palette Flow)

CRGBPalette16 palette = CRGBPalette16(
  CRGB::Red, CRGB::Green, CRGB::Gold, CRGB::White
);
leds[i] = ColorFromPalette(palette, index + i * 16);
  • 色のセット(パレット) を用意して
  • そこから色を取り出して流す方式

→ 色の変化が滑らかで、作品感が一気に出ます!


🛠 うまくいかない時のチェック

  • LEDが光らない → DINの向き(矢印)を確認 / ピン番号が合っているか確認

  • チカチカして不安定 → GND共有 / 外部5V電源 / 明るさ(BRIGHTNESS)を下げる

  • 色がおかしい → COLOR_ORDER を GRB → RGB に変えてみる


✅ まとめ

今回は WS2812 × FastLED で、クリスマスっぽい点灯パターンを5種類 作ってみました🎄

ポイントはこの3つ!

  • 明るさは控えめ(白飛び対策)
  • fadeToBlackBy() で残像・キラキラが作れる
  • Palette を使うと作品感が一気に上がる

🏫デジタル技術大学校関連動画一覧

📺 ゆかり先生の講座をもっと学びたい方はこちら www.youtube.com

🍓 まき先生のRaspberry Pi講座はこちら

www.youtube.com

💼 校長先生のチャンネルはこちら

www.youtube.com