PC制御のロボットアーム
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 4 |
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
私は常に、最新の製造技術と、材料の持ち上げ、部品の取り付けと収集、溶接と切断、そして最後に倉庫での使いやすさなど、製造のさまざまな分野でこれらの機械が果たす重要な役割を賞賛してきました。
このロボットアームを構築した私の経験は挑戦でした。そこで、まずは2016年にfortzeroasが設計したシンプルなロボットアームを選び、いつものように手で操作しないことにしたので、「C#Windows Application」で自動化アプリを作成し、自動化アプリを製造しているように見せました。
そのため、プログラミングスキルの経験に従って、この自動化アプリケーションを作成して、ロボットアームを完全に制御し、その動きを監視し、さまざまなタスクを実行できるようにしました。
ステップ1:材料 <図> <図>
主な素材はMDF材で、構造は2mm、ベースは4mmを使用しました。
ブループリントは最後のステップでダウンロードできます。パターンを印刷してから、MDFに直接接着する必要があります。
輪郭に沿ってカットし、穴を開けます。回転工具を使って木をドリルでカットしました。ベースには設計図はありませんが、即興で作成できると思います。
ステップ2:ペイントとスタイリング <図> <図>
プロジェクトに魅力的な外観を与えるために、同じ青写真を使用し、Photoshopを使用してカバーをデザインし、リアルに見えるデカールと幾何学的形状を作成し、白い接着剤を使用して木に接着しました。
ステップ3:フレームの組み立て <図> <図>
このロボットアームは、すべてが事前に計画されていたため、組み立てが簡単でした。サーボモーターをネジで固定するだけで、作業中に微調整を行いました。
次に、右側と左側を取り付けるために、太い木の棒を使用し、長いネジの状態で瞬間接着剤を使用して接着し、重量を減らしました。
ステップ4:グリッパー(ピンチメカニズム) <図> <図>
ペンチで2本の金属棒を曲げてから、回転工具ドリルを使用して厚さ3 mmの木片の内側にホールを開け、瞬間接着剤で接着します。
ステップ5:ベースを作成する <図> <図>
ベースは厚さ4mmのMDF木材でできており、丸のこ盤で約17cm * 10cmの正方形に切り、ホールをドリルしてベースサーボモーター9gを取り付けます。ベースとシリンダーの摩擦を減らすために、高さ2.5cm、直径10cmの丈夫なダンボール缶の一部をカットし、それをドリルしてサーボモーターシャフトを取り付けます。
ステップ6:電子機器 <図> <図>
Arduinoで3つ以上のサーボを使用する場合は、それらに外部電源を使用する必要があります。このプロジェクトでは、 3つを使用しました。 マイクロサーボ9gおよび 1つ 大きなサーボモーター。
もちろん、最初のデモンストレーションテストは、サーボをシミュレートして電気回路をテストするために、tinkercad.comで仮想化されました。
したがって、この場合、6vに相当する単3電池4本を使用し、ブレッドボードのテストセットアップを行い、その後、Arduinonano用の非常にシンプルな拡張ドックを作成しました。
ステップ7:Arduinoコード
1. Arduino IDEの最新バージョンをダウンロードしてインストールします。Windows、Linux、またはMAC OSXの最新バージョンは、ArduinoのWebサイト(https://www.arduino.cc/en/main/software
)で見つけることができます。2.ArduinoボードをUSBポートに接続します。
3. [ツール]> [ボード]に移動し、ボードを選択します。
4.コードをコピーしてIDEエディタに貼り付けます。
5.(✔)アイコンボタンをクリックしてコードを確認します。
6.(➤)アイコンボタンをクリックして、コードをボードにアップロードします。
ステップ8:自動化アプリケーション <図> <図> <図> <図> <図>
実際、これはPCを使用してArduinoプロジェクトを自動化することです。私の意見では、ボードやその他のプロジェクトを制御する機能を将来改善する方法を学ぶのに良いスタートでした。
固定角度の位置に到達するのは簡単ではなかったので、最初は「Processing3」という名前のサードパーティアプリケーションを使用してこの問題を解決しました。
初期段階では、ロボットアームサーボ(ベース、ショルダー、エルボー、グリッパー)をキーボードでシミュレートし、事前に準備した固定位置に到達するまで「角度ごと」に別々に移動する、サポートされているインターフェイスを作成しました。
次に、準備された位置に到達したときに、これらの4つの角度をコードの配列(A、B、C、D)に記録します。その後、これらのマルチ配列をWindowsアプリケーションで使用しました。これは、各サーボモーターは、それぞれの場所で角度を付けます。
これらの収集された制限は、ARMを制御下に置き、再生機能をサポートするためのガイドラインとしてユーザーインターフェイスのサイドバーに配置しました。
したがって、このアプリケーションを使用すると、次のようにロボットアームを制御、記録、監視できます。
1。モーションコントロール:
このロボットアームを制御するムードは2つあります。最初は、
などのスパスティックサーボを制御するトラックバーをドラッグして手動で操作します。- グリッパー:開閉ボタンをクリックして、ロボットグリッパーを開閉します。
- ベース:トラッキングバーを左右にドラッグするか、キーボードの矢印(右/左)を使用してベースを左右に移動します。
- 肩:トラッキングバーを左右にドラッグするか、キーボードの矢印(上下)を使用して肩を上下に移動します。
- エルボー:トラッキングバーを左右にドラッグするか、キーボードキー(w / s)を使用してエルボーモーターを上下に動かします。
2。モーションレコード:
ロボットアームの動きを自動化したい場合は、「位置の調整」ボタンをクリックするか、キーボードの(R)を押して、すべてのステップで位置を記録する必要があります。その後、アプリケーションがそれを処理します。
すべてのステップで、アプリケーションがモーターの移動位置を検出したことを記録し、リスト内に個別に保存します。
[自動ムードの開始]ボタンをクリックすると、アプリケーションはそれらの保存された位置をシーケンス順序の形式で送信します。
3。監視:
グラフのすべてのステップを描画するグラフィカルインターフェイスを作成して、異常な変更が発生する可能性があることにユーザーが気付くようにしました。同時に、右側にデータの表があり、特定の角度とその移動の正確な時間を示しています。
したがって、これらの機能を使用することで、製造の自動化とまったく同じように、独自の動きを作成し、それをタスクとしてロボットアームに送信できます。
ステップ9:更新
2018年8月:
<図> <図>
最近、3 mm MDFを使用してレーザー切断機にいくつかの変更を加えた後、同じデザインを作成しました。実際、この追加のアイデアは、特にカスタムジョイスティックを追加したときにクールでした。
コード
- Task.ino
- RobotArm.ino
Task.ino Arduino
int delayT =350; void Home()//アームをホームポジションに設定する場合は、この関数を呼び出します{MyServo0.write(valGripper); //グリッパーdelay(15); MyServo.write(valBase); //ベースdelay(30); MyServo2.write(valShoulder); //ショルダー遅延(30); MyServo3.write(valElbow); //エルボーdelay(delayT); } void Pick()//これは固定されたピック場所です。 {MyServo.write(4); //ベースdelay(delayT); MyServo3.write(125); //エルボーMyServo2.write(95); //ショルダーdelay(delayT); MyServo0.write(50); //グリッパーオープンワイドdelay(delayT); MyServo0.write(2); //グリッパーclosedelay(delayT); MyServo2.write(60); //少し肩を上げるMyServo3.write(80); //少し遅れて肘を上げる(delayT); Serial.println( "選択されたオブジェクト"); } void Drop()//これは固定されたドロップ場所です。 {MyServo.write(145); //ベースdelay(delayT); MyServo2.write(80); //ショルダー遅延(15); MyServo3.write(115); //エルボーdelay(delayT); MyServo0.write(40); //グリッパーオープンワイドdelay(delayT); MyServo3.write(90); //少し遅れて肘を上げる(delayT); Serial.println(F( "Object Dropped")); } voidPlayback(){// https://arduino.stackexchange.com/questions/1013/how-do-i-split-an-incoming-string //入力は配列でなければなりません(servoId:Position&servoId:Position& ServoId:Position)//文字列フレーズ; //フレーズ=String(phrase + ByteReceived); // char入力をstirngに変換して分割できます//各コマンドペアを読み取りますchar * command =strtok(ByteReceived、 "&"); while(command!=0){//コマンドを2つの値に分割しますchar * Sepather =strchr(command、 ':'); if(separator!=0){//実際に文字列を2に分割します: ':'を0に置き換えます* Separator =0; intservoId =atoi(コマンド); ++セパレータ; int angle =atoi(separator); // servoIdとangleを使って何かをするif(servoId =1){MyServo.write(angle); delay(delayT); } else if(servoId =2){MyServo2.write(angle); delay(delayT); } else if(servoId =3){MyServo3.write(angle); delay(delayT); }} //入力文字列で次のコマンドを検索しますcommand =strtok(0、 "&"); }}
RobotArm.ino Arduino
//作成者AhmedAzouz#includeServo MyServo、MyServo2、MyServo3、MyServo0; char ByteReceived; int MyPosition、MyPosition2、MyPosition3、MyPositionG; int runCounter =0; int ledPin =A5; //設定デフォルトのホームサーボ位置intvalGripper =30; int valBase =70; int valShoulder =25; int valElbow =150; void setup(){Serial.begin(9600); pinMode(ledPin、OUTPUT); digitalWrite(13、LOW); MyServo0.attach(12); //グリッパーアタッチMyServo.attach(11); //ベースアタッチMyServo2.attach(13); //ショルダーアタッチMyServo3.attach(10); //エルボーアタッチ//起動位置を設定MyServo0.write(valGripper); //グリッパーdelay(15); MyServo.write(valBase); //ベースdelay(30); MyServo2.write(valShoulder); //ショルダー遅延(30); MyServo3.write(valElbow); // elbow delay(300);} void loop(){Serial.print( "Base:"); Serial.print(valBase); Serial.print( "\ t"); Serial.print( "Shou:"); Serial.print(valShoulder); Serial.print( "\ t"); Serial.print( "エルボー:"); Serial.print(valElbow); Serial.print( "\ t"); Serial.print( "グリップ:"); Serial.println(valGripper); //if(Serial.available())// Byte =Serial.read(); //読み取り// {while(Serial.available()> 0){ByteReceived =Serial.read(); switch(ByteReceived){// ************* LEDケース 'n':digitalWrite(ledPin、HIGH); // LEDをオンに切り替えますSerial.println( "LEDがオンになっています");壊す;ケース 'f':digitalWrite(ledPin、LOW); // LEDをオフに切り替えますSerial.println( "LED is off");壊す; // *************ベースケース 'l':MyPosition =MyServo.read()+ 2; //ベースを左に移動するためのLMyServo.write(MyPosition); Serial.print( "Base"); Serial.print( "\ t"); Serial.println(MyServo.read()); delay(15);壊す;ケース 'r':MyPosition =MyServo.read()-2; //ベースを右に移動するためのRMyServo.write(MyPosition); Serial.print( "Base"); Serial.print( "\ t"); Serial.println(MyServo.read()); delay(15);壊す; // *************エルボーケース 'u':MyPosition2 =MyServo2.read()+ 2; //肘を上に移動するためのUMyServo2.write(MyPosition2); Serial.print( "Elbow"); Serial.print( "\ t"); Serial.println(MyServo2.read()); delay(15);壊す;ケース 'd':MyPosition2 =MyServo2.read()-2; //肘を下に移動するためのDMyServo2.write(MyPosition2); Serial.print( "Elbow"); Serial.print( "\ t"); Serial.println(MyServo2.read()); delay(15);壊す; // *************ショルダーケース 'w':MyPosition3 =MyServo3.read()+ 2; //肩を下に移動するためのWMyServo3.write(MyPosition3); Serial.print( "Shoulder"); Serial.print( "\ t"); Serial.println(MyServo3.read()); delay(15);壊す;ケース 's':MyPosition3 =MyServo3.read()-2; //肩を上に移動するためのSMyServo3.write(MyPosition3); Serial.print( "Shoulder"); Serial.print( "\ t"); Serial.println(MyServo3.read()); delay(15);壊す; // *************グリッパーケース 'o':MyServo0.write(30); // Gripperを開くにはOSerial.print( "Gripper Open"); Serial.print( "\ t"); Serial.println(MyServo0.read()); delay(15);壊す; case'c ':// CでGripper MyServo0.write(1);を開きます。 Serial.print( "グリッパーを閉じる"); Serial.print( "\ t"); Serial.println(MyServo0.read()); delay(15);壊す; // *************デフォルトのドロップ位置(クイックドロップ位置)case'q ':digitalWrite(ledPin、HIGH); Serial.println( "デフォルトでドロップがアクティブになりました!");選ぶ();落とす();家(); digitalWrite(ledPin、LOW);壊す; // *************強制停止してホームポジションに戻るcase'h ':Home(); digitalWrite(ledPin、LOW);壊す; // *************自動ムード実行再生機能//シリアル読み取り次の形式である必要があります:1:90&2:80&3:180 //ピックアップ場所は固定されており、この機能はドロップを自動化しますポジション。デフォルト:digitalWrite(ledPin、HIGH); Serial.println( "自動ムードがアクティブになりました!");選ぶ();再生();家(); digitalWrite(ledPin、LOW);壊す; }}}
カスタムパーツとエンクロージャー
f98t2axin238k2n_khGWAEIqdl.skp 回路図
製造プロセス