Arduino-Web経由のコントロールアームロボット
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
このプロジェクトについて
初心者の方は、次のチュートリアルを読むことをお勧めします。
- Arduino-モーター
- Arduino-サーボモーター
- Arduino-Wifi
1.デモンストレーション
2.ユーザーインターフェース <図> <図>
ロボットアームには6つのモーターがあります。
- ゾーンA:制御モーター2、3、4(3つの手関節を制御)
- ゾーンB:制御モーター1(制御ベース)
- ゾーンC:制御モーター5(グリッパーの回転を制御)
- ゾーンD:コントロールモーター6(コントロールグリッパー)
3.システムアーキテクチャ <図>
4.作業フロー
クライアント側 (Webユーザーインターフェイス-JavaScript + HTML + CSSで記述)
ユーザーが指に触れたりスイープしたり(またはマウスをクリックまたは移動)すると、座標(x、y)を取得できます。作業フローは次のとおりです。
<図>ゾーンAの場合、モーター2、3、4の角度を計算するには、いくつかの 幾何学的計算を実行する必要があります。 。このページの最後で参照できます。
サーバー側 (Arduinoコード):
クライアントから一連の角度を受け取ると、6つのモーターが現在の角度から新しい角度に徐々に移動します。 6つのモーターが移動し、同時に新しい角度に到達する必要があります。すべてのモーターを制御する方法を詳しく説明する前に、単一のモーターを制御する方法を見てみましょう。モーターを現在の角度(angle)から新しい角度(new_angle)に移動するとします。モーターの速度が速いので、 減速する必要があります。 そのためには、モーターが新しい角度に達するまで、次の2つの手順を繰り返します。
- 小さなステップでモーターを動かします。
- 少し間を置いてから、次のステップに進みます。
次の図は、新しい角度が現在の角度よりも大きい場合の上記のスキームを示しています。
<図>
Wherestep_numisモーターが実行する必要のあるステップ数。 ステップと時間
は事前定義された値です。後の2つが、速度と滑らかさを決定します。 上記は1台のロボットのみです。ロボットの移動と目的地への到達を同時に開始するには、次のようにします。6つのモーターが同じ step_num 、ただし step
各モーターのは互いに異なります。したがって、 step_num を選択する必要があります このプロジェクトでは最大です。
一般的に、Arduinoの作業フローは次のとおりです。
<図>
5.幾何学的計算
ロボットアームの計算を次のジオメトリの問題にしましょう:
<図>既知
- Cは修正されました
- 既知のポイント-Dはユーザーからの入力です
- 既知のポイント-CB、BA、AD(それぞれb、a、dで示されます)
- 各アームセグメントの長さ検索: 角度C、B、A 解決策:
- 角度BとAが同じであると仮定します
- ポイントとセグメントを追加します
計算
- 点CとDを知っていた=> DCの長さを計算できる(cで示される)
- δを計算することもできます
- 三角形のABEを見ると、AE =BEおよび∠E=π-2αであると推測できます。
- だから:
- 三角形CDEの余弦定理:
- (1)と(2)を(3)に変更すると、次のようになります。
簡略化
- 上記を簡略化してください:
- a、b、c、dがわかっているので、上記の2次方程式を解くと、αの値を計算できます。 -そしてβ=π–α-これまでβを見つけましたが、γを見つけましょう-三角形BDCとBDAの余弦定理:
- この一連の方程式を解くと、γを計算できます。
- したがって、必要な角度は(δ+γ)、β、およびβです。これらはそれぞれモーター2、3、4の角度です。
6.ソースコード
ソースコードには2つのファイルが含まれています:
- RobotArmWeb.ino :Arduinoコード
- Remote_arm.php :PHPoC WiFiShieldまたはPHPoCShieldにアップロードされるWebアプリコード。 (この記事の説明を参照してください。)
また、画像ファイルflywheel.pngをPHPoCシールドにアップロードする必要があります。
<図>
初心者のための最高のArduinoスターターキット
Arduinoキットをお探しの場合は、初心者向けの最高のArduinoキットをご覧ください
関数リファレンス
- Arduino-サーボライブラリ
- Servo.attach()
- Servo.write()
- Servo.writeMicroseconds()
- Servo.read()
- Servo.attached()
- Servo.detach()
- Serial.begin()
- Serial.println()
コード
- RobotArmWeb
- remote_arm.php
RobotArmWeb Arduino
これはArduinoコードです#include#include int angle_init [] ={90、101、165、153、90、120}; //モーターがまっすぐ立っているとき。ウェブでは、モーターがまっすぐ立っているときの角度は{0、90、130、180、0、0}; int angle_offset [] ={0、11、-15、-27、0、137}; //実際のサーボモーターとwebintの角度の間のオフセットcur_angles [] ={90、101、165、153、90、120}; // 6つのモーターの現在の角度(度)int dest_angles [] ={0、0、0、0、0、0}; //宛先anglesintangle_max [] ={180、180、160、120、180、137}; int angle_min [] ={0、0、0、20、0、75}; int direction [] ={1、1 、1、1、1、-1}; int angleSteps [] ={3、2、2、2、4、4}; //各モーターの移動ステップ(度)サーボサーボ1;サーボサーボ2;サーボサーボ3;サーボサーボ4;サーボサーボ5;サーボサーボ6;サーボサーボ[6] ={サーボ1、サーボ2、サーボ3、サーボ4、サーボ5、サーボ6}; PhpocServerサーバー(80); PhpocClient client; int stepNum =0; void setup(){Serial.begin(9600); Phpoc.begin(PF_LOG_SPI | PF_LOG_NET); server.beginWebSocket( "remote_arm"); Servo1.attach(2); //ピン2のサーボをサーボオブジェクトservo2.attach(3);に接続します。 //ピン3のサーボをサーボオブジェクトservo3.attach(4);に接続します。 //ピン4のサーボをサーボオブジェクトservo4.attach(5);に接続します。 //ピン5のサーボをサーボオブジェクトservo5.attach(6);に接続します。 //ピン6のサーボをサーボオブジェクトservo6.attach(7);に接続します。 //ピン7のサーボをサーボオブジェクトに接続しますfor(int i =0; i <6; i ++)servo [i] .write(angle_init [i]);} void loop(){PhpocClient client =server.available (); if(client){String angleStr =client.readLine(); if(angleStr){Serial.println(angleStr); intcommaPos1 =-1; intcommaPos2; for(int i =0; i <5; i ++){commaPos2 =angleStr.indexOf( '、'、commaPos1 + 1); int angle =angleStr.substring(commaPos1 + 1、commaPos2).toInt(); dest_angles [i] =角度*方向[i] +角度オフセット[i]; combaPos1 =combaPos2; } int angle5 =angleStr.substring(commaPos1 + 1).toInt(); dest_angles [5] =angle5 * direction [5] + angle_offset [5]; stepNum =0; //モーターをスムーズに動かすために、モーターを多くの小さなステップで動かし、モーターが突然動くのを防ぎます。以下は、(int i =0; i <6; i ++){int dif =abs(cur_angles [i] --dest_angles [i]);のステップ計算です。 int step =dif / angleSteps [i]; if(stepNum 0){for(int i =0; i <6; i ++){int angleStepMove =(dest_angles [i] --cur_angles [i])/ stepNum; cur_angles [i] + =angleStepMove; if(cur_angles [i]> angle_max [i])cur_angles [i] =angle_max [i]; else if(cur_angles [i] remote_arm.php PHP
このコードはウェブアプリです。<!DOCTYPEhtml>Arduino-Arm Robot-Web Arduino-Web経由でアームロボットを制御
WebSocket: null
回路図
6つのモーターに外部電源を提供する必要があります 製造プロセス