自動はんだ付けロボットアーム
コンポーネントと消耗品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
イントロ
このプロジェクトのアイデアは、ロボットアームのさまざまな機能を探していたときに偶然思い浮かびましたが、この使用分野(自動溶接およびはんだ付けロボットアーム)をカバーしている人が数人いることがわかりました。
実際、私は以前に同様のプロジェクトを構築した経験がありましたが、今回のプロジェクトは非常に有用で効果的でした。
形を決める前に、特に業界分野で多くのアプリケーションやその他のプロジェクトを見ましたが、オープンソースプロジェクトは、適切で適切な形を見つけるのに大いに役立ちました。
それは私たちの脳の視覚的摂食の背後にある科学のおかげです。
ステップ1:設計
最初は、その複雑さのために実装できなかった多くの専門的なプロジェクトを見ました。
その後、他のプロジェクトからインスピレーションを得て自分の製品を作ることにしました。そこで、Google Sketch up 2017proを使用しました。次の図に示すように、各パーツは特定の順序で並べて組み立てられるように設計されています。
組み立てる前に、部品をテストして適切なはんだごてを選択する必要がありました。これは、仮想仕上げプロジェクトをガイドとして描くことで実現しました。
これらの図は、実際の仕上げの実物大の形状と、適切なはんだごてを選択するための各部品の正しい寸法を示しています。
ステップ2:操作とインストール
仕事中に私はそれについて発表しなければならないいくつかの障害に直面しました。
1。 アームが重すぎて小さなステッピングモーターで保持できなかったため、次のバージョンまたはレーザーカットプリントでこれを修正しました。
<図>
2。 モデルはプラスチック素材でできているため、回転ベースの摩擦が大きく、動きがスムーズではありませんでした。
最初の解決策は、重量と摩擦に耐えることができるより大きなステッピングモーターを購入することでした。そして、より大きなステッピングモーターに合うようにベースを再設計しました。
実際、問題は解決せず、モーターが大きくなっても問題は解決しませんでした。これは、横にある2つのプラスチック面の間の摩擦でポットをパーセントで調整できないためです。最大回転位置は、ドライバーが提供できる最大電流ではありません。ポットを回しながら電圧を測定する、メーカーが示す手法を使用する必要があります。
それから、ベースのデザインを完全に変更し、ギア機構を備えたメタルギアを備えたサーボモーターを配置することにしました。
3。 電圧
<図>
Arduinoボードには、DC電源ジャック(7〜12V)、USBコネクタ(5V)、またはボードのVINピン(7〜12V)のいずれかから電力を供給することができます。 5Vまたは3.3Vピンを介して電圧を供給すると、レギュレーターがバイパスされるため、PCまたは任意の電源から5ボルトをサポートする特別なUSBケーブルを購入することにしました。
そのため、ステッピングモーターとその他のコンポーネントは、わずか5ボルトで適切に動作し、ステップダウンモジュールを修正する問題から部品を保護します。
降圧モジュールは降圧コンバーター(降圧コンバーター)はDC-DC電力コンバーターであり、入力(電源)から出力(負荷)への電圧を(電流をステップアップしながら)降圧し、安定性を維持しますまたは電圧。
ステップ3:変更
<図> <図>
いくつかの変更を加えた後、アームのサイズを小さくしてモデルのデザインを変更し、図のようにサーボモーターギアに適した穴を開けました。
また、サーボモーターのテストでは、トルクが高いためにメカニズムがより重い負荷を処理できるため、ウェイトを180度正しく回転させることができました。サーボ機構が出力できる回転力は、供給電圧、シャフト速度などの設計要素によって異なります。
また、I2cを使用すると、2つのピンしか使用せず、同じ2つのピンに複数のi2cデバイスを配置できるので便利です。たとえば、最大8つのLCDバックパックとLCDをすべて2つのピンに配置できます。悪いニュースは、「ハードウェア」i2cピンを使用する必要があることです。
ステップ4:はんだごてホルダーまたはグリッパー
<図>
グリッパーは、はんだごての重量に耐えるために金属歯車サーボモーターを使用して固定されました。
servo.attach(9、1000、2000); servo.write(constrain(angle、10、160));
最初は、モーターの揺れと振動という障害がありましたが、天使を拘束するトリッキーなコードが見つかりました。
すべてのサーボが完全に180度回転するわけではないからです。多くはそうではありません。
そこで、機械的な限界がどこにあるかを判断するためのテストを作成しました。サーボ.writeの代わりにservo.writeマイクロ秒を使用します。ベース範囲として1000〜2000を使用できるため、これがより気に入っています。そして、多くのサーボは、600から2400までのその範囲外をサポートします。
そこで、さまざまな値を試して、制限に達したことを示す話題がどこにあるかを確認しました。次に、書くときだけそれらの制限内にとどまります。これらの制限は、servo.attach(pin、min、max)
を使用するときに設定できます。真の動きの範囲を見つけて、コードがエンドストップを超えてプッシュしようとしないことを確認してください。これには、constraint()Arduino関数が役立ちます。
ステップ5:コーディング
<図>
ライブラリ環境を使用するArduinoは、ほとんどのプログラミングプラットフォームと同様に、ライブラリを使用して拡張できます。ライブラリは、スケッチで使用するための追加機能を提供します。ハードウェアの操作またはデータの操作。スケッチでライブラリを使用するには。
#include AccelStepper.h#include MultiStepper.h#include Servo.h#include Wire.h #include LiquidCrystal_I2C.h
<図>
コード
- ステッパーXYZコード
ステッパーXYZコード Arduino
#include "AccelStepper.h" // AccelStepper SetupAccelStepper stepperX(1、2、3); // 1 =EasyDriverインターフェイス// EasyDriverのSTEPピンに接続されたUNOピン2 // EasyDriverのDIRピンに接続されたUNOピン3AccelStepper stepperZ(1、5、6); // 1 =EasyDriverインターフェイス// EasyDriverのSTEPピンに接続されたUNOピン5 // EasyDriverのDIRピンに接続されたUNOピン6AccelStepperstepperY(7、8、9); // 1 =EasyDriverインターフェイス// EasyDriverのSTEPピンに接続されたUNOピン5 // EasyDriverのDIRピンに接続されたUNOピン6 // Stepper Travel Variableslong TravelX; // Serial MonitorlongTravelZに入力されたX値を格納するために使用されます。 // Serial MonitorlongTravelYに入力されたZ値を格納するために使用されます。 //シリアルモニターに入力されたY値を格納するために使用されますintmove_finished =1; //移動が完了したかどうかを確認するために使用されますvoidsetup(){Serial.begin(9600); // 9600ボーの速度でシリアルモニターを開始します//開始時にシリアルモニターで指示を印刷しますSerial.println( "コンマで区切られた移動距離を入力してください:X、Z"); Serial.print( "Enter Move Values Now:"); //各ステッパーの最大速度と加速度を設定stepperX.setMaxSpeed(500.0); // X軸の最大速度を設定stepperX.setAcceleration(500.0); // X軸の加速stepperZ.setMaxSpeed(250.0); //回転のZ軸の最大速度を遅く設定しますstepperZ.setAcceleration(250.0); // Z軸の加速stepperY.setMaxSpeed(250.0); //回転のY軸の最大速度を遅く設定しますstepperY.setAcceleration(250.0); // Y軸の加速} void loop(){while(Serial.available()> 0){//シリアルバッファで値が使用可能かどうかを確認move_finished =0; //ステッパーの移動をチェックするための変数を設定しますTravelX =Serial.parseInt(); //バッファからの最初の数値をTravelX変数Serial.print(TravelX);に入れます。 Serial.print( "X Travel、"); TravelZ =Serial.parseInt(); //バッファから2番目の数値をTravelZ変数Serial.print(TravelZ);に入れます。 Serial.print( "Z Travel、"); TravelY =Serial.parseInt(); //バッファから2番目の数値をTravelY変数Serial.print(TravelY);に入れます。 Serial.println( "Yトラベル"); stepperX.moveTo(TravelX); // Xステッパーの新しい移動位置を設定しますstepperZ.moveTo(TravelZ); // Zステッパーの新しい移動位置を設定しますstepperY.moveTo(TravelY); // Zステッパーの新しい移動位置を設定delay(1000); //ステッパーを移動する前に1秒待ちますSerial.print( "ステッパーを所定の位置に移動しています..."); } //ステッパーが目的の位置に到達したかどうかを確認if((stepperX.distanceToGo()!=0)||(stepperZ.distanceToGo()!=0)||(stepperY.distanceToGo()!=0)){stepperX 。走る(); // Stepper Xを位置stepperZ.run();に移動します//ステッパーZを位置stepperY.run();に移動します//ステッパーyを所定の位置に移動します} //移動が完了したら、シリアルモニターにメッセージを表示しますif((move_finished ==0)&&(stepperX.distanceToGo()==0)&&(stepperZ.distanceToGo()==0)&&(stepperY.distanceToGo()==0)){Serial.println( "COMPLETED!"); Serial.println( ""); Serial.println( "次の移動値を入力(リセットの場合は0,0,0):"); //新しいシリアルモニター値の準備をしますmove_finished =1; //移動変数をリセットします}}
回路図
製造プロセス