2024年10月21日月曜日

2073 BTLで簡易ギターアンプを作る

エフェクターを繋ぐため、386スモーキーアンプよりもクリーンで癖のないパワーアンプが欲しくなった。時間をかけず、手頃なIC一発で組むことに。

大したものではないが、完成した回路は以下の通り。


特に参考にしたのが可燃ごみ箱氏のギターアンプ。実質、先人の回路から前段のディストーションとトーン回路を除いただけなのだが、定数と部品だけは自分の手と耳を使って選び直した。

■パワーアンプ部分

ネットで参考になりそうな事例を漁っていると、NJM2073の回路がいくつか見つかった。NJMのものはディスコンで秋月でも手に入らないが、M2073というセカンドソースは今でも入手可能のよう。こちらはLM386/NJM386によく似たパワーアンプICだが、ゲイン調整ができない代わりに2回路入りというもの。

2回路あるので、それぞれから逆位相の信号を出すようにし、スピーカーを挟むBTLというつなぎ方もできるらしい。出力用のカップリングコンデンサが不要になるのと、理論上は倍の電流でスピーカーを駆動し大きな音を取り出せることがメリットのよう。

■入力インピーダンスのケア

2073は386系と違って入力抵抗が100kΩと高く使いやすいが、ギターのピックアップやウクレレのピエゾを繋ぐにはまだまだ低インピーダンス。試しにブレッドボードでBTLアンプを組み、7ピンの入力に直接ウクレレのピエゾ出力を繋いでみたが、やはりローがすっぱり消えてしまってキンキン音にしかならない。なので、2SK30Aのソースフォロワを前段に据える。

ソースフォロワ部分は、バイアスをかけず、コンデンサも入れず、入力抵抗も無しにした。試しに1MΩの入力抵抗をつけたが、それでも音痩せしてしまう。ピエゾを受けるには数十MΩが必要なのだろう。入力抵抗無しでも特にノイズが乗ったり等は無かったので、電気回路としてあるべきかはわからないがひとまず無しにした。バイアスとカップリングコンデンサもお作法としては入れるべきなのだろうが、手持ちの楽器を繋ぐ分には特に音割れすることも無かったので割愛した。

本来はソースに固定の抵抗を繋ぎ、コンデンサで交流だけを取り出してから可変抵抗で分圧する。可変抵抗を直接ソースに繋ぐと、ボリュームを絞るほどRCのバランスがハイパスフィルター寄りになり、ローが通らなくなるが、聴覚上問題なかったのでこの構成にしている。

■コンデンサの定数およびの検討

検討といっても、オームの法則とハイパスフィルタ・ローパスフィルタの基本原則くらいしか知らないし、安いテスターしか持っていないので、理論や計測ではなく現物を耳で聞いて自己満で判断しているだけ。

5ピン8ピンの間の104は、データシートだと10uFになっている。これをタンタル10uFにすると、低音も高音もしっかり出るようになった。ケミコン10uFだとローは同じくらいだが、高域が少し濁った感じになる。104だと、程よくローカットされてすっきりする。オーディオアンプとしてはタンタルが1番な感じだが、楽器として使う場合は好みでよいと思う。

5ピンに繋いだ103はデータシート通りだが、これもセラミックにするかフィルムにするか、定数を下げるか等がチューニングのポイントになる。

最後に、スピーカと並列の抵抗+コンデンサがあるが、こちらは発振防止のためのよう。元は1Ω+0.22uFだが、音痩せしすぎるので10Ω+104にしている。

■試運転と雑感

回路図通りにブレッドボードで組んでVOX MINI3のスピーカに直結し、ウクレレとギターで鳴らしてみたが、本当に素直な音がする。足し引きが無いという感じ。

VOX MINI3は音を変えて軽く遊ぶ分には面白いけど、ノイズが多いし弄り回した音になってしまう。エフェクターを繋いでもキャラクターがわかりづらい。対して、2073アンプならエフェクターの個性がよくわかる。

ワンコイン以下で、ウクレレの練習用+ギターのエフェクター試験用アンプという目的達成できたので非常に満足。

2024年10月3日木曜日

ZO-3ギターを、ハム⇔シングルで切り替えられるようにする

ハムバッカー4芯化で学習した内容を実践してみる。

スイッチ増設するか迷った末、安さと実装の楽さからピンヘッダ方式に決定。どうせライブで使うわけではないので結果十分だった。

最初は、4芯化して2回路3ポジションのスイッチでシングル⇔ハム⇔パラレルシングルの切替をできるようにしようと考えていたが、できるだけボディを加工したくないし、まずはシングルの音が使えればいいと割り切った。

この場合、2つのコイルを結んだ部分とGNDを短絡するかどうかを切り替えるだけでよい。

原理は以下の図に示す通り。
A-~B+の結線を、B-が繋がっているGNDに図右側のオレンジの線で短絡させると、Bのコイルの信号はすべてGNDに吸われるので、Aの信号だけが出る"シングルコイル"として使えるようになるというわけ。

今回はピックアプの端っこにピンヘッダをくっ付けて、シングルにしたいときだけヘッダを短絡させる作りにした。

元々はこんな状態。


シングル化の効果は聞き分け・弾き分けできるくらい顕著。
パワーが落ちる分ボリュームを上げる等対応は必要だけど、1台で出せるキャラクターの幅が大きく広がって楽しい。

ボディの加工に比べると数段楽で、気軽に試せる範囲と思う。



Mini Watter 6DJ8を作る

http://www.op316.com/tubes/mw/mw-6dj8pp-2017.htmの6DJ8全段差動PPミニワッター2017を作った。

■回路

回路、ラグの配置は原典をほぼ踏襲。
ラグは配置の問題から10+10の2枚に分けて、30V ZDの部分だけを片ラグに置き換える。
また、MT9ピンソケット周りも片ラグを排して空中配線する。
原典より小さい100x50x200mm程度のシャーシを使ったので、クリアランスがかなり厳しかったので、もう少し大きいシャーシがオススメ。
電源と無線系はシャーシの側面に配置し、電源トランスやアウトプットトランスの上にも基盤を配置するなど結構無理やり詰め込んでいる。

■費用

トランスが非常にお高く、電源用とOPT2つで3万近くなり、今回の構築費用の7割程度を占める。
真空管はヤフオクで旧ソ産2本2,300円のものをゲット。

■写真など

まずは電源を作ってテスト。


余っていたアルミシャーシを加工。
穴はステップドリルで一発だが、ニブラで綺麗に直線を切り出すのが難しい。

トランスの結線と配線の色を確認。右上にうっすら見えているのはメインの回路を組んだラグ板。

