2023年10月30日月曜日

Tverが見れなくなったのはDNSブロックのせいだった。

 FireTV StickでTverが見られなくなったと言われたので、調査してみるとどうやらルーターのDNS広告ブロッカーが原因かもしれないということで調べてみた。AdGuard DNSとか使ってFireTV Stickで広告ブロックしている人たちも見れなくなったらしいし。

とりあえずWeb版でどのDNSがブロックされているのかを確認してみると何件かルーターのDNSブロッカーでブロックされているようだったので一個ずつホワイトリストに入れて試してみた。

結果的にこの前HALOの実績が解除できなくなったパターンと同様に広告ブロックのシェルスクリプト

sed '/imasdk.googleapis.com/d' /tmp/hosts0 -i

を追加することでみられるようになった。他のDNSブロッカーで困ってる人たちもいるようだけど、おそらく"imasdk.googleapis.com"をホワイトリストに追加すれば行けるんじゃないだろうか。しかしAdGuard DNSの設定だけで広告ブロックしていた場合はホワイトリストとか使えないのでちょっと難しいかな…

とりあえずこの設定を追加するだけで今まで通りTverで広告ブロックされつつ動画が再生できるようになった。

2023年10月28日土曜日

Steam版Haloで実績解除されないのはルータのせいだった

 久しぶりにPC版のHalo: The Master Chief Collectionをやっている。Halo4まで入っているのでなかなかのボリュームで、さらには実績の数が700個もある。

ついでに実績も解除しておこうということでXbox one版の攻略サイトを見ながら実績解除をしていたんだけどHalo 2でターミナルの実績が解除されない…

レベルとかそういう条件が合ったのかな?とか思ってぐぐってみると、実はHaloの実績解除されない問題の原因としてファイアーウォールの可能性もあるとか。

ということでここの書き込みをもとにコマンドプロンプトから

ping vortex.data.microsoft.com

をしてみるとIPアドレスが127.0.0.1(ローカルホスト)に向かってPingをしている…
つまりルーターの広告ブロッカーでこのアドレスがテキトーなIPに割り当てられているのでアクセスできないという。

DD-WRT化したルーターにDNSブロックのスクリプトを入れていたのでvortex.data.microsoft.comをブロックリストから外すようにしてpingを打つと今度はonedscolprdeus05.eastus.cloudapp.azure.com [20.42.65.85]という表示になったのでちゃんとした宛先に繋がってそう。

PiHoleを使ってる場合もホワイトリストに追加した方がいいアドレスが2つほどあるらしいのでそちらも確認してみたけどこっちはブロックされていなかった。

とりあえずルーターの広告ブロッカーを設定してもう一度ターミナルに行く前に一番簡単で実績解除をしていなかった"シールド不足"っていう実績を試してみた。これはHalo2で難易度アドバンスまたはレジェンドで、ストリーキング スカルだけをオンにするだけなんだけど、ムービーだけの1:"異端者"や戦闘のない2:"武器庫"だけでも取れる。とりあえずストリーキングスカルをオンにしてレジェンドで最初から始めれば勝手に解除される。

とりあえず異端者のムービーが終わって武器庫が始まった瞬間に解除されたので今回の実績解除されない問題はDNSブロッカーだったということに。次にターミナルの実績を解除しに行ったんだけど無事解除された。

ちなみにレジェンドクリアのカウントはいくつかの実績を解除していったらちゃんとカウントされてるっぽかった。"オプションとキャリア"で一応実績の解除具合が確認できるんだけど、そこのカウントが元々0でおかしいなーと思っていたやつもDNSブロックを外してなんかやってる間に更新されていた。しかし、DNSブロック中に開いたターミナルとか、その場で実績解除されたり、カウントしていたりする実績はもう一回やらないとだめっぽい。でもフィギュアの実績はつながるようになったら一気に解除された。

Halo2のレジェンドクリア実績はスカラベスカルをオンのままでも取れそうなのでとりあえずスカラベスカルをオンでやってみようかな。(自爆で何度もリトライしてるけど…)昔友人とCOOPでなんとかクリアできたような気がしてるし。

