2018年4月19日木曜日

Raspberry Pi Cameraで長いフレキを使ってみた

Raspberry Pi Camera上でレンズで遊んでいるとどうしても付属のフラットケーブルではちょっと短く感じることがある。ということで長いフレキケーブルを買ってみた。

Aliexpressが一番安い感じで、とりあえず30cmと2Mのフレキケーブルがだいたい同じ値段で売っていた。
今の環境では30cmが扱いやすい感じの長さなんだけど、値段が余り変わらなかったのでつい2mをポチってしまった。CSIインターフェースってこんなに延長しても使えるのか気になったので…


とりあえずこんな小さい箱に入って届いた
通常2mのケーブルとか買ってもこんなに小さくはならないよなぁ


さすがフレキケーブル、だいぶコンパクトに入っていただけでスペック通り2mありそう。


早速ラズパイとカメラモジュールをつないでテスト。
普通にmjpg-streamerでも問題なく動いた。フレームレートにも影響はなさそうな感じ。

さすがに2mは長すぎるけど、付属の15cmよりはだいぶ作業性が良くなった。
しかしCSIインターフェースってこんなに伸ばしても大丈夫なもんなのねぇ

2018年4月6日金曜日

Raspberry Pi CameraでSマウントのレンズをいろいろ試してみた

というわけで前回はSマウント(M12x0.5)のレンズをRaspberry Pi Cameraに取り付けれるようにして見たわけですが、1.8mmのレンズも届いたので改めてレンズによる画角の違いをテストしてみました。

こちらがAliexpressで購入した1.8mmのレンズ。

IRフィルタ付きが一番安かったのでフィルタは外せばいいかなと思ってこちらにしました。
Raspberry Pi Cameraの方にはフィルタが付いてるのでまずはIRフィルタを取り外し。


ラジペンとかでねじると簡単に外れる。
レンズに傷つけないように注意しないといけないけど。

後はこのレンズ、超短いのでレンズマウントで最大まで締め込んでもピントが合わない…
といいうことでレンズマウンタを削ってもらいました。

デフォルトより3mmほど短くしました。


例によってホットボンドで装着。

というわけでそれぞれのレンズでどんな感じに映るかをテスト。

まずはノーマル。

まぁコピーモジュールなのでレンズの品質があまり良くないとか言われてますが、こんなもんかなぁと。

次にSマウントの3.6mm

画角的にはもともとついていたレンズと変わらない感じ。
レンズが大きくなった分多少画質が良くなった気もする?

お次はSマウントの2.8mm

画角がちょっと広くなってるけど画質はあんまり変わらないかな?

最後に1.8mm

画角がだいぶ広がってるし、文字もくっきり読みやすい感じ。
ピントはすべて真ん中のダンボールに合わせるように調整してるんだけど、どうにも1.8mm以外は文字が潰れてしまう。これはレンズの品質によるものなのかなぁ?

ちなみに前回3.6mmを試した際に上手くピントが合わせられなくてマクロにしか使えなくなっていたのはどうやらネジの部分に貼りがあってそれ以上ねじ込めなくなっていたみたい。
今回マウンタを縮めることにより問題がなくなった…

こうやっていろんなレンズを試してみると画質はセンサーの性能だけではないんだなぁということがわかった…
もうちょっと良いレンズを試してみたくなるなぁ

2018年4月4日水曜日

DD-WRTでSoftEther VPNを使ってみた。

iPhoneでVPNで自宅のネットワークに接続するためにDD-WRTでSoftEther VPNを有効化してL2TPで接続してみた。最近の市販ルータはPPTPぐらいには対応してるのが多いけど、せっかくDD-WRTなのでSoftEatherを使ってみた。

使用しているルータはDD-WRT化したWZR-1166DHP。NANDの容量が多いこともあって、公開されているROMでもいろんな機能が付加されている。
ServiceのVPNにはなんとOpenVPNはもちろん、SoftEther VPNの項目まであった。

ただこの項目からSoftEather VPNを有効にしても設定ファイルをコピペしたりしてもうまく動かない…
ということでSSHから手動で設定することに。

まずはSoftEatherの設定を保存するためにAdministration→ManagementでJFFS2を有効化する。

このルーターの場合は結構な容量がつかえるっぽい。

SSHからコマンドを実行したいのでServicesでSecure Shellを有効にしておいた。

SSHでルーターに接続したらとりあえずSoftEather VPNを起動してみる。

vpnserver start
でSoftEather VPNが起動する。

