「Qtの基礎 - GPIO」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == オンライン上にある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ピンを入力設定 (プルダウンオプションを付加) にして開放する場合、該当ピンの状態を確認すると<code>High</code>を返す場合がある。<br>
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>


案内メニュー