ミニ四駆にobnizで自動ブレーキをつけてみた

#超音波距離センサーを見て最初に思いつくのは自動ブレーキだと思う
電子工作を始めました。
パーツリストを眺めていてまず目につくのが「超音波距離センサー」です。
見た目の可愛らしさもあり、使い倒したいと思いました。

おっと、ここでちょうど目に入ったのは以前タミヤショップで購入したミニ四駆。
こんな相性の良い組み合わせはないと思います。
ということで、超音波距離センサーを見て、誰もが思いつくネタをチャレンジします。

###ミニ四駆に自動ブレーキを実装する
今回改造する物はこちらです。そう、バスターソニック、星馬烈の4代目マシンです。
レッツ＆ゴーといえば、**「いっけー！マグナム」**ですが、私はソニック派です。
![sonic2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143015/aeee6cfe-549c-8916-c173-7d6731ffba3f.jpeg)

[バスターソニックの詳細はこちら](https://dic.pixiv.net/a/%E3%83%90%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BD%E3%83%8B%E3%83%83%E3%82%AF)

昨今、普及が急激に伸びている自動ブレーキ（AEBS：衝突被害軽減ブレーキ）をミニ四駆界にも適用させます。
爆走が許される時代は終焉を迎え、AEBS装備が義務化されたという設定です。


###完成品

**カウルは絶対外さない**＆見た目も気にしたい、ということで、機材は全部後ろ載せにしました。
原型をとどめていてかっこいい。
が、車体の後部が重すぎて余裕でウィリー走行になり、まったく動けません。
しかもまだバッテリー積んでなかった。。。
![sonic4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143015/22e1589f-ee34-bd59-328d-ad84b09ecd49.jpeg)

最終的にこうなりました。配線とテープがものすごく残念ですが我慢です。
**カウルは外していないからギリセーフ**
![sonic6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143015/e77b06bb-455b-d9d6-7117-9d4660a31964.jpeg)

###仕組み
超音波距離センサーで障害物との距離を測り、一定の距離（今回は1000ミリ）でモーターを停止させます。
ミニ四駆は単三電池で動きますが、今回の動力はobnizから供給するのでそこで制御します。
思った以上に走行速度が速く、調整するためのギアもなかったので停止距離を長めにしています。
停止後も慣性で前進し、事故ってしまうので、サーボを使って物理で止めるという暴挙に出ています。

###実践動画
何とか、ギリギリ停止しました。
サーボの羽で無理やり止めた音がブレーキ音っぽく聞こえるのが、少し雰囲気が出ているような。
もっとスマートに止めたいのですが、一度勢いがつくとなかなか止められません。技術不足につき精進が必要です。
日夜、AEBSの開発を行っているエンジニアの皆さんの凄さを勝手ながら感じました。

https://twitter.com/tishiyamaa/status/1453023674232033281

https://twitter.com/tishiyamaa/status/1453023907389132810



###ソースコード
<details><summary>ソースコード全文</summary><div>

```javascript:lostc.js

const Obniz = require('obniz');
const obniz = new Obniz('xxxxxxxxxx');

obniz.onconnect = async () => {

    // 超音波距離センサを利用
    // 基礎編で使ったときと向きが反転していることに注意
    const hcsr04 = obniz.wired('HC-SR04', {
        gnd: 5,
        echo: 6,
        trigger: 7,
        vcc: 8,
    });

    //DCモーターを使用
    var motor = obniz.wired('DCMotor', {forward:1, back:0});
    //サーボモーターを使用
    const servo = obniz.wired('ServoMotor', { gnd: 11, vcc: 10, signal: 9 });

    let degrees = 0.0;

    // obnizディスプレイ（初期表示）
    obniz.display.clear();
    obniz.display.print('obniz Ready');

    motor.forward();  //前進

    // setIntervalで定期実行
    setInterval(async () => {
        // 距離を取得
        let distance = await hcsr04.measureWait();
        // 小数点以下がたくさんあるのでここでは整数にします
        distance = Math.floor(distance);
        // 距離をコンソールに表示
        console.log(distance + ' mm');
        // 距離をobnizディスプレイに表示
        obniz.display.clear();
        obniz.display.print(distance + ' mm');
        // 距離によって判定
        if (distance < 1000.0) {
            // 50mm = 5cm 未満の場合 obnizディスプレイ表示
            obniz.display.clear();
            obniz.display.print('Too close!!');
            motor.stop(); //停止
            degrees = 10.0;    //サーボ角度設定
            servo.angle(degrees);   //サーボ起動
        } else {
            // 50mmを超えるときは常にLEDオフ
            motor.forward();  //前進
            degrees = 90.0;   //サーボ角度設定
            servo.angle(degrees);  //サーボ戻す
        }
    }, 300); // 1000ミリ秒 = 1秒ごとに実行
};

```
</div></details>





#おまけ（息子ちゃんと娘ちゃんの迷子センサーをobnizで作ってみた）
ほぼ完成した後でセンサー類を全く使っていなかったことに気づき中止した企画です。
お蔵入りにするのも悲しいのでおまけ登板します。

###経緯
2歳児と5歳児の父やってます。最近よく子供がどこかに行ってしまいます。
2歳の息子ちゃんは最近走るのが上手になったのが嬉しいのか、気づいたらどこかに走って行ってしまいます。5歳の娘ちゃんは好奇心が育ってきたのか気づいたらいないです。
急にいなくなっているので、気づいた時の焦りが凄い。

私の代わりに監視してくれる何かが欲しい、目の前にobnizが、、、
というわけで、迷子防止センサーをobnizで作成することにしました。


###仕組み
私から一定距離を離れると「迷子」と判定して通知します。
通知は「LINE Notify」を使用
所有のスマホとobnizとの接続（テザリング）が切れたら「迷子」と判断しています。



###完成品
子供が手放さないように猫バスに搭載してみましたが、バッテリーが大きすぎてはみ出す結果に。。。
ネットワーク接続が切れるとLINE Notifyから設定したメッセージが通知されてくる仕組みです。
**この通知が来たらダッシュで探しに行かなければいけません。**
![lostc2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143015/df7b70aa-2fcd-900d-75b8-f31eb8d3b66c.jpeg)![noti2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143015/8c8b9d7b-4071-b2ca-2ce2-32ce17e79f9a.jpeg)




###ソースコード
<details><summary>ソースコード全文</summary><div>

```javascript:lostc.js

'use strcit';

const axios = require('axios');
const qs = require('querystring');
const BASE_URL = 'https://notify-api.line.me';
const PATH =  '/api/notify';
const LINE_TOKEN = `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`;  //notifyのトークンを入れます、取り扱い注意
const Obniz = require('obniz');
const obniz = new Obniz('xxxxxxxx'); // Obniz_IDに自分のIDを入れます、取り扱い注意

const message = `みっちゃんとしのぴっぴがいないよ！！！！！` //LINEに表示するメッセージ

let config = {
    baseURL: BASE_URL,
    url: PATH,
    method: 'post',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': `Bearer ${LINE_TOKEN}`
    },
    data: `message=${message}`
};

obniz.onconnect = async function () {
    obniz.display.clear();
    obniz.display.print('( ^v^)<watching over the lost child');

    //obnizとの接続が切れたら動く
    obniz.on('close', () => {
        console.log('missing...');

        axios.request(config).then((res) => {
            console.log(res.status);
        })
        .catch((error) => {
            console.log(error);
        });
    });
}


```

</div></details>



##感想
初めての電子工作、最高でした。はんだ付けが必要でハードルが高いと思っていましたが、そんなことなくライトにできる時代になっていました。
少し触った程度でしたがobnizから多くの可能性を感じました。これからも触っていきたいと思います。
電子パーツもミニ四駆のパーツも集め始めると止まらなそうです。