PrologだってLチカしたいよ
Prologというと論理型の言語であり、どちらかというとアカデミック用途が多いです。PrologでラズパイのGPIO制御については応用例が少ないようなのですが、PrologでだってLチカしたいですよね。その方法についてご紹介します。
SWI-Prologの場合
Prolog処理系といいますとJanさんのSWI-Prologが有名です。事実上の世界標準だと思われます。とても高性能です。ところでSWI-PrologでGPIOを扱いにはどうしたらいいのでしょうか?ググってみるとJanさんが説明しているのが見つかりました。
https://discourse.swi-prolog.org/t/access-to-gpio-on-raspberry-pi/4438
CのライブラリをSWI-Prologから呼び出すようです。
N-Prologの場合
拙作のN-Prologはできるだけお手軽にGPIOを制御できるようにしてあります。ラズパイで処理系をコンパイルしますとハードがラズパイの場合には自動的にGPIO制御の述語を組込み述語として組み入れるようになっています。
拡張された述語は下記のとおりです。
N-Prolog <==================================> C
wiringpi_spi_setup(ch speed) <===> wiringPiSPISetup (SPI_CH, SPI_SPEED)
wiringpi_setup_gpio <===> wiringPiSetupGpio()
pin_mode(n, 'output) <====> pinMode(n, OUTPUT) or 'input -> INPUT 'pwm-output -> PWM_OUTPUT
digital_write(n, v) <===> digitalWrite(n, v)
digital_write_byte(v) <===> digitalWriteByte(value)
digital_read(pin) <===> digitalRead(pin)
delay(howlong) <===> void delay(unsigned int howLong)
delay_microseconds(howlong) <===> void delay_microseconds(unsigned int howLong)
pull_up_dn_control(pin, pud) <===> pullUpDnControl(pin,pud)
pwm_set_mode('pwm_mode_ms) <===> pwmSetMode(PWM_MODE_MS); or 'pwm_mode_bal -> PWM_MODE_BAL
pwm_set_clock(n) <===> pwmSetClock(n)
pwm_set_range(n) <===> pwmSetRange(n)
pwm_write(pin, value) <===> pwmWrite(pin , value)
自律型ロボット
写真はPrologで制御のおもちゃロボットを作ろうとして途中になったままのものです。超音波センサーとLチカを仕込んであります。バッテリーは携帯電話用のバッテリー。欲がでて画像認識もとDeepLearning(以下「DL])にはまってしまいました。この後Elixir用のDLライブラリDeepPipe2の開発に没頭してしまい、ロボットは中途半端なままです。(苦笑)
夢は膨らむ
Prologは論理的推論ができます。これとDLを組み合わせると面白いことができそうです。そしてGPIOでセンサーやサーボモーターを制御したら面白そうです。といいつつ、Lisp処理系開発、Prolog処理系開発に没頭していたのでさっぱり進展していないのですが。
N-PrologはRUN/PROLOG互換のインタプリタ・コンパイラです。OSSとして無償提供しております。
https://github.com/sasagawa888/nprolog