Raspberry Piレーダーを”360度”仕様にしてみた
Raspberry Piレーダーネタはおしまい、なんて言葉はどこへやら。
もうちょっと手を出すことにしました。
というのも、そもそもレーダーというものは
・ 360度全方位をサーチできること
・ 緑色のラインがくるくる回り、反応ポイントがピコーンと光る
ていうやつじゃなければいけません。
これを実現するために、先日のステッピングモーター28BYJを使いますが、このステッピングモーターの先に赤外線測距計をつけると電線がぐるぐる巻きになっていつかぶちって切れてしまいます。
これを解決するために「スリップリング」ってやつを購入。
ツクモロボット館で購入。お値段2,500円ほど。
6極スリップリング:SRG-1-6G | 電気部品 › スイッチ | ロボット 専門店 - ツクモRobot王国オンラインショップ
”スリップリング”というのは、くるくる回っても通電してくれるという電極。
原理はこちらを参照:スリップリングシステムとは? | 協栄電機株式会社
これを使えば、電線がぐるぐる巻きになることがありません。
真ん中部分がくるくる回るところで、どれだけ回転しても左の電極と中央の6本の線とが通電状態にできるというもの。
・・・なんですけど、この土台の電極がどの色の電極に対応しているのか!?
説明書も何もついてなかったため、さっぱりわかりません。
ということで、これをつくっている”ツバメ無線”というところのサイトで確認しました。
上の写真の右から黒、赤、黄、緑、青、白 の順のようです。
さて、これをどうやってステッピングモーターに取り付けるのかと思ってたら
もぅやだ、なにこれ・・・ぴったりすぎ・・・
何も考えなくてもぴったりはまってくれました。
てことで、準備完了!レッツ!!電子工作ぅ!!!
回路図はこちら
ただ既に赤外線センサー等はプリント基板上にハンダ付けされてるため、線のつなぎ直しが必要。
こんな感じにちょきんと切って
結線してハンダ付け
被覆します。
また、スリップリングの電極にもリード線接続。
計10本以上の結線を実施。
つなぎ直しでも赤外線センサー”GP2Y0A710K”がちゃんと動くことを確認。
Raspberry Pi B+からRaspberry Pi 2につなぎ変えたステッピングモーターもテスト。
スリップリングをつけてもちゃんと回ることを確認。
さて、問題はこのスリップリングの中央と”GP2Y0A710K”をどうやってつなげるのか?
いろいろ考えて、こういうものを使いました。
これくらいの大きさに切って
ちょっと切れ目を入れて配線をはさみ
あとは両面テープ・セロテープで無理やり固定。
いずれもうちょっとまともな固定方法を考えます。
ステッピングモーターとスリップリングはビニールテープで引っ付けました。
これでハードは完成。
続いて、ソフトウェアです。
以前はセンサー値をOpenCVを使って描画させましたが、今回使うのは”pygame”というやつです。
こちらのサイトを参照。
画面サイズを600×600にし、センサーの値を点でプロット。
で、まるで軍艦のレーダーサイトのようにレーダー画面の点がじわじわっと消えていく演出も加えました。
出来たコードはこちら。
#!/usr/bin/python
import math
import sys
import signal
import spidev
import time
import RPi.GPIO as GPIO
import subprocess
import pygame
import numpy as np
pygame.init()
sx = 600
sy = 600
pygame.display.set_mode((sx, sy), 0, 32)
screen = pygame.display.get_surface()
# Loop until the user clicks the close button.
done = False
# open SPI device 0.0
# open SPI device 0.0
spi = spidev.SpiDev()
spi.open(0, 0)
GPIO.setmode(GPIO.BCM) # use GPIO Number
StepPins = [17,22,23,24]
# Set all pins as output
for pin in StepPins:
print "Setup pins"
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin, False)
# Define advanced sequence
# as shown in manufacturers datasheet
Seq = [[1,0,0,1],
[1,0,0,0],
[1,1,0,0],
[0,1,0,0],
[0,1,1,0],
[0,0,1,0],
[0,0,1,1],
[0,0,0,1]]
StepCount = len(Seq)
StepDir = -1 # Set to 1 or 2 for clockwise
# Set to -1 or -2 for anti-clockwise
# Initialise variables
StepCounter = 0
Rrx = [0] *512
Rry = [0] *512
while (True):
angle = 0
for i in range(4096):
# motor angle
angle = i * 5.625/64
for pin in range(0, 4):
xpin = StepPins[pin]
if Seq[StepCounter][pin]!=0:
GPIO.output(xpin, True)
else:
GPIO.output(xpin, False)
StepCounter += StepDir
if (StepCounter>=StepCount):
StepCounter = 0
if (StepCounter<0):
StepCounter = StepCount+StepDir
if i%8==0:
pygame.draw.circle(screen, (0, 200, 0), (sx/2, sy/2), sx/2, 1)
pygame.draw.circle(screen, (0, 200, 0), (sx/2, sy/2), sx/2/6*1, 1)
pygame.draw.circle(screen, (0, 200, 0), (sx/2, sy/2), sx/2/6*2, 1)
pygame.draw.circle(screen, (0, 200, 0), (sx/2, sy/2), sx/2/6*3, 1)
pygame.draw.circle(screen, (0, 200, 0), (sx/2, sy/2), sx/2/6*4, 1)
pygame.draw.circle(screen, (0, 200, 0), (sx/2, sy/2), sx/2/6*5, 1)
pygame.draw.line(screen, (0, 200, 0), (0, sy/2), (sx, sy/2))
pygame.draw.line(screen, (0, 200, 0), (sx/2, 0), (sx/2, sy))
# Radar Point
for j in range(512):
# col = 255
deg = j * 5.625 / 8
radar_deg = deg - angle
if radar_deg <=0 :
col = int(255*((360+radar_deg)/360)**1.3)
pygame.draw.circle(screen, (0,col,0),(Rrx[j-1],Rry[j-1]),5)
else:
col = int(255*(radar_deg/360)**1.3)
pygame.draw.circle(screen, (0,col,0),(Rrx[j-1],Rry[j-1]),5)
# IR_sensor value to distance (m)
resp = spi.xfer2([0x68, 0x00])
value = (resp[0] * 256 + resp[1]) & 0x3ff
if distance < 0:
distance = math.fabs(distance)
dx = sx/2 + sx/2 * math.cos(math.radians(angle))
dy = sy/2 + sx/2 * math.sin(math.radians(angle))
pygame.draw.aaline(screen, (0, 200, 0), (sx/2, sy/2), (dx, dy),5)
rx = int(sx/2 + 50 * distance * math.cos(math.radians(angle)))
ry = int(sy/2 + 50 * distance * math.sin(math.radians(angle)))
Rrx[i/8] = rx
Rry[i/8] = ry
pygame.display.update()
pygame.time.wait(30)
screen.fill((0, 20, 0, 0))
else:
time.sleep(0.001)
3つくらいのコードをごちゃ混ぜにしたため、少々見難いコードとなっております。ご勘弁を。
今回はコードを簡単にゲットできるようにしました。以下のコマンドを実行すると上のコードが入手できます。
wget https://arkouji.cocolog-nifty.com/file/IRradar.py
で、こちらがその画面。
緑のラインが回ると点が現れて、だんだん消えていきます。いかにもレーダーっぽくなりました。
今回「pygame」というのを初めて使いましたが、グラフィック描画させるには確かに便利。
ただし、これを使うにはRaspberry Piに直接ディスプレイをつなぐか、上のようにVNCで接続できるようにするかのいずれかが必要。
動画を撮ってみました。こちらの方がイメージつかみやすいかも。
コード中に「col = int(~)**1.3)」というのが2箇所ありますが、この「1.3」という値を小さくすると消えるのが遅くなり、大きくすれば早くなります。この辺は好みで変更可能。
ちょっと気になるのは、今回ちょっと回路組換えしたんですが、その結果赤外線センサーの値のばらつきが大きくなったような…ノイズが増えてるような感じ、コンデンサー使わないといけませんかね。
せっかくコンパクト化したのに、ステッピングモーターつけたらまたごちゃごちゃしちゃいました。これもいずれなんとかしたい。
さて。
少々問題ありですが、360度レーダーは完成しました。画面もレーダーっぽく描画可能に。
しかし、作っておいていうのもなんですがこれが一体何に使えるのかはさっぱり未定。
動画をご覧になるとわかりますが、当初考えていた車載レーダーとして使うにはスキャン速度が遅すぎ。
正直、以前作った戦艦大和のラジコンに搭載するくらいしか使い道が思い浮かびませんね。
まあ、中二病が捗るアイテムとしてはおすすめできますね。
SODIAL(R) 28BYJ-48 28BYJ48 DC 5V 4-フェーズ5線式ステッピングモータとULN2003ドライバボード |
最近のコメント