ラズパイで本当に動く空気砲を作りました


![a2e3bc0764b061b8cf194e82966a1e01.png](https://qiita-image-store.s3.amazonaws.com/0/218533/6e2c12af-dbe9-9998-6c09-ac77eca4d4a6.png)

## 22世紀に間に合いました

The world's first voice recognition air cannon made with Raspberry Pi.
It is a tool of Doraemon.
I was in time for the 22nd century.

どうもくろにゃんこたんです。
そういえばコードが載せられると思い、久しぶりにQiitaへ遊びに来ました。
発明の日（4月18日）が近づいてきましたので、それに合わせておもちゃを自作してみました。

### デモンストレーション

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Youtubeにアップしました！<br>「空気砲を作ってみました」<a href="https://t.co/s0Nyex0UA6">https://t.co/s0Nyex0UA6</a></p>&mdash; くろにゃんこたん (@kuronyankotan) <a href="https://twitter.com/kuronyankotan/status/1113682642833006592?ref_src=twsrc%5Etfw">2019年4月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ろうそくを際だたせるために、ちょっと暗くしすぎましたね。。

スマホでもテイク２を撮りましたのでこちらでも。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%83%89%E3%83%A9%E3%81%88%E3%82%82%E3%82%93?src=hash&amp;ref_src=twsrc%5Etfw">#ドラえもん</a> 秘密道具のひとつ。<a href="https://twitter.com/hashtag/%E7%A9%BA%E6%B0%97%E7%A0%B2?src=hash&amp;ref_src=twsrc%5Etfw">#空気砲</a> を発明しました！！<br>ドカンと言うとコンプレッサーで充填した圧縮空気を一気に放出<br>！建物ごと吹っ飛ばせます。<br>もちろん子どもが扱えるサイズで電池がある限り連射可能です。<a href="https://twitter.com/hashtag/22%E4%B8%96%E7%B4%80%E3%81%AB%E9%96%93%E3%81%AB%E5%90%88%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F?src=hash&amp;ref_src=twsrc%5Etfw">#22世紀に間に合いました</a> <a href="https://t.co/UhOatvMbvk">pic.twitter.com/UhOatvMbvk</a></p>&mdash; くろにゃんこたん (@kuronyankotan) <a href="https://twitter.com/kuronyankotan/status/1112482533516546048?ref_src=twsrc%5Etfw">2019年3月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 概要
ドカンと話すだけで、充填された空気を放出します。
その空気でろうそくの火を消すことが出来ます。
動画では4歳の子が実際に打っています。

[元記事](https://kuronyankotan.com/?p=1618)の投稿日は4月1日ですがエイプリールフールネタではありません。。。

## 利用技術

### 動作環境
・Raspberry Pi 3 Model B+
・音声認識モジュール Julius4.3.3
・モバイルバッテリー
・USBマイク
・サーボモータ
・ゴミ箱
・チップスターの筒
・風船（半分）

動作の流れ
１．ラズパイ起動
２．Juliusのモジュールモードが起動。
３．音声認識で「ドカン」を検知。
４．サーボモータでフックを外す
５．空気放出！

６．フックをもとに戻す（手動）

## 解説
### きっかけ
ゲームセンターで、ふと「本当に打てる空気砲」というのが売っていたんですよね(´ω｀)
こちらも手動で、音声は単に言うだけだったのですが、では音声認識させたら本物の空気砲が再現できるのでは無いか。と考えました。

空気砲の要素で大事なところを分解すると下記のような図になります。

![f1ffb33032deac5a8e248a3b8935fb14.png](https://qiita-image-store.s3.amazonaws.com/0/218533/256d352f-ec46-547f-0d63-45dd6b217a44.png)

１．音声認識APIで「ドカン」を検知
２．空気が出る
３．片手持ち

たったこれだけですね！
さらに子供でも出来るというのが要点です。

どちらかというと空気を出す方法について色々な施策があると思いますが、こちらはチップスターの筒で、すでに完成形がありましたので、物理的に試行錯誤した結果、結局はこちらを採用いたしました。

風船といってもその力はかなり強いので、サーボモーターではフックを外すという役割だけを担ってもらい、風船を引っ張ってフックに取り付けは手動にしました。
いずれバージョンアップの際に電気的に連射が可能にするかもしれません。


 
また、空気の力を強くすればするほど、昨今で銃刀法違反にかるーく触れかねないので、ローソクの火程度にしています。（笑）

## まとめ
苦労話
音声認識自体は下記記事を参考にしたので、（サーボモータの扱いも）だいぶ楽でした！

[それ、ラズパイでつくれるよ——日本語音声認識もできるよ！](https://fabcross.jp/category/make/sorepi/20180326_julius.html)

こちらで、自作の辞書を用意。
辞書ファイルは超シンプル
認識結果も上々です(´ω｀)

vocaファイル
```dokan.voca
% DOKAN
ドカン d o k a n
% NS_B
[s] silB
% NS_E
[s] silE
```
grammarファイル
```dokan.grammar
S : NS_B DOKAN NS_E
```

たったこれだけで自作辞書が生成出来ました＼(^o^)／

![IMG_20190331_200726.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/5290b0e9-dbd6-c16d-9736-aac0af3003b6.jpeg)

小さめのマイクでしたのでマイク音量が小さいのですよね。
でもアニメのシーンに出てくるような打ち方なら大丈夫です。
もう少し小声で打ちたい方はもう少し高性能なUSBマイクを利用しましょう。

### でもやっぱり
威力が微妙過ぎますよね。
内部に板を仕込んでソレノイドで打ち出す方法が、最も簡単かも。
威力を求めるとそれなりに筐体か電気的に負荷がかかるものも多いし、なにより捕まるリスクが高まりますのでこれくらいの威力でまだちょうどいいです。
重くなりすぎて子供が持てないと意味ないですしね(´ω｀)

サーボモータの動作でもはコチラ。
ゴミ箱から外して動かしてみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">いいね(´ω`) <a href="https://t.co/0OuZXnKJgT">pic.twitter.com/0OuZXnKJgT</a></p>&mdash; くろにゃんこたん (@kuronyankotan) <a href="https://twitter.com/kuronyankotan/status/1112538531224682496?ref_src=twsrc%5Etfw">2019年4月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

単純に90度を反転しているだけです。
上記動作確認用Pythonプログラムはこちら

```python:test.py
import wiringpi
import time
import sys

servo_pin  =  18
param = sys.argv
set_degree = int(param[1])
print(set_degree)

wiringpi.wiringPiSetupGpio()
wiringpi.pinMode( servo_pin, 2 )
wiringpi.pwmSetMode(0)
wiringpi.pwmSetRange(1024)
wiringpi.pwmSetClock(375)

if ( set_degree <= 90 and set_degree >= -90 ):
	move_deg = int( 81 + 41 / 90 * set_degree )
	wiringpi.pwmWrite( servo_pin, move_deg )
```
このサンプルにちょっと手を加えて、-90度→90度で動かしていました。

デバイスに詳しい方が見れば、こうした方が強い！とか絶対言ってもらえると思いますが、発明というのは先進性も重要なので空気砲の基準を満たしたものをプロトタイプレベルですがいち早く発表させて頂きました。

音声認識で空気砲を完全再現は世界初ではないでしょうか(´ω｀)
（やったね元祖を取りました）

### 内部
くろにゃんこたんが大好きな養生テープがバリバリ使われています。
撮影用にラズパイとバッテリーを抜いてありますが、構造はほぼこれ。
![IMG_20190331_200602.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/355c28cb-bb04-2ab3-70f3-74baf16dbdf6.jpeg)


実は空気を打ち出すところは超小さい！
絞ることによって空気を強めにしています。

持ちやすいようにゴミ箱の真ん中に突っ張り棒ミニサイズを入れてあります。
逆にこれだけスペースがあるので、もう少し小さいゴミ箱でも良かったかな(´ω｀)
左右の隙間にラズパイとモバイルバッテリーを養生テープで固定します。

また、手に持っても、ろうそくの火が見やすいように、大口径でのぞき穴があります。
これで対象を狙いやすくしています。
あまり外観に手を入れて、本物と変わってしまうのもあれなので、外側からは筒にしか見えない位内部に仕込みました。

### 今回使ったゴミ箱

![IMG_20190331_200631.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/0e71b964-60f3-ff40-6716-09ebbeb639cb.jpeg)

珍しく100均以外での買い物でした。
2重構造になっていて、穴を開ける必要がなかったのでとても楽。
もし失敗したらゴミ箱にもなるというすぐれものです(´ω｀)

## 展望
・ 威力の増加
色んな人に見せたのですが、威力が弱いっ。という感想が多かったです。
まぁあのサイズの筒と100均の風船なので。。
よくある空気砲だと、ダンボールに穴を空けて作るので、あれくらいの威力を小型化できれば良いのですが。ここはアイデア募集中(´ω｀)

・手動で戻す必要がある。
面倒ですね。
威力のほぼ100%は人力で引っ張る構造なので、致し方ない設計ではありますが、
ゴムを巻いて一気に放出。というのはサーボモーターには荷が重いです。
ファンとか使えば良いんですかねぇ。
個人的には、チャージ時に光や音も入れて波動砲っぽくしたいなぁとは思っています。

・命中しづらい
穴が小さいので、必然的に狙うには練習が必要です。
レーザーをつけても良かったかな。でもろうそくには効かないので今回は心の目の鍛錬でなんとかしました。

今回はIoTではなく、レイテンシーの問題でローカルデバイスのみで実現しました。
「ドカン」だけ分かれば良いのでローカルでもなんとかなりました。

この空気砲の趣旨は、
威力が大事というより、「音声認識（ローカル）」で実際に動く22世紀風のおもちゃを作ってみたかったので、威力はご容赦ください。

ありそうで無かった空気砲。
こちらの記事を読んで、なんだ！全然簡単そうじゃん。
我こそはこんなゴミ（ゴミ箱なんだけど）より良いもの作ってやる。
と思った方はぜひトライしてみてください(・ω・)ノ

トライしたら教えてくださいね！