Xbox Oneコントローラでやってみてるけど、やっぱりHaloはパットでも行ける気がする。ファームウェア更新でBluetoothも切れにくくなってるし。


2023年10月22日日曜日

ラズパイPicoWのBluetoothでSPPを使ってみた

 Raspberry Pi Pico Wは元々WiFiとBluetooth対応のワイヤレスモジュールを搭載していたのにもかかわらず最初はWiFiしか使えなかったんだけど、SDKがいつの間にかBluetoothにも対応していたので試してみた。

技適マークも本体に刻印してほしいよなぁ

環境はArduino IDE 2.2.1にEarle F. PhilhowerさんのArduino Core 3.6.0を使用した。こっちのほうがビルドが早いし。

SerialBTライブラリを覗いてみたんだけど、ESP32のBluetoothSerialみたいに接続状態のステータスを確認したりできないっぽい(private関数内にはあるようだけど)
とりあえずESP32でやったみたいにUARTデバイスをBluetooth化するスケッチを作ってみた。
#include <SerialBT.h>

void setup() {
  Serial2.setTX(4);
  Serial2.setRX(5);
  Serial2.begin(115200);//有線デバイスのBaudrateに合わせる

  SerialBT.begin();
  gap_set_local_name("PicoW BT");//Bleutoothデバイス名変更
}

void loop() {
  if (Serial2.available()) {
    SerialBT.write(Serial2.read());
  }
  if (SerialBT.available()) {
    Serial2.write(SerialBT.read());
  }
}

これでGP4(TX)とGP5(RX)に接続したUARTデバイスをBluetooth SPP化できる。いわゆる透過モードってやつ。例によってBluetoothの仮想COMポートに接続するときはBaudrateは何に設定しても問題なく接続できるんだけど、有線デバイス側のBaudrateを変えたいときはスケッチから変更しないといけない。RN42みたいにコンフィグモードとかを実装すればいいんだけれども…

デバイス名変更とかはライブラリの関数では用意されてなかったので直接弄ってるけど、ステータスとかも取得できるかもしれない。
Windowsの仕様でCOMポートは2つ認識されるんだけど"PicoW Serial"ってなってない方は削除してもOK。ちなみに上のスクショはデバイス名を変更する前に取ったスクショなのでデバイス名がデフォルトの長いやつになってる。

今のところはESP32のほうがステータスLED実装できたりするので便利かもしれない。

例によって5V系のマイコンにつなぐときはI2Cとか用のレベルコンバータを使用すると良いと思う。

2023年10月20日金曜日

デジタルワットメーターをArduinoに繋いでみた。

 PZEM-051っていうDCのデジタルワットメータを解析している人がいて、Arduinoでデータを取り込めるらしいのでやってみた。PZEM-021でも良かったんだけど、PZEM-021だとシャント抵抗内蔵で20Aまで。PZEM-051だと50Aか100Aのシャント抵抗が外付けっぽい。

KT-D1384っていうそっくりなやつがあったんだけど、結局中身はPZEM-051だった。中華製なので出荷時期によって変わったりするかもしれないから注意なんだろうけど…

PZEM-051の裏面の蓋を開けてみるとこの基板はPZEM-051(v5.0)だった。PEACEFAIRっていうメーカー、一応PCに出力できるタイプのワットメータもAC、DC問わずにランナップされているけど液晶付きのやつをよく解析されてる気がする。
このモデルの場合はTM1621BっていうLCDコントローラとMCUの間のSPI通信を解析して実現しているっぽい。

GithubにはPower Meter LoggerとしてArduinoのスケッチも公開してくれているので、ありがたく利用させていただくことに。LoggerってなってるけどESP32のシリアルコンソールから流しているだけっぽい。

