工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

KITtyBot

コンポーネントと消耗品

>
SparkFun Arduino Pro Mini 328-5V / 16MHz
× 1
サーボ(Tower Pro MG996R)
同じフォームファクタのSG-90または9gサーボ
× 12
Adafruit UBEC DC / DCステップダウン(バック)コンバーター- 5V @ 3A出力
× 1
Adafruitミニリモコン
もちろん、どのリモコンでも使用できます。これはたまたまIRLibライブラリとうまく連携していました
× 1
Adafruit IR(赤外線)レシーバーセンサー-TSOP38238
× 1
抵抗1kオーム
× 1
抵抗2.2kオーム
× 1
7.4 V / 500 mAhLiPoバッテリー
R / C趣味向けのほぼこの容量のバッテリーで十分です
× 1

必要なツールとマシン

>
3Dプリンター(汎用)
はんだごて(汎用)
ブレッドボードのデザインははんだ付けなしでも機能する可能性があります

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

はじめに

私は、通常の「クモ」や「昆虫」よりも「哺乳類」のスタイルで、歩く4本足のロボットをやりたかったのです。インスピレーションは、有名なボストンダイナミクスロボットと他の4本足の研究ロボットから来ています。このようなロボットを作ることは、重心が高く、足が角に広がるのではなく、体の下にあるために転倒しやすいため、非常に困難です。

目的は、Arduinoと低コストのマイクロサーボを使用して、安価なロボットを構築することでした。もちろん、このソリューションには制限があります。完璧であるとは期待できませんが、この映画で説明されているように、歩行動作を実行できるロボットをいくつか構築することができました。そして、非常に少ない予算で最善を尽くすことはそれ自体が課題であり、多額の資金提供を受けた研究プロジェクトの人が直面する必要はないかもしれません。 :)

それを正しくするためには、逆運動学(IK)の研究が必要であることが早期に特定されました。このコードには、目的の足の動きに基づいて関節角度を計算するための一連の方程式が含まれています。これらはさらに、体の動き(4フィートすべてを反対方向に動かす)や完全な足の動き(上に持ち上げて指定された方向に動かして再び下に置く)などの定期的なタスクの機能で使用できます。

>

次の課題は、歩行の研究を行うことです。つまり、ロボットが体と足の動きの観点からどのように歩き、向きを変えるかを定義することです。私のロボットは常に静的に安定した歩行を使用しています。一度に片方の足を持ち上げて、新しい位置に置きます。体は他の3つの足の上に置かれ、重心を転倒しないようにするには、これらの足が形成する三脚内に留まらなければなりません。私は4つの標準的な歩き方を開発しました-前進、後進、左、右。これは次に、足と体の動きの機能を利用して、完全なシーケンスに結合されます。

また、同期サーボ動作の機能も設計しました。場合によっては、いくつかのサーボが設定された時間内に異なるストロークを作成します。スムーズな動きを実現するには、これを同期させる必要があります。

最後になりましたが、私は完全に保護されていないLiPoバッテリーを使用しています。これは危険な場合があります。主な危険は、それを速くまたは深く放電することです。最初の危険は、誤って短絡されない限り回避されます。通常のR / Cバッテリーの放電率は25Cで、この場合は12 Aになります。UBECは、どのような状況でも2Aを超えることを防ぎます。 2番目の危険は、ソフトウェアの監視機能によって防止されます。電圧はアナログピンの1つで測定され、7.0 Vを下回ると、ロボットは停止します。

そして最後に、バッテリーは専用の充電器で充電し、通常の注意を払って取り扱う必要があり、充電を放置しないでください。バッテリーはロボットから取り外し(ベルクロを使用して取り付けます)、防火バッグ内で、または少なくとも可燃物から安全な距離を置いて充電し、火災を封じ込めて延焼しないようにする必要があります。また、バッテリーは安全に保管してください。

LiPoバッテリーに慣れていない場合は、地元のR / Cホビーショップに相談し、適切な充電器と、場合によっては充電と保管用の耐火バッグ/コンテナーと一緒にバッテリーを購入してください。これらのアイテムはしばしば警告サインでいっぱいです。それらをやり直し、あなた自身の良い判断を使用してください。 :)

ロボットの構築

