LoginSignup
7

More than 3 years have passed since last update.

posted at

Organization

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

■io.animationとは

io.animationの機能の内容についてはobniz officialのDocument Page( https://obniz.io/ja/doc/sdk/doc/io )を参照下さい。下記のように正確なパルスを出力する事例も記載されています。
image.png

■io.animationによるミニ四駆制御のサンプルコード

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

<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>

■最後に実際のミニ四駆チキンレース車の走行をお楽しみください

■最後に

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7