息抜きコーナ

電動ガンをプログラミングして自動発射させて遊ぶ

アイキャッチ画像
  • PC上のソフトだけではなく、物理的なものを作ってみたい
  • いつもと違う物を作ってみたい
  • 普段のプログラム業務に疲れた・・

という方は、楽しめる記事になってます。

子供心に戻って夢中で楽しめる、Pythonで操作する簡単なおもちゃの作り方を紹介します。

制作物の動画はこちら

PC(ラズベリーパイもOK)からエアーガン発射装置を制御するガジェットです。簡単なプログラムで実装可能です。

準備するもの

「USB」スナイパー 

(2013年製なので現在販売していませんが、ヤフオクとかメルカリで結構出回っています。)

USBスナイパーの外観

本ガジェットは、電動ガンの機能の他に、目標物の認識用カメラも内臓しています。

当時のAKIBAさんの記事

用意するPC(ラズベリーパイでもOK)

本検証では、Linux(Ubuntu)を使用しました。ラズベリーパイでも動作確認済です。

MACでは、ドライバを製作する必要があります。(2021年4月時点で、筆者のPC(2018年製 MacBook Pro OSは最新)では認識しませんでした。)

Windowsは、7/Vista/XPが対応してます。(ごめんなさい。Windows10での確認ができていません。)

箱の裏面写真

PCとの接続

物理的な接続は、USBを接続するだけです。

Linux上で「/dev」内のディレクトリに以下のファイルがあれば、USBとして認識しています。

筆者の環境では、「ttyUSB1」でした。ファイル名の最後の番号は変わります。

USBの接続すると、「ttyUSB◯←番号」ファイルが追加されるので、判断できると思います。

Pythonのコード

シリアル通信のライブラリ

「pyserial」を使用します。

インストールされていない方は、pipで簡単にインストール可能です。

pip install pyserial

シリアル通信のためのコード

import serial
import time

ser = serial.Serial('/dev/ttyUSB1', 9600)
time.sleep(1)
ser.write('@CPSM\n'.encode('utf-8'))

上記コードのserial.Serial(‘/dev/ttyUSB0’, 9600)の引数は、割り当てられたデバイス名とボーレートを入力します。

ボーレードの単位は、上記の場合9600ビット/secです。

BB弾、発射のためのコード

本記事の一番のメインディッシュですw 

とても簡単で、以下のコードを記入するだけです。

ser.write('FIRE-2580\n'.encode('utf-8'))

引数の「FIRE-2580」の2580は、BB弾の発射時間になります。単位はmsecです。

本装置はBB弾発射の前に「ためる」時間が必要です。

筆者が確認した所、上記の設定(2580msec)で、一発発射しました。

時間を伸ばすと、連続してBB弾を発射できます。(BB弾、数個位なら、本ガジェットにセット可能です。)

砲身の移動

このガジェット、砲身を動かす事ができます(すごい!)。

砲身は、縦方向と横方向に動かす事ができます。そのコードは以下の通りです。

# 砲身を上に動かす場合
ser.write('UP-240\n'.encode('utf-8'))
time.sleep(2)
# 砲身を下に動かす場合
ser.write('DOWN-240\n'.encode('utf-8'))
time.sleep(2)

# 砲身を右に動かす場合
ser.write('RIGHT-240\n'.encode('utf-8'))
time.sleep(2)
# 砲身を左に動かす場合
ser.write('LEFT-240\n'.encode('utf-8'))
time.sleep(2)

引数に記述している240は、240msec秒間動かすという意味になっています。

シリアル通信が終わったら、最後に以下のコードを記入して、シリアル通信を終了させましょう。(忘れがちです。)

ser.close()

内臓カメラから撮像データを取得するコード

このコードは、普通にOpenCVを使ったコードです。(本ガジェット特有のコードではありません。)

参考までに記します。

import cv2

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('img', frame)

    if cv2.waitKey(30) == 27:
        break

cv2.destroyAllWindows()
cap.release()

 内臓カメラで撮像したデータを取得して、PCでリアルタイムで動画出力するコードです。「ESC」を押すと、終了します。

最後に

Pythonから操作する電動ガンのガジェットをご紹介しました。

本ガジェットは、簡単なコードで遊べるため、プログラミング初心者の学習にとっても、最適な題材だと思います。

また、内臓カメラもあるので、人工知能(ディープラーニング)と組み合わせると、何かを認識して自動で発射するとか、アイデア次第で楽しい装置になるかと思います。

楽しいひとときを。