SoftEatherのダウンロードセンターからSoftEher VPN Server Managerをダウンロードしてきて実行する。このツールでサーバーの詳細設定をすることができる。

今回はGUIのvpnsmgr.exeを使用した。

新しい接続設定からルーターのIPアドレスを設定して、接続するとパスワードを設定するように促されるので、設定パスワードを設定し、そのままウイザード形式でVPNの設定を済ませる。このへんは普通のSoftEther VPNの設定と同様に設定できる。
とりあえず今回はL2TPを有効化しておいた。

ウイザードによる設定が完了したら、ローカルブリッジ設定を開く。

ここでは物理的な既存のLANカードとブリッジするのではなくて、新しいtapデバイスを作成した。先程L2TPを設定した仮想ハブにvpnという名前のtapデバイスを作成してローカルブリッジを設定した。

ローカルブリッジを設定したら、サーバーマネージャーを終了してSSHのターミナルに戻るって下記コマンドを実行する。

mkdir /jffs/etc (もしフォルダが存在する場合は不要)
cp /tmp/var/lib/vpn_server.config /jffs/etc


これでSoftEatherの設定ファイルがjffsにコピーされて再起動しても消えなくなる。
後はWebの設定画面からAdministrationのCommandsを開いて、下記のスクリプトをスタートアップに登録する。

#!/bin/sh

ln -s /jffs/etc/vpn_server.config /tmp/var/lib/vpn_server.config
vpnserver start
sleep 5
brctl addif br0 tap_vpn

これをCommandsのところに入力してSave Startupをクリックすればスタートアップスクリプトとして登録される。

あとはルーターを再起動すれば自動的にSoftEther VPNが起動して設定が読み込まれるはず。

最後に外部から接続できるようにNAT/QoSのPort ForwardingからL2TP用に500と4500番(UDP)を開けて完了。
ちなみにiPhoneからの場合は「L2TP-VPNサーバーが応答しませんでした。」というエラーはIPアドレスがちゃんと取得されてない場合も表示されるみたいなのでこのエラーが出た場合はポートがちゃんと開いてるかどうか以外にもブリッジ設定などによってちゃんとIPが取得できる状態になっているかどうかも確認する必要があるみたい…
(自分はこのエラーがでてポートが空いてないと思いこんでいろいろやっていたので)

とりあえずこれでDD-WRT上でL2TPが使えるようになった。L2TP以外の手段でSoftEther VPNに接続する場合はポートを開けておくのも忘れずに。



2018年3月24日土曜日

Raspberry Pi CameraでSマウントのレンズを使ってみた。

Raspberry Pi Camera V1の互換モジュールでいろいろ遊んでみてたんだけど、レンズのピントを調整するときにレンズに傷をつけてしまった…
ということでレンズを交換してみようと思います。

まぁ互換モジュールはお安いのであまり痛手ではないのですが、レンズを替えたらまた面白いことに使えるんじゃないかということで。

とりあえずWebカメラとかではそこそこ使われてるM12×0.5のSマウントレンズを試してみることに。やすいし。
ちなみにレンズを外すとこんな感じ。
ここにSマウントレンズを取り付けられるようにレンズマウントをつけます。

フラットケーブルがあるので、加工しやすいように樹脂製のものを購入。
穴ピッチがちょうど良さそうなやつが2個で2ドルぐらいでした。
ガラス入り樹脂っぽくて結構硬かったのですが、とりあえずフラットケーブルを避けるぐらいのスリッドを入れます。でかすぎると光が漏れるので慎重に…

裏側からネジ止め。結構穴の近くに部品やパターンがあるので樹脂のスペーサーをつけました。

簡単に行くと思いきや…
最初からこの穴位置がなんか中心からずれてると思っていたけどやっぱりずれてる…
そのままでも一応使えたりするんだけど、レンズによってはダメそうなのでネジでの固定ではダメそう。純正モジュールだと良さげな位置なのになぁ

というわけで最終手段ホットボンドで固定。裏から見たらネジの半分ぐらいずれてました。
今回はとりあえず多少光が漏れたりするのは気にしないことに。そもそも基板自体が遮光されてないし。

肝心のレンズですが、一応2.8mmと3.6mmを用意しておきました。どちらも1ドルちょい。ともにF2.0でCMOSサイズ1/3で画角90°らしい。
Raspberry Pi CameraはCMOSサイズが1/4なので画角は90°より狭くなりそう。

