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
まず、コンパイルが通りません。。
もう少しC言語に関して理解があればすぐに解決できたはずなのですが、適切な対処法がわからず、include文を変更したり、ディレクトリの位置を変更するという、(今思えば)意味のないことをしてますますエラー地獄にはまります。
実際、include文に関しては、変更する意味はありませんでした。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が点滅しています。
あとがき
C言語でDHT11モジュールをコントロールするプログラムを作るための前段階として、LEDチカチカを作ってみましたが、完成までなかなかうまくいきませんでした。私のC言語に関する理解が浅かったことが要因ですが、浅いなりにもいろいろ試行錯誤を重ねたことで勉強になり、C言語に対する理解が深くなりました。(ヘッダーやリンクファイルのPathなど)
もちろん、時間もかかりましたが、あれこれ悩む時間は決して無駄でなく、非常に有意義で、なによりおもしろいです。