hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

赤外線リモコンWi-Fi中継の応用 Webページからテレビを操作(操作Webページの紹介)

2024-03-29 14:41:01 | 赤外線リモコン

操作Webページです。
”コントロールするテレビの電源は:””OFFしています”では、
テレビ電源のON、OFFを、USB端子に出てくる5Vを読み取って表示させています。
(電源ONのコントロールが必要かの判断するため)

Webページ部分のコードを部分的に紹介します。
SimpleWiFiServerサンプルコードを改変し、client.println記述されている中へ追加
テレビ電源検出を表示する部分
//Check the TV power 電源がONしている時はONのコントロールを省略する7
bool CheckTVpower() {
  TV_Pon = !(digitalRead(TV_PowDet_PIN));//TVonのときLOW("0")なので反転して使う
  //備忘記uint8_t TV_Pon = 0;//"1"でTV電源がONしている
  if (TV_Pon) {
    return 1;
  } else {
    return 0;
  }
}

USBの5VをTLP624経由でGPIO43/D6入力し読み取る。
CheckTVpower()で5V検出時戻り値”1”
if(CheckTVpower()){
   client.println("<h3> ON しています</h3>");
   } else {
   client.println("<h3> OFF しています</h3>");
    }


赤外線リモコンWi-Fi中継の応用 Webページからテレビを操作(赤外線リモコン送信機用設定ファイル)

2024-03-29 08:50:45 | 赤外線リモコン

"irremoTV.txt"というファイルに順番に送信する赤外線のデータを記述しています。


# #以降はコメントとして取り扱われます。
# 赤外線リモコン送信機用設定ファイル
# protocolは SONY 23 に固定されています。
# 設定する情報は次の内容です。
# Address, Command, Repeat, Bit, Interval
# Intervalは次の送信開始までの待ち時間 単位mS
# Bitは2固定のようなので省略しています。
# 参考
# C00 1   ,15,12,10000
# 上記のように記述すると、下記のように変換され、TV Power ON(ON-OFF)が送信されます。
# IrSender.sendSony(0x1, 0x15, 2, 12);
# delay(10000);
#
# コントロール実行ステップ数を設定します。
NCO 10 # Number of IR control operations
#
# コントロールする操作順に記述してください。C00〜C09の10個まで記述できます。
# ”コントロール実行ステップ数”を超えた部分は使用されません。
# 文字の位置を変えないでください。(備忘記 行頭はインデックス0です。)
C00 1   ,15,12,10000 # TV Power ON(ON-OFF)
C01 1   ,25,12,500   # 入力切換え
C02 1   ,33,12,500   # カーソル右移動 1
C03 1   ,33,12,500   # カーソル右移動 2
C04 1   ,33,12,500   # カーソル右移動 3
C05 1   ,33,12,500   # カーソル右移動 4
C06 1   ,33,12,500   # カーソル右移動 5
C07 1   ,33,12,500   # カーソル右移動 6
C08 1   ,33,12,500   # カーソル右移動 7
C09 1   ,65,12,500   # 決定ボタン
# 以降は現在使っていません。今後の改変のための予備です。
C20 1   ,15,12,10000 # 0x1 , 0x15, 2, 12, 10000 TV Power ON(ON-OFF)
C21
C22
C23
C24
# 1    ,75,12,500   # カーソル下移動
# 1    ,74,12,500   # カーソル上移動
# 1    ,34,12,500   # カーソル左移動
# 1    ,10,12,500   # チャンネル+
# 1    ,11,12,500   # チャンネルー
# 1    ,12,12,500   # 音量+
# 1    ,13,12,500   # 音量ー
# 1    ,0 ,12,500   # 1チャンネル
# 1    ,1 ,12,500   # 2チャンネル
# 1    ,2 ,12,500   # 3チャンネル
# 1    ,60,12,500   # ホーム
#


赤外線リモコンWi-Fi中継の応用 Webページからテレビを操作(試作基板できた)

2024-03-28 13:02:54 | 赤外線リモコン

この投稿は書きかけです。

このプロジェクトは
赤外線リモコン信号が届かない場所にあるテレビを、Webページから操作します。
事前にプログラムした一連の動作を実行させます。

「本当に正しくテレビが操作できるのか?!」
リモコンデータはテレビ側に設置された赤外線送信機の中にあり、
Web経由でスタートスイッチを押しているだけなので、
テレビとの間に遮蔽物がなければ操作できるはずです。

他の用途を考えてみると、
Webクリックで機器を制御したいような用途に使えます。
また、遠隔地のデジタル、アナログデータや、制御した結果をWeb表示することもできます。


ユニバーサル基板で試作したものです。

