« カメラレンズ用激落ちくん「激落ちカメラレンズクリーナー」誕生! | トップページ | 水柱をアンテナに!?三菱電機が海水をアンテナ化する技術を確立 »

2016年2月 2日 (火)

”Raspberry Piレーダー”をさらにスリムにしてみた

”Raspberry Piレーダー”を完成形にしてみた」の記事で完成したRaspberry Pi+赤外線距離計で作ったレーダー(もどき)ですが。

Img_1096

やはりちょっと大きすぎるのが気になって、もう少しスリムにしてみました。

Img_1097

サイズを大きくしている元凶がこれ。PCA9685ボードです。

サーボ一個なのに、16個も制御できるボードをつけているのがいけません。

大体サーボ一個を動かすためだけに、わざわざこれを使うのはもったいない。

ちょうどPCA9685 電源用の線が切れたので、これを機に引き剥がすことにしました。このボードはまたいずれ使うことにします。

さて、まずは回路を作り直します。

テックシェアストア(TechShareStore)

この記事を参考に組んだのが以下の回路。

Ir_rader_single_01

SG-90サーボは茶色線がGND、真ん中の赤線が5V、黄色線が信号線のようです。

信号線をGPIO 12(PWM 0)に接続しました。

今回はサーボ用電源はRaspberry Pi 2からとることにしました。不安定になったときはそのとき考えることに。

さてプログラムですが、上のサイトを参考にしたらなかなかうまく動きませんでした。

0度、90度、180度と動かすはずのサンプルコードで、どう見ても90度も動きません。何か変。

で、見つけたのがこちらの記事。

Raspberry pi 2 + Servo Motor(サーボモータを動かす) - 日記とか、工作記録とか

ChangeDutyCycle() の()内の値を2~12の間でふるとうまくいくと書かれてます。

たしかに、こちらのサンプルプログラムを動かすとちゃんとサーボがきれいに0~180度動きます。

ということで、これを元に作ったコードは以下。

----------------------------------------------------------------

#!/usr/bin/python

import math
import sys
import signal
import spidev
import time
import RPi.GPIO as GPIO
import subprocess

import numpy as np
import cv2

# open SPI device 0.0
spi = spidev.SpiDev()
spi.open(0, 0)

def exit_handler(signal, frame):
  print("\nExit")
  servo.stop()
  GPIO.cleanup()
  sys.exit(0)

signal.signal(signal.SIGINT, exit_handler)

GPIO.setmode(GPIO.BCM) # use GPIO Number

SV1 =12
GPIO.setup(SV1, GPIO.OUT)

servo = GPIO.PWM(SV1, 50) # set 20 ms / 50 Hz

servo.start(0.0)

while (True):
  # Change speed of continuous servo on channel O
  img = cv2.imread('black.png')
  for i in range(90):
        servoRad = i * 2
        servoPls = 2.0 + servoRad/18.0
        servo.ChangeDutyCycle(servoPls)

        resp = spi.xfer2([0x68, 0x00])
        value = (resp[0] * 256 + resp[1]) & 0x3ff
        volt = value * 5.0 / 1023
        distance = ( 18.679 / volt ) -4.774

        x = 300 - int(80 * distance * math.cos((180-servoRad) * math.pi/180))
        y = 480 - int(80 * distance * math.sin((180-servoRad) * math.pi/180))

        a = int(distance * math.sin((180-servoRad) * math.pi/180))
        b = int(distance * math.cos((180-servoRad) * math.pi/180))

        cv2.line(img,(x-a,y+b),(x+a,y-b),(255,255,255),3)
        time.sleep(0.02)

  cv2.imwrite('/var/www/html/result.jpg', img)

  img = cv2.imread('black.png')
  for j in range(90):
        servoRad = 180 - j * 2
        servoPls = 2.0 + servoRad/18.0
        servo.ChangeDutyCycle(servoPls)

        resp = spi.xfer2([0x68, 0x00])
        value = (resp[0] * 256 + resp[1]) & 0x3ff
        volt = value * 5.0 / 1023
        distance = ( 18.679 / volt ) -4.774

        x = 300 - int(80 * distance * math.cos((180-servoRad) * math.pi/180))
        y = 480 - int(80 * distance * math.sin((180-servoRad) * math.pi/180))

        a = int(distance * math.sin((180-servoRad) * math.pi/180))
        b = int(distance * math.cos((180-servoRad) * math.pi/180))

        cv2.line(img,(x-a,y+b),(x+a,y-b),(255,255,255),3)

        time.sleep(0.02)

  cv2.imwrite('/var/www/html/result.jpg', img)

----------------------------------------------------------------

Img_1100

うまく動作してくれました。

Img_1103

あとはこのプリント基板をニッパーで強引に切って

Img_1102

裏はビニールテープで絶縁

Img_1104

強引にRaspberry Pi 2のケース内に押し込んでやりました。

が、まだ周りの線が邪魔。

Img_1113

これすらもケース内に収めてみました。

こういうとき、透明じゃないケースの方がいいですねぇ。

Img_1114

電源・ディスプレイを除けば、手のひらサイズにまで出来ました。

この状態で、ちゃんと動作することも確認。

コンパクトになったので、そろそろ車載テストしてみたいですねぇ。

本来の用途である死角用センサーとして本当に使えるんでしょうか?気になるところです。

デジタル・マイクロサーボ SG90 (5個)

« カメラレンズ用激落ちくん「激落ちカメラレンズクリーナー」誕生! | トップページ | 水柱をアンテナに!?三菱電機が海水をアンテナ化する技術を確立 »

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

コメント

コメントを書く

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

トラックバック


この記事へのトラックバック一覧です: ”Raspberry Piレーダー”をさらにスリムにしてみた:

« カメラレンズ用激落ちくん「激落ちカメラレンズクリーナー」誕生! | トップページ | 水柱をアンテナに!?三菱電機が海水をアンテナ化する技術を確立 »

無料ブログはココログ

スポンサード リンク

ブログ村