12,925
回編集
(ページの作成:「== 概要 == オンライン上にあるGPIOに関するドキュメントの多くは、ArduinoおよびRaspberry PiのようなSoCを対象にしている。<br> SoCとは異なり、GPIOのあるPCはGPIOピンをCPUに直接統合していないが、スーパーI/Oチップ (SIO) を使用している。<br> <br><br> == GPIOへのアクセス == 多くのLinuxディストリビューションにおいて、GPIOを扱うことができる。<br> 最近のLinux…」) |
(→エラー) |
||
110行目: | 110行目: | ||
== エラー == | == エラー == | ||
==== GPIOピンの入力を開放する場合 ==== | ==== GPIOピンの入力を開放する場合 ==== | ||
GPIOピンを入力設定 ( | GPIOピンを入力設定 (<code>pull-down</code>オプションを付加) にして開放する場合、該当ピンの状態を確認すると<code>High</code>を返す場合がある。<br> | ||
sudo gpioget -B pull-down 0 0 | sudo gpioget -B pull-down 0 0 | ||
118行目: | 118行目: | ||
これを解決するには、外付けのプルダウン抵抗を追加することである。<br> | これを解決するには、外付けのプルダウン抵抗を追加することである。<br> | ||
1[K]、10[K]、100[K]のプルダウン抵抗を試して、カット&トライすること。<br> | 1[K]、10[K]、100[K]のプルダウン抵抗を試して、カット&トライすること。<br> | ||
<br><br> | |||
== サンプルコード == | |||
以下の例では、Linuxのsysfsインターフェースを使用してGPIO 17を制御している。<br> | |||
<br> | |||
# まず、exportGpio関数でGPIOをエクスポートして、使用可能にする。<br> | |||
# 次に、setGpioDirection関数でGPIOの方向を出力 (out) に設定する。<br> | |||
# setGpioValue関数を使用して、GPIOの値を1 (HIGH) 、および、0 (LOW) に交互に設定して、1秒ずつ待機することを5秒繰り返す。 | |||
# unexportGpio関数でGPIOをアンエクスポートして、GPIOピンの使用を終了する。 | |||
<br> | |||
ただし、これを実行する場合は、適切な権限 (通常はスーパーユーザ権限) が必要である。<br> | |||
また、使用するGPIOピン番号やパスは、ハードウェアの構成に応じて適宜変更すること。<br> | |||
<br> | |||
<u>PCのGPIOピンを制御する場合は、ハードウェアの仕様を確認して、適切な保護回路を使用する等、十分な注意が必要である。</u><br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QCoreApplication> | |||
#include <QFile> | |||
#include <QTextStream> | |||
#include <QThread> | |||
const QString GPIO_PATH = "/sys/class/gpio/"; | |||
void exportGpio(int gpio) | |||
{ | |||
QFile exportFile(GPIO_PATH + "export"); | |||
if (exportFile.open(QIODevice::WriteOnly | QIODevice::Text)) { | |||
QTextStream out(&exportFile); | |||
out << gpio; | |||
exportFile.close(); | |||
} | |||
} | |||
void unexportGpio(int gpio) | |||
{ | |||
QFile unexportFile(GPIO_PATH + "unexport"); | |||
if (unexportFile.open(QIODevice::WriteOnly | QIODevice::Text)) { | |||
QTextStream out(&unexportFile); | |||
out << gpio; | |||
unexportFile.close(); | |||
} | |||
} | |||
void setGpioDirection(int gpio, const QString &direction) | |||
{ | |||
QFile directionFile(GPIO_PATH + "gpio" + QString::number(gpio) + "/direction"); | |||
if (directionFile.open(QIODevice::WriteOnly | QIODevice::Text)) { | |||
QTextStream out(&directionFile); | |||
out << direction; | |||
directionFile.close(); | |||
} | |||
} | |||
void setGpioValue(int gpio, int value) | |||
{ | |||
QFile valueFile(GPIO_PATH + "gpio" + QString::number(gpio) + "/value"); | |||
if (valueFile.open(QIODevice::WriteOnly | QIODevice::Text)) { | |||
QTextStream out(&valueFile); | |||
out << value; | |||
valueFile.close(); | |||
} | |||
} | |||
int main(int argc, char *argv[]) | |||
{ | |||
QCoreApplication a(argc, argv); | |||
int gpioNumber = 17; // 使用するGPIO番号 | |||
exportGpio(gpioNumber); | |||
setGpioDirection(gpioNumber, "out"); | |||
for (int i = 0; i < 5; ++i) { | |||
setGpioValue(gpioNumber, 1); | |||
QThread::sleep(1); | |||
setGpioValue(gpioNumber, 0); | |||
QThread::sleep(1); | |||
} | |||
unexportGpio(gpioNumber); | |||
return a.exec(); | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||