付属のファイルに従ってパーツを印刷します。時間をかけて写真を見て、作業を開始する前に部品の組み立て方法を理解してください。私はスカンジナビア人ですが、この命令はIKEAやLEGOの命令のレベルからはほど遠いです:)

股関節は最初に組み立てる必要があります。パーツの接合には良質の両面テープを使用しました。それらは接着することもできますが、壊れた部品を修理する必要がある場合、それらを分解することは不可能です。1つの壊れたサーボは完全なジョイントの交換につながります。

サーボサポートを1つのサーボの下部に、作動軸に沿って配置します。次に、軸が垂直になるように別のサーボを結合します。下の写真は、右前と左後の股関節を示しています。他の2つのコーナーについては、ミラージョイントを作成する必要があります。

先に進む前に、12個のサーボすべてが中央に配置されていることを確認することをお勧めします。最良の方法は、PCB(またはブレッドボード、以下を参照)を組み立て、すべてのサーボを接続してコードをロードすることです。 Arduinoを起動すると、すべてのサーボが中央に配置されます(コマンド信号は90度)。ロボットを組み立てたら、後で中心位置を微調整する必要があります。

次のステップは、脚アセンブリの「上肢」である太ももと呼ばれる部分を取り付けることです。この部分には、通常サーボと一緒に供給されるサーボホーンと一緒にフィットするくぼみがあります。ホーンをくぼみに接着します。 3Dプリント素材とホーンを構成するナイロンプラスチックを接合するために機能する接着剤を必ず使用してください。私が使用した接着剤銃はうまく機能しましたが、CA接着剤である程度の成功を収めました(一部のブランドは機能しますが、他のブランドは機能しません)。

太ももは60度の角度で股関節に結合されています。サーボが中央に配置されているときに、この角度にできるだけ近い位置を見つけるようにしてください。付属のネジ(多くの場合、サーボに付属している3つのうち短い方)を使用して、ホーンをサーボスプラインに固定します。以下は、組み立てられた太ももとヒップの2つの写真です。わかりやすくするためにサーボホーンは含まれていません(または、私の側からの怠惰からモデル化されたことはありません)。

脚の下部も組み立てる必要があります。この場合、サーボはネジを使用して脚部分に取り付けられます。サーボに付属のネジがあります(多くの場合、2本の長い「木」ネジ)。

これで、脚を体に組み立てることができます。ロボットの前後に「バンパー」と呼ばれる2つのパーツがあります(車のバンパーのように)。太もも部分と同じようにサーボホーン用のくぼみがあります。それらに角を接着します。次に、上肢のサーボサポートを本体の対応する穴にスライドさせます。これを両側で行うと、アセンブリをバンパーで固定できます。脚が約12度(脚から20 mmのつま先)を指すようにします。残りの(長い)サーボネジを使用して、バンパーをボディに固定します。

ついにロボットの下脚を取り付けることができます。それらは太ももの反対方向に角度を付け、足の先端が各脚アセンブリの股関節の真下になるようにする必要があります。

これにより、ロボットが組み立てられます。下の写真のようになります。ロボットのデザインは、上の画像やフィルムクリップと比べてわずかに変更されていることに注意してください。ボディを一新し、より堅牢なデザインに仕​​上げました。股関節のサーボサポートとホーンの位置が入れ替わっています。したがって、3D画像に従って組み立て、写真やフィルムクリップと混同しないようにしてください。

もちろん、各ジョイントの角度を正確に必要な角度にすることはできません。SG-90サーボのスプラインの数は21であり、2つの位置の間で17度の角度になります。ロボットはせいぜい10〜20度以内で組み立てることができます。残りのエラーは、コードの中立位置を変更して調整する必要があります。この手順の詳細を参照してください。もう一度すべてのサーボを接続してArduinoを起動し、ニュートラル位置を確認し、必要に応じていくつかの機械的調整(ジョイントをスプラインまたは2つ移動)を行うことをお勧めします。サーボを操作するときに誤ってサーボを回す傾向があります。

電子機器の接続