粗く配置を検討。

位置が決まったら、どんどん実装していく。

だいぶそれらしくなってきた。

あともう一息。








ここまで配線すればパワーアンプとしては完成。このときはAC100Vの配線直結だったが、あとでメガネコネクタ化してヒューズも追加した。
最後に、M5stamp+PCM5102Aで作ったBluetooth+I2Sユニットを組み込んで、スマホやPCから無線で直接ならせるようにしたら完成。

前に作ったトランジスタのTourer Part 5といい具合に収まっている。筐体は小さいが、トランスがあるので持ち上げると結構重い。

暗がりだとヒーターの灯りが映える。
せっかく旧ソ連の球なので、旧ソ連の音楽が聴きたくなる。

夜な夜な作業して、電源回路を組んでからパワーアンプとして動くまでだいたい7日、さらにBluetoothを組み込むのに4日くらいかかった。
慣れた人が集中してやれば土日で作れるかもしれない。
BOM(部品一覧)をちゃんと作って、1回の秋葉原詣でや通販で部品を仕入れ切るのがポイントかも。

音を出してみた感想は、さすがという感じ。
最初はヒーターの配線がイマイチでハムノイズがあったが、経路の見直しを行ったら非常にしずかで聞きやすくなった。

2024年10月2日水曜日

ハムバッカーの4芯化

 エレキギターのハムバッカーを4芯化するための有益なリンク集。

https://pop-guitars.com/brog/?p=1252

https://pop-guitars.com/brog/?p=1247

https://www.soundhouse.co.jp/howto/guitar/wiring/sp/?srsltid=AfmBOop_2Lm9k61L8ytj1UVowcQcHN600Hiecq-8HFg7dg5Eg0Ds4Lx

https://frontisland.com/reference-book/coil-tap/

①②はポップギターズ、③はサウンドハウス、⑤はフロントアイランド。

①は、どうやって4芯化するか?

②は、4芯化した後コイル同士をどうやって繋ぐとどんなピックアップとして使えるかの概要。

③は4芯の話とは離れるが、一般的なギターでどんな結線をしているか?

④は4芯ハムバッカーとスイッチ、ポッド、ジャックをどうやって繋ぐとどんなキャラクターのギターになるかの具体例集。

これらの文献で勉強すれば、あとは工作技術が十分あれば望むピックアップに改造できる。

ちなみに、4芯のケーブルはギター屋や配線屋で買うと結構高額だけど、データ用USBケーブルをハードオフなり百均で買ってばらせば同等の品質のケーブルを格安でゲットできるのでオススメ。

ーーーー

10/03追加、手持ちのZO-3のピックアップをばらしてみた。


コイルAとBで、極性とコイルの白黒が逆になっている。通常のハムバッカーとして組む分には作業しやすいのかもしれないが、極性の判断はやりづらい。

2024年9月16日月曜日

6DJ8 Mini Watterのバイアス調整メモ

Tourer Part5に続き、ぺるけさんの6DJ8 Mini Watterを作った。

記事はこちら→http://www.op316.com/tubes/mw/mw-6dj8pp-2017.htm

本回路のバイアス調整のメモ。

こちらは6DJ8のGが16.2V、Kが19.2Vになるよう、初段の負荷抵抗と定電流回路を調整する必要がある。

手持ちの抵抗は6.2kΩと6.8kΩで、ZDは30Vのものを購入。

ZDは実測値30.5V、6.8kΩ、定電流回路の2SK30Aが3.9mAの組み合わせで通電すると、Gが18V、Kが21Vとなり、設計上のポイントから大きく外れてしまった。

これを回避するため、Idss=4.3~4.4mAとする必要がある。

手持ちの2SK30Aはすべて4.0mA未満で、逆に2SK170と2SK117は5.0mA以上で使えない。

残りのJFETを手当たり次第に探すと2SK184が1個だけあり、こちらがちょうと4.4mAだった。さらに、2SK30ATMで2.1~2.3mAのものがいくつかあり、2つ組み合わせると4.4mAになるペアを発見。

定電流回路をこちらに付け替えると、左右ともGが16V前後、Kが19.1前後となり、許容範囲に収まった。

FETの表面積が左右で大きく異なるので温度変化に弱くなるかもしれないが、ひとまずこの構成で動かすことに。

2024年8月27日火曜日

久々の真空管アンプ、真空管式スモーキーアンプを作る(3A5 + 3A4シングル)②

真空管スモーキーを段ボールブレッドボードで仮組したが、その回路図の話。
実物の写真や背景は以下①を参照してください。

黒字が定数値、赤字が実測値。
2枚のうち1枚目はリプルフィルタの抵抗が1kΩで、2枚目は220Ωに変えたもの。

カップリングコンデンサを104にしてライン入力で音楽を聞くとまあいい感じ。ウクレレのピエゾでは少し出力が物足りない。さらに電圧を上げるか、高能率のスピーカーに変えてみる?


2枚目のほうが高電圧のためか、少し大きな音が出る。
カソードのバイアス抵抗には、3A5だけでなく3A4のプレート電流も流れ込む。3A4の動作点を考えると-3.7Vのバイアスをかけたいので、180Ωから220Ωに差し替えたほうがよいかもしれない。

参考文献は以下。
Haruさんのコントロールアンプから、3A5の電圧増幅回路やグリッド抵抗の取り廻しを真似させていただく。

UX生さんが、3A5の低電圧での詳細な実測Ep-Ip図を公開してくださっており、動作点の検討に生かさせていただいた。

3A4はあまり作例がないので、昔のアプリケーションノートを参考に定数を決めた。

以上。

2024年8月26日月曜日

久々の真空管アンプ、真空管式スモーキーアンプを作る(3A5 + 3A4シングル)①

■電池管スモーキーの構想

ずいぶん昔、知人の愛煙家にアメスピの缶を大量にもらったので、スモーキーアンプのメタル版を作った。
久々に物置から出てきたのでいじってみたが、それなりに遊べる感じの音だ。
回路は本家の完全なパクリだが、実装は昔の自分ながら結構いい仕事をしていた。

 ボリュームに基板を固定し、いい具合にコンパクトに収めている。
 
スモーキーと一緒に死蔵していた電池管たちも発見。そういえば、メタルスモーキーの次は真空管スモーキーを作ろうと考えていたことを思い出した。

スモーキーアンプの回路図を探す中で以下の川端様のページを見つけ、自分でも作りたいと思って秋葉原で部品を集めたのだった。

当時は技術も知識も今以上に乏しく、ノイズ発生器しかできずに諦めてしまった。
今回は、当時の反省を生かしつつ電池管を生かし、ちゃんと音が出るものを目指して作ってみる。

