速さこそ正義

調べたことを書いていきます。

闇のゲームを攻略した

序章

帰宅すると嫁がテレビに向かって無表情でリモコンの"決定"ボタンを連打してた。

何事かと思ったら、期間限定でABC朝日放送※のデータ放送(dボタン)を見ると、ABCeeiSLOTとというミニゲームができるようだった。
※関西のテレビ局

ミニゲームでコインを1000枚集めるとQUOカード一年分ゲットに応募できるチャンスがもらえるらしい。

嫁はスロットが当たるたびに、「やった」と小さくつぶやくと、また無表情でボタンを連打した。

嫁はテレビ番組を見ていなかった。 テレビ局の狙いはゲームをやりながら番組を見てもらい、視聴率やファンを増やすことだったと思うが、私や嫁はもともとABC朝日放送は好きなのでミニゲームがなくても見ている。今の嫁は番組を見ていないのでマイナス効果である。

妻は長時間ボタンを連打したため少し疲れていた。

私は妻の精神的な負担と、全国のリモコンの決定ボタンの塗装が心配になった。

おそらく他のご家庭でも同じ問題が発生しているだろう。

1000コインという頑張れば到達できそうな数字は実は最低でも3時間以上は連打しないといけないゲームだなんて…

これは闇のゲームだ…。

私はエンジニアの端くれとして、この闇のゲームを攻略し、関西の家庭の平和を守るべく立ち上がった。

技術章

リモコンから出ている赤外線を別の装置から連続して送信し続ける装置
=全自動「決定ボタン」連打機を作ることにした。

キャプチャ編

テレビの「決定ボタン」の赤外線信号がどんなものを送っているかわからないため、赤外線受光器を使ってキャプチャし、その信号を送信に使う。

赤外線受光器はこんなこともあろうかと半年前に秋月で20円で購入したものを使った。

電気回路の制御にはArduinoを使った。

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

Arduinoをはじめよう 第3版 (Make:PROJECTS)

Arduinoをはじめよう 第3版 (Make:PROJECTS)

これも5年前に自由研究用に買ったもの。 いまだにたまに使うので重宝する。

赤外線の受信方法は以下サイトを参考にした。

deviceplus.jp

しかし以下のようなコンパイルエラーが出る。

receve:49: error: 'class decode_results' has no member named 'panasonicAddress'
 Serial.print(results->panasonicAddress,HEX);
                       ^
exit status 1
'class decode_results' has no member named 'panasonicAddress'

panasonicAddress関数が見つからないと怒られるので、 以下のように書き換えてその場を凌ぐ。

//IRremoteライブラリのサンプルプログラム
//// ~~~~ 47行目から
else if (results->decode_type == PANASONIC) { 
Serial.print("Decoded PANASONIC - Address: ");
//Serial.print(results->panasonicAddress,HEX); ←エラーがでるのでコメントアウト
Serial.print(HEX); //←受信結果を16進数でとりあえず表示
Serial.print(" Value: ");
////~~~~

送信編

赤外線は赤外線用LEDから送る。 電気回路の制御もArduinoを使う。

詰まったところ

①回路がわからない

送信サンプルコードを見ると、Arduinoのどのピンから電流を流すのか指定していなかった。
上部で指定しているライブラリ(IRremote.h)の中に記載されていると思い、 ライブラリコードの中を30分は迷走したがよくわからない。
こんな簡単なこともできないのかと自分に絶望していると、サンプルコードに

* An IR LED must be connected to Arduino PWM pin 3.

と書いてあった。あほすぎる。。。

②IRsend関数がわからない

Arduinoには赤外線用のライブラリ(IRremote.h)があり、それを使うと簡単に送信できるようだが、
中で定義されてる関数の意味がわからずエラー連発だった。

最終的には Sonyのリモコンでの電源オフ信号を送信するサンプルを参考にPanasonic用の関数(irsend.sendPanasonic)を見つける
Panasonic用の関数が含まれるサンプルコードを漁る。
サンプルコードからPanasonic共通のPanasonicAddress値を見つける。
上記値とサンプリングした受信信号(HEX)を関数に入れる。 これでようやく動いた。

完成品

コード

#include <IRremote.h>

IRsend irsend;

void setup()
{  
}

void loop() {
  irsend.sendPanasonic(0x4004, 0x1009293); //決定ボタン
   delay(2000);
}

今回はわざわざ赤外線を物理的にキャプチャしたけれども、
ボタンの情報はここに載っていた。

memento mori: Arduinoと赤外線LEDでPanasonicのテレビをリモコン操作できた

回路

やっていることはLチカとかわらない。
回路はすごくシンプル。

終章

仕事から帰って作業に取りかかり3時間かけて完成した。 時計は深夜の1時を回っていた。

装置を使う直前は293コインであり、3時間ほど妻が連打した成果がそこにあった。

1000コインまでどんだけ道のりは長いんだ、、、。
もしかしたらこの装置を使っても時間内に1000コイン貯まらないかもしれない。
そう思いながら完成した回路をテレビの前にセットし、私は疲れて寝てしまった。




そして次の日テレビを見ると…





























やりすぎた。

余談

どんだけポイントをゲットしても応募できるチャンスは各賞一人一回まででだった。

しかしこれで関西の家庭からボタンの連打音をなくし、笑顔と会話を取り戻せたのならよしとする。