2つのオプションがあります。すべてを1つのブレッドボードに配置するか、提供されたフリッツファイルを使用してPCBを作成します。すべての電源ラインとアースラインをサーボに接続するときに注意しないと、ブレッドボードの電圧に問題が発生する可能性があります。極端な場合、1つのサーボが600 mAを消費する可能性があり、接続が不十分な場合、動作が不安定になります。 PCBには電力線用の非常に広い銅トレースがあるため、適切にはんだ付けすれば問題なく動作します。

私のデザインには電源スイッチがありません。バッテリーを接続するだけでロボットの電源を入れたり切ったりできます。追加する場合は、バッテリーコネクタの後に、ArduinoとUBECの両方への7.4V電源を切断する必要があります。

ブレッドボードバージョン

Pro Mini、サーボ用のコネクタ、およびその他のほとんどの電子機器を1つのハーフサイズのブレッドボードに配置することができます。下の写真に回路図を描きます。特にサーボへの5V電源およびアース接続には、必ず短いジャンパー線を使用してください。サーボコネクタは、3つに切断され、ブレッドボードに押し込まれる非常に長いオスのヘッダーです。

写真に写っていないのはバッテリーとUBECです。バッテリーにコネクターフィッティングを取り付けるために、これを固定するためのはんだ付けがあるかもしれません。 Pro Mini(RAWおよびGNDに接続)に給電するには、コネクタから2本のジャンパー線をブレッドボードの下部の「電源レール」に接続する必要があります。また、7.4V電源からA0ピンに2つの抵抗を接続します。 2.2kはプラス側から、1kは地面からです。これにより、フルバッテリーで8 Vを超える電圧が、アナログピンで測定できる5V未満の値に分割されます。

UBECの出力側にはサーボコネクタが付いています。上部の「パワーレール」に2つのオスヘッダーを追加すると非常に便利です。写真のように真ん中のどこかに置いて、サーボへの配電が可能な限りバランスが取れていることを確認してください。

IRレシーバーはA1に接続し、5V電源を備えている必要があります。レシーバーのピンは、ブレッドボードの穴に直接取り付けるのに十分な長さです。

下の回路図と完成したブレッドボードがどのように見えるかについての写真があります。写真は、ピン配置と接続が異なる古いバージョンのロボットを示していることに注意してください。それでも、ジャンパー線とサーボコネクタを接続する方法についてのアイデアが得られます。

ブレッドボードは、粘着性のある裏側で本体に取り付けられています。ピンD3、D4、およびD5に接続されたサーボのあるコーナー(回路図の右上)がロボットの前/左コーナーになるように向きを変え、ボードがボディの中央にあることを確認します(重力は不可欠です。

PCBバージョン

以下にFritzingファイルを追加しました。これは、Fritzingで利用可能なサービスから注文するか、PCB製造用のファイルをエクスポートすることにより、PCBを製造するために使用できます。以下のアセンブリを示すために、一連の写真を作成しました。 PCBは、すべてのサーボ、IR、および電圧測定へのコネクタを備えたこのロボット用にカスタムメイドされています。ただし、残りのピンから外れたコネクタもあります。将来ロボットを拡張したい場合は、これらを使用して他の機器を接続できます。

本体にはPCBの角にフィットする小さな「パッド」があります。また、ここでは、D3からD5へのコネクタのあるコーナーが前面/左側にある必要があります。 PCBには取り付け穴がありますが、取り付けには本体に両面テープを使用しただけです。そのまま残ります。

バッテリー

バッテリーはベルクロで下側に取り付けられています。本体には専用の平面があります。 7.4V / 500mAh LiPoバッテリーは、通常、約55x30x10 mm(数mmのギブまたはテイク)のフォームファクターを備えており、この場所に非常によく適合します。

最後に、歩行中にサーボワイヤーがつまずかないように、サーボワイヤーを素敵な束にストラップで固定することで、ロボットを「修正」することができます。また、サーボワイヤの山ではなく、実際に4本足の生き物が歩き回っているような見栄えがロボットに与えられます。 :)

ファイナライズ

ロボットを使用する前に、中心位置を微調整する必要があります。これは、コード内の配列servodeg0を編集することによって行われます:

  const floatservodeg0 [12] ={90、90、90、90、90、90、90、90、90、90、90、90};  

