非公式Rock研究所

Radxaのシングルボード(主にRock4c+)について書いています

DHT11モジュールとの格闘(続編)

DHT11モジュール写真

前回の記事から継続中のtiltセンサー、DHT11モジュールです。

【Article】「DHT11モジュールとの格闘」 - 非公式Rock研究所
https://informal-r-labo.net/posts/article013

DHT11モジュールのDatasheetを調べてみると、
モジュールから信号を受信するためには、モジュールからデータ出力を促すための信号をRock4c+側から送信する必要があるのですが、この信号はマイクロ秒単位の制御が必要で、Pythonだとちょっと難しいようです。
(そもそものやり方が間違っているのかもしれないが、何度か試したがうまくいかない。)

DHT 11 Humidity & Temperature Sensor
https://osoyoo.com/driver/DHT11-datasheet.pdf

一方、C言語にはマイクロ秒単位での制御が可能なusleep関数があります。これを使えばうまくいくかもしれません。

ただ、私自身、C言語に関しては入門書程度のレベルなので、まずはLEDチカチカをC言語でできるか試してみます。

ソースコード

mraa/examples/c/gpio.c at master · eclipse/mraa · GitHub
https://github.com/eclipse/mraa/blob/master/examples/c/gpio.c

上記のGitHubに掲載されているexampleを参考にコードを書いてみます。

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mraa.h>

#define GPIO_PIN_1 23

int main(void)
{
    mraa_gpio_context gpio_1;

    gpio_1 = mraa_gpio_init(GPIO_PIN_1);
    mraa_gpio_dir(gpio_1, MRAA_GPIO_OUT);

    for(int i = 0; i < 10; i++){
        mraa_gpio_write(gpio_1, 1);
        sleep(1);
        mraa_gpio_write(gpio_1, 0);
        sleep(1);
    }

    mraa_gpio_close(gpio_1);
    mraa_deinit();

    return 0;
}

エラーチェックなど極力ややこしそうな部分をのぞき、最低限(と思われる)コーディングに変更し、 上記コードを"~/c/LED_Blink.c"として保存しました。

コンパイル、そして沼…

さきほども申しましたが、私自身、C言語に関しては入門書程度のレベルだったこともあり、ここから難航します。

(これは間違っています!)
$ cd ~/c
$ gcc LED_Blink.c
コンパイル失敗(その1)

まず、コンパイルが通りません。。

もう少しC言語に関して理解があればすぐに解決できたはずなのですが、適切な対処法がわからず、include文を変更したり、ディレクトリの位置を変更するという、(今思えば)意味のないことをしてますますエラー地獄にはまります。

コンパイル失敗(その2)

実際、include文に関しては、変更する意味はありませんでした。mraa.hの中身をみてみると、

mraa.hの中身

同じように各ヘッダファイルをincludeしているだけでした。
(ここまでだとりつくにもいろいろ調べましたが。。)

解決へ

何か手掛かりがないかいろいろネットを調べていると、以下のサイトを見つけました。

Mraa Usage | Radxa Docs
https://docs.radxa.com/en/compute-module/cm5/radxa-os/app-dev/mraa#gpio-1

Radxaの別デバイスのページですが、こちらにC言語のサンプルコードの他に、gccのコンパイルのコマンドが書かれていました。

コンパイルコマンド

-lmraaは「libmraaをリンクしろ」という命令のようで、このリンクが漏れていたため、ずっとエラーが出続けたようです。

$ cd ~/c
$ gcc LED_Blink.c -lmraa 
コンパイル成功

おぉ!エラーなし!

a.outファイルを管理者権限で実行してみます。

実行ファイルの実行 LEDチカチカ実行時LED(点灯時) LEDチカチカ実行時LED(消灯時)

期待通りにLEDが点滅しています。

あとがき

C言語でDHT11モジュールをコントロールするプログラムを作るための前段階として、LEDチカチカを作ってみましたが、完成までなかなかうまくいきませんでした。私のC言語に関する理解が浅かったことが要因ですが、浅いなりにもいろいろ試行錯誤を重ねたことで勉強になり、C言語に対する理解が深くなりました。(ヘッダーやリンクファイルのPathなど)

もちろん、時間もかかりましたが、あれこれ悩む時間は決して無駄でなく、非常に有意義で、なによりおもしろいです。