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

組込みStudy

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

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

Amazon.co.jp: Xsdjasd NEO用開発ボード + ヒートシンク + メタルケースキット Allwinner H3 クアッドコア 512MB RAM Openwrt/LEDE コンプリート マシン : パソコン・周辺機器
Amazon.co.jp: Xsdjasd NEO用開発ボード + ヒートシンク + メタルケースキット Allwinner H3 クアッドコア 512MB RAM Openwrt/LEDE コンプリート マシン : パソコン・周辺機器
Amazon | KIOXIA(キオクシア) 旧東芝メモリ microSD 64GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA064G | KIOXIA | microSDカード 通販
KIOXIA(キオクシア) 旧東芝メモリ microSD 64GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA064GがmicroS...
Amazon.co.jp: エレコム エコ USBケーブル スマートフォン対応 2.0 A-microB 1.2m U2C-JAMB12BK : パソコン・周辺機器
Amazon.co.jp: エレコム エコ USBケーブル スマートフォン対応 2.0 A-microB 1.2m U2C-JAMB12BK : パソコン・周辺機器
Amazon | TP-Link WIFI 無線LAN 子機 11n/11g/b デュアルモード対応モデル 英語パッケージ TL-WN725N(EU) | TP-Link | 無線LAN子機 通販
TP-Link WIFI 無線LAN 子機 11n/11g/b デュアルモード対応モデル 英語パッケージ TL-WN725N(EU)が無線LAN子機ストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通...
Amazon.co.jp: ELEGOO 50 PCS オスメスジャンパーワイヤ200mm (170 タイポイント ブレッドボード付き) : 産業・研究開発用品
Amazon.co.jp: ELEGOO 50 PCS オスメスジャンパーワイヤ200mm (170 タイポイント ブレッドボード付き) : 産業・研究開発用品
Amazon.co.jp: WayinTop 発光ダイオード 金属皮膜抵抗器 セット 5mmLED 砲弾型 白/黄/緑/赤/青 40個ずつ 合計200個 抵抗器 10Ω~1MΩ 30種類 20本ずつ 合計600個 800pcs入り : 産業・研究開発用品
Amazon.co.jp: WayinTop 発光ダイオード 金属皮膜抵抗器 セット 5mmLED 砲弾型 白/黄/緑/赤/青 40個ずつ 合計200個 抵抗器 10Ω~1MΩ 30種類 20本ずつ 合計600個 800pcs入り : 産業...
Amazon.co.jp: 共立電気計器 (KYORITSU) 1012 キューマルチメータ : 産業・研究開発用品
Amazon.co.jp: 共立電気計器 (KYORITSU) 1012 キューマルチメータ : 産業・研究開発用品

コメント

タイトルとURLをコピーしました