2024年1月8日月曜日

知能ロボコン2024計画立案

昨年知能ロボットコンテストには「銀雲雀」というロボットで参加しましたが、これは一昨年(オンライン大会)からの継続でした。今年はROBO-剣のロボットを継続的に運用して完成度を上げるため、このロボットを改造してマスターズコースに出場しようと思います。テクニカルコースがマスターズコースに変わってからはまだ出たことがないので、初の挑戦になります。

どのようなロボットになるかはまだ見えませんが、最小の構成としては、ROBO-剣用の竹刀が固定されたアームの代わりに対象物を拾えるような形状のハンドをつけたアーム、ということになると思います。

また、前回ロボットがそうであったように、Maker Faire等のイベントでも見てもらえるようにしたいと思います。

今思いつくタスクを書き出してみます。

  • ハードウェア(電気)
    • 電源基板作り直し ※昨年CNC削り出しの配電基板が問題を起こしたため
    • 近距離障害物検知用のLidar設置 ※現状Realsenseのみで足元付近が死角になっているため
    • 4chDCモータードライバ回路の小型化 ※現状のFET選定や放熱設計はモーターに対してオーバースペックと思われるため
    • スピーカー回路 ※前回ボリュームが小さかったため
    • スタート・リトライの操作スイッチ
  • ハードウェア(機械)
    • 電池格納場所改善
    • 対象物を取るためのアーム
    • 車輪乗り上げ防止用スカート
  • ソフトウェア
    • (全般的に新規開発が必要)
    • ROS2

2024年1月7日日曜日

2024年活動計画

現在計画中の製作物としては次のものがあります。

  • ROBO-剣ロボットの改良
  • インタラクティブ・ペンプロッタの改良
  • 超音波浮揚実験装置の新バージョン
  • マイコン時計(仮)の続き

多くのプロジェクトがあるので、並行して計画的に進めていきたいと思います。

今年参加を検討しているイベントのスケジュールです。
この他にも増える可能性はあります。

2023年12月31日日曜日

2023年の活動 まとめ

2023年の製作物およびイベント参加のsummaryです。

1月〜 超音波浮揚の実験と製品化。スイッチサイエンス、Maker Faire Tokyo、BOOTH(12V電源版)で総計50台以上を販売。

3月 「こっしぇる!」出展。

5月 NT京都出展。クワッドコプター「銀雲雀」の自動制御システム。

6月 知能ロボットコンテスト参加。「銀雲雀」。チャレンジ技術賞受賞

https://www.youtube.com/live/rb7TOAqGzIQ?si=odGls4-7qg82keT9&t=12035

8月 インタラクティブ・ペンプロッタ。3目並べを実現。

10月 Maker Faire Tokyo出展。プレゼンテーションにも登壇。

11月 新ROBO-剣参加。ハードウェアを一通り完成、ソフトウェアは来年へ

11月 NT東京出展(小型クローラロボットと自動制御システム)

12月 マイコン時計の製作開始。進捗50%。来年へ。

2023年12月17日日曜日

マイコン時計(仮称)製作開始

前の記事と順番が前後しますが、マイコンを使った時計の製作を開始しました。詳細は未だ伏せておきますが、実用になるものを目指しています。

まずは、回転駆動部分を試作しました。240~1800rpm程度の回転速度で、できるだけ小さくしたいので自作しました。左は比較用のタミヤのミニモーター標準ギヤボックスです。

ATtiny204 フォトインタラプタの長周期パルス信号の周期計測

現在製作中のマイコン時計(仮)ではATtiny204を使用し、フォトインタラプタで駆動部の回転周期を計測する部分があります。この機能の実現のためにマイコンの周辺機能をいくつか組み合わせた事例として記録しておきます。

以下、21.のような数字および太字はATtiny204データシートの章番号と周辺機能の名前を指します。

概略


タイマー・カウンタBにインプットキャプチャ機能があるのでこれを使います。--> 21. 16-bit Timer/Counter Type B (TCB)

H8などではタイマーユニットへの外部入力は専用に割り当てられている端子がありますが、最近のAVRではイベントシステム( → 14. Event System (EVSYS))を介しての入力となります。 Figure 21-1. Timer/Counter Type B Block Diagramにも、入力がEvent Systemとあります。

