I/Oを1ms単位で正確にON/OFFできるio.animation機能がすごい(ミニ四駆チキンレース車応用例)

#■はじめに
obnizで1ms単位で正確(時間)にIOを制御するio.animationという機能の紹介です。チキンレース用のミニ四駆に応用した例で紹介します。

#■走行距離が大きくブレて苦戦
obnizは1ピン当たり1Aまでの電流を取れるのでミニ四駆などのDC Motorも直刺しで使え、小さな車体内にもコンパクトに搭載できます。一方でCloudで動作するという機構のため、超正確(時間)に信号をON/OFFする事が少し不得意です。モーターを回したりLEDを点滅させたりした時に、少し引っ掛かりを体感した事がある人もいるかと思います。とはいってもmsオーダーの話なので、多くの場合あまり問題になる事はないでしょう。ところが、高速で走るミニ四駆の場合100msの間に25cmも進んでしまいます。チキンレースともなれば、これだけの距離のブレは致命的です。実際にobnizで**await()で時間設定**してミニ四駆を走らせてみたところ、全く同じ条件で走らせても停止位置は0～40cmの幅でブレました。

#■io.animation機能でブレが5cmへと大幅改善
そんな時、obnizの中の人から**1ms単位で正確にIOをコントロールできるio.animation**という機能を紹介していただきました。効果は絶大でした。下記は、壁の3m手前から走り出し1.5秒走行し停止させた時の停止位置(ミニ四駆鼻先～壁までの距離)のBefore/Afteの計測値です。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/84285bf0-3fa6-3813-c59d-ce6f43050d93.png)
#■io.animationとは
io.animationの機能の内容についてはobniz officialのDocument Page( https://obniz.io/ja/doc/sdk/doc/io )を参照下さい。下記のように正確なパルスを出力する事例も記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/d5c1cf4e-f636-8396-f227-4067f5fad2f9.png)

#■io.animationによるミニ四駆制御のサンプルコード
ミニ四駆のモーターを0/1番ピンに直刺し、画面の「1.5秒ダッシュ」buttonを押すと、**正確に指定された時間「 前進 → エンジンブレーキ → 停止 」**という動作を行うサンプルコードです。解説は割愛しますが、コード内のコメント及びofficial Documentから推測いただければと思います。
(io.animationにフォーカスするため、後述の動画の本番機の動作とは異なるコードです。)

```html
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@3.1.0/obniz.js" crossorigin="anonymous"></script>
  </head>
  <body>
    <div id="obniz-debug"></div>  
    TEST_animation<br><br>
    <button id="DASH">1.5秒ダッシュ</button>
<script>
var obniz = new Obniz("XXXX-XXXX");
obniz.onconnect = async function () {
   var motor  = obniz.wired("DCMotor",{forward:0, back:1} ) ;  
  
   $("#DASH").on('click',async function(){ await DASH(); })

   async function DASH(){
      obniz.io.animation("dash", "loop", [
         {
             duration:1500,           //Action-1：前進(80%のパワーで1.5秒正転)
             state:function(index){
                motor.power(80);                
                motor.forward();
             }
         },{
             duration: 400,           //Action-2：エンジンブレーキ(80%のパワーで400ms反転)
             state:function(index){
　              motor.power(80);               
                motor.reverse();
             }
         },{
             duration:1,              //Action-3：停止
             state: function(index){
                motor.stop();
             }
         }
      ],3)
   }

}
</script>
</body>
</html>
```
#■最後に実際のミニ四駆チキンレース車の走行をお楽しみください

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://twitter.com/hashtag/%E3%83%9F%E3%83%8B%E5%9B%9B%E9%A7%86?src=hash&amp;ref_src=twsrc%5Etfw">#ミニ四駆</a> <a href="https://twitter.com/hashtag/%E3%83%9F%E3%83%8B%E5%9B%9B%E9%A7%86%E3%83%81%E3%82%AD%E3%83%B3%E3%83%AC%E3%83%BC%E3%82%B9?src=hash&amp;ref_src=twsrc%5Etfw">#ミニ四駆チキンレース</a><br>Motorの回転時間の制御方式をawait obniz.wait()方式からio.animationという方式に変更したら、ダッシュの急停止位置のばらつきが46cm→5cmに劇的に改善。obniz/JavaScriptでも1ms単位の正確な制御が可能に。 <a href="https://t.co/NAH5zF6xaQ">pic.twitter.com/NAH5zF6xaQ</a></p>&mdash; Google Homer (@google_homer_) <a href="https://twitter.com/google_homer_/status/1149676321502449664?ref_src=twsrc%5Etfw">July 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://twitter.com/hashtag/%E3%83%9F%E3%83%8B%E5%9B%9B%E9%A7%86?src=hash&amp;ref_src=twsrc%5Etfw">#ミニ四駆</a> <a href="https://twitter.com/hashtag/%E3%83%9F%E3%83%8B%E5%9B%9B%E9%A7%86%E3%83%81%E3%82%AD%E3%83%B3%E3%83%AC%E3%83%BC%E3%83%88%E3%82%B9?src=hash&amp;ref_src=twsrc%5Etfw">#ミニ四駆チキンレートス</a><br>「私、失敗しないので」バージョン完成。<br>obniz Motor制御 io.animation方式、昨日のダッシュにフィニッシュの距離センサーショットを追加し完成。 <a href="https://t.co/0eOOBC2O59">pic.twitter.com/0eOOBC2O59</a></p>&mdash; Google Homer (@google_homer_) <a href="https://twitter.com/google_homer_/status/1149843008906338304?ref_src=twsrc%5Etfw">July 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#■最後に
走行が正確になったことで、タイヤにゴミが付着しブレーキで横滑りするようになるタイミングが明確にわかったり、バッテリーの電圧降下によるパワーダウンも敏感に見て取れるようになりました。IO時間の不確定要素が排除された事で、他の要因のより高度な追い込みができるようになりました。ちなみにio.animation機能を知ったのは、今年春にIoTLTの懇親会で開催されたミニ四駆チキンレースより後のことでした。(正確さで負けたのではなく、電源ストールだったのですが)次は優勝できるかもしれません。

あまりニーズのなさそうな内容ですみません。