2025年11月03日

ラズピコでナイトライダー ナイト2000のスキャナ作り #1

11月に入りやや寒くなって来ましたが、DTMerの皆さまにおかれましては
全裸DTMが捗っておられる事とお慶び申し上げます。

さて、ここ最近ナイト2000のスキャナを作っておりますが、電子回路版が
ひと段落ついた所で、次は先日購入したRaspberry Pi Pico(以下 ラズピコ)
で同じようなものを作ってみようと思います。
実は元々ICの回路が上手く動かず悩んでいた時に、「いっそラズピコ辺りで
作った方が楽なんじゃね?🤔」と思って買ったもの。

果たして、プログラミング言語はBASICしか触った事のない自分にそんな
物が作れるのでしょうか…?
今回は手始めに、基本動作(8つのLEDが往復点灯する)をやってみる事に。


RPKittScanner_01.jpg

なかなか取っ付きにくい気がして暫く放置していたラズピコ。

RPKittScanner_02.png

ラズピコのピンアサインは、データシートによるとこうなっているようです。
入出力が豊富なので、使い方次第ではかなりの戦力になりそうですね。成程、
こりゃみんな好んで使う訳だわい。

この中のGP0~GP7までを出力端子としてLEDを光らせる訳ですが、これら
GPIO端子は数mAしか取れないようです。CPUである RP2040 と直結されて
いるので、直接LEDを駆動するのは止めた方が良いかな。


となると各LEDはトランジスタでスイッチングする事になりますが、LEDと
ラズピコで電源を個別に用意しなければならないのか…面倒だな。

RPKittScanner_03.jpg

…と思っていたのですが、基板を良く見るとUSBの VBUS と40ピン VBUS
直結している模様。ならラズピコをUSBで動かし、同時に40ピンからLEDの
電源も取れるよね~。この構造は有難い。LED1個当たり最大20mA流したと
して、全点灯でも160mA。USB2.0でも規格内です。


RPKittScanner_04.png

てな訳でこんな回路に。LEDの電流制限抵抗に240Ωを各個入れてあります。
全てまとめて1個の抵抗でも事足りるとは思いますが、今後起動時に全点灯
させたり残光の処理なども考えているので、それを踏まえ個別にしました。
電源電圧5V、LEDのVfが1.72Vなので、13.7mA流れます。


RPKittScanner_05.jpg

完成。


しかしまぁ当然ながら、これだけでは望む動作はしない訳です。プログラム
しないとね~…。

ラズピコは言語に microPython か C/C++ が使えますが、両者を大まかに
比較した限りでは圧倒的に microPython の方が(言語の扱い的にも、環境を
整える手間的にも)楽そうなので、microPython で行きますか。

microPython は C/C++よりも実行速度が遅いらしいけど、ただLEDを8個
数ミリ秒おきに光らせるだけの回路、気にする必要は全くないでしょう。

という訳でインターネッツ上のLチカ記事を幾つか読んで、ごく簡単にLED
1~8を往復させる処理を書いてみました。
from machine import Pin
import time

led1 = Pin(0, Pin.OUT)
led2 = Pin(1, Pin.OUT)
led3 = Pin(2, Pin.OUT)
led4 = Pin(3, Pin.OUT)
led5 = Pin(4, Pin.OUT)
led6 = Pin(5, Pin.OUT)
led7 = Pin(6, Pin.OUT)
led8 = Pin(7, Pin.OUT)

Interval = 0.08

while True:
led1.value(1)
time.sleep(Interval)
led1.value(0)

led2.value(1)
time.sleep(Interval)
led2.value(0)

led3.value(1)
time.sleep(Interval)
led3.value(0)

led4.value(1)
time.sleep(Interval)
led4.value(0)

led5.value(1)
time.sleep(Interval)
led5.value(0)

led6.value(1)
time.sleep(Interval)
led6.value(0)

led7.value(1)
time.sleep(Interval)
led7.value(0)

led8.value(1)
time.sleep(Interval)
led8.value(0)

led7.value(1)
time.sleep(Interval)
led7.value(0)

led6.value(1)
time.sleep(Interval)
led6.value(0)

led5.value(1)
time.sleep(Interval)
led5.value(0)

led4.value(1)
time.sleep(Interval)
led4.value(0)

led3.value(1)
time.sleep(Interval)
led3.value(0)

led2.value(1)
time.sleep(Interval)
led2.value(0)


各命令は「Raspberry Pi Pico Lチカ」などで検索すると、細かく解説して
いるサイトが多数出て来るので、ここでは詳細は割愛します。
これも変数を使って BASIC で言うところの FOR ~ NEXT のような命令で
繰り返せば、短くまとめて単純化出来るとは思いますが、そこまでの知識が
ないので今はダラダラとLEDごとに書き連ねるだけ。
多分もっと簡潔に出来るはず。


Interval = 0.08

でLEDが点灯している時間を決めています。この値を変える事で往復速度を
変えられます。0.08で通常の速度、0.04にするとマイケルの命令で何か作業
を行う時のやや速め往復くらいになります。

なおプログラムの転送には定番の Thonny を使っています。

今回は往復点灯させるのが目的なので速度は固定ですが、いずれはスイッチ
操作か可変抵抗で自由に速度を変えられるようにする予定~。



このようになります(17秒 音声なし)。
残光が全くないので味気なく往復しますが、まず第一段階は成功。

残光の処理が難しそうですね~。ICで作った回路のように各LEDに電解コン
をぶら下げて済ますか、プログラム上でPWM処理をさせるか…。
PWMの場合、8→1と戻って来た時の折り返し部分の処理をどうすれば良い
のかが悩みどころ。プログラムはループしているので、折り返し時に残光が
途切れたり不自然な光り方をする気がしないでもない。

まぁ残光についてはぼちぼちネット記事などを参考に考えてみます。次回は、
スイッチか可変抵抗で往復速度を可変出来るようにしてみる予定~。


???「暇なんですね、マイケル…😏」



posted by ゆう at 2025年11月03日| Comment(0) | ラズピコ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください
最近の記事