« PCやRaspberry Piで使えるSIMフリーのLTE通信可能なUSBドングル”PIX-MT100” | トップページ | 100ドルを切る安価な3Dスキャナー”CowTech Ciclop” »

2016年2月29日 (月)

Raspberry Piレーダーを”360度”仕様にしてみた

Raspberry Piレーダーネタはおしまい、なんて言葉はどこへやら。

もうちょっと手を出すことにしました。

というのも、そもそもレーダーというものは

・ 360度全方位をサーチできること

・ 緑色のラインがくるくる回り、反応ポイントがピコーンと光る

ていうやつじゃなければいけません。

これを実現するために、先日のステッピングモーター28BYJを使いますが、このステッピングモーターの先に赤外線測距計をつけると電線がぐるぐる巻きになっていつかぶちって切れてしまいます。

これを解決するために「スリップリング」ってやつを購入。

Img_1240

ツクモロボット館で購入。お値段2,500円ほど。

6極スリップリング:SRG-1-6G | 電気部品 › スイッチ | ロボット 専門店 - ツクモRobot王国オンラインショップ

”スリップリング”というのは、くるくる回っても通電してくれるという電極。

原理はこちらを参照:スリップリングシステムとは? | 協栄電機株式会社

これを使えば、電線がぐるぐる巻きになることがありません。

Img_1241

真ん中部分がくるくる回るところで、どれだけ回転しても左の電極と中央の6本の線とが通電状態にできるというもの。

Img_1243

・・・なんですけど、この土台の電極がどの色の電極に対応しているのか!?

説明書も何もついてなかったため、さっぱりわかりません。

ということで、これをつくっている”ツバメ無線”というところのサイトで確認しました。

ツバメ無線株式会社|スリップリング

上の写真の右から黒、赤、黄、緑、青、白 の順のようです。

さて、これをどうやってステッピングモーターに取り付けるのかと思ってたら

Img_1242

もぅやだ、なにこれ・・・ぴったりすぎ・・・

何も考えなくてもぴったりはまってくれました。

Img_1244

てことで、準備完了!レッツ!!電子工作ぅ!!!

回路図はこちら

Rpiradar360_01

ただ既に赤外線センサー等はプリント基板上にハンダ付けされてるため、線のつなぎ直しが必要。

Img_1245

こんな感じにちょきんと切って

Img_1246

結線してハンダ付け

Img_1247

被覆します。

Img_1248

また、スリップリングの電極にもリード線接続。

計10本以上の結線を実施。

Img_1250

つなぎ直しでも赤外線センサー”GP2Y0A710K”がちゃんと動くことを確認。

Img_1252

Raspberry Pi B+からRaspberry Pi 2につなぎ変えたステッピングモーターもテスト。

スリップリングをつけてもちゃんと回ることを確認。

さて、問題はこのスリップリングの中央と”GP2Y0A710K”をどうやってつなげるのか?

Img_1254

いろいろ考えて、こういうものを使いました。

Img_1257

これくらいの大きさに切って

Img_1258

ちょっと切れ目を入れて配線をはさみ

Img_1259

あとは両面テープ・セロテープで無理やり固定。

いずれもうちょっとまともな固定方法を考えます。

Img_1260

ステッピングモーターとスリップリングはビニールテープで引っ付けました。

Img_1261

これでハードは完成。

続いて、ソフトウェアです。

以前はセンサー値をOpenCVを使って描画させましたが、今回使うのは”pygame”というやつです。

こちらのサイトを参照。

Python/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

で、こちらがその画面。

Rpiradar360_02

緑のラインが回ると点が現れて、だんだん消えていきます。いかにもレーダーっぽくなりました。

今回「pygame」というのを初めて使いましたが、グラフィック描画させるには確かに便利。

ただし、これを使うにはRaspberry Piに直接ディスプレイをつなぐか、上のようにVNCで接続できるようにするかのいずれかが必要。

動画を撮ってみました。こちらの方がイメージつかみやすいかも。

コード中に「col = int(~)**1.3)」というのが2箇所ありますが、この「1.3」という値を小さくすると消えるのが遅くなり、大きくすれば早くなります。この辺は好みで変更可能。

ちょっと気になるのは、今回ちょっと回路組換えしたんですが、その結果赤外線センサーの値のばらつきが大きくなったような…ノイズが増えてるような感じ、コンデンサー使わないといけませんかね。

せっかくコンパクト化したのに、ステッピングモーターつけたらまたごちゃごちゃしちゃいました。これもいずれなんとかしたい。

さて。

少々問題ありですが、360度レーダーは完成しました。画面もレーダーっぽく描画可能に。

しかし、作っておいていうのもなんですがこれが一体何に使えるのかはさっぱり未定

動画をご覧になるとわかりますが、当初考えていた車載レーダーとして使うにはスキャン速度が遅すぎ

正直、以前作った戦艦大和のラジコンに搭載するくらいしか使い道が思い浮かびませんね。

まあ、中二病が捗るアイテムとしてはおすすめできますね。

SODIAL(R) 28BYJ-48 28BYJ48 DC 5V 4-フェーズ5線式ステッピングモータとULN2003ドライバボード

« PCやRaspberry Piで使えるSIMフリーのLTE通信可能なUSBドングル”PIX-MT100” | トップページ | 100ドルを切る安価な3Dスキャナー”CowTech Ciclop” »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

すばらしいです!
僕もチャレンジしたくなりました。

レーダーのスピードってもっと上げられるんですかね。

こんにちは、きむきむさん。

このセンサーとRaspberry Piの組み合わせをする限りは、これが限界かもしれません。Arduino辺りを使えば、あるいは……

でも、本命はこの掃除機についているセンサーですね。

https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00320/00005/

2万円台の掃除機についているという日立LGストレージ製のLIDERを手に入れたいですね。これさえあれば、もっと高速で精度のいい、安価なレーダーっぽいものが気軽に作れそうです。が、残念ながら、個人で手に入れる方法が見つかりませんね・・・

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Raspberry Piレーダーを”360度”仕様にしてみた:

« PCやRaspberry Piで使えるSIMフリーのLTE通信可能なUSBドングル”PIX-MT100” | トップページ | 100ドルを切る安価な3Dスキャナー”CowTech Ciclop” »

無料ブログはココログ

スポンサード リンク

ブログ村