Skip to content

組み込みソフトウェアとは

組み込みエンジニア養成講座を始めるにあたって、いったいどんなものが組み込み機器なのか簡単な例をあげてみます 細かい内容までは今日の講座では理解できなくても問題ありません。まずは雰囲気をつかんでください

コンピュータが発明されてからまだ100年は経っていませんが、一般家庭にコンピュータが5個もない家庭はほぼないと思います。 20個以上のコンピュータがある家庭も少なくないと思います。

コンピュータと言われると、WindowsのPCやマックを思い浮かべるかもしれませんが、それ以外のコンピュータは広い意味で組み込み開発されたものです。 電気を使って押しボタンスイッチが2個以上ついているものはほぼ間違いなくマイコンと言われる小型コンピュータ(マイコンが使われています) 広い意味での組み込みソフトウェアには、カーナビ、スマホ、等も含まれます。 もっと単純なマイコンは歴史的には炊飯器辺りから始まっています。マイコンの性能向上、価格低下に合わせて、使われる家電製品がどんどん増えて現在にいたっています。 また、スマホ、携帯ゲーム機、小型情報機器類の普及によりハードウェアコストが下がりソフトウェアも発展してきて、GoogleHome,AmazonAlexa等もどんどん発展していってます

  • 電子レンジ
  • 炊飯ジャー
  • 冷蔵庫
  • オーブントースター
  • 湯沸かしポット
  • テレビ
  • ステレオ。。。今はない家も多そうではありますが

赤外線リモコン付きLED電灯

現在で単純な組み込みシステムとしては、LED照明があげられます。 どのような仕組みになっているのか見てみましょう 難しい用語も出てきますが、一度にすべて覚える必要はありません徐々に少しずつ覚えていければOKです

まずは動作についてまとめ

  1. ON/OFFボタンを押すと電灯がつく
  2. ON/OFFボタンを押すと電灯が消える

いたってシンプルですね

赤外線リモコン付きLED電灯のモデル

学習用に家庭用の100Vの本当の赤外線リモコン付きLED電灯(本物、これ以降では本物と呼ぶこともあります)を使うのは危険なので学習用ボードで再現すると 学習用ボードには"Arduino UNO R4 WIFI"これ以降では単純に”UNO R4 WIFI"とか”UNO R4"とか”R4”と呼ぶこともあります

Note

WIFIの機能がない"Arduino UNO R4"というボードもありますがWIFI/Bluetoothの機能がないだけで基本的な部分は同じです

  • 必要な部品
  • Arduino UNO R4 WiFi
  • 赤外線受信モジュール
  • 赤外線リモコン
  • LED(任意の色)
  • 330Ω抵抗
  • ジャンパーワイヤー
  • ブレッドボード

軽くデータシートを眺めてみましょう

参考 赤外線受信モジュールデータシートPDF

Tips

データシートというのは超重要です、今後も何度も出てきます
どんなものなのかぐらいは把握しておいて下さい

graph TD;
    A[Arduino UNO R4 WIFI] -->|デジタルピン 2| B[赤外線受信モジュール];
    A -->|デジタルピン 12| C[LED];
    C -->|330Ω抵抗| GND;

Note

LEDには方向(+/-)があります
構造を説明する際には信号の線だけ記載しています、実際に配線する際にはGNDや電源の線も必要です

詳細な接続は以下のようになります、結線だけを示しているので矢印に若干違和感がありますが気にしないでください 今後必要に応じて信号線だけのものと詳細なものを使い分けます

graph TD;
    subgraph Arduino UNO R4 WiFi
        A5["5V"] -->|Vcc| B[赤外線受信モジュール];
        A4["GND"] -->|GND| B;
        A13["デジタルピン 13"] -->|LEDのアノード| C[LED];
        C -->|330Ω抵抗| D(GND);
        A3["デジタルピン 3"] -->|INPUT| B;
    end

