Pythonで**マイクロ秒(μs)**単位の遅延/計測を実現する方法
序文
最近、ラズベリーパイのGPIOを学習しており、PythonでDHT11温湿度センサーのデータを読み取りたいと考えました。DHT11はシングルバス通信を使用しており、マイクロ秒クロ秒単位の遅延が必要です。sleep()関数では要件を満たせないようでした。そこで、タイムスタンプが小数点以下7桁まで精度を持つことを発見しました。つまり、0.1マイクロ秒単位で計測可能ですが、実際の精度はこれほどではないでしょう。しかし、十分に使用できるはずです。
この方法はLinuxシステム専用です。Windowsではどうやっても遅延が1000マイクロ秒以上になります。
1秒(s) = 1000ミリ秒(ms) = 1,000,000マイクロ秒(μs)
タイムスタンプとは
タイムスタンプとは、グリニッジ標準時1970年1月1日0時0分0秒(北京時間1970年1月1日8時0分0秒)からの経過秒数を指します。
実装方法
初期タイムスタンプを記録し、ループ内で毎回タイムスタンプを記録します。ループの継続条件は、現在のタイムスタンプから初期タイムスタンプを引いた値が指定した時間未満の間です。指定時間以上になるとループを終了します。
ソースコード:
import time # timeモジュールをインポート
# https://blog.zeruns.com/
def delayMicrosecond(t): # マイクロ秒単位遅延関数
start,end=0,0 # 変数を宣言
start=time.time() # 開始時間を記録
t=(t-3)/1000000 # 入力tを秒単位に変換。-3は時間補正
while end-start<t: # 時間差が指定値以上になるまでループ
end=time.time() # 終了時間を記録
使用方法:上記コードをあなたのプログラムにコピーして貼り付け、関数 delayMicrosecond(t) を呼び出してください。括弧内のtは遅延時間(単位:マイクロ秒)です。
上記ソースコードの t-3 は時間補正です。関数呼び出しやループ実行などの処理にも時間がかかるため、実際のテスト結果に応じて調整してください。ラズベリーパイ4でテストした結果、約3マイクロ秒のオーバーヘッドがあったため、3を引いて補正しています。
実例
import time # timeモジュールをインポート
# https://blog.zeruns.com/
def delayMicrosecond(t): # マイクロ秒単位遅延関数
start,end=0,0 # 変数を宣言
start=time.time() # 開始時間を記録
t=(t-3)/1000000 # 入力tを秒単位に変換。-3は時間補正
while end-start<t: # 時間差が指定値以上になるまでループ
end=time.time() # 終了時間を記録
a=time.time() # 遅延関数開始時の時間を記録
delayMicrosecond(35) # 35マイクロ秒遅延
b=time.time() # 遅延関数終了時の時間を記録
print("https://blog.zeruns.com/")
print((b-a)*1000000) # 遅延関数の実行時間を表示
実行結果:
関連記事
- コスパの良い安価なVPS/クラウドサーバーのおすすめ:https://blog.zeruns.com/archives/383.html
- Python関連記事:https://blog.zeruns.com/category/Python/
- ArduinoでDHT11、DHT22、SHTC3の温湿度データを読み取る:https://blog.zeruns.com/archives/527.html
- 学生専用割引特典一覧:https://blog.zeruns.com/archives/557.html
- 個人ブログの構築方法:https://blog.zeruns.com/archives/218.html