PZEM-051はテストパッドが出ているので、T1をCS_PIN、T2をCLK_PIN、T3をDATA_PINに接続すれば良い。間に保護用の抵抗入れたほうが良いかな?
回路を見るとVDDっていうテストパッドに3.3Vが来ているし、それでLEDのバックライトをつけたりしているので低消費電力な3.3Vマイコンなら電源もいただけるのではないかなということでAttiny1614で試してみることに。スケッチのサイズが4kbを超えるのでAttiny402は厳しそうだったので…
void loop() {
  static unsigned int updateRate = 200;//データ出力頻度
  static unsigned long lastUpdate = 0;
  if (lastUpdate + updateRate <= millis()) //updateRate[ms]周期で実行
  {
    lastUpdate = millis();//次の実行のために現在時間格納
    Serial.print(get_voltage());
    Serial.print(" V\t");
    Serial.print(get_current());
    Serial.print(" A\t");
    Serial.print(get_power());
    Serial.print(" W\t");
    Serial.print(get_energy());
    Serial.println(" Wh");
  }
  if (Serial.available() > 0) { // シリアルバッファチェック
    char in = Serial.read();
    if (in == 't') {
      unsigned int input = Serial.parseInt();
      if (input >= 50) {
        updateRate = input; //データ出力頻度変更
      }
    }
  }
}
そんでもってloopのところだけ上のように変更した。電圧、電流、電力、電力量をタブ区切りで出力できるようにして、出力頻度を変更できるようにした。
シリアルでt1000って送ると1秒間隔でデータが送られてくるような感じ。

ロギングしたいのであればこれにOpenLogを接続しても良いし、ESP32を接続してWiFi対応にしても面白いかも。ESP32は電力を食うので別なDCコンバータとかから電源を用意しないといけないかもしれないけど。
ちなみにRS485のModbus対応とかだったらLCDはついていないけどPZEM-017というのが存在するみたい。ただし200msぐらいでしか通信できないみたいなので、RS-232CとかでデータストリームするぐらいだったらPZEM-051を改造したほうがデータ更新頻度は高そう。


2023年9月10日日曜日

ESP32でトランシーバを作ってみた。

 前回、ESP32でI2S DACとI2Sマイクを試してみたのでESP32で無線LANトランシーバを作ってみることに。ESP-NowやWiFiのUDP通信を使ってトランシーバを作っている人がいたのでとりあえずこの方のプログラムをArduino環境でビルドして使ってみることに。ESP-Nowを使えばWiFi APがないところでも気軽につかえるし、WiFi STAモードでWiFiルータに接続すれば中継機やメッシュWiFiルーターで距離を伸ばしたりもできるかも。

esp32-walkie-talkie

原理とか動作デモとかもGithubのYoutubeリンクを見るとわかり安く説明されていた。I2Sマイクのノイズ対策とかも解説してくれている。

このソフトウェアはPlatformIOで作られているようだったんだけど、Arduino IDEでもビルドできそうな気がしたので試しにやってみた。

まずは上のリンクからソースコード一式をZIPでまるっとダウンロード。

Arduino IDEで新しいプロジェクトを作成して(今回はesp32-walkie-talkie.inoにした)、最初に生成されるsetup()やloop()を消してまっさらにする。
srcフォルダ内のmain.cppの中身をテキストエディタで開いてそこにコピペする。そしたら一旦inoファイルを保存してArduino IDEを閉じる。

Arduino環境だとinoファイルと同じ名前のフォルダが作成されてその中にesp32-walkie-talkie.inoが入ってると思うんだけど、そこにsrcフォルダ内のmain.cpp以外のファイル4つをコピーする。

あとはlibフォルダの中の各ライブラリ(5種類)の中のsrcフォルダの中身だけ(cppファイルとhファイルだけ)を全部inoファイルと同じフォルダにコピー。同じフォルダに30個以上のファイルができてちょっと見にくくなるんだけどこの状態でArduino IDEからinoファイルを開くと他のファイルを認識してタブが増えているはず。