alt text

(R4とセンサーだけしかありませんが、LEDも別途配線してください)

TODO 回路図の画像を更新したい

実際の赤外線リモコン付きLED電灯との違いは

項目 本物 モデル 説明
電源 AC100V USBからのDC5V AC100VからDCを作成する回路が本物にはある
LEDの数 たくさん 1個 LEDがたくさんあると明るいです
CPUの数 1個 1個(2個) 実は赤外線受信モジュールもマイコンです
CPUの値段 100円 ARDUINO R4 WIFI 4800円

モデル用のプログラム

/*
  This Arduino receive and decode infrared (IR) signals from a remote control. It uses 
  the IRremote library to receive the IR signals and map them to corresponding keys like 
  numbers, mathematical operations, and other function keys.

  Board: Arduino Uno R4 
  Component: Infrared Receiver
  Library: https://github.com/Arduino-IRremote/Arduino-IRremote (IRremote by shirriff, z3t0, ArminJo)
*/

// Include the necessary libraries
#include <IRremote.h>

// Define the pin numbers for the IR receiver
const int IR_RECEIVE_PIN = 2;
const int LED_PIN = 12;  // LEDを接続するピン

void setup() {
  Serial.begin(9600);                                     // Start serial communication at 9600 baud rate
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the IR receiver
  pinMode(LED_PIN, OUTPUT);                               // LEDピンを出力モードに設定
  digitalWrite(LED_PIN, HIGH);                            // LED ON
}

void loop() {
  // Check if there is any incoming IR signal
  if (IrReceiver.decode()) {
    // IrReceiver.printIRResultShort(&Serial);                 // Print the received data in one line
    // Serial.println(IrReceiver.decodedIRData.command, HEX);  // Print the command in hexadecimal format
    Serial.println(decodeKeyValue(IrReceiver.decodedIRData.command));  // Map and print the decoded IR signal to corresponding key value

    IrReceiver.resume();  // Enable receiving of the next value
  }
}

// Function to map received IR signals to corresponding keys
String decodeKeyValue(long result) {
  // Each case corresponds to a specific IR command
  switch (result) {
    case 0x16:
      return "0";
    case 0xC:
      digitalWrite(LED_PIN, HIGH);  // LED ON
      return "1";
    case 0x18:
      digitalWrite(LED_PIN, LOW);  // LED OFF
      return "2";
    case 0x5E:
      return "3";
    case 0x8:
      return "4";
    case 0x1C:
      return "5";
    case 0x5A:
      return "6";
    case 0x42:
      return "7";
    case 0x52:
      return "8";
    case 0x4A:
      return "9";
    case 0x9:
      return "+";
    case 0x15:
      return "-";
    case 0x7:
      return "EQ";
    case 0xD:
      return "U/SD";
    case 0x19:
      return "CYCLE";
    case 0x44:
      return "PLAY/PAUSE";
    case 0x43:
      return "FORWARD";
    case 0x40:
      return "BACKWARD";
    case 0x45:
      return "POWER";
    case 0x47:
      return "MUTE";
    case 0x46:
      return "MODE";
    case 0x0:
      return "ERROR";
    default:
      return "ERROR";
  }
}```

### リモコンの信号の観測

では

!!! Tip
    赤外線受信モジュールの信号をオシロで見てみましょう

### モデル用のプログラムの解説

#### 初期化部分

- シリアルポートのボーレートの設定
- 通信の開始
- ポートの方向を設定

```cpp
void setup() {
    Serial.begin(9600);     // シリアル通信の初期化
    irrecv.enableIRIn();    // 赤外線受信を開始
    pinMode(LED_PIN, OUTPUT); // LEDピンを出力モードに設定
}

ループ処理

