”Raspberry Piレーダー”をさらにスリムにしてみた
「”Raspberry Piレーダー”を完成形にしてみた」の記事で完成したRaspberry Pi+赤外線距離計で作ったレーダー(もどき)ですが。
やはりちょっと大きすぎるのが気になって、もう少しスリムにしてみました。
サイズを大きくしている元凶がこれ。PCA9685ボードです。
サーボ一個なのに、16個も制御できるボードをつけているのがいけません。
大体サーボ一個を動かすためだけに、わざわざこれを使うのはもったいない。
ちょうどPCA9685 電源用の線が切れたので、これを機に引き剥がすことにしました。このボードはまたいずれ使うことにします。
さて、まずは回路を作り直します。
この記事を参考に組んだのが以下の回路。
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)
----------------------------------------------------------------
うまく動作してくれました。
あとはこのプリント基板をニッパーで強引に切って
裏はビニールテープで絶縁
強引にRaspberry Pi 2のケース内に押し込んでやりました。
が、まだ周りの線が邪魔。
これすらもケース内に収めてみました。
こういうとき、透明じゃないケースの方がいいですねぇ。
電源・ディスプレイを除けば、手のひらサイズにまで出来ました。
この状態で、ちゃんと動作することも確認。
コンパクトになったので、そろそろ車載テストしてみたいですねぇ。
本来の用途である死角用センサーとして本当に使えるんでしょうか?気になるところです。
![]() |
« カメラレンズ用激落ちくん「激落ちカメラレンズクリーナー」誕生! | トップページ | 水柱をアンテナに!?三菱電機が海水をアンテナ化する技術を確立 »
「Raspberry Pi・Arduino・電子工作」カテゴリの記事
- 名古屋 大須へ行ってきました(2024.04.28)
- Raspberry Pi 5用電源購入(2024.04.19)
- Interface 2024年5月号はRaspberry Pi 5特集(2024.03.26)
- Raspberry Pi 5とPCがつながらなかった理由は「プライバシーセパレーター機能」のせいでした(2024.03.12)
- Raspberry Pi 5に日本語LLM(ELYZA-Japanese-Llama-2-7b-fast-Instruct)を入れてみた(2024.03.10)
« カメラレンズ用激落ちくん「激落ちカメラレンズクリーナー」誕生! | トップページ | 水柱をアンテナに!?三菱電機が海水をアンテナ化する技術を確立 »
コメント