Raspberry Pi Pico zero(Waveshare)を使ってArduinoでR909-testerと言うプロジェクトやってます。コンデンサに100kΩで充電して0.64までの時定数から容量を算出するという教科書スタイルです。充電する前に放電させないといけないので、ADCで使うGPIO29を一旦、pinMode(GPIO29, output)としたが、シカとされました。
お話をまとめると次になります。
1.【やりたかったこと】
Pico(RP2040)で、ピン1本をデジタル出力(放電)とアナログ入力(測定)でダイナミックに切り替えて、コンデンサの充放電(時定数)を測ろうとした。
2.【直面した謎のバグ】
ピンを切り替えているはずなのに、オシロで見ると上りも下りも綺麗なCRカーブのままで、放電制御が全く効いていない(オープン状態になっている)。ピンを28や29に変えても同じ。
3.【原因の特定】
ArduinoのPico用コアライブラリの仕様(罠)により、一度 analogRead() を呼ぶとピンがアナログモードに拉致・固定され、以降の pinMode(OUTPUT) が裏でスルーされてしまうためらしいと判明。
4.【じじ研的・解決策(オチ)】
「ソフトがダメならハードで直せ!」ということで、制御用のGPIO14に向けてダイオードを1本追加。GPIO14をLOWにすることで物理的に電荷をぶち抜く回路に変更し、見事解決!
R909-testerと言うプロジェクトはHackadayにポストしてます。
R909-Tester: A Modular RP2040 zero Instrument
https://hackaday.io/project/206070-r909-tester-a-modular-rp2040-zero-instrument
はてなブログ
https://nobcha23.hatenablog.com/
