【NanoPi NEO/Armbian】LinuxでLチカしてみよう (C言語プログラム制御編)

シングルボードコンピュータ(SBC)

プログラム制御で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...

プログラム制御で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の明るさを制御してみようかと思います。

今回の記事で使用した機材紹介

コメント

Amazon プライム対象
タイトルとURLをコピーしました