■ブレッドボードで仮組
できたものがこちら。仮組だが、それなりのものにはなった。
ライン入力では一昔前のPCで鳴らしたくらいの音にはなる。
ウクレレのピエゾやギターを繋ぐといい感じだが、欲を言うともう少しゲインが欲しい。カップリングコンデンサが104のままだと低音が煩いので、472に変えるとちょうどよかった。

回路は以下の通り。
  1. A電源
    1. 構成
      1. アルカリ電池1.5V
  2. B電源
    1. 構成
      1. AC100V直結、ブリッジ整流、2段リプルフィルタ
    2. 供給電圧
      1. DC120V
    3. 主要素子
      1. 秋月の100uF/400V
      2. 抵抗は1kΩ、これで十分にリプル除去できていた。
  3. 増幅回路
    1. 構成
      1. 3A5電圧増幅2段、3A4電力増幅1段 ※無帰還
    2. 主要素子
      1. OPTはTOEIの一番安いもので、7kΩ:8Ωのタップを使用
      2. スピーカは秋月の安い樹脂コーンのもの。
      3. 3A5のプレート抵抗は両方とも33kΩ
      4. カソード抵抗は全体共通で180Ω+220uF。
      5. グリッドはすべて1MΩで設置
      6. カップリングコンデンサはフィルムの104 or 472。
      7. 各プレートには申し訳程度で1uF/250Vのセラコンも追加。
一応オリジナルの回路だが、ほぼ先人の回路を切り貼りしただけ。
回路図や参考資料などはまた後日記載予定。

できれば、電源のDC-DCコンバータ化、高電圧化、負帰還の追加あたりもやってみて、うまくいったものをちゃんと実装したいところ。

2024年8月16日金曜日

オーディオの電源検討

■前提

BLE→I2S→パワーアンプ→スピーカという構成でオーディオ環境を構築しようとしている。 BLEで繋ぐと、PCでもスマホでもワイアレスで簡単に運用できて便利。

  • 機器構成
    • BLE→I2S
      • M5ATOM Lite
    • I2S→アナログ
      • PCM5102A
    • アナログのパワーアンプ
      • 自作の386アンプ or ぺるけさんのTourer Part5
  • 各機器の電圧と消費電力
    • M5ATOM Lite
      • 5V or 3.3V
      • 80mA-125mAくらい
    • PCM5102A
      • 3.3V or 1.8V※デジタル部のみ
      • 10mAくらい
    • パワーアンプ
      • 12V
      • 数百mAくらい
  • 希望スペックというか制約条件
    • それぞれ必要な電圧が違うので、電圧変換が必要。
    • 主電源は12V1系統にしたい。(秋月ACアダプタ)
    • コンバータや3端子レギュレータはなるべく減らしつつ、省エネにしたい。
現在、バラック構成で複数系統の電源を繋いだ状態ではいい感じの音で鳴らせている。
これを、ひとまとまりのシステムとしてまとめたい。
そのために、電源をなんとかしたい。




■検証1:レギュレータ1発
NJM722333で単純に降圧し、ATOM LITEとPCM5102を繋いでみた。
12V->3.3Vでは電位差が大きすぎて、ヒートシンクをつけても手で触れないくらい熱くなる。
電流を計ってみると80mAくらい。
(12-3.3)*0.08=0.696≒0.7Wの消費。

■検証2:スイッチング電源
熱対策で、DC-DCコンバータを仕込んでみる。
12VからDC-DCで5Vを作ってそのままATOM LITEに入力し、さらに5V->3Vを722333で賄ってDACを動かすようにする。



NJM2460かMC34063を使えば、僅か8点で12Vから5Vが作れる。
ブレッドボードで上記の回路を組んで、定数と種類を変えてうまく動くか試験してみる。
しかし、ATOM LITEを動かせるくらいの電力を賄おうとすると、正しいパーツを選定しないといけない。

具体的には、C1の容量、L1のインダクタンスと種類が重要。
最初、有り合わせでC1に103=0.001uFを使っていたが、周波数が足りないようでどのL1と合わせても、無負荷では5Vになるが、マイコンを動かすだけの電力を作れなかった。
C1を先人の回路に合わせて470pFにしたうえで、L1も値と種類を変えて試してみたが、マイクロインダクタでは十分な電力が取れなかった。
マイコンどころか、100Ωの抵抗を繋ぐだけで電圧降下してしまう。約50mAの負荷にも耐えられないということ。

スイッチング周波数を計算すると、だいたい470pFでは40kHzで、0.001uFだと半分の20kHzになるようだ。

左の3つはNG,右の3つはOKで、特に一番端の220uFが安定した。
どうも、十分なコアを持つ巻き線型でないとスイッチング電源には不向きのよう。
今回は検証していないが、ダイオードも高速かつ低閾電圧のものを選ぶ必要がある。逆起電力への耐圧も必要。

奥深い。

ーーーー
2024/8/18追記
スイッチング電源はうまく動いたものの、どうしてもノイズが乗ってしまうし、ATOM LITEの起動時のコンデンサの電荷の溜まり具合などの影響か、マイコンの起動がうまく動く時と動かない時があって安定しない。
また、7805で12V→5Vを作ってから他のLDO、AP7375で3.3Vを作るようにし、ATOM LITEは5Vで動かすようにすると、意外と大したことない発熱で済んだ。

7805側は、(12-5)=7Vで80mA、0.56Wの消費電力。小さいヒートシンクか、アルミケースに接触させれば十分放熱できた。
AP7375は、(5-3.3V)=1.7Vで20mA程度のため、34mW。SOT-23でも基板と配線だけで十分放熱できていた。
2段階で降圧することで、1段目のLDOの電位差が1.7V, 136mW減少する。数字で見ると大したことないが、いざ手元で作ってみると馬鹿にならない違いだった。
事前にあれこれ希望スペックを出して考えていたが、机上の空論よりまずやってみることが大事かも。

上記より、スイッチング電源は諦めて、LDOのみの構成とすることにした。

セラコン、マイクロインダクタ、3.3V LDOは表面実装にしたので表面はほとんど部品無し。
細かいので最初は手間取ったが、慣れればリード部品よりも早く実装できるくらい。
7805は実装面積を減らすため、基板裏面に配置し、そのままアルミケースに接触させるつもり。

