アレクサ、エアコンつけて

published_with_changes 更新日: event_note 公開日:

labelamazon alexa labelESP8266

自作Alexa IOT デバイスの第3段目になります。2作目まではリモコン内部のスイッチをフォトカプラに置き換えてAlexaデバイスを作りました。今回は赤外線リモコンの信号をコピーした赤外線リモコン用の自作Alexaデバイスを作ります。




構成

使用するESP8266のデジタルpinは12mAしか流せないので、赤外線 LEDを直接には駆動できません。そこでLED電流はNPNトランジスタで5V電源から引っ張りこみます。電源電圧のゆとりを利用して、赤外線(以下IR)LEDを2~3個直列にして大きな照度を得ます。

デジタルpinは12mAですが、トランジスタを駆動するだけなのでわずかな電流を消費するだけです。余剰(といっても、極わずかですが)電流を使って、目視確認を目的の赤色LEDを点灯させます。

これらが成り立つように各部抵抗の設計を行います。




各部抵抗の設計

IR LEDはOSI5LA5113A(最大定格電流 DC:100mA、順方向電圧VF:1.35V)を利用します。照度確保のためLED電流は最大の100mAを狙います。NPNトランジスタは2SC1815-Y(hfe :120~200)を使います。

IR LED電流制限抵抗

IR LEDを2個使うとき

( 5 - 2 x 1.35 ) / ( 100 / 1000 ) = 27 Ω なので、47Ωを並列で使って23.5Ωにします。この時のコレクタ電流Icは、

Ic = ( 5 - 2 x 1.35 ) / 23.5 = 98 mA になります。

IR LEDを3個使うとき

同様に計算すると、R = 9.5 Ω なので、10Ωにします。Ic = 95mA です。

ベース抵抗

2SC1815の増幅率(min) 120のとき、ベース電流 Ib = 98 / 120 = 0.82 mA ですが、デジタル的にON/OFFを繰り返す今回の回路ではベース電流の飽和領域で使うのがよいとされています。

コレクタ-エミッタ間の電位差(VCE)をなるべく小さくすることでコレクタ電流(IC)を大きくしたい。VCEを最小値近くで動作させるためには、トランジスタを飽和させて使う必要がある。
2SC1815のデータシートにあるいろいろな特性図のうち、以下に示すIC-VCE曲線を見ると、小さなVCE値を維持したままICが直線的に立ち上がっている領域がある。

2sc1815 IC-VCE
2SC1815の IC-VCE特性図 (東芝データシート 2007-11-01より抜粋)

飽和させて使うときには、この領域になるようなIB を使うことになる。

引用元:電子工作とプログラミング WROOM02を使った赤外線リモコン その1

 これを参考にベース電流 Ib は5mAを考えます。このときのベース抵抗はベース-エミッタ間の電圧の標準値 0.6Vを利用して、

R(Ib) = ( 3.3 - 0.6 ) / ( 5 / 1000 ) = 540 Ω です。1kΩを並列で使いベース抵抗は500Ωにします。このときベース電流は次のようになります。

Ib = ( 3.3 - 0.6 ) /  500 x 1000  = 5.4 mA

可視確認用の赤色LEDの電流制限抵抗

赤色LEDの電圧降下を2.1Vとして、電流制限抵抗を220Ωにすると、

( 3.3 - 2.1 ) / 220 * 1000 = 5.4 mA です。

デジタルpinは12mAが最大です。上記のベース電流 Ib:5.4mAと合わせても11mAなのでデジタルpin出力は許容電流内です。

パーツリスト

Part TypePropertiesAmount
Infrared (940nm) LED5 mm [THT]; Infrared (940nm); leg yes2
Red (633nm) LED5 mm [THT]; Red (633nm); leg yes1
NPN-Transistor2SC1815-Y タイプ NPN (ECB); TO92 [THT]1
47Ω Resistor抵抗 47Ω; bands mini 4; tolerance ±5%;2
1kΩ Resistor抵抗 1kΩ; bands mini 4; tolerance ±5%;2
10kΩ Resistor抵抗 10kΩ; bands mini 4; tolerance ±5%;1
220Ω Resistor抵抗 220Ω; bands mini 4; tolerance ±5%;1
WeMos D1 Minicpu ESP-8266EX1


