プログラム制御で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の明るさを制御してみようかと思います。
今回の記事で使用した機材紹介
Xsdjasd NanoPi NEO用開発ボード + ヒートシンク + メタルケースキット Allwinner H3 クアッドコア 512MB RAM Openwrt/LEDE コンプリート マシン
¥4,665 (2024年11月19日 20:49 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)型式:NEO V1.4 OS サポート:FriendlyCore (UbuntuCore-16.04 に基づく);OpenWrt 18.06;Armbian;DietPi;Lakka; カーネルバージョン:Linux-4.4-;U-boot-2017.11 PCB:6層
Penkeef NanoPi NEO オープン ソース H3 開発ボード + ヒートシンク DDR3 RAM 512MB クアッドコア -A7 Openwrt Armbian
¥3,229 (2024年11月19日 20:49 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)DDR3 RAM: 256MB/512MB DDR3 RAM CPU: Allwinner H3 用、クアッドコア -A7 最大 1.2GHz SDスロット用x1 MicroUSB: OTG および電源入力 GPIO: 2.54mm 間隔の 12x2pin ヘッダー x 2、2.54mm 間隔の 10x2pin ヘッダー x 1
Uniiitie NanoPi NEO Air 開発ボード+ヒートシンク H3 4コア 512MB+8GB WiFi Bluetooth Run UbuntuCore Mini IOT 開発ボード
¥5,452 (2024年11月19日 20:49 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)GPIO1: 2.54mm 間隔の 24 ピン、UART、SPI、I2C、GPIO が含まれます。 GPIO2: 2.54mm 間隔の 12 ピン、USBx2、IR、SPDIF、I2S を含む RAM: 512MB DDR3 RAM;ストレージ: 8GB eMMC; Wi-Fi: 802.11b/g; Bluetooth: 4.0 デュアル モード CPU: Allwinner H3 の場合、クアッドコア -A7 最大 1.2 GHz -sd スロット x 1 の場合。 -USB: OTG およ... もっと読む
KIOXIA(キオクシア) 旧東芝メモリ microSD 64GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA064G
UHS-I、UHSスピードクラス1、SDスピードクラス10 最大読出速度:100MB/s 耐温度変化、耐X線、耐静電気、耐衝撃、防水、ヒューズ搭載 Nintendo Switch動作確認済 保証期間:製品お買い上げ日より5年間 ダウンロードしたソフトや追加コンテンツ、キャプチャーボタンで撮影した静止画や動画などが保存できます
エレコム エコ USBケーブル スマートフォン対応 2.0 A-microB 1.2m U2C-JAMB12BK
58% オフコネクタ形状:USB(A)オス - USB(Micro-B)オス ケーブル長:1.2m プラグメッキ仕様:金メッキピン カラー:ブラック 対応転送速度:480Mbps(最大) 環境配慮事項:EU RoHS指令準拠
TP-Link WIFI 無線LAN 子機 11n/11g/b デュアルモード対応モデル 英語パッケージ TL-WN725N(EU)
¥805 (2024年11月20日 21:57 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)注意:本製品を使用される場合はUSB3.0ポートではなくUSB2.0をご利用ください。 なめらかな小型ボディー:ノート PC の USB ポートに差し込んだまま使用できます 高度なセキュリティ:64/128 WEP、WPA、WPA2/WPA-PSK/WPA2-PSK OS: macOS 10.7~10.12, Windows 10/8.1/8/7/XP 日本語対応かんたんセットアップですぐに接続可能 最大 150Mbps での高速無線通信は、動画ストリーミング、ゲーム、チャットに最適 Windo... もっと読む
ELEGOO 50 PCS オスメスジャンパーワイヤ200mm (170 タイポイント ブレッドボード付き)
¥880 (2024年11月21日 00:28 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)高品質なオスメスジャンパーワイヤ50本セット!200mmの長さで、ブレッドボードにも対応 このジャンパーワイヤを使えば、ボード上の任意のオスまたはメスヘッダからジャンパを使用できます。 0.1インチヘッダーに隣接することができるため、複数のジャンパーを使用して回路を簡単に構築できます。 1パッケージには10本のジャンパーワイヤが含まれており、長さは200mm +/- 5mmです。 さらに、170ポイントのブレッドボードをプレゼント!ELEGOOの高品質なジャンパーワイヤを手軽にお試しください。
WayinTop 発光ダイオード 金属皮膜抵抗器 セット 5mmLED 砲弾型 白/黄/緑/赤/青 40個ずつ 合計200個 抵抗器 10Ω~1MΩ 30種類 20本ずつ 合計600個 800pcs入り
¥1,450 (2024年11月21日 11:48 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)金属皮膜抵抗器:炭素皮膜(カーボン)抵抗器より、抵抗値の精度が高いです。安定していて、使い勝手がいいです。また、抵抗器のカラーコードが付属しています。 よく使われる30種類が含まれ、1種類20本ずつ、合計600本あり--10Ω、22Ω、47Ω、100Ω、150Ω、200Ω、220Ω、270Ω、330Ω、470Ω、510Ω、680Ω、1KΩ、2KΩ、2.2KΩ、3.3KΩ、4.7KΩ、5.1KΩ、 6.8KΩ、10KΩ、20KΩ、 47KΩ、51KΩ、68KΩ、100KΩ、220KΩ、300KΩ、... もっと読む
共立電気計器 (KYORITSU) 1012 キューマルチメータ
29% オフ歪んだ波形が測定可能な真の実効値表示 直流電圧=600.0mV/6.000/60.00/600.0/600V(入力インピーダンス:10MΩ,600mVのみ100MΩ)、±0.5%rdg±2dgt(600.0mV/6.000/60.00/600.0V)、±0.8%rdg±3dgt(600V) 交流電圧=6.000/60.00/600.0/600V(入力インピーダンス:10MΩ)、±1.5%rdg±5dgt(6.000V)、±1.2%rdg±3dgt(60.00/600.0V)、±1.5%rdg±5... もっと読む
コメント