Lispと一緒(4) ラズパイPico2でもuLisp、吉例Lチカ

Joseph Halfmoon

ラズパイPico2をターゲットに、別シリーズにて 「C/C++ SDK」「Arduino」「MicroPython」の3種の開発環境にて吉例Lチカ。Pico2でもソフトが作れる雰囲気。しかし、心の底で引っかかっていたものがあります。組み込み用のLisp処理系、uLispです。今回は処理系インストールして吉例Lチカまで。

※Lispと一緒 投稿順 index はこちら

まずは別シリーズのPico2での吉例Lチカ3連発が以下に

やっていることは皆Lチカですが、開発環境毎に設定などでとまどう事もあり、書き留めましたるものが以下でございます。

Pico C/C++ SDK

Arduion IDE

MicroPython

上記の3種類はどれも人気でお使いになられている姉貴兄貴も多数でおられると思います。

今回はuLispじゃ

かねて残念に思っておったのですが、uLisp、日本では今一つ人気でない感じがします(これまた個人の感想デス。)かなりな種類のマイコンに移植されており、ドキュメントも充実、強力でよく出来た処理系、そしてLispには熱狂的な推しのイケオジ様がおられるのではないかと思うのですが(個人の感想です。)

今回みたら、uLisp、早速Pico2にも対応しておりました。9月冒頭ね。いつものことだけれども仕事が速い?ね。ホームページが以下に

Lisp for microcontrollers

そして Pico2対応についての解説ページが以下です。

Raspberry Pi Pico 2

さてそのインストールは簡単ではありますが、ソースからのビルドとなります。手順は以下の通り

    1. Arduino IDEでPico2をビルトできるようにする(上記の過去回記事のArduino IDEでのLチカができる環境そのままです。)
    2. Arduino IDEでPico2向けにビルドする時に、スケッチが使える容量を3Mバイト、残り1MバイトはFS(ファイルシステム)用に設定しておく(これをお怠ると後で実行環境をセーブ、ロードするときに困ります。)
    3. ulispのダウンロードページもしくはGitHubから uLisp の Release 4.6bのソースファイルを持ってきてArduino IDEでビルドして書き込む。.ino形式の単一ソースファイルなので、いつものArduinoのビルドと手順は同じです。7859行、 248KBありますが、感覚的には(個人の感想デス)一瞬でビルドが終わり、書き込み完了と同時にシリアルモニタが起動してプロンプトが出現します。

Arduino IDEのセットアップについては出来ているものとして、2番目手順からです。Pico2はプログラムに使えるFlashメモリを4Mバイト(Picoのときは2Mバイトだった)も搭載しているので、ファイルシステム用に1Mくらい使ってしまっても余裕じゃないかと思います。確保の仕方はArduino IDEのツールメニュー(もちろんターゲットボードはPico2にしておいてくだされ)から以下のFlash Sizeのところを開き赤丸で印してあるところをクリックするだけです。FlashSizeSetting

これでArduino IDE上でビルドするプログラムサイズをコントロールできたことになったみたい。

さて uLisp のソース(Arm用)の在処は以下です。

https://github.com/technoblogy/ulisp-arm/

いつもの Arduino 式に .ino 形式の一本のソースにまとまっているのでとてもお楽です。これ一本で各種Armコアのマイコンボードをサポートしとります。

Pico2ボードに uLisp を書き込んだ直後のシリアルモニタの様子が以下に。OnTheArduinoIDE

さらっと uLisp 4.6b とグリーティング・メッセージが出た後は uLispのプロンプト(23000>というところです。23000は残りのフリー領域の数みたい)が返ってきてしまったので、思わず

(+ 1 1)

などと入力してみたら、2と答えが返ってきます。uLispは、小さな処理系ではあるけれど、common Lisp 風味らしいデス。知らんけど。

Arduino IDEのシリアルモニタでプログラムしても良いのですが、外部のエディタ(秀丸)+仮想端末ソフト(Teraterm Pro)の組み合わせに変えて以降の処理を行いました。慣れた環境がお楽。

さて、吉例Lチカのコードは、Pico2の解説ページに掲載されております。それをテキストファイルとして作成しておきます。

(defun blink (&optional x)
  (pinmode :led-builtin t)
  (digitalwrite :led-builtin x)
  (delay 1000)
  (blink (not x)))

さて、Teraterm Proのファイル転送機能を使って上記のソース(テキストファイル)をuLispに入力します。こんな感じ。blinkRunning

(blink) として走らせると、吉例Lチカ動作しましたぞ(いつもと同じなので写真は貼付しないけど。)

さて上記は末尾で自分自身を呼び出して無限ループしております。Lispらしい末尾再帰っす。途中 delay という関数で時間を無駄にしてますが、delayは端末側から一文字、チルダってやつ

~

を入力すると、プロンプトに戻ってきます。こんな感じ。ESCAPE

このblink関数が動作することは確かめられたので、現在のワークスペースの内容を確保済のFS(ファイルシステム)にセーブしてみます。save-imageとな。なおファイル名はキメウチらしいです。これでFlash上に記憶されたので電源落としても大丈夫なハズ。

電源落として再度立ち上げてロードしてみました。こんな感じ。load_image

(blink)と入力すれば再び吉例Lチカが走りまする。やったね。

Lispと一緒(3) uLisp、Wio Terminalのボタンをセンスする へ戻る

Lispと一緒(5) ラズパイPico2でもuLisp、まずはCARとCDR一族 へ進む