値は、アルファ、ベータガンマ、フロント/左、リア/左、フロント/右、リア/右の順になっています。したがって、右前のベータは、アレイまたはservodeg0 [7]の8番目の位置です(アレイの番号付けは0から始まります)。

サーボの回転方向を定義するservodirと呼ばれる配列もあります。

  const intservodir [12] ={+ 1、+ 1、-1、-1、-1、+ 1、-1、-1、-1、+ 1、+ 1、+ 1}; //回転方向(正は反時計回りにサーボ) 

私が使用したサーボは、反時計回りに0度から180度まで移動します。私はどこかでサーボが反対方向に進んでいることを読みました。このような場合、配列servodirの符号をずっと変更する必要があります。

Arduinoを起動し、すべてのサーボの角度を確認します。対策を講じて、すべてがまっすぐで対称に見えるようにします。距離と角度は下の写真に従ってください。

各測定で正確なミリメートル以内にすることは困難であり、cm以内にすることは合理的です。必要な変更を確認し、それらをアレイservodeg0の値に加算/減算します。これは、すべてが正しくなる前に、間違いなく数回の反復を必要とします。このようなservodeg0配列(私のロボットの1つからの実際のコード)で終わります。そして最も重要なのは、最終的には4フィートすべてに乗って、まっすぐに立つロボットを用意することです。

  const floatservodeg0 [12] ={80、95、100、100、110、90、100、115、100、80、80、100};  

これですべてが終了しました。お楽しみください!

途中でいくつかのヒントがあります。

しばらくすると、サーボの再校正が必要になる場合があります。中心位置は時間の経過とともにドリフトする可能性があります。すべてが時々調整されているかどうかを確認してください。

すべてを正しく行っても、転倒するロボットがある場合は、重心を確認してください。これのバランスをとるためにバッテリーを動かすことができます。これは、ベルクロを使用することの良い点の1つです。

そしてもう一度。 LiPoバッテリーは慎重に扱ってください。

さらなる改善

ここに私のロボットを提出することで、機能を追加したり、わずかに異なるレイアウト(より大きく、より小さく、より涼しげに見える)を行ったりして、デザインを洗練するように人々を招待します。コードは、わずかに異なるレイアウトまたはサイズのロボットで再利用できる必要があります。以下のスケッチは、コード内のさまざまな定数を示しています。異なる測定値のロボットが作成された場合でも、すべてのIKおよび移動機能は機能するはずです。また、座標が定義されていること、xが順方向を指していることも示しています。

そしてもちろん、ロボットに機能を追加していただければ面白いと思います。リモコンには、機能を与えることができるいくつかのボタンがあります(ボタンが押された場合、ダンスをしたり、他の一連の動きをしたりしないでください)。

私は個人的にアナログ入力を試しています。また、「歩きながら曲がる」歩行でロボットをある程度操縦したり、ジャイロやコンパスを使ってコースのずれを修正したりしました。また、超音波センサーと自律動作(障害物を回避)も追加しました。私の現在のプロジェクトは、アナログ制御と自律制御を組み合わせて、すべてをスマートフォンから制御することです。これにより、私は多くの新しいこと(Blynk、ESP6822、デバイス間のシリアル通信など)について学ぶ必要があり、ロボットの洗練されたバージョンを起動できることを願っています(または、より優れたスキルを持つ誰かがそのことで私を打ち負かします):)

コード

  • KITtyBot2のコード