使用している電線はAWG24、半田めっき線は直径0.3mmです。

部品レイアウトと配線、端子名(概略)

つづく

仕様
・マイクロSDに保存した赤外線コントロールのデータを読み込みます。
(テキストファイル)
・Webページ上リンクのクリックで、テレビに向けて赤外線コントロールを送信します。
・テレビ電源がOFFの時だけ電源ONのコントロールを追加します。
(テレビのUSB端子5Vを検出)
・現在の仕様では最大10個の赤外線コントロールを設定できます。(暫定)
・設置する施設のWi-Fiアクセスポイントを使います。
・Wi-Fi接続できなかった時は黄 LEDが点滅を続けます。
・WebページのURLは”http://設定したIPアドレス”となります。
・Webページには現在のテレビ電源”ON”、”OFF”が表示されます。
アクセスポイント設定
・Wi-Fiアクセスポイントへの接続設定はコンフィグポータルで行います。
・コンフィグポータル概説:機器自身がアクセスポイントとなり、
 接続して施設Wi-Fiアクセスポイントの設定をします。
・設定されたWi-Fi認証情報とIPアドレスは保存されます。
・設定情報が無い時、設定された接続先が見つからない時は、
 コンフィグポータルが起動します。
・何らかの原因で接続不能となった時は、ジャンパーピンにて
 強制的にコンフィグポータルを起動できます。

感謝 公開されているすばらしいサンプルスケッチやライブラリを使わせていただいています。


Raspberry Pi 5が届きました。(Geekworm X1002でNVMe SSDを試す64Bit OS)

2024-03-17 10:28:38 | Single board computer

この投稿は書きかけです。

NVMe Baseを販売しているPIMORONIのサイトで、
問題の報告有りのリストに"TS500GMTE110Q-E Transcend"がありました。
同シリーズの1TBも同じコントローラを使用していると推定されます。
よって、HY works所有の1TBの問題発生は当然の結果ですね。
同サイトに互換性確認のとれているNVMeSSDも載っていますので、
今後購入して試したいと思います。

Raspberry Pi 5にはPCIEインターフェースが追加されています。
そこで、NVMe SSDを取り付けて試してみました。

NVMe SSDのコントローラと、Pi5の相性問題がまだ全解決していないらしいです。
試してみたい方は、よく調べてNVMe SSDを選んでください。
HY worksでは所有の1TB(TS1TMTE110Q-E Transcend)で試した結果・・・問題出ています。
いつか改善されることを期待して、定期的にテストします。

画像を載せておきます。

続くと思います。


赤外線リモコンWi-Fi中継の応用 Webページからテレビを操作(SDメモリ内データで操作できた)

2024-03-13 10:23:04 | 赤外線リモコン

この投稿は書きかけです。
間違いやコードの文字化けがあるかもしれません。

赤外線リモコンWi-Fi中継の送信機応用です。
赤外線リモコン信号が届かない場所にあるテレビを、Webページから操作します。
事前にプログラムした一連の動作を実行させます。

「本当に正しくテレビが操作できるのか?!」
リモコンデータはテレビ側に設置された赤外線送信機の中にあり、
Web経由でスタートスイッチを押しているだけなので、
テレビとの間に遮蔽物がなければ操作できるはずです。

説明を省略している部分がありますので読み直して加筆します。
前の投稿も参考になります。

SimpleWiFiServerのwebページで、LEDを点灯するリンクをクリックすると、
テレビを操作する赤外線リモコン信号が送信されます。

スケッチの概要

IRremote ライブラリのSendRawDemoを改変し、
WiFiManagerAdvanced、SimpleWiFiServerと合体、EEPROMライブラリ追加
(Wi-Fi認証以外のネットワーク設定はEEPROMへ保存)
SimpleWiFiServerのwebページをリモコン用に改変すると良いが、そのままでも操作はできる。
SDライブラリ追加

SDメモリのルートにirremoTV.txtというファイルを置いて、
赤外線リモコンで送信するデータを記述しています。
例です
#参考にsendSony()関数の引数名と型
#sendSony(uint16_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats, uint8_t numberOfBits)
#aNumberOfRepeatsは2固定のようなので省略しています
#データー番号,アドレス,コマンド,numberOfBits,インターバル時間(mS)のように並んでいます
C00 1 ,15,12,10000 # 0x1,0x15,2,12,1000 TV Power ON(ON-OFF)
#以降はコメントとして取り扱われます
C01 1,15,12,200 # 0x1,0x15,2,12,200 # 入力切換え
C02 1,65,12,200 # 0x1,0x65,2,12,200 # 決定
#このように記述します


