はじめに

Raspberry Pi 4 Model Bに入れたUbuntu Desktop 21.10で、

GPIO制御をLGPIOライブラリを使ってC言語で行います。

背景としては、こちらの記事でUbuntu Server 20.04.2 LTS 64bit版にWiring Piを入れて、

GPIO制御をC言語プログラムから行おうと思ったのですが、Ubuntuが64bit版だったこともあってか、

下記のようにコンパイル時にエラーとなってしまって、できませんでした。(Pythonは大丈夫でした。)

$ gcc -o blink blink.c -lwiringPi
/usr/bin/ld: skipping incompatible /usr/lib/gcc/aarch64-linux-gnu/9/../../../../lib/libwiringPi.so when searching for -lwiringPi
/usr/bin/ld: skipping incompatible /lib/../lib/libwiringPi.so when searching for -lwiringPi
/usr/bin/ld: skipping incompatible /usr/lib/../lib/libwiringPi.so when searching for -lwiringPi
/usr/bin/ld: skipping incompatible /usr/lib/gcc/aarch64-linux-gnu/9/../../../libwiringPi.so when searching for -lwiringPi
/usr/bin/ld: skipping incompatible /lib/libwiringPi.so when searching for -lwiringPi
/usr/bin/ld: skipping incompatible /usr/lib/libwiringPi.so when searching for -lwiringPi
/usr/bin/ld: cannot find -lwiringPi
collect2: error: ld returned 1 exit status

そこで、他の方法を探していたところ、

Ubuntuのこちらのページによると、Ubuntu 21.04からはRPi.GPIOなどは使えなくなりますが、

LGPIOというライブラリを使えば、GPIO制御ができるとのことだったので挑戦してみました。

※こちらに書いた手順でPythonでもLGPIOライブラリでGPIO制御できるようになりましたが、

Pythonの場合は、こちらの記事の方が簡単です。

環境

・Raspberry Pi 4 Model B 4GB

・Ubuntu Desktop 21.10 64bit版

手順

基本的には、こちらのページの手順通りにすすめました。

1. LGPIOのインストール

Ubuntu Desktop 21.10がインストール済みの状態から記載します。

下記のコマンドを実行します。

$ sudo apt install swig python-dev python3-dev
$ sudo apt install python-setuptools python3-setuptools

次に、好きななディレクトリで、下記のコマンドを順番に実行していきます。

1行目で、wgetでzip圧縮されたソースファイルを取得

2行目で、zipファイルを解凍

3行目で、解凍したディレクトリにカレントディレクトリを移動

4行目で、ソースをコンパイル

5行目で、インストール

$ wget http://abyz.me.uk/lg/lg.zip
$ unzip lg.zip
$ cd lg
$ make
$ sudo make install

ここで、上記の4行目のmakeコマンドを打った際に、

makeが入っていないとエラーになります。また、makeだけ入れたとしても

次にgccが入っていないと下記のようにエラーが出るので、入れてない場合はそれぞれインストールします。

makeが入っていないときのエラー

$ make
Command 'make' not found, but can be installed with:
sudo apt install make        # version 4.3-4ubuntu1, or
sudo apt install make-guile  # version 4.3-4ubuntu1

makeのインストール

$ sudo apt install make

gccが入っていないときのエラー

$ make
gcc -O3 -Wall -pthread -fpic    -c -o lgCtx.o lgCtx.c
make: gcc: No such file or directory
make: *** [<builtin>: lgCtx.o] Error 127

gccのインストール

$ sudo apt install gcc

ここまででエラー無く、完了していれば、インストール完了です。

makeとsudo make installの成功時のログをはっておきます。

make成功時のログ

$ make
gcc -O3 -Wall -pthread -fpic    -c -o lgCtx.o lgCtx.c
gcc -O3 -Wall -pthread -fpic    -c -o lgDbg.o lgDbg.c
gcc -O3 -Wall -pthread -fpic    -c -o lgErr.o lgErr.c
gcc -O3 -Wall -pthread -fpic    -c -o lgGpio.o lgGpio.c
gcc -O3 -Wall -pthread -fpic    -c -o lgHdl.o lgHdl.c
gcc -O3 -Wall -pthread -fpic    -c -o lgI2C.o lgI2C.c
gcc -O3 -Wall -pthread -fpic    -c -o lgNotify.o lgNotify.c
gcc -O3 -Wall -pthread -fpic    -c -o lgPthAlerts.o lgPthAlerts.c
gcc -O3 -Wall -pthread -fpic    -c -o lgPthTx.o lgPthTx.c
gcc -O3 -Wall -pthread -fpic    -c -o lgSerial.o lgSerial.c
gcc -O3 -Wall -pthread -fpic    -c -o lgSPI.o lgSPI.c
gcc -O3 -Wall -pthread -fpic    -c -o lgThread.o lgThread.c
gcc -O3 -Wall -pthread -fpic    -c -o lgUtil.o lgUtil.c
gcc -shared -pthread  -Wl,-soname,liblgpio.so.1 -o liblgpio.so.1 lgCtx.o lgDbg.o lgErr.o lgGpio.o lgHdl.o lgI2C.o lgNotify.o lgPthAlerts.o lgPthTx.o lgSerial.o lgSPI.o lgThread.o lgUtil.o
ln -fs liblgpio.so.1 liblgpio.so
strip --strip-unneeded liblgpio.so
size     liblgpio.so
   text	   data	    bss	    dec	    hex	filename
  84998	   3460	 111168	 199626	  30bca	liblgpio.so
