2023年12月26日火曜日

ダイソーのUSB Type Cケーブルを買ってみた。

 久しぶりにダイソーに行ったらUSB Type Cケーブルが売っていたので試しに買ってみた。

何種類かあったんだけど100円の5V3Aタイプにしてみた。
セリアで前に60Wタイプを購入したときはデータ転送ができなかったんだけど、これは5V3Aのかわりにデータ転送ができる感じかな。300円商品になるとどっちもできるのが売っていたけど、おそらくケーブルの太さ=銅の量で電流と値段が決まっていそう。
青とシルバーの在庫があった。ケーブルはツルツルしていて少し硬い感じ。やすいケーブルってこんな感じだよね。

そんでもって試しに60WなPD充電器でノートパソコンに繋いでみたら(良い子は真似しないほうがいいかも)ちゃんと充電できた。ってことはこのケーブルの中身は6本でUSB2.0が4本+CC1とCC2で2本結線されてそう。前に買った給電専用のセリアのケーブルは電源2本とCC1とCC2が結線されている感じだったので、おそらく通信用のケーブルが結線されている分電流控えめって感じなのかな。

コネクタ自体はカチッと挿さるのでとりあえずはUSB2.0デバイス用としてはまずまずかも。


2023年11月23日木曜日

ESP32で昇降圧DCコンバータを使ってみた。

 前にESP32搭載のラジコンでモータのノイズや電圧ドロップでESP32がリセットしてしまう対策に昇圧DCコンバータを使ってみたんだけど、安い昇降圧DCコンバータをAliespressで買ってみたので試してみた。Lipoを使うと結局4.2Vからどんどん下がって3Vになってしまうんだけど、わざわざ昇圧してから3.3VをLDOで作るのも効率が悪そうだし。

DD0603SA

今回購入したのはDD0603SAっていうモジュール。ICの刻印は2149Fってなってる。ME2149っていうICっぽい。このIC自体は昇圧DCコンバータなんだけど、SEPIC方式の昇降圧DCコンバータとして動かしてる模様。
対応電圧が色々あったんだけど、たまたま3V版が安かったので3V版をポチってみた。ESP32で使うにはそのままでも問題ないと思うんだけど、他のICとかを考えると3.3Vにしておきたい。3.0V仕様ではR1が10kΩ、R2が14.0kΩになっていたんだけど、R1を10kΩ、R2を16.5kΩにすれば3.3V仕様に変更できるっぽい。

3.3V仕様にするのに16.5kΩがなかったので、適当なジャンクボードについていた16kΩを移植してみた。R2の抵抗値が高くなると電圧が高くなるんだと思うんだけど、16kΩでもすでに3.33V出ていたのでちょうどよかったのかもしれない(抵抗の誤差によるものかもしれないけど)

仕様的には0.9Vから6V入力まで対応なので1Sのリチウムイオンだけではなくて、Ni-MHでもESP32を駆動するのにはいい感じに使えそう。試しにESP32を搭載したメカナムラジコンに搭載してみた。このラジコンは1Sのリチウムイオンバッテリ駆動なんだけども、バッテリが減ってくるとESP32がリセットしてしまう対策に昇圧DCコンバータで4.5Vぐらいに昇圧してからLDOで3.3Vを作っていたので、このDCコンバータを使えば自動で昇降圧を切り替えてくれるので効率が良くなるはず…

結果的には駆動時間はほぼ変わらず。昇圧コンバータでノイズ対策したときと同じく、Lipoバッテリを3V付近まで使用できた。ラジコンの場合はESP32よりもモータでバッテリを消費するのでこの使い方の場合は昇圧コンバータ+LDOでも駆動時間はあんまり変わらないのかもしれない。Ni-MHを2本で長時間ESP32を駆動させるようなアプリケーションとか、ソーラバッテリでNi-MHを充電しつつ環境計測するようなシステムだと変わるのかな?

なんにせよ昇圧+LDOとお値段はあまり変わらないのではんだ付けとかなしで使うのであればDD0603の3.3V版を購入すればそのままESP32開発ボードに直結できるので良いかもしれない。