void loop() {
    if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);  // 赤外線リモコンの信号をシリアルモニタに出力
        // 任意のリモコンの信号に対してLEDのON/OFFを切り替え
        if (results.value == 0xFF30CF) {     // 例:リモコンの「1」ボタンの信号
            digitalWrite(LED_PIN, HIGH);     // LED ON
        } else if (results.value == 0xFF18E7) { // 例:リモコンの「2」ボタンの信号
            digitalWrite(LED_PIN, LOW);      // LED OFF
        }
        irrecv.resume();  // 次の信号を待機
    }
}
  • リモコンからの信号を受信した時だけ処理が実行されます
  • リモコンからのコード「1」を受信したらLED用のポートをHIGH(ON)にします
  • リモコンからのコード「2」を受信したらLED用のポートをHIGH(OFF)にします

実際の製品の仕様

アマゾンで最安値だったNEC(ホタルクス)の製品ページ

ここから仕様とリモコンの画像を取得してきました

仕様 リモコン

ざっくりと機能を洗い出してみると

  • Ch1/CH2の切り替え
  • 調光機能
  • 壁スイッチコントロール

があります 詳しく説明すると

Ch1/CH2の切り替え

隣り合った部屋で同じ照明を取り付ける場合を考えてみましょう Aの部屋で電気をつけていて、Bの部屋移動します、Bの部屋にあったリモコンで電気をつけようとしたときに隣のAの部屋の電気が消えてしまうと 操作がややこしくなります。 リモコン、LED電灯の機器の設定をAの部屋はCH1、Bの部屋はCH2としておくことで、使い分けができます

調光機能

仮に10個のLEDで電灯を作っているとしましょう。  10%の明るさにしたいときには1番目のLEDだけを点灯させる、50%の明るさにしたいときには1から5番目のLEDだけ点灯させる  これでも明るさの調整はできます

一見簡単そうに思われますが、デメリットもあります

  • 明るさのむらができたり
  • LEDの寿命に差が出る
  • 回路が複雑になる

では実際にはどのようになっているのでしょうか?

人間には知覚できないほど高速にON/OFFを繰り返してONの時間の長さで明るさを調整しています

実際に試してみましょう

調光機能付き回路図
graph TD;
    subgraph Arduino UNO R4 WiFi
        A5["5V"] -->|Vcc| B[赤外線受信モジュール];
        A4["GND"] -->|GND| B;
        A4 -->|GND| C;
        A9["PWM対応ピン 9"] -->|LEDのアノード| C[LED];
        C -->|330Ω抵抗| D(GND);
        A3["デジタルピン 3"] -->|OUT| B;
    end
調光機能付きプログラム
/*
  This Arduino receive and decode infrared (IR) signals from a remote control. It uses 
  the IRremote library to receive the IR signals and map them to corresponding keys like 
  numbers, mathematical operations, and other function keys.

  Board: Arduino Uno R4 
  Component: Infrared Receiver
  Library: https://github.com/Arduino-IRremote/Arduino-IRremote (IRremote by shirriff, z3t0, ArminJo)
*/

// Include the necessary libraries
#include <IRremote.h>

// Define the pin numbers for the IR receiver
const int IR_RECEIVE_PIN = 2;
const int LED_PIN = 9;      // LEDを接続するピン (PWM対応ピン)

int brightness = 0;         // LEDの明るさ (0~255)
const int brightnessStep = 51;  // 明るさの変化幅 (255の5段階)

void setup() {
  Serial.begin(9600);                                     // Start serial communication at 9600 baud rate
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the IR receiver
  pinMode(LED_PIN, OUTPUT);                               // LEDピンを出力モードに設定
}

