CommonLisp에서 RaspberryPi 전자 공작 ~GPIO 입력편~

소개



지난번에 계속해서 이번에는 GPIO 입력을 해보고 싶습니다.
이번에도 SBCL + Quicklisp를 사용합니다.

패키징



마지막과 똑같은

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

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

API 래퍼 작성



마지막으로 만든 것에 필요한 함수를 더해갑니다.
다음 두 가지 추가.

· pullUpDnControl
단자에 아무것도 연결되어 있지 않은 경우의 상태를 설정하는데 사용.
3.3V의 경우는 "2", 0V의 경우는 "1"로 설정한다.

·digitalRead
GPIO 단자의 상태를 읽습니다.
버튼을 누르면 "0", 놓으면 "1"이 된다.

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))

;; 端子に何も接続されていない場合の状態を設定
(defcfun "pullUpDnControl" :void (pin :int) (pud :int))

;; GPIO端子の状態を読み込む
(defcfun "digitalRead" :int (pin :int))

GPIO 입력 프로그램 본체 작성



프로그램 본체는 다음과 같이 되었습니다.
pullUpDnControl 을 추가한 것과 무한 루프내를 조금 줄인 것뿐입니다.

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

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

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

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

(defun digi-input ()
  ;; GPIO初期化
  (wiringPiSetupGpio)

  ;; GPIO17を入力モード(0)に設定
  (pinMode +pin+ 0)

  ;; 端子に何も接続されていない場合の状態を設定
  (pullUpDnControl +pin+ 2)

  ;; 無限ループ:"Ctrl-c"でループを抜ける
  (loop
   (if (equal (digitalRead +pin+) 0)
     (format t "Switch ON~%")
     (format t "Switch OFF~%"))
   (delay 500)))

;; 実行!
(digi-input)

회로도



회로도는 다음과 같습니다.
사용한 것은, 「택트 스위치」와 「1kΩ 저항(차흑 적금)」입니다.



실행



SBCL을 시작하고 다음 명령으로 실행.
(load "input.lisp" :external-format :utf-8)

택트 스위치를 누르지 않으면 콘솔에 "Switch OFF"가 표시되고, 누르면 "Switch ON"으로 변경됩니다.
이하 실행중인 모습



마지막으로



GPIO 표준 입력도 무사? 할 수 있었습니다.
이것으로 입출력을 할 수 있게 되었으므로, 이것들을 조합해 나가면 여러가지 재미있을 수 있을 것 같네요.

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

좋은 웹페이지 즐겨찾기