みなさん、こんにちは!
今日は、YandexスピーカーのAliceとArduinoを使用して、インターコムに接続されたドアを開く方法についての記事があります。興味のある方は、猫の下でお願いします。
誰かがインターコムに電話をかけることがよくありますが、現時点では何かで忙しいか、怠惰すぎてドアを開けることができません。おなじみの状況ですね。
そして、私のインターコムは、ハンドセットを受け取らないとドアをまったく開けません。電話をかけてから30秒以内にハンドセットを受け取らないと、ドアオープナーボタンは新しい電話が来るまでアクティブでなくなります。インターコムは(当時)安くはなかったので、ヒキガエルは私にそれを別のものに変えるように窒息させました。そして、私はそれと戦うことにしました。
私の人生を簡素化する最初のアイデアは10年前に現れました。インターコムからの通話が自宅の電話に複製されるように、インターコム電話アダプターを作成することにしました。図を描き、ブレッドボードにプロトタイプを組み立てました。すべてがうまくいきましたが、私はこのプロトタイプを通過することはありませんでした。今日まで、すべてがまだゴミ箱の中に横たわっています。
2番目のプロジェクトは、CyberWRTファームウェアとBareSIPソフトウェアSIP電話を備えたTL-MR3020ルーターに実装されました。屋外パネルのボタンを押すと、インターコム通話と並行してルーターが携帯電話を呼び出し、別の都市にいてもアパートのドアの近くに立っている人と話すことができましたが、ソフトフォンまたはルーター自体は非常に不安定で、放棄する必要がありました。
しかし、ここで、私の幸いなことに、昨年、彼らは私の誕生日に音声アシスタントのアリスをくれました。私は新しいアイデアを思いつきました。Yandexコラムを通して私の声でドアを開けるというものです。
そして今日、私が自分の考えを実行することに着手した日が来ました。
ビデオインターコムのドアステーションの仕組みについて少し
屋外パネルは、4本のワイヤーGND、+ 12 V、オーディオおよびビデオを使用してインターコムモニターに接続されています。
呼び出し側パネルで、オーディオワイヤが100オームの抵抗を介してGNDに接続されている場合、呼び出し信号が聞こえます。また、オーディオワイヤに+12 Vを印加すると、電磁ロックを開くためのリレーが機能します。
下の画像は、屋外パネルとドアフォンの接続図を示しています。
特別なインターコムケーブルを使用してドアステーションをモニターに接続する場合は、通常、次の手順に従って接続します
。GND-編組
+ 12V-赤いワイヤー
オーディオ-青いワイヤー
ビデオ-同軸ケーブルの中央コア
スキーム
図から、Arduino上のデバイスをインターコムに接続するには、2本のワイヤーを接続するだけでよいことがわかります。これらのワイヤーを接続するために、私は手元にあるものを使用しました。リレーの代わりに、NPNトランジスタまたはPC817オプトカプラーのキーを使用できます。
私は最初に目を引いたIRレシーバーを使用しました。これは、古いテレビから落としたもので、長年ゴミ箱の棚に置いていました。
使用されるコンポーネント
ArduinoNano
リレーモジュール
IRレシーバー38kHz
デュポンワイヤーArduinonanoの
代わりに、Arduinoラインの他のマイクロコンピューターを使用できます。Arduino nanoをたくさん持っているので、使用しました。
Arduinoのソース
コードは非常に単純で簡単です。
押されたボタンのコードを受信して保存するには、Arduinoコントローラーをリモートボタンを追加するモードにする必要があります。 D2ピンとGNDピンにジャンパーを設定し、Arduinoのリセットボタンを押す必要があります。その後、コントローラーボードのシステムLEDが点灯し、コントローラーはリモコンのボタンが押されるのを待ちます。
音声操作だけでなく、ソファから起き上がることなくリモコンからドアを開けられるように、テレビのリモコンの使用をお勧めします。リモートでは、めったに使用しないボタンを選択するのが最善です。通常、テレテキスト用に設計された4色のボタンです。コードを受信すると、ArduinoはLEDで元気に点滅し、スタンバイモードに戻ります。
ボタンは好きなだけ押すことができますが、Arduinoは最後に押しただけを覚えています。コード記憶モードを終了するには、ジャンパーを取り外し、マイクロコンピューターの「リセット」ボタンを押すだけです。
Arduinoのコード
#include <IRremote.h>
#include <EEPROM.h>
//#define TOLERANCE 35 //
#define IR_RECEIVE_PIN 11 //
#define RELAY_PIN 12 //
#define SET_PIN 2 //
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
void setup()
{
irrecv.enableIRIn(); //
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
pinMode(SET_PIN, INPUT_PULLUP); //D10 , « »
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
// Serial.begin(115200);
while(!digitalRead(SET_PIN)) // D2 GND
{
set_command();
}
}
void loop()
{
if (irrecv.decode(&results)) //
{
if(LoadEEPROM()==results.value) // (ir_command==results.value)LoadEEPROM();
{
digitalWrite(RELAY_PIN, HIGH); //
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(RELAY_PIN, LOW); //
}
irrecv.resume(); //
}
}
void set_command() //
{
digitalWrite(LED_BUILTIN, HIGH);
if (irrecv.decode(&results))
{
digitalWrite(LED_BUILTIN, LOW);
SaveEEPROM(results.value); // EEPROM
irrecv.resume(); //
}
delay(100);
}
void SaveEEPROM(unsigned long ir_code) // EEPROM
{
EEPROM.write(0, ir_code & 0xFF);
EEPROM.write(1, (ir_code & 0xFF00) >> 8);
EEPROM.write(2, (ir_code & 0xFF0000) >> 16);
EEPROM.write(3, (ir_code & 0xFF000000) >> 24);
}
unsigned long LoadEEPROM() // EEPROM
{
byte val = EEPROM.read(3);
unsigned long ir_code=val;
val = EEPROM.read(2);
ir_code= (ir_code << 8) | val;
val = EEPROM.read(1);
ir_code= (ir_code << 8) | val;
val = EEPROM.read(0);
ir_code= (ir_code << 8) | val;
return ir_code;
}
#include <EEPROM.h>
//#define TOLERANCE 35 //
#define IR_RECEIVE_PIN 11 //
#define RELAY_PIN 12 //
#define SET_PIN 2 //
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
void setup()
{
irrecv.enableIRIn(); //
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
pinMode(SET_PIN, INPUT_PULLUP); //D10 , « »
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
// Serial.begin(115200);
while(!digitalRead(SET_PIN)) // D2 GND
{
set_command();
}
}
void loop()
{
if (irrecv.decode(&results)) //
{
if(LoadEEPROM()==results.value) // (ir_command==results.value)LoadEEPROM();
{
digitalWrite(RELAY_PIN, HIGH); //
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(RELAY_PIN, LOW); //
}
irrecv.resume(); //
}
}
void set_command() //
{
digitalWrite(LED_BUILTIN, HIGH);
if (irrecv.decode(&results))
{
digitalWrite(LED_BUILTIN, LOW);
SaveEEPROM(results.value); // EEPROM
irrecv.resume(); //
}
delay(100);
}
void SaveEEPROM(unsigned long ir_code) // EEPROM
{
EEPROM.write(0, ir_code & 0xFF);
EEPROM.write(1, (ir_code & 0xFF00) >> 8);
EEPROM.write(2, (ir_code & 0xFF0000) >> 16);
EEPROM.write(3, (ir_code & 0xFF000000) >> 24);
}
unsigned long LoadEEPROM() // EEPROM
{
byte val = EEPROM.read(3);
unsigned long ir_code=val;
val = EEPROM.read(2);
ir_code= (ir_code << 8) | val;
val = EEPROM.read(1);
ir_code= (ir_code << 8) | val;
val = EEPROM.read(0);
ir_code= (ir_code << 8) | val;
return ir_code;
}
上に投稿したコードを公開するときは、ソースへのリンクを示してください。
Yandex.StationAliceに接続しています
スマートスピーカーに接続するには、Yandex SmartRemoteが必要です。
ロシアの検索エンジンやパートナーから購入する必要はありません。リモートコントロールはAliexpressで少し安く購入できます。しかし、その違いは、中国人からリモコンを購入して宝くじをするのに十分な大きさではありません。リモコンをステーションに接続する方法については説明しません。インターネット上にこのトピックに関する詳細な手順がたくさんあるので、同じYandexから簡単に見つけることができます。 Yandex.StationとArduinoオープナーの間の相互作用を設定する方法のみを説明します。
これを行うには、アプリケーションに移動する必要があります Yandex.Browser-すべてのサービス-デバイス-デバイス管理-リモートコントロール-デバイスの追加-手動で構成-「ドア」という名前を入力-コマンドを追加-音声コマンド「開く」の名前を入力-あらゆる家庭用電化製品からリモートコントロールを取得し、Yandexに送信します必要なボタンを押します。I.リモートコントロールの青いLEDが消えると、列はこのコマンドを実行する準備が整います。これで、「アリスがドアを開ける」というフレーズを確認できます。少し考えた後、彼女が注文を実行します。
結論
スマートホームでYandexリモートコントロールを使用すると、リモートコントロールを含むあらゆる家電製品を制御できます。また、Arduinoで最も単純な回路を組み立てたので、リモートコントロールを持たない他のデバイスの制御を統合することも非常に簡単です。シンプルで信頼性が高く、これらのデバイスをインターネットに接続する必要はありません。
私の記事が気に入ったら、次の出版物を見逃さないように私のチャンネルを購読することができます。
ご不明な点がございましたら、コメント欄でお尋ねください。