void loop() {
  // Check if there is any incoming IR signal
  if (IrReceiver.decode()) {
    // IrReceiver.printIRResultShort(&Serial);                 // Print the received data in one line
    // Serial.println(IrReceiver.decodedIRData.command, HEX);  // Print the command in hexadecimal format

    String res = decodeKeyValue(IrReceiver.decodedIRData.command);
    Serial.println(decodeKeyValue(IrReceiver.decodedIRData.command));  // Map and print the decoded IR signal to corresponding key value


    switch(res[0]) {
      case '1':
            brightness = min(brightness + brightnessStep, 255); // 最大255まで
            analogWrite(LED_PIN, brightness);  // LEDの明るさを設定
      break;
      case '2':
           brightness = max(brightness - brightnessStep, 0);  // 最小0まで
            analogWrite(LED_PIN, brightness);  // LEDの明るさを設定
       break;
    }



    IrReceiver.resume();  // Enable receiving of the next value
  }
}

// Function to map received IR signals to corresponding keys
String decodeKeyValue(long result) {
  // Each case corresponds to a specific IR command
  switch (result) {
    case 0x16:
      return "0";
    case 0xC:
      // digitalWrite(LED_PIN, HIGH);  // LED ON
      return "1";
    case 0x18:
      // digitalWrite(LED_PIN, LOW);  // LED OFF
      return "2";
    case 0x5E:
      return "3";
    case 0x8:
      return "4";
    case 0x1C:
      return "5";
    case 0x5A:
      return "6";
    case 0x42:
      return "7";
    case 0x52:
      return "8";
    case 0x4A:
      return "9";
    case 0x9:
      return "+";
    case 0x15:
      return "-";
    case 0x7:
      return "EQ";
    case 0xD:
      return "U/SD";
    case 0x19:
      return "CYCLE";
    case 0x44:
      return "PLAY/PAUSE";
    case 0x43:
      return "FORWARD";
    case 0x40:
      return "BACKWARD";
    case 0x45:
      return "POWER";
    case 0x47:
      return "MUTE";
    case 0x46:
      return "MODE";
    case 0x0:
      return "ERROR";
    default:
      return "ERROR";
  }
}

Tip

オシロでLEDの両端を見てみましょう
赤外線受信モジュールの信号とLEDのアノードの信号をオシロで見てみましょう(赤外線モジュール立下りモニター)

壁スイッチコントロール

リモコンが見当たらないのに電灯をつけたり消したりしたい場合に便利なのが壁スイッチコントロールです。 壁にあるスイッチを操作することで、器具への電源供給をON/OFFすることができます

家庭用の電源はAC100Vです。マイコンはDC5Vとか3Vとかで動作しています。 そのためにACからDCを作っています。そのDCをコンデンサにチャージしておくことで、少しの間マイコンを動作させることができます。

動作しているマイコンが生成されたDCの電圧を監視することで壁スイッチがOFFになったり、ONになったことを検出しています。

一定期間の間にOFF/ONしたことが検出されると、LED電灯を、全灯、半灯、常夜灯を切り替えることができます

スリープタイマー

一定時間が経過するとLED電灯をOFFにする機能です、CPU内部にある時計機能を使って実装しています

赤外線リモコン付きLED電灯のシステム全体として考える

ここまで主にソフトウェアを中心にLED電灯の解説をしてきました システム全体として製品を作るところまでの範囲を考えてみます

  • ハードウェア

    • マイコン選定
    • LED選定
    • 電源選定
    • 回路図作成
    • プリント基板レイアウト設計
    • 放熱設計
  • ソフトウェア

    • 基本仕様設計
    • 詳細仕様設計
    • コーディング
    • テスト

ハードウェア部分は主にハードウェア担当の技術者が担当します またソフトウェアのボリュームもさほど大きくないのと派生開発が主な作業になるので専任のソフトウェア担当の技術者がおらず ハードウェア担当の技術者が兼任する場合もあります

これがハードディスクレコーダーやカーナビ等になってくると ハードウェアの規模もかなり大規模になり、ソフトウェアも圧倒的に大きくなります そうなってくると、それぞれにチームを結成して対応するようになります

参考

Arduino IDEのインストールの説明はこちら

UNO R4 WiFiチートシート(NEW TAB)