2023年11月19日日曜日

ハイブリッド中華イヤホンのKZ ZNAを買ってみた。

 いままでPCではKZ ZSN ProXというハイブリッド中華イヤホンを使っていたんだけど、もう3年ぐらい使っているので11月11日セールで新しいイヤホンをポチってみた。2261円だったんだけど、ほかに300円ぐらいのものを同時にポチったのでセールで500円引きになった。(2500円で500円引きらしい)

今回購入したのはKZ ZNAってやつ。今回もDD1+BA1なんだけど、DDが12mmとなっているっぽい。ZSN ProXはたしか10mmだったはず。

パッケージはかなりコンパクト。プチプチの袋に入っていただけなのに凹んでいない。Aliexpress Standard Shipping早いし国内は結構ヤマトで届くことが多いので便利。
裏面はこんな感じ。今回はマイク無し仕様にした。
プレートはメタルで、穴から半透明の樹脂部品が出ている感じ。

ケーブルは編んであるタイプじゃなくなったので引っかかりがなくなったのはいいかも。でも芯線が細くなってるような気がするので少し安っぽく感じるかも。

肝心の音質的にはDDが12mmになったので低音もりもりかなと思ったら意外と全体的にクリア感がました気がする。でもまぁZSN ProXで不満はなかったのでこのぐらいの違いならいい感じかな。

結局5年前にTRN V20買ってからPCではハイブリッド中華イヤホンがメインになっている気が…
TRN V20→KZ ZSN→KZ ZSN ProX→KZ ZNAときているのでKZに慣れちゃったってのもあるかも。TRN V20とかに戻るとなんか物足りないし…

逆に有線イヤホンはPCでしか使わなくなったかも。iPhoneにはイヤホンジャックがなくなったし。Yinyoo BT4を活用しないと。


2023年11月18日土曜日

USB Type Cの2Sバランス充電モジュールを買ってみた。

 2SのリポをUSB Type Cで充電できる基板が安く売っていたので試しに購入してみた。以前改造したメカナムホイールなラジコンとかだと模型用のDCモータだから1Sでも良かったし、USBで手軽に充電できるのが良かった。2SのリポもUSBで手軽に充電できたらもっとパワーが有るおもちゃが作れそう…


どうやらIP2326というコントローラチップを搭載した充電モジュールで、2Sと3Sのリポバッテリに対応できるみたい。半田ブリッジジャンパで切り替えられるようになっている。ちなみに2Sだとバランス充電もできちゃうみたい。

今回は2Sのバッテリが使いたかったのでもともと2S設定になってる基板を購入した。Aliexpressで199円だった。

バッテリとの接続はコネクタにしたかったのでバランス充電器でよくあるJSTのXHシリーズにした。昔BeagleBone用に作った2SのバッテリもXHコネクタにしていたし。