ーーーー
2024/08/26追記
今回の方式、単電源をそのまま使う386アンプではうまくいくが、ぺるけさんのTourer Part5ではうまくいかない。12Vを内部で疑似的に±6Vにして中点をGNDとしているので、そのままだとBLE DACのGNDとパワーアンプのGNDが異なってしまうため。
これを解消するため、7805の代わりに、12V→5Vの絶縁型コンバータを購入予定。
小さい巻き数2:1のトランスに12V方形波を突っ込めば何とかなりそうな気はするが、500円で買えるのでわざわざ組むより買うことに。

2024年5月29日水曜日

格安3Dプリンタをレーザー加工機に作り変える(③ソフトウェア)

 grblとbCNCを導入する。

■grbl
とりあえず、手持ちのArduino Unoにgrblを入れてみる。
githubの公式に行って、ソース一式をダウンロードし、Arduino IDEにライブラリ追加する。
そして、アップローダのスケッチを選択して流し込み。
Arduinoに慣れていたら難しいことは何もない。
本家か、「自作CNCマシン・レーザーカッターについて」をよく読めば大丈夫なはず。
https://github.com/grbl/grbl/wiki/Compiling-Grbl
https://cnc-selfbuild.blogspot.com/2016/12/grbl11_14.html

バージョンだが、0.9jか1.1がよさそう。
CNCシールドの基板改造が必要になるかもしれないが、なるべく新しいものということで1.1で進めることにする。

■bCNC
pythonに慣れている人ならすぐに導入できる。
pip3でbCNCをインストールして、あとは「python3 -m bCNC」とするだけ。

■接続テスト
ここまでうまくいったら、Arduinoをパソコンに繋いでbCNCを起動する。
grbl 1.1ならbauを115700にする。

これで、H/Wが揃えばパソコンからGコードを送り込み、自由に制御することができるはず。
Gコードの作成などは、後で考える。
以上。

2024年5月28日火曜日

格安3Dプリンタをレーザー加工機に作り変える(②可動部分の用意、実験)

■解体
レーザー加工機を作るために、格安3DプリンタLabists X1を改造する。


元の制御基板と、エクストルーダー周りを取り除いて、X,Y,Z 3軸のステッピングモーターおよびリミットスイッチの配線だけにする。
リミットスイッチはマイナス側のみで、プラス側には存在しない。また付け足してもいいかも。


エクストルーダーを取った後のハウジングはこんな感じ。
金具部分に加熱・押出装置が、反対側のガワにはファンが付いていた。


■ステッピングモーターの動作試験
ステッピングモーターを試しに動かしてみる。

ステッピングモーターの型番を調べてみると、24BYJ48という機種の12V版で、4ピンのもの。バイポーラ型というらしい。
2系統の電磁石を、決まったパターンで励磁→待機→励磁→待機・・・とさせることで、モーターが正確に回転する。

■ステッピングモーターの1-2相励磁制御
1-2相励磁という制御を行うことで、45度ずつの回転を実現する。
簡単に図示すると、こんな感じ。
左と上の電磁石を8パターンで順番に切り替えていくことで、中心の永久磁石を正確な角度で順番に回転させることができる。

■回路
ドライバにはTA8428Kを2つ利用。マイコンはRP2040。
動画で実際に使っているのは市販のPi Picoではなく、東京バードさんの自作基板の記事を参考にガーバーデータを頂き基板を発注して作ったブレークアウト基板。
実体配線図。ICはピン互換の別ICを流用。
本当はVSYSではなく外部電源を使わないとダメ。
また、今回のモーターには12Vが必要。

励磁させるときは、モータードライバの前転/逆転(入力:H/L, L/H)を使う。
励磁無しのときは、今回は入力をL/Lとして、電磁石の両端をハイインピーダンスにした。
もしかすると、入力をH/Hとして電磁石の両端を直結させるブレーキモードのほうが、瞬時に磁場が消えてより高速な動作ができるかもしれない。
今度試してみよう。

■励磁時間を変えての実験結果
励磁してから次のパターンに移るまでの待機時間を変えて、実験してみた。
モーターの音が変わるのが面白い。

350us: "鳴き"は聞こえるが一切動かない。
400us: 下降するが、上昇できない。
500us: 上昇させる秒数が増えると時々回りそこないが発生する。
600us: 500usと同様。
700us: ここまで待たせると安定動作した。

ちなみに、待機秒数と周波数、ドレミの関係はこんな感じ。
us Hz kHz 近い音階
350 0.002857143 2.857142857 ファ6~#ファ6
400 0.0025 2.5 #レ7
500 0.002 2 シ6~ド7
600 0.001666667 1.666666667 #ソ6
700 0.001428571 1.428571429 ファ6~#ファ6
待ち時間が半分になると周波数が2倍になり、音階もオクターブ上がる。

Z軸のモーターに対し5Vを印加したので700usが限界だったが、X,Y軸や12V印加なら全く違う結果になるのだろう。
消費電力とトルク、速度はトレードオフになりそう。


実際にはCNCシールドを使うが、まずはうまく動かせそうなことが確認できてよかった。
以上、続きは大陸から部品が届いてから。

格安3Dプリンタをレーザー加工機に作り変える(①検討、買い物)

■参考リンク
CNCを自作したければ、このサイトを見れば必要な情報はだいたい手に入る。

あとはAliexpressとAmazon、秋月、千石、マルツに加え、近所のホームセンターでモノを集めて、知恵と工夫があれば何とかなるはず。

■背景
電子工作で、今まではリード線やDIPの部品ばかり扱っていたが、最近は表面実装にも手を出している。
蛇の目基板だけでなく生基板を使うこともあり、カッターで銅を削って回路を書いているのだが、細かい回路を正確に書くのが難しくて困っている。
特に、SOPやSOTのICを配置しようとすると、1mm以下の精度で配線しないといけない部分も出てきて、手作業での限界を感じている。
回路が仕上がってからはPCBを外注すればいいが、プロトタイプの間はお金も時間も勿体ないので、できればその場で加工したい。

■検討:基板の作り方
感光基板や、生基板に塗料を塗ってレーザーで塗料を落としてエッチングするという方法もあるようだが、どうせなら銅を焼き切ってそのまま回路を作れないかと考えていた。
薬品や塩化銅の廃液処理が面倒なので。

Youtubeやネットを見て回って色々調査したところ、青色~紫外線の5W程度のレーザーなら、銅も焼き切ることができるようだ。
金属ごとに光の吸収率が全く違うらしい。
CO2レーザーやファイバーレーザーのような、赤系の波長では銅に跳ね返されてしまうらしい。

光の吸収率は、以下リンク中央あたりにわかりやすい図がある。さすがキーエンス。
今回は銅と455nmの組み合わせなので、だいたい吸収率は40%くらい。
5Wレーザーなら2Wで溶断できると考えればいい?のだろうか。

