2025年11月12日

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

これまでRaspberry Pi Picoでナイト2000のスキャナを再現して来ました
が、どうもプログラムが無駄に長い気がしてあちこちの文献を漁っては、
もっと簡潔にまとめられないか試行錯誤しておりました。

しかし実際には上手く動作させられず思い通りの動きにならなかったので、
ここはいっそGrokさんに頼ってみようかとプログラムをぶん投げてみた所、
いともあっさり簡潔かつ完璧に作り直してくれたので、これをラズピコへ
転送して完成とします。

RPKittScanner_06.png

回路はこれまでと同じです。31 ADC0/33 GND/35 ADC_VREFに10kΩの
可変抵抗を付け、往復速度が可変出来るようになっていますが、最大の時に
視認出来ない速度で往復してしまうので、その辺はプログラムを変更すると
良いかと( (Potvalue / 16384) * 0.1 の辺り)。

※seesaaブログは行頭のスペースが削除されてしまうため、「 」で
入れているので、もしかしたらインデントがおかしいかも知れません。適宜
修正してください。テキストファイルはこちら

from machine import ADC, Pin, PWM
from time import sleep

# LEDの配列を作成
leds = [PWM(Pin(i)) for i in range(8)]
for led in leds:
  led.freq(1000) # LED周波数 1kHz

Speedpot = ADC(Pin(26))
value1 = 65535 # フル点灯
value2 = 20000
value3 = 8000
value4 = 3000
value5 = 1000 # 最低残光レベル(通過後オフ)
value0 = 0
LightUp = 0.05
LightDn = 0.05

# FullyLightup: すべてのLEDを同時に点灯・消灯(滑らかに拡張)
def set_all_leds(value):
  for led in leds:
    led.duty_u16(value)

# アップ: 0からvalue1まで10ステップで滑らかに増加
num_up_steps = 10
for step in range(num_up_steps + 1):
  v = int(value1 * step / num_up_steps)
  set_all_leds(v)
  sleep(LightUp)
sleep(0.1) # 最大輝度で待機

# ダウン: value1から0まで8ステップで滑らかに減少
num_down_steps = 8
for step in range(num_down_steps + 1):
  v = int(value1 * (num_down_steps - step) / num_down_steps)
  set_all_leds(v)
  sleep(LightDn)
sleep(0.2) # 消灯後待機

# レベル移行マップ(v5後オフで完全消灯)
level_map = {
  value1: value2,
  value2: value3,
  value3: value4,
  value4: value5,
  value5: value0 # 尾通過後オフ
}

# メインループ: 状態を逐次更新して滑らかな往復を実現
led_values = [value0] * 8 # 現在のLED明るさ
head_pos = 0 # ヘッド位置(LED1=0, LED8=7)
direction = 1 # 移動方向(右=1, 左=-1)

while True:
  Potvalue = Speedpot.read_u16()
  Interval = (Potvalue / 16384) * 0.1

# すべてのLEDをdim(移行)
new_values = [level_map.get(v, value0) for v in led_values]

# 新しいヘッドをフル点灯
new_values[head_pos] = value1

# LEDに適用
for i in range(8):
  leds[i].duty_u16(new_values[i])

  sleep(Interval)

# 状態更新
  led_values = new_values

# ヘッド移動(端で方向反転)
next_pos = head_pos + direction
  if next_pos < 0 or next_pos > 7:
    direction = -direction
    next_pos = head_pos + direction
  head_pos = next_pos



作り直してもらうにあたって、以下の点を修正しました。

・電源ON時の全点灯/全消灯をもっと滑らかに
・往復時の尾(残光)を4つ→5つに

かなり実物の点灯に近くなったと思います。いや~プログラムが難し過ぎて
簡潔にまとめるのを若干諦めかけていたんですが、Grokさん凄いな!

何の注釈もないただの命令の羅列で「LEDを往復点灯させるプログラム」と
だけ書いて渡したのに、可変抵抗で速度が変わるとか全点灯するとか細かな
部分まで解析して、あっという間にまとめ上げてくれるんだから。

まぁ、自分の知識は全く増えないんですけどね…😏

さすがに1回では無理で、提案されたプログラムをThonnyに貼り付けては
試し、おかしな所を指摘するという形で何度か作り直してもらっていますが、
それでもここまでの形になるまで30分もかからなかったんじゃないかな。


という訳で、ラズパイでナイト2000のスキャナ作りはこれで完成って事に
しようと思います。多分Grok使わなかったら、何年も完成しなかったかも。



完成形は動画でどうぞ(26秒 音声なし)。今回は速度可変はせず、ほど良い
速度で往復させています。かなりそれっぽくなったのではないでしょーか。
良い感じです。

電球バージョンとの違いは残光でしょうか。電球の場合はゆっくり往復の時
残光は短くなり、速く往復では残光が長くなります。しかしこのPWM制御の
場合は必ず残光が5個になるので、ゆっくり動かしていると若干不自然では
あります。

ラズピコ本体で¥1,000ほど、LEDとトランジスタ、抵抗を各8個揃えても
¥1,000もしないでしょうから、¥2,000弱で作れます。LEDをアンバー色に
交換してK.A.R.R.仕様にするのも楽しいですね。

違反になるので付けませんが、これ付けて走ってみたいなぁ~…。ちなみに
公道を走行する車両の場合、すぐに点灯出来る状態になっているとアウト
です。
走行中だけスイッチを切っていればおkという話ではなく、光源となるもの
(LEDや電球)を抜いた状態にしてあり、そもそも配線が繋がっていないとか、
そこまでしないと車検にも通りません。

マイケル・ナイト気分で走ってみたい…。



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