2017年12月25日月曜日

ニンテンドースイッチでいろんなコントローラーを使う

ゲーム機で他のゲーム機のコントローラーを使う変換アダプタっていうのは色々と出てるけど、その中でも1000円を切るようなコンバーターがあったので友人用にeBayで代理購入をしてみた。
酷威COOV N100ってやつ。eBayで1000円切るぐらいで購入できた。国内でも取り扱ってるショップはあるみたいだけど、1000円以下なら失敗しても悲しくないということで…
最近はN200ってのも出てるようで、こちらは20ドルぐらいっぽい。

COOV N200はレシーバとトランスミッタのセットになっていて、トランスミッタを好きなコントローラーにマジックテープで取り付けてワイヤレス化できると言うもの。
さらにトランスミッタにはジャイロがついてるので、どんなコントローラでもジャイロ対応にできるらしい。まぁ今回はとりあえず試しということで有線のn100を選択した。

とりあえず友人に渡す前に動作確認して使い方を把握しておかねば。

まずはアップデート。
ファームウェアは公式サイトからダウンロードできる。
日本語もあるけど、解凍すると文字化けしてよくわからないので英語版がいいかも。
現時点での最新はV3.4だった。

V3.0からはUSBキーボード、マウス、HID準拠ゲーム コントローラに対応したらしい。
キーボードとマウスを使うにはHUB K4って言うオプションが必要らしけど、DirectInput対応の普通のPC用ゲームパッドは繋げばそのまま動くようになってるかも。

あとは認証用に各純正コントローラが必要みたいだけどPS4とXbox One用のコンバータとしても使えるようになったっぽい?(実機がないので試せないけど)
ファームウェアのアップデート方法はCOOV N100をPCのUSBポートにつなぐとマスストレージデバイスとして認識するので、その中に先程ダウンロードしたfirmware.binを上書きするだけ。
アップデートが完了するとN100のLEDが緑色に点灯したあとに再認識される。失敗すると赤に光る模様。
ちなみにinfo.txtを開くと今入ってるバージョンがわかる。購入時のバージョンは1.5だった。

設定はdata.binというファイルの中に書き込まれる。
今回はまだ何も設定してない状態でアップデートしたので、ついでに設定初期化(restore)用のdata.binも上書きしておいた。(たまにうまく動かない設定ファイルのまま出荷されてるものもあるらしいので念のため。)


ファームウェアアップデートとコンフィグファイル(data.bin)の初期化が終わったところで、早速使ってみる。
ニンテンドースイッチ側の設定を少し変更する必要がある。
ファームウェアがV2.0以上の場合、設定のコントローラーとセンサーでProコントローラーの有線通信をONにする必要がある。ここをONにするまではn100に繋いだコントローラは全く動かない。
N100がPS4コンのジャイロに対応したときにProコン有線モードとして認識されるようにファームウェアを変更したのかもしれない。

とりあえずこの状態でXbox Oneコンを繋いでみたけど特に問題なく動く感じ。
デフォルトのキー配置は物理的に同じ位置にあるキーが割り当てられているので、
Proコン同様の操作性。ジャイロ無いけど。
Xbox OneコンをつなぐとAとB、XとYの印字が反対になる。
なんかQTEが多いゲームとかだと混乱しそうだ。つまりAを押せと言われたらBを押さないといけない。PS4コンの場合はABXYじゃないのでまた違う問題だけど。

一応N100にはキーマッピングという機能がついててキーを入れ替えることができる。
ホームボタンとスティック以外のキーは好きに入れ替えられるらしい。
1.キーマッピングモードに入るにはXboxボタン(ホームボタン)とBボタン(ProコンだとAボタンの位置)を同時に押す。
2.キーマッピング対象のボタンを押す。
3.割り当てたい機能のボタンを押す。
4.ホームボタンを押すとキーマッピングモード終了。

例えばAボタンを押したときにBと認識させたい場合は、
 Xboxボタン+Bボタン同時押し
 A
 B
 ホーム
という順番に押せば良い。
入れ替えたい場合は
 Xboxボタン+Bボタン同時押し
 A
 B
 B
 A
 ホーム
みたいな感じで、ホームボタンを押さない限りは連続して登録できる。

この機能を使えばXboxコンのときにAとB、XとYを入れ替えてしまえば画面表示どおりにキーを押せばいいことになる。
この場合Proコンに慣れてるとむしろ混乱するかもしれないけど、XboxやPCでXboxコンを使ってる人にはこっちのほうが慣れやすいかも?
ちなみにスクリーンショットはXboxボタンを2度押しだった。PS4コンだとまた違うらしい。