更にフォトインタラプタのアナログ出力を直接つなげるように、アナログコンパレータを使います。 → 28. Analog Comparator (AC)

VREFとAnalog Comparatorの設定

  • 非反転(positive)入力: 入力ピン
  • 反転(negative)入力: 内部VREF
  • ヒステリシス: 50mV

アナログコンパレータは2つのアナログ信号の電圧を比較するものですが、今回は1本の入力を閾値で2値化したいだけなので、一方の入力に内部リファレンス電圧を使います。

18. Voltage Reference (VREF) CTRLAの「Bits 2:0 – DAC0REFSEL[2:0] AC0 Reference Select」について、「DAC」ですがこれは単独に使うD/Aではなくアナログコンパレータに接続されているD/Aということのようで、ここでNegative入力に使う電圧を選択できます。

  VREF.CTRLA = VREF_ADC0REFSEL_1V1_gc;

  // Positive input = AINP0, Negative input = voltage reference
  AC0.MUXCTRLA = AC_MUXNEG_1_bm;

  AC0.CTRLA = AC_HYSMODE_50mV_gc | AC_ENABLE_bm;

イベントシステムによるACとタイマーの接続

event channelにイベントソースを割り当て、userに提供するevent channelを選択するという2段階になっています。 参照: Figure 14-1. Block Diagram

アナログコンパレータの出力はasynchronous generatorになることができ、TCB0はasync userの0番として固定されています。

event channelとしてasynchronous channel の0番を使って接続するとこのようになります。

async channel 0 ← AC output
TCB0 ← async channel 0

EVSYS.ASYNCCH0 = EVSYS_ASYNCCH0_AC0_OUT_gc;
EVSYS.ASYNCUSER0 = EVSYS_ASYNCUSER0_ASYNCCH0_gc;  // TCB0

タイマーの設定

Figure 21-5. Input Capture Frequency Measurement

まずクロックソースを設定します。ここで時間分解能と計測可能な周期の最長が決まります。1秒間に10回程度の周期を想定しているので、最大で1秒程度の時間が計れれば良いでしょう。

TCB自体のプリスケーラでは2分周までしか設定できませんが、TCAと同じクロックソースを使うモードがあります。今回は周期の長い信号を計測したいので、これを使います。TCAのクロック分周器であれば、最大1024分周までがサポートされています。64分周とすると、0.0192ms分解能で約1.3秒まで計測できます。(periperal clock 3.33MHzの場合)

TCAの設定について(20. 16-bit Timer/Counter Type A (TCA))、16ビットタイマーを2個8ビットに分けて使うsplit modeと区別する意味で、「シングルモード」という指定になります。

TCA0.SINGLE.CTRLA = TCB_CLKSEL_DIV64_gc | TCA_ENABLE_bm;

TCAは他の機能はまだ使わず、カウンタを回すだけなのでこれだけです。

TCBの設定

TCB0.CTRLA = TCB_CLKSEL_CLKTCA_gc;
TCB0.CTRLB = TCB_CNTMODE_FRQ_gc;

以上で、TCB0.CCMPに周期が取得されるようになります。

2023年11月27日月曜日

第2回ROBO-剣参加

第2回ROBO-剣大会に参加しました。


成績は1回戦敗退でしたが、「人工知能ロボット賞」を受賞しました。若干期待値込みという感じもしますが、独立計数輪とIMUを使った自己位置推定に基づく制御を評価された結果だと思います。

ロボットについて

昨年からの続きでの製作ということになります。

昨年のTweetより:




昨年同時期に足回りの機構とドライバ回路、制御回路の設計と製作をしました。しかし大会に間に合わないと判断して断念、開発もそのまま中断していました。今年も3週間前の時点で何も進んでいない状態でしたが、とにかく参加してみないと始まらないと思ったので参加を決めました。集中して開発したおかげで一通りの機能が動くものができ、良かったと思います。

特徴としては、4輪の駆動輪(オムニホイール)に加えて、2輪の独立した計数輪(と、向き推定のためのIMU)を使用することにより多少タイヤがスリップしても安定して現在位置の推定ができるようになっています。計数輪は垂直にスライドする機構を付けてサスペンションとしています。