■検討:ハードウェア
・レーザー
Aliexpressを見ていると、5W青色レーザーが6千円くらいでヒット。非常にコスパがよい。

強力なレーザーは失明の危険性があるので、防護メガネも一緒に購入。

・可動部分
昔使っていた、Labists X1という3Dプリンタのガワを流用。
AnkerMake M5Cが来てから一度も動かしておらず、今後も使うことは無いので有効活用する。
1万円台と激安だが肝心の成形が安定せず、調整→失敗の繰り返しで時間とフィラメントが大量に必要だった。
3Dプリンターの勉強にはなったが、何かを作って利用するには不向き。

Youtubeのアカウントは残っているけど、公式Webサイトは無くなっている。
潰れたのかどこかと合併してしまったよう。

・CNC
Arduino向けのCNCシールドというものが安くて事例も多いようなので、これを使う。
V3, V3.51, V4の3つが主に出回っていて、数字が大きいほど新しいソフトウェアが使える。
例えばV3.51以降はマイクロステッピングが有効、等。

この基板はそこら中でクローンされているようで、AmazonやAliexpress、楽天などでも数百円~2千円程度で見つかる。
今回は、V4にArduino NanoクローンもセットになっているものをAliexpressで調達。

■検討:ソフトウェア
grbl+bCNCを利用する。
grblとは、CNCシールドを前提としたArduino向けのCNC向けファームウェアのことらしい。
bCNCをPCで動かすことで、grblを導入したArduinoとシリアル接続し、Gコードを解釈して実際にマシンを制御できるようになるようだ。

CNCシールド、grbl、bCNCのバージョンあわせが必要なよう。
これは実際にCNCシールドが届いてから考える。

次回に続く。


2024年4月21日日曜日

QMC5883Lは不安定?

ーーーーーー
2024/05/08追記:やはり原因はQMC5883Lだった。他は全て同じコードで、I2Cで地磁気を読む部分のみセンサおよびコードをLSM9DS1に置き換えると、少なくとも12時間連続動作させても問題ないことを確認。安物、コピーでもよい用途と、ダメな用途があるという学びになった。
ーーーーーー

GPSと方角ベースのナビを作るべくトライし続けているが、地磁気センサとのI2C通信が安定しないので、いつまで経っても先に進まない。
症状としては、起動後すぐは安定した速度で動作しているのだが、10分?60分?以上経過すると、徐々に地磁気センサからのX,Y,Z軸の磁気情報の読取が遅くなるというもの。

最初はプログラムのミスや外付け回路の不良を疑い、プログラムを書き換えたりI2Cのプルアップの値を変えたりして戦ってきたが、どの方法でも解消しない。

そもそもチップが悪いのではと考えて検索したところ、似たような症状の方を発見。
https://shinshu-makers.net/shinshu_makers/2019/10/02/%E3%80%90%E3%83%91%E3%83%AF%E3%83%BC%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC2019%E3%80%91qmc5883l%E4%B8%8D%E8%AA%BF%E3%81%A7lsm9ds1%E3%81%AB%E4%BA%A4%E6%8F%9B%EF%BC%9Cimu%E3%81%A7ok/

やはり格安チップではダメということか?
似たり寄ったりだが、aitendoで買ったHMC5883Lで再トライすることにする。

2024年4月20日土曜日

RP2040でR-2R DACを試してみる

I2Sの勉強をしていたら、R-2RというDACのことを知った。
せっかくなので、試しに作って遊んでみる。

参考文献はこちら→https://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/mechatronics/anadigi.html

上記サイトの上のほうの回路図にあるように、正確な抵抗のセットが2n本と、n個のDOがあれば、n bitのアナログ出力が作れるということ。
今回はDO4つ+R 3つ+2R 5つで、4bitを作ってみる。
Rの値は電源とマイコンの電流入出力能力を超えない範囲で選べばよいが、今回はわかりやすく1kΩと2kΩで作ってみた。

お行儀はよくないがGP18をLOWにしてGND代わりとしている。
GP21-24がDOで、A0で結果を読み取っている。

結果は以下のようになった。
ガタガタしているのは、抵抗のバラつき起因と思われる。
オーディオ用途で拘って作る人々は、チップ抵抗で16bit, 24bitを作って、抵抗器をやすりで削って微調整しているらしい。
一度トライしてみたい。

今回作ったものの精度はともかく、こんな簡単な回路でアナログ出力ができるというのは本当に面白い。


オマケで、結果の取得に使ったThonnyのコード。
汚いけどそのまま貼ります。
整数0~15を2bitの01の0埋め文字列に変換する部分、もっといいやり方がある気がするけど動けばいいやの精神。

import time

LED = machine.Pin(25, machine.Pin.OUT) # GP25をLEDとして出力端子に設定
GND = machine.Pin(18, machine.Pin.OUT)
GND.off()
bits = [
    machine.Pin(24, machine.Pin.OUT)
    ,machine.Pin(23, machine.Pin.OUT)
    ,machine.Pin(22, machine.Pin.OUT)
    ,machine.Pin(21, machine.Pin.OUT)
]
VIN = machine.ADC(0)
conv = 3.3/65535
conv = 1

print("start")
print("----")

def v(order):
    print(order, end="")
    print(": ", end="")
    for i in range(4):
        if order[i] is "0":
            bits[i].off()
        else:
            bits[i].on()
    time.sleep_ms(10)
    print(VIN.read_u16()*conv)

for i in range(2**4):
    t = ("000" + str(bin(i)).replace("0b", ""))[-4:]
    v(t)  

2024年4月13日土曜日

トランジスタ2石とDO 1つでマイコンの電源自己保持

待機中のマイコンの消費電力を極限まで下げるため、トランジスタ2石とDOを1つ使い、電源に自己保持回路を加えることを考えてみる。

何か動作させるときは、モメンタリスイッチなどでワンショットの入力を受け付ける。マイコンが起動すると、電源用のDOをHIGHにして、電源をONにしつづける。
仕事が終わったら、電源用のDOをLOWにして、自己保持を解いて電流を消費しないようにする。

マイコンにもスリープモードがあるのでそちらで十分な時は無駄に部品が増えるだけだが、うまく作ればスリープモード以上の省電力化ができるのでは?

考えた回路がこちら。
2つのスイッチが、マイコンのDO相当。右端の100Ωがマイコンの電源部分。

この回路は、NPNのベース抵抗の反対側にHIGHが印加されると電源ONで、LOWもしくはハイインピーダンスだと電源OFFになる。

シミュレータは以下のサイトを利用。

