CommonLisp에서 RaspberryPi 전자 공작 ~L치카편 SBCL판~

소개



전회 CLISP로 했던 L치카를 이번은 SBCL로 해 보려고 생각합니다.
Quicklisp를 사용하므로 미리 설치해 두십시오. (아래 참조)

· Quicklisp 베타

【추기】
SBCL 설치는 아래 기사의 "SBCL 설치"에 설명되어 있습니다.
CommonLisp로 만드는 STG

Quicklisp 설치는 다음 기사의 "Quicklisp 배포"에 설명되어 있습니다.
CommonLisp로 만드는 STG~그 2~

패키징



cffi를 Quicklisp로로드하고 패키지 정의.

packages.lisp
;; cffiをQuicklispでロード
(ql:quickload "cffi")

;; cl-cffiパッケージを定義
(defpackage :cl-cffi
    (:use :common-lisp :cffi))

API 래퍼 작성



L치카에 필요한 각종 함수의 API 래퍼를 작성.
ffi로 만드는 것보다 편하네요.

libwiringPi.lisp
(define-foreign-library libwiringPi
              (:unix "libwiringPi.so"))

(use-foreign-library libwiringPi)

;; wiringPi初期化
(defcfun "wiringPiSetupGpio" :int)

;; GPIOピンのモード設定
(defcfun "pinMode" :void (pin :int) (mode :int))

;; GPIOピンの出力制御
(defcfun "digitalWrite" :void (pin :int) (value :int))

;; 待機処理
(defcfun "delay" :void (howlong :uint))

L치카 프로그램 본체 작성



본체 프로그램은 CLISP로 했을 때와 거의 같다.
"wiringPi:"를 붙이지 않아도 좋아진 정도의 차이입니다.

blink.lisp
;; パッケージをロード
(load "packages.lisp" :external-format :utf-8)

;; 定義したパッケージに入る
(in-package :cl-cffi)

;; ラッパーAPIをロード
(load "libwiringPi.lisp" :external-format :utf-8)

;; GPIO11(23ピン)を「+pin+」の名前で定義
(defconstant +pin+ 11)

(defun blink ()
  ;; GPIOを初期化
  (wiringPiSetupGpio)

  ;; GPIO11を出力モード(1)に設定
  (pinMode +pin+ 1)

  ;; 無限ループ(Ctrl-cでループを抜ける
  (loop
    ;; GPIOを3.3VにしてLEDを点灯
    (digitalWrite +pin+ 1)
    ;; 500ms待機
    (delay 500)
    ;; GPIOを0VにしてLEDを消灯
    (digitalWrite +pin+ 0)
    ;; 500ms待機
    (delay 500)))

;; 実行!
(blink)

회로도



지난번처럼


실행



이번에는 이하를 읽는 것만으로 실행할 수 있도록 해 보았습니다.
(load "blink.lisp" :external-format :utf-8)

마지막으로



SBCL + Quicklisp에서 L 치카를 해 보았습니다.
Quicklisp를 사용하는 편의상, 먼저 cffi를 로드하는데 시간이 걸리는 것이 난점입니다만, 코드의 보수성에 관해서는 이쪽이 좋다고 생각합니다.

이번 소스 코드는 Github에서도 공개하고 있습니다.
· Github

좋은 웹페이지 즐겨찾기