スケッチの追加点を紹介しておきましょうか
(サンプルスケッチを改変しています。ライブラリ開発者に感謝します)
#include "FS.h"
#include "SD.h"
#include "SPI.h"
//中略
uint16_t IRco[20][5];
//中略
  if (!SD.begin()) {
    Serial.println("Card Mount Failed");
    return;
  }
  readFile(SD, "/irremoTV.txt");//SDのルートにあるirremoTV.txtというファイルを読み込む
//中略
//readFile()関数です。setup(){}の前か後ろ、またはloop()の}以降に置きます。
void readFile(fs::FS &fs, const char * path) {
  Serial.printf("Reading file: %s\n", path);   File file = fs.open(path);
  if (!file) {
    Serial.println("Failed to open file for reading");
    return;
  }
 //中略
//読み込んだファイルからリモコン信号のaddress、command等を2次元配列へ入れていく
//aAddressのuint16_t型に合わせて配列を作りaCommand以降のuint8_t型はキャストすればよいか‹
  //関数へ与える引数の型は次の通りです。
  //sendSony(uint16_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats, uint8_t numberOfBits)
  //uint16_t IRco[20][5];//[行][列] イメージは横書きフォーマット
  Serial.print("Read from file: ");
  while (file.available()) {
    //Serial.write(file.read());
    String line = file.readStringUntil('\n');//終端文字'\n'が検出されるまで読んで文字列全体をlineへ入れる
    line = line.substring(0, line.indexOf('#'));//インデックス0(行頭)から(#までのインデックス数)の文字列取得
    if (line.substring(0, 3) == "C00") { //開始位置(0)は含むが終了位置(3)は含まれない
      String command0_0 = line.substring(4, 8); //address
      command0_0.trim();//スペース等を除去
      IRco[0][0] = strtol(command0_0.c_str(), NULL, 16);//address uint16_t
      String command0_1 = line.substring(9, 11);//command uint8_t
      IRco[0][1] = strtol(command0_1.c_str(), NULL, 16);//.toInt();
      //repeatは2固定のようなので省略しようと思う
      String command0_2 = line.substring(12, 14);//Bit
      IRco[0][2] = command0_2.toInt();
      String command0_3 = line.substring(15, 20);//interval
      command0_3.trim();//スペース等を除去
      IRco[0][3] = command0_3.toInt();
      //Serial.println(ss); Serial.println(ssid);
    } else if (line.substring(0, 3) == "C01") {
      String command1_0 = line.substring(4, 8); //address
      command1_0.trim();//スペース等を除去
      IRco[1][0] = strtol(command1_0.c_str(), NULL, 16);//address uint16_t
      String command1_1 = line.substring(9, 11);//command uint8_t
      IRco[1][1] = strtol(command1_1.c_str(), NULL, 16);//.toInt();
      //repeatは2固定のようなので省略しようと思う
      String command1_2 = line.substring(12, 14);//Bit
      IRco[1][2] = command1_2.toInt();
      String command1_3 = line.substring(15, 20);//interval
      command1_3.trim();//スペース等を除去
      IRco[1][3] = command1_3.toInt();
    } else if//中略
//同じパターンの繰り返しでやっていますがもっと良い書き方あると思います。
中略
loop()
//SimpleWiFiServerスケッチを改変して使います
        if (currentLine.endsWith("GET /H")) {
//LEDを制御する代わりにIrSender.sendSony()を実行している
          //digitalWrite(5, HIGH); // GET /H turns the LED off
          //関数へ与える引数の型は次の通りです。
          //sendSony(uint16_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats,
          // uint8_t numberOfBits)
          /*2次元配列 IRco[0][0]*/
//aNumberOfRepeatsは2固定のようなので直接書いています
         IrSender.sendSony(IRco[0][0], (uint8_t)IRco[0][1] , 2, IRco[0][2]); //POWER ON-OFF
          //IRco[0][3] POWER ONから次の操作を受け付けるまでの待ち時間
          delay(IRco[0][3]);
          IrSender.sendSony(IRco[1][0], (uint8_t)IRco[1][1] , 2, IRco[1][2]);
          delay(IRco[1][3]);
          IrSender.sendSony(IRco[2][0], (uint8_t)IRco[2][1] , 2, IRco[2][2]);
//中略
        }
        if (currentLine.endsWith("GET /L")) {
          //digitalWrite(5, LOW); // GET /L turns the LED on
//LEDを制御する代わりにIrSender.sendSony()を実行している
//割り当てる操作を固定するならば次のように書けば良い
          IrSender.sendSony(0x1, 0x15, 2, 12);//TV Power OFF(ON-OFF)
          //delay(1000);
        }
//後略