Import用のテキスト列。
$ 1 0.000005 10.20027730826997 50 5 43 5e-11
r 384 272 384 208 0 1200
s 208 256 272 256 0 1 false
v 144 336 144 160 0 0 40 3.7 0 0 0.5
r 464 160 464 336 0 100
w 320 160 368 160 0
w 208 160 320 160 0
w 144 336 208 336 0
w 400 160 464 160 0
w 384 336 464 336 0
t 352 288 384 288 0 1 -3.161620436472443 0.20923865338699582 100 default
t 384 208 384 160 1 -1 3.370856126826202 -0.32914051091822083 100 default
w 384 336 208 336 0
r 272 288 352 288 0 1200
w 208 160 208 256 0
w 256 192 320 192 0
w 144 160 208 160 0
w 384 336 384 304 0
s 208 288 272 288 0 1 false
w 272 256 272 288 0
w 208 288 208 336 0
o 0 64 0 4099 0.0000762939453125 0.00009765625 0 2 0 3
o 3 64 0 4099 0.0000762939453125 0.00009765625 1 2 3 3
38 0 F1 0 1 101 -1 Resistance


2024年3月24日日曜日

RP2040にてarudino-picoでWireを使うときの注意点

まず、ArduinoでRP2040を動かすにはMbed OS RP2040という公式系と、arduino picoというphilhowerさんが作ったバージョンがある。少なくともI2Cの使い方がそれぞれ違う。

公式版は、I2Cで任意のピンを使うのが難しいらしい。なので、arduino-picoを選ぶ。

そして、Wire/Wire1は、setup()やloop()のスコープ中でしか使えない。
グローバルスコープで使おうとすると、未定義となりうまくコンパイルできない。
RP2040-ZeroにてArduino IDEでI2Cを使うとき、micropythonの感覚で書くと失敗する。
こんなのにハマるのは私だけかもしれないが、誰かの役に立つかもしれないので一応公開しておく。

■OKのとき

#inclue <Wire.h>
void setup(){
  Wire1.setSDA(14);
  Wire1.setSCL(15);
}

■NGのとき

#inclue <Wire.h>
Wire1.setSDA(14);
Wire1.setSCL(15); void setup(){ }
ちなみに、NGのときは次のようなエラーが出る。
<ファイルパス>:18:3: error: 'Wire1' does not name a type
   18 |   Wire1.setSDA(14);
      |   ^~~~~
<ファイルパス>:19:3: error: 'Wire1' does not name a type
   19 |   Wire1.setSCL(15);
      |   ^~~~~
<ファイルパス>:20:3: error: 'Wire1' does not name a type
   20 |   Wire1.begin();
      |   ^~~~~
exit status 1
Compilation error: 'Wire1' does not name a type
Wire1が定義されていない、となっている。

thonny+micropythonからarduino-pico c++へ

これまで、RP2040関係はthonny+micropythonで動かしてきたが、arduno-picoとc++に移行することにした。

というのも、今回GPSナビを作るにあたり試行錯誤しているのだが、フリーズが多発し実用的なデバイスが作れそうにないため。
私の回路技術およびプログラミング技術の低さによるものなのか、そもそも無謀なことをやろうとしているのか、他に原因があるかは判別できていないが、このままでは埒が明かないので新しいやり方を試そうと思う。
特に、SPI液晶+I2Cセンサ+UARTのGPSという異なる3種類のバスをタイマ割り込みも交えつつ動かすというのがよくないのかもしれない。
リンクを見失ってしまったが、ピン割り込みとタイマ割り込みを高周期の設定で併用するとクラッシュするというようなブログの記載があった気がする。

今までCで書かれたライブラリを頑張ってmicropythonにポートしていたが、技術向上という意味では無駄ではなかったと思いたい。

2024年3月20日水曜日

gc9a01pyで円、楕円、三角を簡単に書けるようにする

gc9a01pyは大変有難いライブラリだが、四角と直線と点しか描けないのが弱点。
さすがに不便なので、円、楕円、三角を足した。
https://github.com/matsuura-h/gc9a01py/tree/main
以下は、ランダムに三角を表示している例。

効率のよい描画ロジックを1から作るのは大変なので、LovyanGFXのコードを参考にした。
CからPythonへの移植だが、すべてを手打ちすると大変なので、https://www.codeconvert.ai/c-to-python-converterで自動変換し、自動ではうまく動かない部分を手直しする。
ほとんどのコードはうまく自動変換できるけど、以下の2パターンだけはNGだった。

  1. do-while
    1. 対処方法:while Trueに書き直して、条件文を末尾にif not <condition>: breakとして追加する
  2. 入れ子になったインクリメントやデクリメント
    1. 対処方法:インクリメントやデクリメントを前出しもしくは後出しにする
一つ困っていることとして、gc9a01pyはMITライセンスだが、LovyanGFXはFreeBSDライセンスになっている。
こういうとき、どうやってライセンスを処理すればよいのだろうか?
また、私が移植した部分と元のコードは一体どのように扱うとよいのだろうか?
下手にpull reqestを送ってrusshughesさんやLovyan03さんの迷惑になったら申し訳ないので、とりあえず自分のリポジトリにforkを作って公開してみた。
よい方法をご存知の方がいたら、是非教えてください。

2024年3月18日月曜日

RP2040-ZERO+gc9a01pyの実描画速度を調べてみる

 gc9a01pyはmicropython派にとって大変有難いライブラリだが、どれくらいの速度で描画できるのかが気になる。

Timerと組み合わせて、簡易的にFPSを調べてみる。

サマリは以下の通り。

関数 1回のdot数 fps
line 240 tft.line(0, 0, 240, i, color565(i,255-i,count&255)) 5fps
line 10 tft.line(115, i, 125, i, color565(i,255-i,count&255)) 106fps
pixcel 1 tft.pixel(30+i, 30+j, color565(i,255-i,j)) 948fps
fill_rect 1 tft.fill_rect(30+i, 30+j, 1, 1, color565(i,255-i,j)) 868fps
fill_rect 100 tft.fill_rect(30+i, 30+j, 10, 10, color565(i,255-i,j)) 755fps
fill_rect 240*240 tft.fill_rect(0, 0, 240, 240, color565(i,255-i,j)) 18fps

line, pixelはdot数律速で、だいたい1秒1000dotが限界。
fill_rectは、SPIの命令送信と液晶内部処理の2つが律速。SPIの命令は最大1000回/s発行できる。
液晶内部での描画は、3パターンという少ない試行数からの試算なので意味があるかは怪しいが、今回の結果からは1dotあたり0.94usかかっていると推測される。
SPIの命令発行にかかる時間が変わらないとして、総塗り替えのときは1dotのときに比べ、54.4ms余分にかかっているので、1dotあたりに直すと0.94usとなる。
この結果を100dotに当てはめると803fpsとなり、実際のfpsに近い値になる。
試してみればいいことではあるが、fill_rectの速度推定にある程度役立つ。