とりあえず2.8mmの方は問題なく使えるんだけど、3.6mmの方は最大限にねじ込んでも10mmぐらいのところじゃないとピントが合わないのでマクロレンズみたいになってしまった。
M12のレンズはCCTV用で結構お安いのが手に入るのでいろいろ買って試してみようかなぁ

そういえばもともとのレンズより画質が良くなったように感じるんだけどやはりレンズの差って大きいのかな

2018年1月5日金曜日

ニンテンドースイッチでキーボードとマウスを使う

前回Coov N100でオプションのCoov HUB K4を購入すればキーボードとマウスが使えるという話をしましたが、友人用に代理購入してみた。
スイッチはもともとキーボードを文字入力用とかには使えるみたいだけど、このアダプタを使ってつなぐとゲームの操作に使用できるようになる。
今回も使い方を教えるためと、動作確認のために開封させていただいた。

Coov N100は結構小さい箱だったので潰れたりしてなかったけど、HUB K4はちょっと端っこのほうが破れてた…
eBayで購入して1週間で届いたのですごく速い方だと思う。

箱を開けるとこんな感じ。


付属品はちょっと特殊なケーブルのみ。長さは1mちょいあるかも。

見た目はほんとに普通のハブ。単純にN100の方でVIDとPID読んで認識してるだけで普通のハブなんじゃないかなというぐらい。
PCにつなぐと普通のUSB2.0の汎用ハブとして認識する。VIDは1A40でPIDは0101だった。

Coov N100とは付属のケーブルで接続するとこうなる。

HUB K4自体はminiUSBなのでmicroUSB端子は余る。N100の説明書には不使用と書いてあったが、COOV N200との接続用かも知れない。
OTGケーブルとしても使えるかも?

HUB K4はN100のファームウェアがV3.0以上なら使えるっぽいけど、V4.0が出たということでN100のファームウェアをアップデートしておいた。

V4.0からはAndroidアプリでマウス変換時のパラメータをいじれる様になっりDS4の新しいやつに対応したりしてるっぽい?

USBキーボードとマウスを設定するために適当なコントローラが必要なのでXbox Oneコントローラを使用した。

N100のファームウェアはV3.0以上が必要。
そしてUSBキーボードとマウス設定用に適当なコントローラが必要っぽい。
例によって本体設定のProコントローラの有線接続はオンになってないと動きません。

今回はXbox Oneコントローラを使用したのでボタン配置もXbox One用で説明するので別なコントローラを使って設定する際は読み替えてください。
 1.キーマップモードに入るためにXboxボタンとBボタンを同時押し。
 2.キーボード、マウスの割り当てたいボタンを押す。
 3.Xboxコントローラで割当先のボタンを押す。
 4.ホームボタンを押すとマップモード終了。
でとりあえずはキーマップできる。
更にキーマップはキー入れ替えのときと同様に続けて登録することもできる。
例えばProコンで言う、Aボタンを右クリック、Bボタンを左クリックにしたい場合は
Xboxボタン+B
右クリック→Bボタン(XboxコンのBボタンはプロコンで言うAボタン)
左クリック→Aボタン
Xboxボタン
という順番に押せば良い。

マウスの動きをスティックに割り当てたいときもマップモードに入ってから
マウスをちょっとだけ右に動かす→スティックを右に倒す
みたいな感じで登録できる。

今回使用したDeathAdder 3500の場合はサイドボタンも割り当てることができた。
ココらへんはマウスによるかも。


実機がないから試せないんだけど、この機能はXbox OneやPS4でも使えるらしい。その場合は純正コンを認証用に繋ぐ必要があるようだけど。
N100とHUB K4はeBayで買うと合わせて2400円ぐらいなので、Cross Hair converterとかXIM4とかより断然安い。機能とかはちょっと違うだろうけど。

PCゲーマーでどうしてもコントローラでの操作になれない人にはよいかもしれない。
マウサーとかいうハードウェアチートになるかもしれないので使用時は注意かも。
結構ジャイロ使ってる人のほうが強そうな気もしたり…
何にせよ任天堂認定ハードではないので注意が必要かもです。


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('トークンをこちらに')

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

Related Post

Raspberry Pi Cameraで長いフレキを使ってみた

Raspberry Pi Camera上でレンズで遊んでいるとどうしても付属のフラットケーブルではちょっと短く感じることがある。ということで長いフレキケーブルを買ってみた。 Aliexpressが一番安い感じで、とりあえず30cmと2Mのフレキケーブルがだいたい同じ値段で売っ...