目次
環境
Raspberry pi zero
iphone8
エディターはラズパイに初めから付いている、Thonnyを使ってます。
今回は
カメラとサーボモータを使って、追従できると知ったのでやってみました。
部品
- ピンソケット
- 基板
- モータドライバ
- Raspberry Pi Zero
- ジャンプワイヤー
- モバイルバッテリ
配線繋げる
サーボモータ | 配線と機能 | ラズパイGPIO繋ぐ先 |
茶色 | マイナス線 GND | 6番ピン(GND) |
橙(赤?) | プラス線 | 4番ピン(5V) |
黄色 | 制御線 | 32番ピン(GPIOポート番号12) *1kΩ抵抗を噛ませています。 |
↑こんな感じです。
Pythonプログラムを作る
早速、プログラムを作っていきます。「servo-chase.py」というファイルにしました。
import cv2 import numpy as np import pigpio # つないだGPIOの番号です pin = 12 #GPIOピン番号32 # 初期化 pi = pigpio.pi() pi.set_servo_pulsewidth(pin, 1500) img = 0 # サーボの可動範囲を決めます MAX = 2100 MIN = 900 HOME = 1500 # 表示するイメージサイズです WIDTH = 640 HEIGHT = 480 FPS = 24 cap= cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT) cap.set(cv2.CAP_PROP_FPS, FPS) # 描画サイズとフレームレートです width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) fps = cap.get(cv2.CAP_PROP_FPS) print("fps:{} width:{} height:{}".format(fps, width, height)) def move(move): pi.set_servo_pulsewidth(pin, move) # 初期位置の設定します now_degree,move_degree = HOME,0 move(HOME) # 追従スタート try: while True: ret, frame = cap.read() hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 追従する色(青) low_blue = np.array([160, 155, 84]) high_blue = np.array([180, 255, 255]) blue_mask = cv2.inRange(hsv_frame, low_blue, high_blue) red = cv2.bitwise_and(frame, frame, mask=blue_mask) contours, _ = cv2.findContours(blue_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours = sorted(contours, key=lambda x:cv2.contourArea(x), reverse=True) for cnt in contours: (x, y, w, h) = cv2.boundingRect(cnt) img = int((y + y + h) / 2) # かけ算の数値を変えると動きが大きくなるらしいです move_degree = now_degree - (img-240)*0.3 if move_degree > MIN and move_degree < MAX: move(move_degree) now_degree = move_degree print(img) break cv2.line(frame, (0, img), (320, img), (0, 255, 0), 2) cv2.imshow("mask", blue_mask) cv2.imshow("Frame", frame) except KeyboardInterrupt: move(HOME) pi.set_servo_pulsewidth(pin, 0) pi.stop() print("\nCamera stop") finally: cap.release() cv2.destroyAllWindows()
↑こんな感じです。
私は「青色」を認識させますが、ここの数字を変えると、「赤色」だったり、「緑色」だったりにして、色々試せそうです。
やってみよう!
プログラムができたので、実際やってみます。
まず、LXTerminalを開きます。
“pigpiod”を実行するには”pigpiod”を常駐しておく必要があります。なので、コマンドを入力します。
sudo pigpiod
ラズパイを起動するときに”pigpiod”を自動で実行させるには、”nano”で設定ファイル「rc.local」を編集しなければなりません。
sudo nano /etc/rc.local
と入力して、ファイルを開きます。
開いたら、最後の行にある「exit」の前の行に、
sudo pigpiod
と追記して、「Ctrl」+「X」で終了して、
「Y」キーで上書き保存します。
次に、ファイルが実行できるように”cd”で移動します。
cd プログラムが入ってるフォルダのパス
次に”servo-chase.py”プログラムを実行します。
sudo python3 servo-chase.py
すると、数字がLXTerminal上にバァーーーーって出ます。
物をカメラにかざすと、
物を認識して、サーボモータが動いているのがわかります。
できたー。やったー。
でも、実際は車につけてみて、本当に追従するかですね。