設定をもとに戻したい場合はXboxボタンとBボタンを同時押しした後にXboxボタンを3秒以上長押しするとキーマッピングをリセットできる。

キーを押すたびに振動してくれるのでちゃんとキー操作が認識されてるかどうかもわかりやすい。

N100にはキーマップも含めて、結構色んな機能があるっぽい。
・キーマッピング(Xboxボタン+B)
・スティックのデッドゾーンの設定
・速度調整可能な連打機能(Xboxボタン+X?)
・マクロモード(ホーム+マクロを登録したいボタン)

非公式ハードだから本体のバージョンアップで使えなくなる可能性はあるけれどもこんなに機能ついてて1000円以下ならお買い得かもしれないぞ…
HUB K4を購入すればキーボードとマウスも使えるみたいだし。
スリープから解除できないのはちょっと不便かもしれないけどセカンドコントローラとしてなら問題ないしな

最後に分解してみた。

ケースは金属で高級感がある。ネジを外せば分解できる。
メインのマイコンはNuvotonのNUC505Y013Yっぽい。
あとはUSB機能用と思われる12MHzのクロックと3.3Vのレギュレータ、抵抗とコンデンサとLEDぐらい。マイコンだけで300円ぐらいはしそう。


2017年12月23日土曜日

Discord用に簡単なTTS Botを使ってみた。

友人とゲームをするときにはよくTeamSpeak3を使っていたんだけど、最近Discordに乗り換える流れがあったので乗り換えてみた。

ついでにDiscordのAPIを使ってBotが簡単に作れるらしいのでちょっとTTS(text to speech)ボットを作ってみた。要はテキスト棒読みBot。
Discordはブラウザからも簡単に参加できてしまうので、その場で喋れない奴とかたまーにゲーム中に入ってきてもテキスト読めない問題を少しでも解決するために…。

サーバーは現状のLinux鯖を使いたかったので、Bot作成にはPythonのDiscord.pyを使用した。
喋る部分は棒読みちゃんとかを使いたかったんだけど、Linuxだとちょっと面倒だったので簡単に使えるOpen JTalkを使用した。

まずはOpen JTalkをPythonから使えるようにする。

こちらのサイトのjtalk.pyをPython3でも使えるようにちょっとだけ変更して使用した。

#coding: utf-8
import subprocess

def jtalk(t):
    open_jtalk=['open_jtalk']
    mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
    htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']
    speed=['-r','1.0']
    outwav=['-ow','open_jtalk.wav']
    cmd=open_jtalk+mech+htsvoice+speed+outwav
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    c.stdin.write(t.encode('utf-8'))
    c.stdin.close()
    c.wait()

変更したのは音声は再生しないようにしたのとstdin.writeの部分をバージョンに合わせてちょっと変更。

あとはBot本体からこいつを呼び出すだけ。

#coding: utf-8
import discord
import jtalk


client = discord.Client()

@client.event
async def on_ready():
    global player
    global voice
    print("-"*20)
    print("user name:", client.user.name)
    print("user id:", client.user.id)
    print("-"*20)
    channel = client.get_channel('参加させたいボイスチャンネルのID')
    voice = await client.join_voice_channel(channel)
  

@client.event
async def on_message(message):
    global player
    global voice
    # we do not want the bot to reply to itself
    if message.author == client.user:
        return
    jtalk.jtalk(message.content)
    player = voice.create_ffmpeg_player('open_jtalk.wav')
    player.start()

client.run('トークンをこちらに')

とりあえずこんなもんで一応は動いてるっぽい。
テキストの流れが早かったりすると対応できないかもしれないし、チャンネル移動コマンドとか追加していきたい

2017年12月17日日曜日

Lightning - USBカメラアダプタの互換品を買ってみた

たまにiPhoneにカメラをUSBで繋いで画像を取り込みたくなることがあるんだけどLightning - USBカメラアダプタの純正品は高い…
ということでためしにeBayで安いやつを買ってみた。
Lightningコネクタは認証を取ってないケーブルによくある、一体成型じゃないやつ。
USBポート側は純正より丸い感じ。全体的に安っぽいんだけど、実際安い。
これで160円ぐらい。純正品が3200円なので超お安い…

非純正でよくあるのがiOSのアップデートで使えなくなるというやつ。
しかもこいつはiOS9以上対応とか大雑把にしか対応情報が書いてなかった。

