クリーナースタンド

マキタ充電式クリーナーのスタンドを作りました。これは1号機です。

もう少し小さくしても安定するかなと思って、2号機を作りました。

Picoでパルスカウント

パルスの状態(HighまたはLow)を高速で観察して、L→Hの切り替えを検出することで、パルスをカウントします。

 

テスト用にPicoのGP16をPWM出力にして、それをそのままGP17に入力して、カウントできるかどうかやってみました。PWMの周波数を1kHzにして、Timerで1秒毎に割り込みをかけます。

>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
1001
1000
1000
1000
1000

 

10kHzまでは何とかカウントできています。

>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
9996
9992
9996
9996
9995

 

100kHzだとだめでした。

>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
16138
15774
16271
15921
16093

 

pythonのwhileループやパソコンのスペックの限界でしょうかね?

 

ネットで調べたときはパルスの立ち上がり検出の部分でもっと複雑なことをやっていましたが・・・ここでは最低限の部分だけ抜き出しました。これで何か不具合が生じたら対策を考えることにします。

 

 

from machine import Pin, PWM, Timer
import time

 

pwm = PWM(Pin(16, Pin.OUT))    # PWM出力
pwm.duty_u16(2**16//2)              # Duty比=50%
pwm.freq(1000)                            # PWM周波数設定
inp = Pin(17, Pin.IN)                     # GP16をそのままGP17に入力する

 

# 割り込み時に呼び出される関数
# カウント数を表示してからリセットする
def reset(timer):
  global count
  print(count)
  count = 0

 

# 1秒毎に割り込みする
timer = Timer()
timer.init(freq = 1, mode = Timer.PERIODIC, callback = reset)

 

count = 0
oldval = 0

while True:
  newval = inp.value()                      # 入力値を読み込む
  if oldval == 0 and newval == 1:    # パルスの立ち上がりを検出したら
    count += 1                                  # カウントする
  oldval = newval                             # 現在の入力値をoldvalに保存

 

Raspberry Pi Pico&7セグLED

7セグLEDの使い方が分かったので、Raspberry Pi Picoで点灯させてみました。「これ1冊でできる!ラズベリー・パイPicoではじめる電子工作超入門」を参考にしました。

  • 7セグドライバIC(TC4511BP)
  • 7セグLED(C-551SR)…カソードコモン


 

TC4511のデータシートを見ると、電源電圧は3V~18Vとなっていましたが、上述の本ではPicoの3.3V電源ではなく、VBUSの5Vを使っていました。3.3Vだとうまくいかないようです(試す前にばらしてしまいましたが)。LTbarとBIbarは3.3Vでも5Vでも可。

 

あとはpythonプログラムを動かすだけ。

例:10進数の5(2進数の0101)を表示する場合

右に0回シフト→0101 & 0001→1→Aピンに出力

右に1回シフト→0010 & 0001→0→Bピンに出力

右に2回シフト→0001 & 0001→1→Cピンに出力

右に3回シフト→0000 & 0001→0→Dピンに出力

 

from machine import Pin

import time

 

A = Pin(0, Pin.OUT)

B = Pin(1, Pin.OUT)

C = Pin(2, Pin.OUT)

D = Pin(3, Pin.OUT)

 

# 0~9までの数字を表示する

for i in range(10):

  A.value((i >> 0) & 1)

  B.value((i >> 1) & 1)

  C.value((i >> 2) & 1)

  D.value((i >> 3) & 1)

  time.sleep(0.5)         # 0.5秒待つ

7セグLEDでデジタルサイコロ

7セグメントLEDの使い方を勉強するために、誠文堂新光社「電子工作大図鑑」(伊藤尚未著)を参考にして、0から9までの数字をランダムに表示するデジタルサイコロを作成しました。(上述の文献では「デジサイ」というタイトルがついていました。)

  • タイマーIC(555)…クロック信号を発生する。スイッチでクロックをON/OFFする。
  • カウンターIC(74LS90)…クロックをカウントする。9まで数えたら0に戻る。
  • 7セグメントドライバIC(74LS47)…4桁の2進数を入力して、その数の形に対応したセグメントを光らせる。例:0101が入力されると7セグLEDのACDFGが光る。
  • 7セグメントLED(A-551SRD)…7447がLowレベルで動作するタイプのため、アノードコモンを使用。(回路図のLEDは違う型番になっていますが、配列はA-551SRDと同じ。)

タイマーICの抵抗とコンデンサは1kΩ、470Ω、10μFにすると周波数60Hz、デューティー比60%ぐらいのようです。便利な計算サイトがありました。

https://www.zea.jp/audio/schematic/sc_file/018.htm

動くことは動きますが、何回やっても1と7が出ない。配線が間違っているかも・・・。

 





Â