以下は、実際に測定に使ったコードと結果の詳細。

■line:240dot
コードはこのような感じ。

  # Timer、計測部分
  from machine import Timer
  def showFPS(t):
      global count, count_prev, tft
      fps = count - count_prev
      tft.text(font,"FPS: {0}".format(fps),40,120,WHITE,BLACK)
      count_prev = count
  
  tim = Timer(period=1000, mode=Timer.PERIODIC, callback=showFPS)
  # 描画部分
  count = 0
  count_prev = 0
  while True:
      for i in range(240):
          count += 1
          tft.line(0, 0, 240, i, color565(i,255-i,count&255))
この例は、直線描画の速度を調べている。
結果、ほぼ5fps。ごくまれに6になるときもあるが、無視してよいレベル。


■line:10dot
今度は、線分の式を「tft.line(115, i, 125, i, color565(i,255-i,count&255))

」に変えてみる。
結果、106fpsくらいまで性能向上する。

lineの中身を見てみるとわかるが、これって結局pixelで1dotずつ描画指令を送信しているので、pixel数の多さで速度が決まるということだ。
このライブラリに限らず、なるべく1点ずつ打つのを避けないと、どんどん描画速度が下がってしまう。

■pixel
じゃあ、今度は1秒に何点打てるのか?を測ってみる。
while True:
    for i in range(180):
        for j in range(180):
            count += 1
            tft.pixel(30+i, 30+j, color565(i,255-i,j))
見てみると、948点/s行けるようだ。
lineで10点ずつ打つと100fps→1000点/sで、240点ずつだと5fps→1200点/sなので、lineの結果ともマッチする。



■fill_rect:1dot
次は、fill_rectを試す。vline, hline, rectも内部でこの式を呼び出している。
fill_rectは、液晶に対し開始終了地点と色を送るだけなので、実はpixelに比べてSPIで送る指示は2byteしか変わらず、送信回数は同じ。
もしSPIの送信がボトルネックとすれば、pixelと遜色ない速度が出せるはず。
while True:
    for i in range(180):
        for j in range(180):
            count += 1
            tft.fill_rect(30+i, 30+j, 1, 1, color565(i,255-i,j))
結果、868fps前後となった。pixelに比べ、8.4%の性能低下で済んでいる。
これは1点ずつの描画だが、次は1回の描画面積が広くなっても変わらないか、試してみる。

■fill_rect:100dot
縦横を10ずつにして、1度に10dotずつ描画させてみる。
while True:
    for i in range(180):
        for j in range(180):
            count += 1
            tft.fill_rect(30+i, 30+j, 10, 10, color565(i,255-i,j))
この場合は755 or 761fpsとなった。RP2040⇔GC9A01の間のSPIは変わらないが、液晶内部の描画が増えた分でこれだけ遅くなったということ。とはいえ13%の性能低下で、1回で更新できるdot数ベースならlineに比べて圧倒的に速い。

最後に、240x240全て塗り替えにすると画像は無いが18fpsくらいだった。さすがに全消去は遅い。

以上。

2024年3月17日日曜日

NMEAの経度・緯度を、Google Mapの形式に変換する

 緯度経度を目にするのはGoogle Map経由という人が大多数だと思う。

Google Mapでは、「https://www.google.com/maps/@<緯度>,<経度>,15z?entry=ttu」として緯度・経度を入力すると、その場所を中心とした地図を表示してくれる。

Google Mapで使う緯度経度は、DEGというフォーマットのよう。
他に、DMMなりDMSなりPOTなりがあって非常にわかりづらい。
GPSの吐き出す生データ(NMEA)は、DMM形式。
よくわからなくなることが多いので、変換方法をメモしておく。

■経度、緯度のフォーマットと相互変換方法メモ

DMM:度分.分
例)北緯3542.60402度=スカイツリー

DEG:度.度
例)北緯35.710067度=スカイツリー

DMM→DEG:int(mod(input, 100)) + mod(input, 100) / 60

DEG→DMM:int(input)*100 + mod(input, 1) * 60


※スカイツリー公式サイトから借用


RP2040のUARTで全文を途切れさせずに読み切る

GPSのNMEAを読み出すとき、文章が長かったりタイミングが悪いと、途中で途切れてしまうことがある。

以下のようにany()を使うと解決する。

■BEFORE

msg = uart.read()

■AFTER

msg = ""
while uart.any():
    msg = msg + str(uart.read())[2:-1]

スライサーで2文字目以降を取ることで、バイト列を文字列に変換したときの先頭の「'b」をスキップしている。-2にして文末もスキップすべき?

RP2040-ZERO+micropythonにてGPS AT6558の日時緯度経度を丸形液晶GC9A01に表示してみる

以前の記事。
RP2040-ZEROとGC9A01の試験→https://matsu-log.blogspot.com/2024/03/aitendom128gc9a01a-gc9a01rp2040-zero.html
GPS AT6558→https://matsu-log.blogspot.com/2024/03/gpsat6558.html

今度は、RP2040-ZEROに液晶とGPSを繋いで、緯度経度を液晶に表示してみる。


USART0を使いたいので、GP0,1を空ける。DCとRSTは、代わりにGP3,4に繋いでおく。

■液晶

  1. GND → GND
  2. VCC → 3V3
  3. SCL → GP6/SPI0 SCK
  4. SDA → GP5/SPI0 TX
  5. RES → GP3
  6. DC → GP4
  7. CS → GP5/SPI0 CSn
  8. BLK → 未使用
■GPS
  1. GND → GND
  2. VCC → 3V3
  3. TX → GP1
    ※RXは繋がなくてもいいので無視

Fritzingで作った回路図。探してみると、RP2040-ZEROなどたくさんのAdd-onパーツが公開されていて非常に有難い。さすがにGPSは無かったので、似たような部品と汎用ヘッダで代用。

以下のようなコードで、$GNGGAと$GNRMCから日時と緯度経度を吸い上げて、液晶に表示した。液晶、GPSをうまく繋げられていたので、これはすんなり作れた。

以下、micropythonコード。

from machine import Pin, SPI
import gc9a01py as gc9a01
import time

import vga2_8x16 as font

from machine import UART
uart = UART(0, baudrate=9600, tx=0, rx=1)