とりあえず最新のiOS 11.2.1にアップデートしたiPhone SEで試してみた。
身近にあったUSBメモリを指してみるとこんな状態。
どうやらこの"アクセサリは使用できません。"ではないので問題なく使用できそう。
"接続されたデバイスは消費電力が大きすぎます。"というエラーは純正ケーブルでもいろんなデバイスで発生するようなので問題ない。
USBカメラアダプタの仕様上、100mAとか200mAを超えるデバイスは使えないようなのでその場合はセルフパワーのUSBハブを使うしか無いみたい。
USBデバイスの消費電力情報を読んで判断してるようなので、USB給電ケーブルとかを使ってもだめっぽい。

ちなみにUSBキーボードは使えたのでこのケーブル自体には問題なさそう。

このケーブルに使えるカードリーダーが手持ちになかったので、iPadをiPhoneに繋いでみた。
すると取り込みボタンが表示された!
iOSデバイスをこのケーブルでつなぐと消費電力を100mA以下に抑えるために充電モードにはいらない様になってるのかな。
とりあえずこれでiPadの画像をiPhoneに取り込むことができた。

他にもUSB DACなど、iOSが対応してればいろんなUSBデバイスが使えるらしいので試してみようかな。
160円ならOSアップデートで使えなくなっても問題ないかな。

100mA以下のSDカードリーダー探さないとなぁ

2017年12月8日金曜日

Google Homeで家電を制御してみる

Google Home Miniをせっかく購入したのでこの前作ったIR Stationを使って赤外線リモコンが使える家電をGoogleアシスタントで制御してみた。

流れとしてはGoogleアシスタントをIFTTTと連動させて、IFTTTからIR Stationを呼び出す感じ。
まずは手始めにシーリングライトをオンオフするところから始めてみた。

まずIR StationをどうやってIFTTTと連動させるかなんだけど、Webhookが使えそう。

Chromeのデベロッパーツールで学習リモコンのボタンをクリックしたときの動作を見てみるとsendでIDをPOSTしてる模様。
IDはどうやらリモコンを登録した順番に割り振ってるようで、さらにPOSTじゃなくてGETでも赤外線を飛ばすことができた。

とりあえず必要なリモコンのボタンをどんどんIR Stationに割り振ってIDをデベロッパーツールで調べれば行けそう。


IDの調べ方はIR StationのページをChromeで開いた状態でF12を押してデベロッパーツールを開いて学習リモコンのボタンをクリック。
するとsendが読み込まれるのでそこのForm DataというところにIDが出てくる。この数字がクリックしたボタンに割り当てられてるIDになるみたい。

そしてWebから
http://IR StationのIPアドレス/signals/send?id=先程のID

とすればIR Stationから赤外線を飛ばすことができる。
IFTTTのWebhookを使うためにポートを開けてIR Stationを外部から制御できるようにしておかないといけない。

あとはIFTTTで連動するだけ。Webhookのアドレスの部分はグローバルIPかDDNSを入れる感じ。

ネット経由の割にはだいぶレスポンスが良い。
HomeBridgeとかよりは設定が簡単でいいなぁ

これで赤外線リモコンが使えるものはほぼ音声で制御できるかも?

2017年12月4日月曜日

Google Home Miniを買ってみた

楽天ブックスで半額セールをしていたのでついGoogle Home Miniを買ってしまった。
半額なら最低限普通のスピーカー的な使い方ができれば問題ないかなと言うことで…
おもったよりだいぶ小さい箱。

箱を開けると本体が。ファブリック感が良い。

付属品はちょっとした説明とACアダプタのみ。
ACアダプタはmini USBでデザインとか質感はなかなか良いと思う。

裏面のオレンジ色はゴムで結構グリップする。本体にはACアダプタとミュートスイッチぐらいしか無いかも。タッチ式のボタンはあるようだけど。

音声認識中は真ん中あたりのLEDが光るっぽい。本体の左右を触ると音量の上げ下げができる。

とりあえず電源を入れるとGoogle Homeアプリから設定するように言われるのでGoogle Homeアプリから自宅のWiFiに繋いだり個人設定すれば普通に使える状態に。
音質的には声は聞きやすいかも。低音は物足りないけど作業用BGMぐらいだったら問題ないかもなぁ

IFTTTでも使えるようなので色々連動させてカスタムコマンドで遊んでみようかな

2017年12月3日日曜日

MyGica S270を買ってみた

地デジ用チューナーPLEX PX-S1UD V2.0のOEM元?であるMyGica S270をポチってみた。
11/11のセールにポチって届くのに3週間かかった…
セールだから仕方ないね

MyGica S270
中国から来た割には箱が原型をとどめている

日本語の説明も書いてある!
ISDB-T対応の国の言語それぞれで説明が書いてあるのかな

付属品はアンテナとそのスタンド2種類、アンテナ変換アダプタとUSB延長ケーブル

