わかったことを書いておきます。<br />
<br />"IRremoteESP8266"ライブラリのsendPanasonic(SHARP用)関数の構文sendPanasonic(const uint16_t address, const uint32_t data,
const uint16_t nbits, const uint16_t repeat)
address = 0x555A(固定) data = 0xF148****(0xF148は固定 ****は下記参照)
nbits = 48(固定)repeatは 省略して良いようです。
このコマンドリストは"IRremoteESP8266"ライブラリで使える(?)はずです。
調べきれていないため、同じボタン名で異なるコマンドがあったりしますが、
何らかの反応があったものはすべて載せています。
テレビ機種による差もあるかもしれません。
文字数字の間違いがあるかもしれませんので注意してください。
****はコマンド+パリティ
ボタン名 コマンド+パリティ
選局+ 8885
選局− 4889
入力切替 C881
音量+ 288F
音量− A887
電源ON/OFF 688B
消音 E883
音声切換 188C
おはようタイマー 9884
オフタイマー 5888
画面表示 D880
カーソル移動↓ 0481
決 定 4A8B
カーソル移動↑ EA81
静 止 9A86
カーソル移動← EB80
カーソル移動→ 1B8F
戻 る 2780
AVポジション E78C
終 了 AF80
操作切換 9141
電源ON 524E
電源OFF D246
1 724C
2 F244
3 0A43
4 8A4B
5 4A47
6 CA4F
7 2A41
8 AA49
9 6A45
10/0 EA4D
11 1A42
12 9A4A
数字キーパネル 5A46
Dデータ連動 7A44
番組情報 FA4C
番組表 064F
映像切換 6649
字幕 E641
テレビ/データ D642
ホームと同じ? AE4D
青 0148
赤 8140
緑 414C
黄 C144
地上D 9141
BS 514D
CS D145
地上A 714F
地上D? 1941
常連番組 D541
ホーム DD49
ツール 3D47
レコーダー電源 00D7
再生 80D8
停止 40D4
早戻し C0DC
早送り 20D2
録画 A0DA
録画停止 60D6
機能選択 E0DE
ファミリンク 48DC
録画? C9F7
一時停止/静止 A5FD
停止 65F1
再生 E5F9
録画リスト B5FC
10秒戻し F5F8
30秒送り 0DFF
新しい発見があれば続きます。
この記事は書きかけなので、変更するかもしれません。
ポイント
シリアルモニタからリモコン送信スケッチのパリティ入力不要にした。
ライブラリ"IRremoteESP8266"のサンプルスケッチ"IRsendDemo"を改変
ESP32 DEV Module互換品(?)でテスト
使い方
シリアルモニタを開いて、通信速度を合わせ、テキストボックスへテストしたいcommandを入力し"送信"を押す。
"0x"は省略可、”F148”は固定、commandは3桁、パリティは"0"(ゼロ)で入力する。
パリティは算出された値に置き換えられて送信される。
下は入力例の画像です。"0xF148C880"入力して送信すると、下から2行目の"F148C881"が
送信されます。
参考スケッチ//省略
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
uint32_t IRcommand = 0;
String SerialRead;
//中略
void setup() {
irsend.begin();
Serial.begin(115200);
}
loop()関数の中に追加
if (Serial.available()) {
//例 line=line.substring(0,line.indexOf('#')); //インデックス0(行頭)から(#までのインデックス数)の文字列取得
SerialRead = Serial.readStringUntil('\n'); //終端文字'\n'検出まで読み文字列全体を変数へ(Stringオブジェクト)
SerialRead.trim();
//strtol関数は文字列をlong int型の数値に
//strtoul関数はunsigned long int型の数値に変換します
IRcommand = strtoul(SerialRead.c_str(), NULL, 16);
//パリティ計算に不要な最上位のFを消しておく例0xF148A887と0xF0000000のXOR取る
uint32_t aIRcommand = IRcommand ^ 0xF0000000;
Serial.println(aIRcommand, BIN);
uint32_t val1 = aIRcommand >> 24;//upper
Serial.println(val1, BIN);//デバック
uint32_t val2 = aIRcommand << 8;
val2 = val2 >> 28;
Serial.println(val2, BIN);//デバック
uint32_t val3 = aIRcommand << 12;
val3 = val3 >> 28;
Serial.println(val3, BIN);//デバック
uint32_t val4 = aIRcommand << 16;
val4 = val4 >> 28;
Serial.println(val4, BIN);//デバック
uint32_t val5 = aIRcommand << 20;
val5 = val5 >> 28;
Serial.println(val5, BIN);//デバック
uint32_t val6 = aIRcommand << 24;
val6 = val6 >> 28;
Serial.println(val6, BIN);//デバック
uint32_t valP = val1^val2;
valP = valP^val3;
valP = valP^val4;
valP = valP^val5;
valP = valP^val6;
Serial.println(valP, BIN);//デバック
IRcommand = IRcommand | valP;//パリティを追加
Serial.println(IRcommand, BIN);//デバック
Serial.println(IRcommand, HEX);//デバック
//
Serial.println("Sharp AQUOS TV sendPanasonic");
//irsend.sendPanasonic(0x555A, 0xF148A887, 48); //例 音量- 48bit repeatなし
irsend.sendPanasonic(0x555A, IRcommand, 48); // 48bit repeatなし
//delay(2000);
}
//省略
つづくかも
この記事は書きかけなので、変更するかもしれません。
この記事に関係する最新の記事があります。
ポイント
AQUOSだけどプロトコルはパナソニックだった。
ライブラリ"IRremoteESP8266"を使ってみた。
シリアルモニタからリモコン送信できるスケッチを書いてみた。
ユニークな卵型リモコンなので、掴みにくく落下を繰り返して現在の姿になっています。
ボタン数が少ないので、例えば地上波、BS/CS切り換えなんかは、
”ホーム”を押してメニューから選ばなければならないので不便です。
汎用リモコンでは、直接切り換えられるボタンがありますが、本当に使えるのか心配です。
購入の前に調べてみようと思いました。該当するコマンドがわからず、可否はまだ判明していません。
いろいろわかったことを書いておきます。
今回は"IRremoteESP8266"ライブラリを使わせていただきました。
というのは、"IRRemote"ライブラリの"ReceiveDump"ではKaseikyo: 8 bit parity is not correct. Expected=0xCF received=0xD152128F5A address=0x128 command=0x52
以降省略("決定ボタン")
>>>>Protocol=Kaseikyo_Sharp Address=0x128 Command=0x52 Parity fail Raw-Data=0xD152128F5AAA 48 bits LSB first
Send with: IrSender.sendKaseikyo_Sharp(0x128, 0x52, );
というようなシリアルモニタ表示になります。
その中に"not correct"とか"Parity fail"の文字が読み取れます。
試しに"IrSender.sendKaseikyo_Sharp()"に、表示されたAddress、commandを
引数に入れて送信してみましたが無反応でした。
何かの設定で使えるのかもしれませんが、他のライブラリを試すことにしました。
"IRremoteESP8266"(ESP8266とありますがESP32でも使えます。)
感謝して使わせていただきます。
AQUOSだけどプロトコルはパナソニックだった。
サンプルスケッチ"IRrecvDumpV2"を使って調べます。("決定ボタン"押した時)Protocol : PANASONIC
と表示されました。
Code : 0x555AF1484A8B (48 Bits)
中略
uint32_t address = 0x555A;
uint32_t command = 0xF1484A8B;
uint64_t data = 0x555AF1484A8B;
SHARPのAQUOSなんですがプロトコルはパナソニックなんですね。
サンプルスケッチ"IRsendDemo"のloop()中へirsend.sendPanasonic(0x555A, 0xF1484A8B, 48); //引数に直接command 例 決定ボタン 48bit repeatなし
追加してみると操作できました。
シリアルモニタからリモコン送信できるスケッチを書いてみたので載せておきます。
シリアルモニタの上のところに"command"の含まれる引数をキー入力して"送信"ボタン又はEnterキー押す。
前述の例では、2番め引数の"0xF1484A8B"の中の"F148"は固定、以降の3桁"4A8"が"command"、
最後の1文字は"1484A8"のパリティです。
未知の"command"を試すにはパリティを計算して入れる必要あり。(面倒くさい 改善の余地)
パリティ計算の参考
16進数:1,4,8,4,A,8
2進数で表現すると:0001,0100,1000,0100,1010,1000
1個めと2個めのXOR(排他的論理和)を求め、3個めとXORを求め・・・やっていくと
0001 XOR 0100 = 0101 , 0101 XOR 1000 = 1101 ,1101 XOR 0100 = 1001 , 1001 XOR 1010 = 0011
0011 XOR 1000 = 1011(16進数で"B"になる)//省略
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
uint32_t IRcommand = 0;
String SerialRead;
//中略
//loop()関数の中へ
if (Serial.available()) { //シリアルモニタからcommand部分だけ打ち込んでEnterすると
SerialRead = Serial.readStringUntil('\n'); //終端文字'\n'検出まで読み文字列全体を変数へ(Stringオブジェクト)
SerialRead.trim(); //念の為入れておく
//strtoul関数はunsigned long int型の数値に変換します
IRcommand = strtoul(SerialRead.c_str(), NULL, 16);//基数16
Serial.println(SerialRead);//変換前の文字列 デバック
Serial.println(IRcommand, HEX);//変換後の数値をHEX表示 デバック
/*赤外線送信の構文参考 sendSharp(const uint16_t address, uint16_t const command,
const uint16_t nbits, const uint16_t repeat)*/
Serial.println("Sharp AQUOS TV sendPanasonic");
//irsend.sendPanasonic(0x555A, 0xF148A887, 48); //引数に直接command 例 音量- 48bit repeatなし
irsend.sendPanasonic(0x555A, IRcommand, 48); // 48bit repeatなし
}
//省略
つづくかも
こんなことがありました。笑ってやってください。
4年前に書いたスケッチが必要になり、書き込みしたらコンパイルエラーになって
"exit status 1
control reaches end of non-void function [-Werror=return-type]"
調べたら<br />void以外の関数で戻り値が無いと次のエラーとなる。<br />"戻り値"が必要ないこともありますが・・・<br /><code>return true</code>と入れたらコンパイル出来ました。
ちなみに
次のスクリーンショットArduino IDEの環境設定で"コンパイル"のチェックを外すとエラーになりません。<br />以前からチェック入れていて、エラーは出なかったと記憶しています。
でも、これからは正しいcodeを書くようにしたいと思います。