赤外線信号解析

先に作った「ESP32の赤外線リモコン学習/コピーツール」でエアコン(東芝RAS251/281)のコード抽出を行いましたが、うまく解析できませんでした。また、取り込んだデータを発信してもエアコンは動きませんでした。

しかたなく、コード解析はあきらめrawデータを送信することにします。rawデータはIR信号のON/OFF時間を表しているので、発信のたびにある程度のばらつきがあります。そこで約10個のデータを取り、平均した数値を使用することにしました。参考に載せますが、一回の送信で295個の数値データがあります。

RAS赤外線.xlsx

スケッチ

操作はON「自動」とOFF「停止」だけにします。スケッチにはEspalexaライブラリとIRremoteESP8266ライブラリを使います。

  • 34行 ON「自動」のRasデータを設定
  • 37行 OFF「停止」のRasデータを設定
  • 87行でON「自動」信号を発信
  • 91行でON「自動」信号を発信


/*
 * Espalexaでデバイスを制御する基本形(シンプルな1個のON/OFFスイッチ) 
 * 2階のエアコンをON/OFFする
 * */ 
 
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h>
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

// prototypes
boolean connectWifi();

//callback functionsコールバック関数のプロトタイプ
void RAS251_ACChanged(EspalexaDevice* dev);

// Change this!!
const char* ssid = "**********";
const char* password = "***password***";

boolean wifiConnected = false;
Espalexa espalexa;

// Configuration to operate a AC by IR codes
const uint16_t kIrLed = 4;  // ESP8266 GPIO pin to use. Recommended: GPIO4 (D2).
IRsend irsend(kIrLed);  // Set the GPIO to be used to sending the message.

uint16_t rawDataON[] = {
4560,4246,705,1443,720,1454,688,1463,707,1464,703,372,699,400,664,1484,688,407,663,414,656,418,673,404,675,421,647,1502,670,1502,645,429,659,1515,640,433,662,415,656,441,631,442,645,430,649,452,622,1524,647,1527,623,1527,647,1524,619,1557,620,1525,648,1526,620,1530,642,457,615,457,614,459,645,457,607,464,607,466,646,452,608,468,603,471,621,1554,602,1544,644,458,600,471,600,1565,613,469,601,473,612,463,634,466,598,475,598,476,640,461,596,479,594,476,628,465,603,477,595,478,596,1579,595,477,596,484,625,1544,596,478,616,480,600,478,594,494,579,495,611,473,594,500,573,500,604,476,593,504,569,504,570,1579,594,5424,4432,4371,570,1578,598,1571,575,1581,594,1571,602,480,594,479,594,1575,604,474,594,504,570,504,600,476,593,504,569,1579,595,1578,570,504,600,1574,570,504,598,478,593,505,569,504,570,504,595,479,594,1579,599,1575,569,1580,594,1578,570,1581,594,1578,601,1573,570,1578,597,478,594,504,570,503,601,475,594,504,570,504,597,480,593,504,569,505,568,1581,594,1579,601,475,594,504,569,1581,593,480,594,504,569,506,595,480,593,506,568,506,597,479,592,506,568,506,574,500,592,482,593,506,567,1582,593,506,568,506,592,1583,567,506,567,507,592,481,593,509,564,509,591,480,592,509,564,510,580,492,591,482,593,510,563,1582,592
};
uint16_t rawDataOFF[] = {
4615,4166,773,1397,703,1472,742,1406,768,1406,734,340,737,342,744,1423,707,368,742,357,713,360,712,362,741,359,707,1441,685,1490,703,370,699,1475,700,374,700,374,715,387,694,377,695,379,673,404,716,1455,691,1483,689,1459,695,1479,689,1461,713,1459,689,1485,686,1461,676,421,691,385,688,386,684,391,712,386,686,387,686,388,698,406,675,394,679,1484,691,1469,682,393,710,389,680,1468,689,416,674,394,679,394,666,411,702,394,678,395,677,397,701,398,676,398,675,1510,663,1473,673,1501,674,1474,693,409,671,399,674,400,658,448,667,400,672,401,673,402,700,400,669,403,670,404,668,1506,669,404,650,1524,669,1480,699,400,669,5349,4507,4275,664,1484,657,1516,665,1484,691,1481,667,408,692,412,661,1482,656,462,649,407,666,407,666,409,693,406,664,1483,672,1501,666,406,642,1532,668,405,667,407,696,403,666,407,665,409,660,472,632,1483,660,1514,669,1480,692,1481,668,1496,680,1477,672,1503,670,1478,688,419,665,401,672,401,651,431,690,401,672,401,671,403,697,401,670,404,669,1530,646,1477,656,420,695,403,669,1479,695,412,662,404,668,405,647,480,640,406,667,407,666,408,690,409,665,409,664,1541,636,1481,638,1536,668,1481,696,403,668,405,667,407,663,464,639,407,665,409,651,425,689,409,663,410,663,411,689,1485,661,412,643,1531,664,1485,692,407,664
};