アンテナ端子はそのままだと日本のF型と互換性がないので付属の変換アダプタをぶっ刺します。

MyGica S270
PX-S1UD V2.0とそっくりというかそのまんま?

とりあえずWindowsで動作確認。
ドライバはPX-S1UD V2.0のものをダウンロードして使用してみた。
BondriverはBondriver_BDATを使用した。
PX-BCUDで環境は整っているのでチャンネルスキャンするだけで普通に使えたー
KTV-FSUSB2のように分波器使わないと極端に感度悪くなるということはないんだけど一部映らないチャンネルも…
CATVパススルー環境だからかなぁ?(PX-S1UD V1はC41ch~C45ch映らなかったみたいだし)

ちなみに消費電力を測ってみた。
MyGica S270
視聴していない時は0.01Aと0.00Aを行ったり来たりなので最大でも10mA流れてる感じかな?

MyGica S270
TvTestでテレビを見ている間は80mAぐらいで安定している。チャンネル切り替え時に50mAぐらいまで落ちたりするけど。

ちなみにPX-BCUDは常に140mAぐらい流れてるけど…

今度はRaspberry Piでためしてみよ。

2017年12月2日土曜日

WiFi学習リモコンを組み立ててみた

Wi-Fi接続の学習リモコンといえばIRKitとかeRemoteとかいろいろ出てるけどどれも意外と値段が張る…
IRKitに関してはオープンソースなので回路図やソフトウェアが公開されていて部品を買って組み立てれば多少はお安くなるんだろうけども、結構部品もお高い。

安価なWiFi搭載マイコンである、ESP-WROOM-02を使って学習リモコンを作っている例が何件かあったので調べてみた。
1つはminIRum。IRKitの一部機能を実現しているもの。
作者さんのサイトではHomebridgeでHomeKit互換の学習リモコンとしての使用例が。IRKit互換なのでHomebridgeではIRKit用のプラグインそのまま使えるっぽい?
もう一つはIR Station。こちらはフル機能の学習リモコンで、タイマーなども使える模様。ブラウザから操作するので対応機種選ばなそう。

ということで今回はIR Stationを作ってみることに。
どちらもESP-WROOM-02なのでハードだけ作ってしまえばソフト書き換えでどっちにでもなりそうだし。

ソースコードや回路図はGithubのIR Stationにアップロードしてくださっているのでそちらを利用させていただいた。

とりあえず部品は手持ちのものを利用して作成することに。
前にAtmega328やRaspberry Piで学習リモコンを自作した時の余りを利用した。

ESP-WROOM-02はだいぶ前に購入して、ユニバーサル基板に実装していたものを再利用した。


ケース買ってからLEDの位置を決めようかと思っていたので赤外線LEDの実装適当。
RGB LEDもケースに入れるときかな…

ソフトの方はArduinoから書き込む。
ESP8266の設定はGithubに書いてあるとおりなんだけど、NTPを使って時刻が正常に取得できなかったのでNTPのサーバーの変更を行った。
ntp.cppのIPAddress timeServerのところをNICTのIPアドレスに変更した。

これで正常に時間が設定されるようになった。

ついでにルータからIR Stationのホスト名を取得するとESP_から始まるデフォルトのホスト名になっていたのでホスト名を"IR-Station"に変更してみた。

修正箇所はwifi.cppの57行目あたりにWiFi.biginがあるのでその上に
WiFi.hostname("IR-Station");
と追加した。

プログラムを焼いたらお次はSPIFFSにWebサーバ用のデータを書き込む。
ファイルシステムにデータをアップロードするためにArduinoにプラグインを追加しないといけない。
Arduino ESP8266 filesystem uploader
こちらからツールをダウンロードしてドキュメントの中にあるArduinoフォルダにtoolsというフォルダを作ってESP8266FSフォルダごと突っ込むだけ。

あとはツールのESP8266 Sketch Data Uploadからデータをアップロードするだけ。
マイコンの設定が正常に行われてないとうまく書き込めないので注意。

起動するとIR-StationというSSIDでAPモードで立ち上がるのでパスワード(IR-Station)を入れて192.168.4.1にアクセスするとWiFiの設定ができる。
あとは自宅のWiFiに繋げば完成っぽい。

詳しい使い方は作者さんのページがわかりやすい。

一応ダイキンのエアコンとNECのシーリングライトがうまく動いてるのですごく便利になった。
エアコンのリモコン信号は特殊な物が多いのでエアコンのリモコンを学習できるリモコンなら他の製品も問題なく動きそう。
ESP-WROOM-02ならRaspberry Piみたいに電源切るとき気を使わなくても良いし、低消費電力だし。
後はこれを小型のケースに組み込みたいな