このボード自体もXHコネクタを付けてくれと言わんばかりの設計。前回バッテリを作ったときに梅沢無線で買っていたサイド型のXHコネクタがそのまま装着できた。念のため買っておいてよかった…(梅沢が土曜日定休日になってから行ってないな

一応充電電流と充電電圧も変更できるっぽい。VSETは電圧設定で、未実装なので8.4Vになっていた。ISETは100kΩと180kΩが並列つなぎになっていて、64kΩに設定されている。なので充電電流は90000/64000で1.4Aになってるっぽい。最大1.5Aまで設定可能。

前に作った18650の2Sバッテリパックを充電してみた。5VのACアダプタに繋いでもちゃんと昇圧されて充電されてる。あとどうやらPDじゃなくてQCっぽいのでQC対応の充電器だと電圧が自動で切り替わる。中華の充電器のほうがQC対応してて、入力電圧が7Vになっていた。
ちなみにLEDは赤が電源ランプ、青が充電中インジケータのようで、充電中はどっちも光っているので紫っぽく見える。充電が終わると青が消えて赤だけが点灯した状態になっていた。

これは使えそうなのでジャンクのバッテリパックを買ってきて2Sのバッテリパック作ろうかな。


2023年11月3日金曜日

DD4012SA DCコンバータを使ってみた。

 ブレッドボード上で3.3Vを作るのにDD4012SAという降圧DCコンバータがコンパクトで良さそうだったのでポチってみた。いろんな電圧のバリエーションがあったのでESP32で使うのに3.3V版をチョイス。
ESP32は結構電流を食うのでスイッチングのほうが良さげだし。

DD4012SA
このモジュール、TO-220サイズのレギュレータを置き換えられるようにサイズがそれっぽい感じになってる。ピンヘッダは付属してなかったけど、L字のピンヘッダを使えばLM2940みたいなリニアレギュレータをそのまま置き換えられそう。
DD4012SA
3.3V版を発注したつもりが12Vにチェックが入ってるんだけど…
ICはME3116が載ってて、入力は40Vまで行けるらしい。抵抗分圧で出力電圧が変更できるっぽいんだけど、下側が2kΩ入っていた。R1(上側)の抵抗を変更することで出力電圧が変更できそう。

デフォルトでは12V仕様でR1の抵抗が28.7kΩが入っていて、5VにするにはR1を10.7kΩ、3.3Vにするには6.34kΩにするといいらしい。
手持ちで6.2kΩがあったので試しに交換してみた。(ちょうど2012サイズ)
R1を6.2kΩに交換して12Vを入れてみると出力は3.28Vになっていたので、3.3Vの電源としてはちょうど良さそう。ということでL字のピンヘッダをはんだ付けしてブレッドボード用の3.3V生成用として使うことに。セラコンも乗っているのでレギュレータと違ってコンデンサを外付けする必要もないので便利かも。



2023年10月30日月曜日

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

 Tverが見られなくなったと言われたので、調査してみるとどうやら広告ブロック対策されているようで、uBlock OriginでブロックされていたURLを外しながら調査してみた。
なぜかiPadだけは見れててFire TVも見れないらしい。

結果的にuBlockだけではなくてルーターでもシェルスクリプトでDNSブロックしていたのでそちらを解除しないとだめだった。この前HALOの実績が解除できなくなったパターンと同様に広告ブロックのシェルスクリプト

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

を追加することでみられるようになった。他のDNSブロッカーで困ってる人たちもいるようだけど、おそらく"imasdk.googleapis.com"をホワイトリストに追加すれば行けるんじゃないだろうか。

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環境内ならどこでも通話できる。

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でダイレクト接続される。(AP不要)

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

ピンアサインはとりあえずこのプログラムのデフォルトを使用した。
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に繋いでデバッグしてるときはマイクはかなりノイズを拾ってる感じだった。プログラム書き換え後とりあえずモバイルバッテリに繋いで試してみたらだいぶ良くなったのでとりあえずはモバイルバッテリでテストした。(本家のマイク用ノイズ対策回路は入れていないため。)

バッテリを搭載してケースに入れたら結構使えるかも。通知音とか鳴らせるようにしたら面白そう。フラッシュ容量はまだ余裕がありそうだし。

スピーカーはジャンクノート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ラジオとして使う分には十分なんじゃないかな。


2023年7月2日日曜日

JNHのキャッシュ付きM.2 SSD 2TBを買ってみた。

 最近SSDの空き容量が少なくなってきたのでM.2のSSDを探していたところ、JNHの2TBのSSDがリード7200MB/s、ライト6700MB/sなのに13500円ぐらいで売っていたのでポチってみた。Gen4対応だし、最近流行りのコスパ最強YMTC製NAND搭載のやつ。

S720D-2TNVHS
聞いたことないメーカーだったけどパッケージは普通にいい感じ。
S720D-2TNVHS
TBWも1500TBとこの価格にしては高め。そしてDDR4のDRAMキャッシュ付き。
前回購入したMicronのSSDは初めてキャッシュなしを買ってみたんだけどやっぱりもたつく時があったので今回はキャッシュ付きSSDを購入してみた。
S720D-2TNVHS
PS5対応となっているのでPS5対応でよく採用されているサイズのヒートシンクもついていた。
B550I AORUS PRO AX
早速取り付けてみた。このヒートシンク、B550I AORUS PRO AX付属のヒートシンクと大きさがほぼ同じサイズなのでヒートシンクを付け替えることなくそのまま装着できた。
B550I AORUS PRO AX
そんでもって上につくヒートシンクもそのまま取り付けられる優れもの。ただ結構熱が気になるけど…

CrystalDiskMark
ベンチマーク的にはスペック通りの速さ。
とりあえずSteamのゲームを移動しておこうかな。

2023年6月26日月曜日

QcK miniを新しくしてみた。

 マウスパッドとしてSteelSeriesのQcKを使ってからずっとQcK miniを使い続けているんだけど、最近端っこが剥がれかけてきたので新しいのをポチってみた。
Amazonの購入履歴を見ると前回購入は2015年5月となっていたので実に8年も使っていた…
たしかに洗うといわゆるQcK汁が出てきて匂いがやばいのだがもうこんなに使っていたとは。

いろんなマウスパッドが出ているっぽいので一通り探してみたんだけど、結局なんだかんだコスパが良さそうなのでQcK miniをポチってしまった。

前回のパッケージは覚えていないけど丸まって届くスタイル。
裏面にもロゴが印字されていた。前回購入したのは裏側は無地だったのに。少し進化している?
表面にはSteelSeriesのロゴだけになっていた。前回購入品はSteelSeriesという文字も印刷されていたんだけど、新しいのはロゴだけに変更になったのかな。

さわり心地は安定のQcK。匂いはだいぶ気にならなくなった気がする。新しいときは手が臭くなるようなイメージが合ったので…
これならもっと汚れる前に頻繁に買い換えようと思う。
キーボードもマウスもRazerになったがやっぱりこのマウスパッドは縁にステッチがない分使いやすいので使い続けていきたいな。

今回は8年ぐらい使ってしまったけどもっと短い頻度で変えるべきだったな。

2023年6月18日日曜日

GaN搭載 USB急速充電器を買ってみた

 TypeCで充電するタイプのデバイスが増えてきたのでType Cが2ポートある充電器がほしいと思っていたんだけど、たまたまセールしていたのでポチってみた。

S-TR-255JP
GOKiiっていうよくわからないメーカーなんだけど、GaNで45Wでセールでお安かったので…
S-TR-255
お値段の割にはパッケージもしっかりしている感じがある。
GOKii S-TR-255JP
質感は結構いい感じ。マットな手触りで傷が付きにくそう。
GOKii S-TR-255
出力はこんな感じ。2ポートを使うと25Wと20Wに切り替わるらしいのでiPhoneの急速充電もオッケー。
GOKii S-TR-255JP
電源に指すとLEDが青白く光る。光具合も程よい明るさで、光り方も均一で安っぽさはない感じ。
Aukeyの65Wと比較。GaNの45Wにしては少し大きい?
幅も少し広め。コンセントは折り畳める。

まぁ1200円ならいい感じかなぁ。出張のときは小さいのを持って言ってるし。


2023年5月4日木曜日

Razer HUNTSMAN V2 TKLを買ってみた。

 赤軸化したLogicool G610の特定のキーが効きにくくなって来てしまったので、キートップも結構減ってることもあって新しいキーボードを買ってみた。
友人にRealforceとか光学式スイッチを進められたので進められるがままにHUNTSMAN V2を買ってみた。一応現物を触ってから購入したんだけど、やっぱり最初の印象だけじゃわからないこともあるし、スペック買いである。

今回はテンキーレスにしてみた。机が広く使えるかなとか思ったり。
デザインも結構シンプルで好み。オプションのキートップに交換するとLEDで光ってないときは無印キーボードみたいになるRazer Phantom キーキャップとかもあるみたいで、ちょっと面白そう。
ケーブルは脱着式。これは断線したときに便利そう。

今まで使っていた赤軸より少し重く感じるけど赤軸がヘタっていたのかもしれない。感触がまあまあ違う。エンターキーだけ少しうるさい感じがするけど…

これでマウスとキーボードが両方Razerになってしまった。


2023年4月30日日曜日

Twitter API 2でPythonからつぶやいてみた。

 ラズパイ鯖のエラーとか状態を定期的にTwitterに投稿していて、結構この運用方法が便利だったんだけど、突然ツイートされなくなったのを発見したので直してみた。

というのも今まではTwitter API 1.1を使っているtcli.shというシェルスクリプトを使ってツイートしていたんだけども、API 2に以降が始まっていたらしい…
そして昨日までだったということをあとから知った。

API 2に対応しないといけないんだけど、tcli.shのサイトはもうなさそうだしだいぶ前から使っていたので一新することにした。
とりあえずPythonで便利そうなライブラリが合ったのでそちらを使ってみることに。

python-twitter-v2

このpython-twitter-v2を使えば簡単に作れそう。

まずはTwitter DeveloperにログオンしてV2への以降を行う。とりあえずFreeアカウントで良かったのでアプリのページを開いて上の方にV2へのリンクが出ていたのでそちらをクリックして赤いDowngradeボタンを押す。
そしてプロジェクトを作成しないといけないのでProjects & AppsのOverviewでプロジェクトを作成する。プロジェクト名とか説明をつけてStep 4で今まで使っていたアプリを選択すればOK。

Consumer KeyもConsumer Secretもそのまま使えそう。

そんでもってpipでpython-twitter-v2をインストールする。

python3 -m pip install python-twitter-v2

あとはアプリ認証のURLを生成する。

from pytwitter import Api
api = Api(consumer_key="Consumer Key",consumer_secret="Consumer Secret",oauth_flow=True)
print(api.get_authorize_url())

これで実行するとURLが生成されるのでこれをブラウザとかに貼り付けて使いたいTwitterアカウントからアプリ認証をする。するとリダイレクト用の設定したURLに飛ばされるのでそれをコピーする。(URLの後ろにキーとか色々ついてくる)

先程の3行めをコメントアウトして

print(api.generate_access_token(response="ログオンして帰ってきたURL"))

これを追加してもう一度実行。

そうするとoauth_tokenとoauth_token_secretが返ってくるのでそれをメモる。

import sys
from pytwitter import Api
api = Api(
    consumer_key = 'Consumer Key',
    consumer_secret = 'Consumer Secret',
    access_token = 'oauth_token',
    access_secret = 'oauth_token_secret'
)

args = sys.argv
api.create_tweet(text = args[1])

これをtcli.pyとかで保存して

python3 tcli.py "ツイートしたい文"

で実行すればツイートできる。

とりあえずこれでまたラズパイからつぶやけるぞ。

2023年4月2日日曜日

DD-WRTでクライアントにNTP鯖を強制的にリダイレクトしてみた。

 WiFiにつながるデバイスが増える中でRTCを持たずにNTPサーバから時計を取ってくるデバイスが増えてると思うんだけども、NTPサーバを強制的に変更できないか試してみた。

微妙に時間がズレてるのとか気になるし。中華デバイスとかだと鯖も中華とかなのかな。

方法としてはNTP鯖が特定できればルータのhostsとかdnsmasqで飛ばせたりするんだろうけども、今回はiptablesでNTPポートの123を特定のNTP鯖に飛ばすようにしてみた。

iptables -t nat -A PREROUTING -p udp -m udp --dport 123 -j DNAT --to-destination 162.159.200.1:123
iptables -t nat -A POSTROUTING -p udp --sport 123 -j SNAT --to-source 162.159.200.1:123

DD-WRT化したルータなのでiptablesがそのまま使えるのでWebアクセスでSSHを有効にしてSSHからこの2行のコマンドを実行した。NTP鯖はCloudflare Time Servicesを使わせてもらった。これでこのルータに繋がっているデバイスからNTPのポート123にアクセスする場合は全部指定したIPアドレス(162.159.200.1)の鯖につながるようになる。

ためしにコントロールパネルの日付と時刻から適当な鯖にインターネット時刻設定するとうまく同期できるようになってる。でも適当なアドレスではだめっぽい。DNSでIPが返ってくるような存在するアドレスであればうまく設定される。

ちなみにこの設定、ルーターを再起動するとリセットされてしまうので、常に有効にしたい場合はAdministration→CommandsでStartupに入れておくといいかも。削除したい場合は

iptables -t nat -L --line-numbers

でリストを表示してから

iptables -t nat -D [リストの項目] [番号]

で削除できる。(デフォルト状態からの追加だと、iptables -t nat -D PREROUTING 3とiptables -t nat -D POSTROUTING 6だった)

ローカル環境でRTCを持たないデバイスにRTCを持つデバイスからNTPしたい場合にも使えるかも。

2023年3月18日土曜日

DD-WRTでDNS広告ブロックを設定してみる。

 この前ルーターが壊れて更新したので、前のルータでやっていたことを思い出しながら元に戻してくことに。壊れたルータにはアクセスできないし…

その一つがDNSブロッカー。広告をブロックするためにDNSをブロックしてしまうやつ。仕組み的にはhostsファイルにブロックしたいDNSを127.0.0.1に飛ばすように設定するやつ。

元々シェルスクリプトで定期実行していたので記憶を頼りに探してみたところ、DD-WRTのフォーラムにそれっぽいスクリプトが。今回はこれをベースにカスタマイズして見ることに。

WZR-1750DHP2はフラッシュ領域がたくさんあるので、JFFS2 SupportとSSHを有効にしてWinSCPなどを使ってSCPでアクセス。
/jffs/にadblock.shというファイルを作って、パーミッションを755に設定。

そしたらadblock.shの中身を
#!/bin/sh
logger WAN up script executing
if test -s /tmp/hosts0
then
        rm /tmp/hosts0
fi

logger Downloading http://www.mvps.org/winhelp2002/hosts.txt
(curl -k -s https://winhelp2002.mvps.org/hosts.txt |
    sed '2,$s/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
curl -k -s https://280blocker.net/files/280blocker_domain_$(date +"%Y%m").txt |
    sed 's/^/127.0.0.1 /g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
#curl -k -s https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardDNS.txt |
#    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
#    grep -v localhost ;
#curl -k -s https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt | 
#          grep "^||" | grep -v "*" | sed 's/||/127.0.0.1 /g'| tr -d '^';
curl -k -s https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileAds.txt |
    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
#curl -k -s https://raw.githubusercontent.com/multiverse2011/adawaylist-jp/master/hosts |
#    sed 's/127.0.0.1/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
#    grep -v localhost ;
curl -k -s https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt |
    sed 's/^/127.0.0.1 /g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
curl -k -s https://warui.intaa.net/adhosts/hosts.txt |
    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
### Extra blocking dns ###
echo 127.0.0.1 adm.shinobi.jp ) | tr ' ' '\t' |
tr -s '\t' | tr -d '\015' | sed '/^$/d' | sort -u >/tmp/hosts0 ### Extra blocking dns end ### ### White List ### sed '/vortex.data.microsoft.com/d' /tmp/hosts0 -i ### White List end ### grep addn-hosts /tmp/dnsmasq.conf || echo "addn-hosts=/tmp/hosts0" >>/tmp/dnsmasq.conf logger Restarting dnsmasq killall dnsmasq dnsmasq --conf-file=/tmp/dnsmasq.conf
こんな感じに設定して保存。
いろんなDNSブロックリストを使えるようにしてみた。追加でDNSを手動でも入れられる。ここにローカルのサーバのIPとかを入れると外部向けのドメイン名でローカル鯖にアクセスしたりもできるので便利かも。

あとはcronでこのスクリプトを定期的に実行するだけ。
使ってないような時間帯に毎日更新するようにしてみた。
とりあえずこれを設定しておくとFireTV StickのTVerの広告も消え去るんだよなぁ。
あとはスマホ向けのヤヴァい広告が消えるのでスッキリ。スマホとかタブレットをWiFiで使うときはすごく見やすくなる。

追記:Xbox Liveの実績解除のためにWhite Listも実装しました。