あとはconfig.hタブを開いて<< YOUR_SSID >>とか書いてあるところを直してやればビルドできるはず。(SSIDとパスワードは""で囲んで記入する)
ESP-Nowを使う場合もこの部分を直しておかないと変な文字<<>>が入っているせいでビルドできないのでここに適当な文字を""で囲んで入れておくと良いかも。そして
#define USE_ESP_NOW
のところのコメントアウトを外すとESP-Nowでダイレクト接続される。(WiFiルータなどのアクセスポイントは不要なので外とかで使いやすいかも。)

ちなみに今回はArduino IDE 2.1.1にESP32-Arduino-Core 2.0.6の組み合わせでビルド成功した。

ESP32トランシーバー

ピンアサインはとりあえずこのプログラムのデフォルトを使用した。
INMP441のほうは
GND→GND
VDD→3.3V
SD→21
SCK→18
WS→19
L/R→3.3V(スケッチにはGNDに繋げば良さそうに書いてあったんだけどGNDだと鳴らなかったのでHIGHに)

MAX98357Aモジュールの方は
Vin→5V
GND→GND
SD→22
GAIN→何も繋がない(ゲインはデフォルト設定)
DIN→5
BCLK→18
LRC→19

こんな感じでI2Sの一部のピンはマイクとDACで共用である。

あと送信ボタン(プレスボタン)は23番Pinと3.3Vの間にタクトスイッチなどのプッシュボタンを接続。23がHighになると音声をもう片方に送信。Lowになると受信。

あとはこれを二台用意して送信ボタンを押したほうの音声がもう片方から再生される。

音声は結構きれい。SAMPLE_RATEは変えられるようになってるので距離が遠くなってデータレートが落ちそうな場合は下げてみると途切れずに送れるようになるかも。遅延も一旦バッファしている割には少ない感じ。

PCのUSBに繋いでデバッグしてるときはマイクはかなりノイズを拾ってる感じだった。プログラム書き換え後とりあえずモバイルバッテリに繋いで試してみたらだいぶ良くなったのでとりあえずはモバイルバッテリでテストした。(本家のマイク用ノイズ対策回路は入れていないため。)

バッテリを搭載してケースに入れたら結構使えるかも。通知音とか鳴らせるようにしたら面白そう。フラッシュ容量はまだ余裕がありそうだし。いまはWAVEデータそのまま送っているので、Codec 2とかで圧縮して使用する帯域を減らしてやれば距離が離れても音声は聞きやすくなるかも。

スピーカーはジャンクノートPCのスピーカーを使ったけど秋月の小さいスピーカーとかDACとスピーカーが一体になっているM5StickC PLUS Speaker 2 HATとかを使ってもいいかも。音質は大きい方が良いのかもしれないけど…

ちなみにこのスケッチ、RISC-VのESP32-C3でも使用できた。ピン配は変更する必要があるけど、I2S DACとI2Sマイクを使用する設定であればESP32-C3でも普通に使える。ESP-NowでESP32とESP32-C3間で通話もできた。バッテリ駆動で作るならESP32-C3のほうが電池持ち良さそうだし。


2023年9月2日土曜日

ESP32でI2S接続のマイクを使ってみた

 前回はESP32に外付けDACをつけてみたけど、今回はI2S接続のマイクを試してみた。

使用したのはINMP441を搭載したモジュール。Aliexpressで180円だった。ESP32にI2Sで接続して音声データを取得できる。

IC自体はこっち面についているんだけど、音声取り込み口は反対側に空いてる基板の穴から取り込むみたい。

このマイクモジュールとしてはこっち側は表面ということに。中央の穴がマイクの穴。

早速ESP32に接続して試してみた。

ライブラリを使用せずにファイルシステムにPCMデータを保存したりするサンプルが多いんだけど、そのままPCで聞けるとテストが楽で良いなぁとおもって探していたら便利なライブラリを発見。

arduino-audio-tools

このライブラリは音声関係のエンコーダやデコーダも入っていて、サンプルにI2Sのマイクから取り出したWAVEデータをブラウザでストリーミングできるサンプルも入っていた。