KITtyBot2 Arduino のコード
ArduinoMiniにアップロード
 / * KITtyBot2のIR制御バージョン。ArduinoProMiniと私が設計したPCBボードを使用します(フリッティングスケッチKittybotmini.fzz)これは以前のロボットKITtyBotとKITtyBotminiを使用したものに基づいていますロボットを制御するためのIRリモコンNEC(Adafruit)リモコンとIRLib2ライブラリを使用します。https://github.com/cyborg5/IRLib2を参照してください。リポジトリからIRLib2ライブラリをダウンロードし、指示に従ってインストールします。一般的な寸法は元のKITtyBotと似ていますが、ガンマ軸とアルファ軸の間に12 mmの変位があります(サーボが互いに重なり合っています)。私は歩き方と回転の歩き方を継続的に調整しましたが、これまでのところ、最も安定した動作が与えられます。スタファンエック2017によって作成* /#include  #include  #include  //最初にデコードベースを含める#include  //現在のプロトコルのみを含めるusing#define MY_PROTOCOL NEC // IR制御(NEC)を定義します。 //サーボの量Servoservo [servonum]; //サーボオブジェクトを作成しますconstfloatservodeg0 [12] ={90、90、90、90、90、90、90、90、90、90、90、90}; //公称90度から調整されたサーボの中立位置(これらの値を調整するには、キャリブレーションが必要です)floatservodegnew [servonum]; //必要なサーボ位置(度単位)serbodegold [servonum]; //古い(または現在の)サーボ位置//以下の値をKITtyBot miniconst intservodir [12] ={+ 1、+ 1、-1、-1、-1、+ 1、-1、-1に更新します-1、+ 1、+ 1、+ 1}; //回転方向(正はサーボ反時計回り)const float pi =3.1416; const float alfa0 =pi / 6; //アルファのニュートラル位置(30度)const float beta0 =pi / 3; //ベータのニュートラル位置(60度)const floatjointlength =50; //脚の部分の長さ(両方とも同じ長さ)const float width =120; //幅(y方向の足の間の距離、toeout0を追加)const float leng =120; //長さ(x方向のフィート間の距離)const float distag =12; //アルファとガンマ軸の間の距離constfloat toeout0 =20; //ガンマサーボ中心からの足の外側の距離(足が外側を向いている距離)const float leglength0 =2 * Jointlength * cos(alfa0); const float gamma0 =asin(toeout0 /(leglength0 + distag)); //ガンマの中立位置(トーアウト20 mm、タグ解除12 mmによる)const float bodyradius =sqrt(pow((width / 2)、2)+ pow((leng / 2)、2)); //対角線の長さ(中心から足の角までの距離)const float phi0 =atan(width / leng); //ボディ半径とx(前向き)軸の角度const float height0 =sqrt(pow(leglength0 + distag、2)-pow(toeout0、2)); //ロボットの通常の高さ(角度や距離を変更する場合は更新する必要があります)float leglength [4] ={sqrt(pow(height0、2)+ pow(toeout0、2))、sqrt(pow(height0、 2)+ pow(toeout0、2))、sqrt(pow(height0、2)+ pow(toeout0、2))、sqrt(pow(height0、2)+ pow(toeout0、2))}; //開始値leglengthunsigned long timestep =500; //各シーケンスにかかる時間(servomove()を使用する場合)int steplength =40; //歩行中のx方向のステップの長さ(順方向および逆方向のクリープ)float phi =20; //回転中の回転角度(ラジアンではなく度単位!)// movementfloatfootposの変数[12]; //足の位置、順序LeftFrontxyz、LeftRearxyz、RightFrontxyz、RightRearxyzfloat stepturn [12] ={0、0、0、0、0、0、0、0、0、0、0、0}; //ターンの場合の足の動き//足の位置はそれぞれの開始位置で調整されますconstfloatjointangle0 [12] ={alfa0、beta0、0、alfa0、beta0、0、alfa0、beta0、0、alfa0、beta0、 0};フロートジョイントアングル[12]; //角度のベクトルを使用して、LeftFrontAlfaBetaGammaなどを注文しますconst int Voltagepin =A0; //電圧測定に割り当てられたピンlowvolt =0; //電圧が7.0未満の場合にロボットを停止する変数Vintmode =0; //現在の順序付き歩行モード; forward、reverse、left、rightvoid setup(){Serial.begin(9600); Serial.println( "KITtyBot mini"); //これらの行は構成を確認するためのものです。削除できます。 Serial.print( "Gamma0:"); Serial.println(gamma0); Serial.print( "Leglength0:"); Serial.println(leglength0); Serial.print( "Bodyradius:"); Serial.println(bodyradius); Serial.print( "Phi0:"); Serial.println(phi0); Serial.print( "Height0:"); Serial.println(height0);サーボ[0] .attach(3);サーボ[1] .attach(4);サーボ[2] .attach(5);サーボ[3] .attach(6);サーボ[4] .attach(7);サーボ[5] .attach(8);サーボ[6] .attach(2);サーボ[7] .attach(A3);サーボ[8] .attach(12);サーボ[9] .attach(11);サーボ[10] .attach(10);サーボ[11] .attach(9); for(int i =0; i  2 *ジョイント長)lresult =2 *ジョイント長; //レッグレングスが可能な値よりも長い場合、次の関数の一部が不安定になりますreturn lresult;} float legright(float dx、float dz、float gamma){float lresult =sqrt(pow(leglength0-(dz / cos(gamma0 --gamma))、 2)+ pow(dx、2)); if(lresult> 2 *ジョイント長)lresult =2 *ジョイント長; //脚の長さが可能な場合よりも長い場合、次の関数の一部が不安定になりますreturn lresult;} //ベータ、「膝関節」float beta(float leg){float bresult =2 * acos(leg /(2 * jointlength)); return bresult;} // Alfa、もう一方のヒップサーボフロートalfafront(float dx、float beta、float leg){float aresult =(beta / 2)-asin(dx / leg); return aresult;} float alfarear(float dx、float beta、float leg){float aresult =(beta / 2)+ asin(dx / leg); return aresult;} //回転角度f(度単位)に基づいて足の位置を指定します。 Stepturnは、footpos値をvoid turnpos(float f){stepturn [0] =bodyradius * cos(phi0 +(f * pi / 180))-leng / 2にするために使用されます。 stepturn [1] =bodyradius * sin(phi0 +(f * pi / 180))-幅/ 2; stepturn [3] =bodyradius * cos(pi --phi0 +(f * pi / 180))+ leng / 2; stepturn [4] =bodyradius * sin(pi --phi0 +(f * pi / 180))-幅/ 2; stepturn [6] =bodyradius * cos(2 * pi --phi0 +(f * pi / 180))-leng / 2; stepturn [7] =bodyradius * sin(2 * pi --phi0 +(f * pi / 180))+ width / 2; stepturn [9] =bodyradius * cos(pi + phi0 +(f * pi / 180))+ leng / 2; stepturn [10] =bodyradius * sin(pi + phi0 +(f * pi / 180))+ width / 2;} //上記の機能の関節角度に基づいてサーボ位置(度単位)を計算しますvoidservopos(){for( int i =0; i <12; i ++){servodegnew [i] =servodeg0 [i] + servodir [i] *(jointangle [i] --jointangle0 [i])* 180 / pi; }} //制御され同期された動きのためのサーボアルゴリズム。すべてのサーボは、タイムステップの終了時に終了位置に到達する必要がありますvoidservomove(){intservotimeold [servonum]; //最後のサーボ位置の時間のローカル変数intservotimenew [servonum]; //サーボが配置された現在の時刻のローカル変数intSERVOPULSE [servonum]; //サーボドライバに書き込むローカル変数floatservodeg [servonum]; //現在のサーボ位置のローカル変数floatservodegspeed [servonum]; //ミリ秒あたりの必要なサーボ速度の低下のローカル変数unsignedlong starttime =millis(); //アルゴリズムの開始にタイムスタンプunsignedlong timenow =starttime; //今すぐ時間をリセットするfor(int i =0; i  

カスタムパーツとエンクロージャー

The body of the robot. Carries the PCB and battery.At each end of body, like bumper on a car. You should have two of these.Supports the hip joint. Print four of theseThe upper limb of leg. Print four.The lower limb (or foot). Print four.All parts put together. Not for printing.

回路図

This is a Fritzing file to allow PCB production. Use it to order from Fritzing themselves or export to a suitable format an manufacture elsewhere. kittybotmini_XKZYltyQVJ.fzz

製造プロセス

  1. Raspberry Pi2上のWindows10 IoT Core –Adafruitセンサーデータ
  2. Adafruit 1/460リングネオピクセルを使用したシンプルな掛け時計
  3. UnifiedWater v1
  4. 組み立てられた復讐者:アイアンマンヘルメット&アークリアクター
  5. モバイル投票ボックス
  6. Intel Arduino 101 BLEBlynkタンク
  7. Arduino101 / tinyTILE BLE:マッチメイキングサングラス
  8. モグラたたき(ボタン版)
  9. モダンジュークボックス
  10. Arduino Apple Watch
  11. すべての礼儀正しいドライバーに感謝します