gcc -O3 -Wall -pthread -fpic  -c -o rgpio.o rgpio.c
gcc -O3 -Wall -pthread -fpic    -c -o lgCfg.o lgCfg.c
gcc -O3 -Wall -pthread -fpic    -c -o lgMD5.o lgMD5.c
gcc -shared -pthread  -Wl,-soname,librgpio.so.1 -o librgpio.so.1 rgpio.o lgCfg.o lgErr.o lgDbg.o lgMD5.o
ln -fs librgpio.so.1 librgpio.so
strip --strip-unneeded librgpio.so
size     librgpio.so
   text	   data	    bss	    dec	    hex	filename
  50259	   2888	   6168	  59315	   e7b3	librgpio.so
gcc -O3 -Wall -pthread -fpic    -c -o rgpiod.o rgpiod.c
gcc -O3 -Wall -pthread -fpic    -c -o lgCmd.o lgCmd.c
gcc -O3 -Wall -pthread -fpic    -c -o lgExec.o lgExec.c
gcc -O3 -Wall -pthread -fpic    -c -o lgFile.o lgFile.c
gcc -O3 -Wall -pthread -fpic    -c -o lgPthSocket.o lgPthSocket.c
gcc -O3 -Wall -pthread -fpic    -c -o lgScript.o lgScript.c
gcc  -o rgpiod rgpiod.o lgCfg.o lgCmd.o lgExec.o lgFile.o lgMD5.o lgPthSocket.o lgScript.o  -L. -llgpio -pthread -lrt
strip rgpiod
gcc -O3 -Wall -pthread -fpic    -c -o rgs.o rgs.c
gcc  -o rgs rgs.o lgCmd.o lgCfg.o lgDbg.o lgErr.o lgMD5.o
strip rgs
>rgs
>rgpiod
>lgpio.h
>rgpio.h
touch DOC/.docs

sudo make install成功時のログ

$ sudo make install
install -m 0644 lgpio.h                  /usr/local/include
install -m 0644 rgpio.h                  /usr/local/include
install -m 0755 liblgpio.so.1 /usr/local/lib
install -m 0755 librgpio.so.1 /usr/local/lib
install -m 0755 rgpiod                   /usr/local/bin
install -m 0755 rgs                      /usr/local/bin
install -m 0644 rgpiod.1                 /usr/local/man/man1
install -m 0644 rgs.1                    /usr/local/man/man1
install -m 0644 lgpio.3                  /usr/local/man/man3
install -m 0644 rgpio.3                  /usr/local/man/man3
ldconfig
/usr/bin/python2
/usr/bin/python3
/usr/bin/swig
/usr/bin/swig
/usr/bin/python2
running build_ext
building '_lgpio' extension
creating build
creating build/temp.linux-aarch64-2.7
aarch64-linux-gnu-gcc -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -ffile-prefix-map=/build/python2.7-E2Za8j/python2.7-2.7.18=. -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c lgpio_wrap.c -o build/temp.linux-aarch64-2.7/lgpio_wrap.o
creating build/lib.linux-aarch64-2.7
aarch64-linux-gnu-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -flto=auto -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -Wdate-time -D_FORTIFY_SOURCE=2 -g -ffile-prefix-map=/build/python2.7-E2Za8j/python2.7-2.7.18=. -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -flto=auto -Wl,-z,relro -Wdate-time -D_FORTIFY_SOURCE=2 -g -ffile-prefix-map=/build/python2.7-E2Za8j/python2.7-2.7.18=. -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fPIC build/temp.linux-aarch64-2.7/lgpio_wrap.o -llgpio -o build/lib.linux-aarch64-2.7/_lgpio.so
/usr/bin/swig
/usr/bin/python3
running build_ext
building '_lgpio' extension
creating build/temp.linux-aarch64-3.9
aarch64-linux-gnu-gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.9 -c lgpio_wrap.c -o build/temp.linux-aarch64-3.9/lgpio_wrap.o
creating build/lib.linux-aarch64-3.9
aarch64-linux-gnu-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-aarch64-3.9/lgpio_wrap.o -llgpio -o build/lib.linux-aarch64-3.9/_lgpio.cpython-39-aarch64-linux-gnu.so

2. C言語プログラムでLGPIOを使ってみる

インストールが完了したので、

試しにC言語でLチカのプログラムを作成・実行していきます。

配線は、下記のように行いました。抵抗は100Ωのものを使用しています。

まずは、下記のファイルを作成してください。

ファイル名は、lgpio.cとしましたが何でも大丈夫です。

lgpio.c

#include <stdio.h>
#include <lgpio.h>

#define LFLAGS 0
#define OUT_GPIO 4 //BCM表記 物理PIN番号の7番

int main(void){
    int h;

    h = lgGpiochipOpen(0);
    lgGpioClaimOutput(h, LFLAGS, OUT_GPIO, 0);

    while (1){
      lgGpioWrite(h, OUT_GPIO, 1);
      lguSleep(0.5);

      lgGpioWrite(h, OUT_GPIO, 0);
      lguSleep(0.5);
    }
    return 0;
}

作成できたら、コンパイルしていきます。

下記のコマンドを実行してください。

作成したファイルがあるディレクトリにいる想定です。

gcc -o lgpio lgpio.c -llgpio

lgpioファイルが作成されたら、成功です。

下記のコマンドで、lgpioファイルを実行します。

$ sudo ./lgpio

Lチカできれば、成功です。