このサンプルはstreams-i2s-webserver_wav.inoのWiFi接続用SSIDとパスワードを変更するだけで、あとは解説ページでも同じくINMP441で解説されているので図のように接続するだけ。書き込み終わったらシリアルコンソールに出たIPアドレスに接続するとブラウザにストリーミングの画面が出るので再生ボタンを押すだけ。

結構プツプツとノイズが入るんだけどこれは電源ラインなのかなぁ?ちなみにファイルシステムに録音するサンプルも試してみたけどそちらは結構いい感じだった。調べてみるとINMP441はこのサンプルのように16Bitで使うとノイズが目立つとかで、ファイルシステムに録音するサンプルでは32bitで取ってきて処理を入れているようだった。
ストリーミングでもそんな事ができるのかもう少し検証してみるかな…


2023年8月26日土曜日

ESP32でMAX98357Aを使ってみた

 I2S接続のモノラルなアンプ付きDACがAliexpressで155円だったのでポチってみた。送料は一応このDAC2個の他に3点入れても170円だった(トータル1000円かからないお買い物)

MAX98357A搭載のモジュールなんだけど、1チップでI2SのDACとD級アンプが内蔵されていてスピーカーと直結できる模様。モノラルなのでステレオで出したい場合は2個必要らしい。一応2個買ったけど。

MAX98357A
見た目はAdafruitのものとほぼ同じである。基板の色が違うぐらいしか…
デフォルトでは5Vで動作させるとモードがLRミックスでゲインが9dbに設定されているっぽい。

さっそくESP32に接続して使ってみた。

ライブラリは有名所っぽいのが2種類あったのでまずはESP32-audioI2Sを試してみた。
こちらのライブラリは簡単にMP3なネットラジオを再生できるようなサンプルがあったのでそのまま試してみた。
しかしビットレートが高くなったとき?にプツプツと切れるっぽい。ESP32でストリーミングデータを受信しながらMP3デコードはちょっと厳しいのかな?

ライブラリもデュアルコアのESP32にしか対応していないっぽいし…

念のため別な方のライブラリも試してみることに。
ESP8266AudioはESP-WROOM-02でも音声が再生できるようなライブラリ。内蔵DACにも対応している。
ESP32でこのライブラリを使う場合のデフォルトピン配置は
LRC→25
BCLK→26
DIN→22
になっていた。このモジュールはアンプ内臓なのでVinは5Vに接続した。

こちらにはWebRadioというサンプルがあったのでそのまま使ってみた。しかしブラウザからシリアルコンソールに出たIPにアクセスしてもブラウザに"ERR_EMPTY_RESPONSE"というエラーが出て設定画面が開けない…

色々探していると、サンプルのweb.cpp内の処理でflush()関数がESP32 Arduino Coreのバージョン1と2で動作が異なるのに起因しているっぽい。このサンプルは1.0.x向けに作られているのでここらへんを2.0.xで動くように作り変えないといけない。GitHubのフォーラムに修正方法が載っていた。
ということでweb.cpp内の
    client->flush();
ってなってるところ2箇所を
    while (client->available()) {
      client->read();
    }
のように変更した。
Coreのv1ではflush()関数がバッファクリアしていたのに対して、v2ではflush()関数が処理が終わるのを待つような仕様になったためらしい。なのでバッファが0になるまでreadでバッファをクリアしている。(Serialも同じような仕様変更あったな…)
この変更をしたらブラウザで設定画面が開けるようになった。

同じラジオ局で試してみたがこっちのほうが安定性がいいかも。
最初の方はプツプツ切れたりするんだけど安定するとちゃんと再生できてるっぽい?

ちなみにESP32のI2S機能はGPIO Matrixに対応しているっぽいのでピンは入力専用ピン以外だったらどこでも使えそう。ライブラリによって微妙にピン設定が違うのでちょっとハマったけど、好きなピンに設定してしまえば良さそう。wclkPinはモジュール上はLRCだったりとか呼び方も微妙に違ったり…

さすが外付けDAC。ジャンクノートPCのスピーカを繋いで使ってみたけど音質は結構クリア。簡易的なWebラジオとして使う分には十分なんじゃないかな。