Common Lispの系譜を継ぐuLispをラズパイPico2マイコン上で練習中。ここまでCommon LispとuLispの重複部分でした。今回からはuLisp独特な領域、ハードウエア制御へ入ります。その1回目はGPIOとな。既に「吉例Lチカ」を過去回でやっているので復習か。でもほじくると出てくるのよ。なんだかな~。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
今回の動作確認リスト
uLispはその成り立ちからして Arduino環境に依存しています。マイコン・ハードウエア制御のための関数どもはArduinoのAPI関数をほぼそのまま受け継いだ感じです。今回動作確認してみるのは以下の3つです。
-
- pinmode
- digitalread
- digitalwrite
pinmodeは、IOピンをデジタル入出力として使用する際にその動作モードを指定する関数です。出力なのか、入力なのか、入力でもプルアップ付きなのかなど。第一引数に端子番号、第二引数にピンモードを示す数値もしくは定数を与えることになってます。通常はこんな感じ。
(pinmode 15 :input)
ところが、今回、ラズパイPico2上で、uLisp 4.6 を使用する場合、:inputとか、:input-pullupとかの事前定義されている筈の定数どもが効かんという件に遭遇。過去、他マイコン機種上では使用できていたハズの機能であります。原因はおいておくと(多分ビルド時のマクロ設定の問題と想像されます)、以下のようにアカラサマに数値でピンモードを与えれば動作OKでした。カッコ悪いけど。
(pinmode 15 0)
digitalreadは、端子の状態を入力するもの、Arduinoでは1か0かということになりますが、uLispでは t か nil かが返ってきます。当然か。
digitalwriteは、端子に出力するもの。この関数はアカラサマに数値の1と0を引数にしても問題なく出力してくれます。これまた当然か。
今回の動作確認用回路
ハードに踏み出してしまったので、回路なしにはuLispのコードを書けませぬ。今回のしょぼい回路が以下に。
目論見は、プッシュスイッチSW1を推したら LED D1が点灯、スイッチ離したら消灯するだけのプログラムであります。
今回のuLispプログラム
Arduino風に、setupした後は無限Loopで回る関数が以下に。
(defun gpiotest (pi po) (pinmode pi 0) (pinmode po 1) (loop (if (digitalread pi) (digitalwrite po 1) (digitalwrite po 0)) (delay 100)))
loopだけでなく、関数自体が暗黙のprogn使っていてハシタナイ感じがしますが、ハードの制御なので気にしないことにします。なお delayでちょいとお休み入れているところが結構ミソです。delay関数はキーボードからの入力を確認しており、~(チルダ記号)が入力されると中断して戻ってきてくれます。大事だね~。
動作確認
上の回路の実機上で動作確認するのには以下のように関数を走らせます。
(gpiotest 15 14)
GPIO15番がスイッチ入力端子、GPIO14番がLED出力端子です。
スイッチ押すとLEDが光るだけの回路っす。でもLispなのよ。