Common Lispの系譜を継ぐuLispをラズパイPico2マイコン上で練習中。前回からuLisp独特な領域、ハードウエア制御へ入りました。前回がデジタル入出力であったので、今回はアナログ入力です。ADコンバータ使って電圧の読み取りね。まあ全部が全部使えるわけでもないみたいだけれども。読み取りは出来るっと。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
今回、動作確認の関数ども
uLispのハードウエア制御関数どもは、ArduinoのAPI関数をほぼそのまま受け継ぐスタイルです。ただし「Arduino互換」といってもボードの種類は多く、全てのボードで全てのAPI関数を使えるわけでもなく、結構デコボコがあります。uLispにおいても同様です。
今回はADコンバータ使ってアナログ電圧を読み取ってみますが、ArduinoのAPI的には以下の3つが関係します。
-
- analogread ピン番号
- analogreference レファレンス電圧の型
- analogReadResolution レゾリューションビット数
結論から言うと Pico2用にビルドしたuLisp 4.6b上では、analogreadは出来るので電圧の読み取りそのものは可能ですが、参照電圧設定用のanalogreferenceとレゾリューション変更用のanalogReadResolutionは使用できないみたいです。こんな感じね。
「建前」ラズパイPicoは、12ビットのADコンバータを搭載しておりますが、その実力は10ビットくらいじゃないかと以下の別シリーズ記事に書きました。
(44) ラズパイPico2:RP2350、Pico:RP2040、ADC比較
Pico2ではPicoより改善が見られるものの、依然実力は10ビットくらいじゃないかと思います。そのためかどうかは不明ですが、デフォルトのレゾリューションは10ビットで、それを変更するAPIは使用できないです。ちょっと残念。
今回の動作確認用回路
ハードを試用してみるので、毎回の手作業が老眼に辛い年寄です。今回のしょぼい回路(手抜き)が以下に。
今回のuLispプログラム
今回も、Arduino風にsetupした後は無限Loopで回る関数デス。28番のAD端子から読んだ値を判定してGP14とGP15に接続したLEDを光らせてます。電圧が高いとLEDが2灯(D1=青、D2=赤)点灯、低くなるにつれて赤1灯、そして青1灯、さらに低くなると全消灯というコードです。
(defun analogreadtest (ain L0 L1) (pinmode L0 1) (pinmode L1 1) (digitalwrite L0 1) (digitalwrite L1 1) (loop (let ((rval (analogread ain))) (cond ((> rval 512) (digitalwrite L0 0) (digitalwrite L1 0)) ((> rval 256) (digitalwrite L0 0) (digitalwrite L1 1)) ((> rval 128) (digitalwrite L0 1) (digitalwrite L1 0)) (t (digitalwrite L0 1) (digitalwrite L1 1)))) (delay 100)))
例によって、delay関数を噛ませてあるので、コンソールから ~(チルダ記号)を入力するとloopから脱出してプロンプトに戻ります。
動作確認
上の回路の実機上で動作確認するのには以下のように関数を走らせます。
(analogreadtest 28 15 14)
ボリュームを操作して、2灯点灯状態にしたところが以下に。
Lispでアナログ入力も取り扱えると。