CommonLispでGPIO実験 ~WiringPiライブラリ編~


CommonLispでGPIO実験 ~WiringPiライブラリ編~

本章では、wiringPiライブラリを使用して電子工作を行います。
BCM2835ライブラリの時と同様に言語はCLISPを使用します。

【目次】
1.wiringPiの準備
2.CLISPのインストールとFFI有効化
3.APIラッパー作成
4.Lチカ
5.電子回路
6.実行
7.まとめ

1.wiringPiの準備

自分がインストールしたOS「RASPBIAN JESSIE」のVersion「May 2016」では、
最初からwiringPiの共有ライブラリ「libwiringPi.so」が「/usr/lib/」にあったので、
わざわざ自分で用意する必要がありませんでした。


▲上へ

2.CLISPのインストールとFFI有効化

CLISPのインストールとFFI有効化は 「CommonLispでGPIO実験」の「開発環境の準備」 を参考にしてください。
すでにやってしまっている場合はスキップしてください。

▲上へ

3.APIラッパー作成

まず最初にLチカに必要となる各種関数をCLISPで使えるようにします。
Lチカで必要になる関数は以下の4つです。

・ wiringPiSetupGpio
  wiringPiの初期化に使用。
  エラーの場合は-1が返ってきます。

・ pinMode
  GPIOピンのモード設定を行います。
  第1引数にGPIOピン番号、第2引数にモード(0:Input、1:Output)を設定。

・ digitalWrite
  GPIOピンの出力制御を行います。
  第1引数にGPIOピン番号、第2引数に値(0 or 1)を設定。

・ delay
  待機処理を行います。
  引数で指定した値[ミリ秒)分待機します。

APIラッパーのプログラムは以下の通りです。
(defpackage :wiringPi
  (:use :FFI)
  (:export :SetupGpio
	       :pinMode
	       :digitalWrite
	       :delay))

(in-package :wiringPi)

(ffi:open-foreign-library "libwiringPi.so")

(ffi:def-call-out SetupGpio
		  (:name "wiringPiSetupGpio")
		  (:return-type ffi:int)
		  (:language :stdc)
		  (:library "libwiringPi.so"))

(ffi:def-call-out pinMode
		  (:name "pinMode")
		  (:arguments (pin ffi:int) (mode ffi:int))
		  (:language :stdc)
		  (:library "libwiringPi.so"))

(ffi:def-call-out digitalWrite
		  (:name "digitalWrite")
		  (:arguments (pin ffi:int) (value ffi:int))
		  (:language :stdc)
		  (:library "libwiringPi.so"))

(ffi:def-call-out delay
		  (:name "delay")
		  (:arguments (howlong ffi:uint))
		  (:language :stdc)
		  (:library "libwiringPi.so"))

▲上へ

4.Lチカ

Lチカプログラムを作成します。
プログラムの内容を以下に示します。
; ラッパーAPIをロード
(load "libwiringPi.lisp")

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

(defun main ()
  ; GPIOを初期化
  (wiringPi:SetupGpio)
  
  ; GPIO11を出力モード(1)に設定
  (wiringPi:pinMode +pin+ 1)
  
  ; 無限ループ(Ctrl-cでループを抜ける)
  (loop
    ; GPIOを3.3VにしてLEDを点灯
    (wiringPi:digitalWrite +pin+ 1)
    ; 500ms待機
    (wiringPi:delay 500)
    ; GPIOを0VにしてLEDを消灯
    (wiringPi:digitalWrite +pin+ 0)
    ; 500ms待機
    (wiringPi:delay 500)))

▲上へ

5.電子回路

電子回路はBCM2835ライブラリの時と同じものを使用しました。


▲上へ

6.実行

実行結果はBCM2835ライブラリを使った場合と全く同じなので省略。

▲上へ

7.まとめ

Lチカではあまり違いはありませんでしたが、もっと複雑なコードを書く場合は、
BCM2835ライブラリよりもwiringPiライブラリを使用した方が個人的には楽になると思いました。

今後はwiringPiの方を使用して電子工作を進めていきたいと思います。
それでは、今回はここまでです。
お疲れ様でした。
▲上へ