なお、大会参加の他のロボットはメカナムホイールを使っているものが多いのですが、移動の等方性や制御性がより良いと考えてオムニホイールを採用しました。将来的には移動と打撃を連動させることを考えているので、精度の良い移動が必要と考えてこのような設計をしました。

アーム部分は以前のロボット「逡巡」から流用しました。変更点として、上腕のひねり軸を無くしました。これは、2つの理由があります。この軸はもともと「相手のガードを回り込む」ために存在していたものですが、今回は車体全体で移動と旋回ができるため必要性が薄くなること。それから、「肩」の上には面、下には胴が付くという位置関係があるため、上腕より下腕を長くすると、腕を目一杯畳んだときにちょうど胴と面を正面だけガードできることです。

筐体はスペーサーで板を留めて積み上げる構造としました。スペーサーの間に嵌まる形で外装板を取り付けます。本体有効打突部位以外は無彩色にするという規定ができたので、黒で塗装しました。


大会前日夜に回路トラブル(動力電源ショートによる配電盤の破損)で突然動かなくなるという事態も起きましたが、幸い主要な回路に損傷はなく復帰させることができました。

プログラムの方は一応動き回れるところまでは作ったものの、時間が足りなくなったために相手の検出が作られておらず、固定アーム型の時と同じ「面」の位置を検出するだけのプログラムで動作を行っていました。「面」は小さいので検出距離も長く取れず、やはり相手の位置をそれとして独立に検出する必要があることがわかりました。
試合では、相手に向かっていくことができないままそっぽを向いたところで打たれて負けました。

次回大会は来年の同じ時期を予定、また7月にプレ大会を行うというアナウンスがありました。これらに向けて開発を継続していきたいと思います。

2023年8月6日日曜日

音響浮揚装置の実験

今年はじめ頃から、超音波を使って物体を浮かせ、能動的に動かす実験を行いました。





原理

定常波(定在波)

原理は、複数音源からの音波の干渉により音の強弱の勾配を作ると、弱い部分に物体が吸い寄せられるというものです。

今回の実験装置は、向かい合わせて配置した2個の超音波スピーカーで強弱の分布を作り出します。

これは高校物理で学ぶ「定常波」で一部説明されます。向かい合う2方向から同じ周波数と振幅の進行波(音波など)を送ると、2音源からの距離の差によって、常に強め合う場所と弱め合う場所が交互に現れ、その位置は時間変化しないという現象です。高校物理では反射波によるものが主に説明に使われていますが、それを能動的な音源で置き換えた形になります。

定常波についてはWikipedia:Standing_waveにアニメーション付きで解説されており、これを見るとイメージが掴みやすいでしょう。

軸に直交する方向の保持力

前節で「一部」と言ったのは、2音源間の直線上(以下、縦方向とします)のみ考慮したものだからです。細長いパイプ内に音を流すような場合はこれで良いのですが、今回の装置のような開放されている形状の場合、重力に逆らうだけでなく横方向に保持する復元力もなければ浮揚を維持できません。この横方向(音源を結ぶ線に対して直交する方向)については別途解析が必要です。

今回製作した装置では、縦方向より弱いながらも横方向にも復元力を示すことが確認できました。これは設計時には考えていなかったことでした。一つの可能性としては、使用した超音波スピーカーの発音部分が送信方向に開いたコーン状なため、TinyLevのようにお椀型に音源を配置したときと同じような効果が出ているのではないかと予想しています。

既存製品と制作動機

このような上下1対の超音波スピーカーによる装置は、市販品も既にあります。AmazonやAliExpressなどでultrasonic levitator等と検索すると、安いものでは1000円程度の完成品が見つかります。しかしそれらの商品説明やユーザーレビューを見る限り、浮かせた物体を能動的に動かす機能のついたものはないようでした。

前述の原理から考えると、2つの音源の位相差を変えれば定常波の節と腹の位置が移動し、物体を動かすこともできるはずだと思いつきました。これを確かめてみたかったので自作することとしました。

制作過程

1. 原理の確認

まず超音波を双方のスピーカーから出して、物体が浮くことを確認しました。

