質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

3回答

3064閲覧

Raspberry Pi で一定間隔でGPIOの値を取得したい

o-kami

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2018/12/28 01:49

編集2018/12/28 02:28

Raspberry Pi上で50msに一回GPIOの値を取得したいと考え、取得後delay(50)を追加し無限ループで回していたのですが、処理速度の影響かだんだんずれてきてしまいます。
そこで50msごとに値を取得する関数を呼び出すことで解決できると考えています。
しかし実装方法が全く思いつきません。
どなたか実装方法を教えてください。
またより良い考え方があればそちらを教えていただきたいです。

コードを下に書いておきます(追記)

C言語

1#include<stdio.h> 2#include<wiringPi.h> 3 4#define GPIO4 4 5 6int main(void){ 7 int value=0,i; 8 9 //Initialize 10 if(wiringPiSetupGpio() == -1) return 1; 11 pinMode(GPIO4, INPUT); 12 13//recieve 14 for(i=0;i<100;i++){ 15 value = digitalRead(GPIO4); 16 printf("%d",value); 17 delay(50); 18 } 19 printf("\n"); 20 21 return 0; 22}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2018/12/28 01:55

delayとはどのライブラリの関数ですか? 可能であれば現状のソースコードを追記ください。
guest

回答3

0

ベストアンサー

一般的な話ですが、DelayやSleepなどの時間待ちの関数は、あまり時間的精度は良くない傾向があります。
また、プログラムループでDelay関数を使うと、Delayの時間精度がいくら良くてもループのその他の処理に時間がかかってしまうため、ループの時間積算を考えると、だんだんずれていくのは仕方がないという話となってしまいます

ということで、テとしては

・カレンダの時間値を読み込んで、それで時間待ちを行う
・定期周期イベントを生成してそこで処理を行う
・タイマ割り込みを実装してそこで処理を行う

ということになろうかと思われます

投稿2018/12/28 02:31

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

o-kami

2018/12/28 02:36

定期周期イベントを生成とは具体的どのようにすればよいのでしょうか。
y_waiwai

2018/12/28 02:41

「linux 定周期イベント」でぐぐるといくつかでてくるようです
guest

0

o-kamiさん、

GPIOの値を取得以外に何をするかわかりませんが、
とりあえず、ポーリングで、やってしまうのは、どうでしょう!?!

# polling.py import time interval = 0.05 time_start = time.time() time_expired = time_start + interval while(True): time_curr = time.time() if (time_curr > time_expired): print(time_curr - time_start) time_expired += interval

実行例

# (実行環境) # Raspberry Pi 3B+ # Raspbian: 2018-11-13-raspbian-stretch-lite
pi@raspberrypi:~ $ python3 polling.py 0.050002336502075195 0.10000205039978027 0.15000081062316895 0.20000076293945312 0.2500007152557373 0.3000006675720215 0.35000133514404297 0.40000081062316895 0.45000171661376953 0.5000016689300537 0.5500016212463379 0.6000001430511475 0.6500017642974854 0.6999995708465576 0.7500016689300537 0.8000013828277588 0.8500010967254639 0.9000003337860107 0.9499993324279785 0.9999997615814209 1.0500011444091797 1.1000006198883057 1.150001049041748 1.2000012397766113 ...

だいたい50ms間隔の、いい数字ができてると思いますが、ほかにバックグラウンド処理を動かすと、どうなるか、わかりません..

投稿2018/12/28 19:41

mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考リンクだけですが、とりあえず取り急ぎ。

英語版stackoverflow

投稿2018/12/28 01:53

bochan2

総合スコア2050

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問