# GPSの結果から日時と緯度経度を抜き出す
def GPS(input):
    if input is None:
        return ("","","","")
    msgs = str(input)[2:-1].split("\\r\\n")
    lat = ""
    lgt = ""
    date = ""
    time = ""
    for msg in msgs:
        if msg[0:6] is "$GNGGA":
            item = msg.split(",")
            if len(item) <= 4:
                continue
            #print(item[1], item[2], item[4])
            time = item[1]
            lat = item[2]
            lgt = item[4]
        elif msg[0:6] is "$GNRMC":
            item = msg.split(",")
            if len(item) <= 10:
                continue
            time = item[1]
            lat = item[3]
            lgt = item[5]
            date = item[9]
    return (date, time, lat, lgt)

# GC9A01初期化
SPI_PORT = 0
SPI_BAUDRATE = 60000000
RESET_PIN = Pin(3, Pin.OUT)
DC_PIN = Pin(4, Pin.OUT)
CS_PIN = Pin(5, Pin.OUT)

spi = SPI(SPI_PORT, baudrate=SPI_BAUDRATE, sck=Pin(6), mosi=Pin(7))
tft = gc9a01.GC9A01(spi=spi, dc=DC_PIN, cs=CS_PIN, reset=RESET_PIN, backlight=None, rotation=0)

bgcolor = gc9a01.color565(0x00, 0x44, 0x22)
tft.fill(bgcolor)

tft.text(font,"GPS Tracker",80,20,gc9a01.BLACK,bgcolor)
while True:
    msg = uart.read()
    ret = GPS(msg)
    pos = 40
    for item in ret:
        if not item is "":
            tft.text(font,item,80,pos,gc9a01.BLACK,bgcolor)
        pos += 20
    tft.fill_rect(88,80,24,40, gc9a01.GREEN)
    time.sleep(0.5)

2024年3月16日土曜日

aitendoの丸形液晶(M128GC9A01A, GC9A01)をRP2040-ZEROで試す

aitendoの丸形液晶 M128GC9A01Aについて、前回、M5+UI FLOWで挑戦するも、失敗。
商品リンク:https://www.aitendo.com/product/20938

今度は、raspberry pi pico互換のRP2040-ZEROで挑戦する。
まずはSPI接続。

以下、スイッチサイエンスさんより画像を借用。
RP2040-ZEROのSPIは2系統あり、片方は裏面のパッドや左右のピンに点在してしまっているので、今回はSPI0を使い右側で固めて配線することにする。電源は左側固定で、さらにジャンパ使うのであまり意味はないが。

配線表とmicropython用のライブラリや使用例を見比べて、以下のつなぎ方に決定。

  1. GND → GND
  2. VCC → 3V3
  3. SCL → GP6/SPI0 SCK
  4. SDA → GP5/SPI0 TX
  5. RES → GP0
  6. DC → GP1
  7. CS → GP5/SPI0 CSn
  8. BLK → 未使用
試しては無いが、たぶん3, 4以外は任意のピンでよいとは思う。
ライブラリはこちら:https://github.com/russhughes/gc9a01py/tree/mainを使わせていただく。
libのgc9a01py.pyをダウンロードし、ThonnyでRP2040-ZEROのルートにこのライブラリのpyファイルを格納すればOK。
下図のように、デバイスのルート直下にファイルが表示されていれば大丈夫。これで、「import gc9a01py as GC9A01」というようにして呼び出せるようになる。

本当に大したコードではないけど、私自身がこのディスプレイをRP2040-ZERO+micropythonで利用するのに結構苦労したので残しておきます。

from machine import Pin, SPI
import gc9a01py as GC9A01

# GC9A01初期化
SPI_PORT = 0
SPI_BAUDRATE = 60000000
RESET_PIN = Pin(0, Pin.OUT)
CS_PIN = Pin(5, Pin.OUT)
DC_PIN = Pin(1, Pin.OUT)

spi = SPI(SPI_PORT, baudrate=SPI_BAUDRATE, sck=Pin(6), mosi=Pin(7))
tft = GC9A01.GC9A01(spi=spi, dc=DC_PIN, cs=CS_PIN, reset=RESET_PIN, backlight=None, rotation=0) 
 
tft.fill(GC9A01.RED)
for i in range(240):
    tft.pixel(i, i, GC9A01.GREEN)
    tft.pixel(120, i, GC9A01.BLUE)
    tft.pixel(i, 120, GC9A01.WHITE)

これがうまく動くと、冒頭の画像のようになる。赤背景に、緑青白の線を引いただけ。
速度を気にするなら矩形や線描写のメソッドを使ったほうがいいはず。

以上。

2024年3月5日火曜日

地磁気センサQMC5883Lにハマりかける

前回、ATD5883Lを1つ焼いてしまったので、Amazonで格安の類似品を注文。3つで\769と格安。(https://www.amazon.co.jp/dp/B0CFQSW2TG

aitendoで買ったATD5883Lでうまくいったコードを動かしてみると、そもそもI2Cのアドレスが0x0D (13)と表示され、アドレスを変えて動かすも、なぜかセンサの値が3軸とも0になる。

よくよく調べてみると、このチップは「QMC5883L」というレジスタアドレスが互換ではない似て非なるチップとのこと。
https://leico.github.io/TechnicalNote/Arduino/esp32-qmc5883l-basicにて先人がレジスタをまとめてくださっているので、有難く参照する。

要所は以下の通り。

  • 出力レジスタが異なる
    • MAG_X:0x00-01
    • MAG_Y:0x02-03
    • MAG_Z:0x04-05
  • 出力レジスタ16bitがリトルエンディアンの並び順
  • 連続モードの設定方法が異なる
    • 0x0Bに0x01を書き込み
    • 0x09に0x1Dを書き込み


UI FLOWだと上記の通り。
以下はmicropython。

pin0 = machine.Pin(22, mode=machine.Pin.OUT, pull=0x00)
pin0.off()
i2c0 = i2c_bus.easyI2C((23, 19), 0x00, freq=10000)
wait_ms(100)
print('----start')
print(i2c0.scan())
print(i2c0.available())
wait_ms(100)
i2c0.addr=(0x0d)
wait_ms(100)
i2c0.write_u8(0x0b, 0x01)
i2c0.write_u8(0x09, 0x1d)
print(i2c0.read_reg(0x0D, 1))
while True:
  print(str([i2c0.read_u16(0x00, byteorder="little"), i2c0.read_u16(0x02, byteorder="little"), i2c0.read_u16(0x04, byteorder="little")]))
  wait_ms(100)
  wait_ms(2)

この例では、m5atom liteの3.3V側の端子5pinにセンサを直結している。G22を0V出力にして、G23, 19をI2Cに割り当てればOK。

これでうまく地磁気を読み取れて、めでたしめでたし。