これは最初に作った装置です。超音波スピーカーを固定する部品を3Dプリンタで作り、間隔を変えられるようにしました。電子回路はブレッドボード上にHブリッジドライバIC(TB6612FNG)とSTM32 Nucleoのマイコン基板で組みました。

ここでTB6612は、主にDCブラシモーターの駆動に使われているものです。製品説明にも「Dual DC モータドライバ」と書かれています。スイッチング素子の働きによって電源を出力端子に適宜接続し、信号によって正逆両方の電圧を掛けるというHブリッジ回路ですので、超音波スピーカーの駆動にも使えます。そして、2回路入っているので2つのスピーカーを独立して駆動することができます。単に浮かせるだけで良ければドライバ1回路に2個のスピーカーを並列接続しても良いのですが、先を見越してこのようにしました。

浮かせた物体は納豆の容器から切り出した4mm角ぐらいの発泡ポリスチレン板です。
定常波の節と節のピッチ≒吸い寄せられるスポットの縦幅は波長の半分となります。使用したスピーカーに合わせて40kHzの超音波を使うので、音速を3.4×10^2[m/s]とすると4.3mmぐらいです。これに比べて十分小さいサイズである必要があります。

2.位相差の変更による移動

次に、2音源の位相差を変えて物体を動かすことに成功しました。

ついでに、ブレッドボード上に組んでいた回路をユニバーサル基板に組み直しました。

また、地面(土台)からの反射波が保持力を低下させる悪影響を及ぼしていると考えて、隙間を空けました。



3.プリント基板化


小型化のためにプリント基板を作成しました。回路設計も何箇所か変更しました。

Hブリッジドライバ

ICをTB6612FNGから78H660に変更しました。どちらもデュアルHブリッジドライバですが、サポートされる入力信号の形式に違いがあります。スピーカー1個あたり前者はPWM信号が2本必要なところ、後者はPWM信号1本でも今回必要な動作が可能となるため、後者に変更しました。

MCU

MCUとしてATtiny85を使用しました。これはなるべくコストを抑えるためです。Hブリッジドライバの変更により合計2本のPWM信号を出すだけで良くなったので、これで十分と考えました。
後にATtiny85が入手しづらくなり、また新しい世代のモデルを採用したほうが良いだろうということで、ATtiny202に変更して新バージョンを作りました。ATtiny202を使うのは初めてだったため、念のためブレッドボードを使用した仮組み回路で検証を行ってから新バージョンの基板を発注しました。
ファームウェアのソースコードはGitHubで公開してあります。

電源回路

今回使用した超音波スピーカーでは必要な出力を得るのに12V程度の電源が必要となります。最初の試作では12VのAC/DCアダプタを使っていました。持ち運びを考えるとこれは使いづらいものです(例: Li-ion電池の場合3セル直列が必要)。ノートPCやモバイル充電器を使って供給できるように、USBコネクタから5Vの電源を取って動作するように変更しました。超音波スピーカー駆動のための電源としてはST662(チャージポンプ型DC-DCコンバータ)で12Vの電圧を作ります。

スピーカーの位置

最初作った基板では、基板面での反射の影響を小さくするためと考えてスピーカーを基板の角に配置していました。しかし、音源の位相差と連動して物体の保持位置が横方向(基板の短手方向)にずれる現象が起こりました。中心軸から大きくずれる箇所では横に滑り落ちるような形で落下しやすくなり、望ましくありません。そこで、今度は基板短辺の中央に配置し、左右対称な形としてみました。後者の方が保持位置の中心軸からのずれが小さくなったため、これを採用しました。

製品化

ATtiny85を使った初期バージョンは3月にチバラボで行われたイベント「こっしぇる」で販売しました。今後改良版をMaker Faire等のイベントで販売予定です。

第4回新ROBO-剣参加

11/16に行われた 第4回新ROBO-剣 に参加しました。ロボットは去年と同じ「 逡巡 」です。 結果は 本戦トーナメント 2勝1敗、 敗者トーナメント (本戦で早めに負けたチームによる別リーグ)第2位でした。新ルールでは、今回初めて有効な攻撃で勝利を挙げることができました。勝...