JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

micro:bit MicroPython HC-SR04による距離の測定

2019-11-29 14:11:38 | micro:bit

 最もポピュラーな超音波センサーHC-SR04を使って、距離を測定する実験を行いました。

 HC-SR04で、センサーと物体までの距離を測定する手順は、次のとおりです。

 1) micro:bitのpin0から10us幅以上のトリガパルスをHC-SR04のTrig端子に加えます。

 2) HC-SR04から40KHzの超音波が発信され、物体に反射されて戻ってきます。Echo端子には、発信から受信に対応するEchoパルスが出力されます。

 3) Echoパルスのパルス幅の時間t(s)を測定します。超音波は、センサーと物体の間の距離L(m)の2倍を進んだので、音速をV(m/s)とすると、2L = V * t より、L = (V*t)/2 となります。音速は、温度によって変化し、V(m/s)=331.5+0.6*temp(℃)で近似されます。精度を求めなければ、V=340m/sとすれば良いと思います。センサーと物体間の距離Lを下の図の式で、cm単位で計算します。

 接続回路図です。HC-SR04は、5V動作ですので、HC-SR04のECHO出力を分圧して、micro:bitのpin1に入れています。

 Trigパルスは、10us以上とされています。pin0からパルスを出力するには、

 pin0.write_digital(1)

 pin0.write_digital(0)

とすれば良く、これで下の図のように約70us幅のパルスが発生します。

TrigerパルスをHC-SR04に加えると、下の図のように物体までの距離に対応したEchoパルス(赤色)が帰ってきます。

 スクリプトです。

 ECHOパルスは、立ち上がりの時刻t1と立下りの時刻t2をutime_us()で測定し、その差をutime.ticks_diff(t2,t1)でパルス幅t(us)を求めます。

 測定した距離Lは、cm単位でLEDにスクロール表示しています。

------------------------------------------------------

'''
micro:bit HC-SR04による距離の測定
2019.11.28
JH7UBC Keiji Hata
'''
from microbit import *
import utime
# pin0初期化
pin0.write_digital(0)
while True:
    # 音速を計算する
    V = 0.6 * temperature() + 331.5
    # トリガパルス
    pin0.write_digital(1)
    pin0.write_digital(0)
    # 距離の測定と表示
    while pin1.read_digital() == 0:
        utime.sleep_us(1)
    t1 = utime.ticks_us()
    while pin1.read_digital():
        utime.sleep_us(1)
    t2 = utime.ticks_us()
    t = utime.ticks_diff(t2, t1)
    L = int(t * V / 20000)
    display.scroll(L)
    sleep(100)
-----------------------------------------------------------------------

測定の様子です。

実測の結果です。

L(cm)   測定値(cm)

10        8

20       19~21

30       30

40       38~40

50       49

60       57~60

70       68~70

80       78~79

90       88~90

100     98

110    109

120    117

130    122~124

140    122~124

といった具合でした。

1m程度までなら1~2cmの誤差で測定できました。1m以内ならほぼ実用になると思います。


micro:bit MicroPython モールス符号解読器の試作

2019-11-21 13:00:50 | micro:bit

 micro:bitでモールス符号解読器を試作しました。

 符号解読のアルゴリズムは、Rspberry Piでモールス符号解読器を作った時と基本的に同じですが、簡単に説明します。

 pin0をプルアップしておき、信号をpin0に加えます。したがって、モールス信号のdot(短点)またはdash(長点)の時にLowレベル(0)になります。

 下の図はAの符号が入力された場合で、スタートビット1をMcodeにセットし、信号が入力される度に1ビット左にシフトして(2倍して)dotのとき0,dashのとき1を加えます。これによって、モールス符号をコード化します。

 Aの場合は、101ですから、10進数で5になります。この方法で、A~Z,0~9,/をコード化し、10進数の順に並べてoubunというリストを作っておきます。

 実際に入力されたモールス符号をコード化し、コードに応じた文字をリストから表示すれば、でコードされたことになります。

 デコードのタイミングは、Hレベルが短点時間の1.5倍程度になった時としました。

 

 スクリプトです。

自作のキーヤーにパドルを接続して、テストしました。

 

 普通の速度のモールス信号なら解読できます。

 ただ、文字表示が1文字だけですので、同じ文字が続いた時に前の文字と区別がつきません。

 やはり、文字を横に表示していくタイプの表示器(例えばLCD1602)の方が解読器には適していると思います。


micro:bit MicroPython utimeを使ったレシプロカル式周波数カウンタ

2019-11-16 12:10:08 | micro:bit

 MicroPythonのutimeモジュールには、現在の時刻の取得、時間間隔の測定、遅延などの関数があります。

 詳細は、ドキュメンテーションを見ていただくとして、この関数を利用して、周波数カウンタを試作してみます。

 タイトルのレシプロカル式とは「逆数式」のことで、信号の周期を測定して、f=1/Tの関係から、周期の逆数を計算して周波数を求める方式です。

 pin0のデジタル入力を利用し、その前に簡単なアンプをつけました。

 pin0の電圧が1から0に変化する時の時刻(start_timeとend_time)を測定して、時刻の差をとれば、1周期の時間を測定できます。

 周期をus単位で測定し、f(Hz)=1000000/T(us)で計算すると周波数f(Hz)を測定することができます。

 スクリプトです。

 呼び出した時点でのmicro:bitの稼働時間をusで返す関数が、utime.ticks_us()です。

 1周期は、start_timeとend_timeを測定し、utime.ticks_diff(end_time, start_time)関数で、その時間差(周期)を計算します。

 計算したperiod(周期)は、小数点がついていますので、int()で整数化してからスクロール表示します。

 自作SGから100Hzの信号を出して、micro:bitで実測してみました。

 97Hz~103Hz程度(誤差3%)の値を表示しました。

 周波数がほぼ、正しく表示されるのは、10Hz~200Hz程度で、500Hz程度までは、それらしい数値を表示します。

 この周波数カウンタは、実用になるものではありませんが、utimeを使えば、こんなこともできるのでは、と思って作ってみました。


micro:bit MicroPython エレキー

2019-11-14 15:22:09 | micro:bit

 micro:bit でエレキーを作ってみます。

 パドルをpin1とpin2に接続し、pin0に出力します。

 pin1とpin2は、micro:bitの設定でPULL UPします。

 pin0の出力は、2SC1815のオープンコレクタで出力します。(リグに接続します)

 

 スクリプトです。

 スピードは固定です。

 

パドルはコードウォリーJrを使用し、モニタ用にブザーを接続してテストしました。

 ちゃんとエレキーとして動作します。

 スクイーズ操作もできますが、メモリ機能がないので、切れが早いので、慣れるまで若干練習が必要かもしれません。


micro:bit MicroPython PULL UP,PULL DOWN

2019-11-12 13:12:13 | micro:bit

 micro:bitの入力ピンは、プログラムによって、pULLUP,PULL DOWNそしてそのどちらもしない状態NO PULLにセットすることができます。

 pin0を0.5秒(500ms)ごとに、PULL UP,PULL DOWN,NO PULLの状態にセットして、pin0の電圧を観察してみます。

 スクリプトです。

 picoscopeの画面です。

PULL UP で3.3V

PULL DOWN で0V

NO PULL で約0.3V でした。

必要に応じて、各入力端子をPULL UP,PULL DOWN,NO PULLにセットして使用します。