void setup()
{
  irsend.begin();

#if ESP8266
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
#else  // ESP8266
  Serial.begin(115200, SERIAL_8N1);
#endif  // ESP8266

  Serial.begin(115200);

  // Initialise wifi connection
  wifiConnected = connectWifi();
  
  if(wifiConnected){
    
    // Define your devices here. 
	espalexa.addDevice("RAS251_AC", RAS251_ACChanged, EspalexaDeviceType::onoff); //non-dimmable device オンオフのみ

    espalexa.begin();
    
  } else
  {
    while (1) {
      Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
      delay(2500);
    }
  }
}
 
void loop()
{
   espalexa.loop();
   delay(1);
}


//our callback functionsコールバック関数
void RAS251_ACChanged(EspalexaDevice* d) {
  if (d == nullptr) return; //this is good practice, but not requiredこれは無くても良い

  //do what you need to do hereここに実行内容を書く

  Serial.print("A changed to ");
  if (d->getValue()){
        Serial.println("Turn ON 空清・自動モードでON");
        irsend.sendRaw(rawDataON, 295, 38);  // Send ON 295 raw datas capture at 38kHz.
  }
  else {
        Serial.println("Turn OFF 停止");
        irsend.sendRaw(rawDataOFF, 295, 38);  // Send OFF 295 raw datas capture at 38kHz.
  }
  
}


// connect to wifi ? returns true if successful or false if not
boolean connectWifi(){
  boolean state = true;
  int i = 0;
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20){
      state = false; break;
    }
    i++;
  }
  Serial.println("");
  if (state){
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else {
    Serial.println("Connection failed.");
  }
  return state;
}

Alexaデバイスへ

写真は抵抗の調整過程のものですので、本文内容と異なるところがあります。また、別ブログの温度センサーをつけています。


スケッチにはAlexa化エミュレートライブラリのEspalexaを入れていますので、ESP8266を起動してAlexaアプリから新しいデバイスを探して追加すれば、「アレクサ、エアコンをつけて」でエアコンが動きます。

Alexaアプリへの追加のやり方は以前まとめています。スケッチではデバイス名を”RAS251_AC”にしていますので、わかりやすい名前に変更します。我が家にはエアコンは何台もあるので、部屋の名前をつけて”〇〇のエアコン”で登録しました。

アプリ上では下記のように照明として表示されます。EspalexaライブラリのON/OFFしか使わないので問題ないです。アレクサに話しかけるとき、”〇〇のエアコン”をつけて/切ってなどの言い方しか有効になりません。(アレクサが言うことを聞きません。”〇〇の暖房をつけて”では、ダメです。)

Powered by Blogger | Designed by QooQ

keyboard_double_arrow_down

keyboard_double_arrow_down