プログラム制御でLチカ
前回記事に引き続き、今回はC言語プログラム制御でLチカしてみたいと思います。前回までの記事は以下です。LED回路や接続については前回記事を参照ください。

【NanoPi NEO/Armbian】環境構築 ~Armbianインストール~起動まで~
組み込みLinux学習にオススメのSBC、NanoPi NEO組み込みLinux学習に適した環境といえば、なんといっても情報量の多いRaspberry Piですが、2023年4月現在で引き続き手困難が続いている様です。そんな中、個人的に組み...

【NanoPi NEO/Armbian】LinuxでLチカしてみよう (コマンド制御編)
LinuxでLチカ今回は筆者が組み込みLinux学習に向いていると考えているNanoPi NEOを使います。環境構築については以下の記事で紹介しています。LED回路の作成などと大げさにいうほどのことではないのですが、まずはNanoPi NE...
プログラム制御でLチカといっても基本的には前回紹介したコマンド制御内容をプログラムから実行する、というだけになります。
コマンド制御おさらい
前回記事より最終的なGPIO制御部分のみを抜き出すと以下になります。
$ su パスワード: # echo 6 > /sys/class/gpio/export # gpio6(PA6)有効化 # echo out > /sys/class/gpio/gpio6/direction # 出力ピン設定 # echo 1 > /sys/class/gpio/gpio6/value # 点灯 # echo 0 > /sys/class/gpio/gpio6/value # 消灯
前回記事では記載しませんでしたが、gpio6無効化は以下となります。
# echo 6 > /sys/class/gpio/unexport
シェルスクリプトで一連の制御実行をトライアル
C言語でのプログラミングの前に、コマンド制御手順をシェルスクリプト化して実行してみましょう。
$ vi led-flashing.sh
#!/bin/bash
if [ -d /sys/class/gpio/gpio6 ]
then
echo 6 > /sys/class/gpio/unexport
fi
echo 6 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio6/direction
for i in `seq 1 10`
do
echo 1 > /sys/class/gpio/gpio6/value
sleep 1
echo 0 > /sys/class/gpio/gpio6/value
sleep 1
done
echo 6 > /sys/class/gpio/unexport
$ chmod +x led-flashing.sh $ sudo ./led-flashing.sh
2秒周期で点灯・消灯が10回行われたら成功です。
プログラミング
前述のシェルスクリプトでの制御内容を元に、忠実にC言語でプログラミングしてみます。
$ vi led-flashing.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd = -1;
int ret;
int i;
struct stat st = { 0 };
// Unexport gpio6 if it exists.
ret = stat("/sys/class/gpio/gpio6", &st);
if(ret == 0) {
fd = open("/sys/class/gpio/unexport",O_WRONLY);
if(write(fd, "6", 1) != 1) {
perror("write-1");
exit(EXIT_FAILURE);
}
close(fd);
}
// Export gpio6.
fd = open("/sys/class/gpio/export",O_WRONLY);
if(write(fd, "6", 1) != 1) {
perror("write-2");
exit(EXIT_FAILURE);
}
close(fd);
// Set direction to out.
fd = open("/sys/class/gpio/gpio6/direction",O_WRONLY);
if(write(fd, "out", 3) != 3) {
perror("write-3");
exit(EXIT_FAILURE);
}
close(fd);
for(i = 0; i < 10; i++) {
// Turn on the LED.
fd = open("/sys/class/gpio/gpio6/value",O_WRONLY);
if(write(fd, "1", 1) != 1) {
perror("write-4");
exit(EXIT_FAILURE);
}
sleep(1);
// Turn off the LED.
fd = open("/sys/class/gpio/gpio6/value",O_WRONLY);
if(write(fd, "0", 1) != 1) {
perror("write-5");
exit(EXIT_FAILURE);
}
sleep(1);
}
// Unexport gpio6.
fd = open("/sys/class/gpio/unexport",O_WRONLY);
if(write(fd, "6", 1) != 1) {
perror("write-1");
exit(EXIT_FAILURE);
}
close(fd);
exit(EXIT_SUCCESS);
}
コンパイルして実行します。
$ gcc led-flashing.c $ sudo ./a.out
シェルスクリプトでの制御時同様に2秒周期で点灯・消灯が10回行われたら成功です。
今回はプログラムの実行も特権で行いましたが、別途アクセス権を適切に設定することでuserにて実行することも可能です。この辺りの話は別の機会にでもできればと思っています。

次回予告
ハードウェアPWMを使ってLEDの明るさを制御してみようかと思います。
コメント