タンク-Arduinoのロボット

Arduinoに基づいてロボットをプログラミングします。

まず、役に立つすべてのものの理論と説明から始めましょう。



画像



Arduinoはハードウェアコンピューティングプラットフォームであり、その主なコンポーネントは単純な入力/出力ボードであり、処理/配線言語の開発環境であることを思い出させてください。 ハードウェアおよびソフトウェアコードのドキュメントは「コピーレフト」ライセンスの下で公開されていますが、開発者は、「Arduino」という名前は公式製品の商標であり、許可なく派生物に使用しないことを望んでいます。 Arduinoという名前の使用に関する文書は、プロジェクトがすべての来訪者に開かれていることを強調しています。



最近まで、ロボットの作成は非常に難しい手順と見なされていたため、高度な資格を持つ開発者と特別な教育、および長い開発時間が必要でした。 しかし、Arduinoボードの登場により、プログラミングに少しでも精通しているほとんどの人がこのアクティビティを購入できるようになりました! どこも簡単ではありませんが、最初に最初のものがあります。





Arduinoボードは、Atmel AVRマイクロコントローラーと、プログラミングおよび他の回路との統合のための要素配線で構成されています。 各ボードには、リニア電圧レギュレーター5 Vおよび16 MHz水晶発振器が必要です。 ローダーは事前にマイクロコントローラーにフラッシュされるため、外部プログラマーは不要です。



Arduinoプロジェクトは常に進化しており、多くの修正が加えられています。 現在、10バージョンのボードが利用可能ですが、特にこのプロジェクトでは、Arduino Diecimilaボードが使用されました。 それは小さな電子ボードで、そのコアはATmega168マイクロコントローラーです。 ボードには、14個のデジタル入力/出力があり、そのうち6個はPWMモードで動作します(したがって、モーターなどのアナログデバイスを制御し、バイナリデータを送信します)、6個のアナログ入力、16 MHzクロック、電源コネクタ、USB、 ICSPポート(デジタルデバイスのシリアルインターフェイスのようなもの)、いくつかの制御LED、リセットボタン。 これは、ボードをコンピューターのUSBポートに接続し、必要なソフトウェア(ドライバーと開発環境)をインストールしてプログラミングを開始するのに十分です。



画像

Arduino Diecimilaボードの外観。



簡単な仕様



マイクロコントローラー:ATmega168

動作電圧:5V

入力電圧(推奨):7-12 V

入力電圧(制限):6-20 V

デジタルI / Oポート:14ポート(そのうち6つはPWM信号付き)

アナログ入力ポート:6ポート

ポート電流:40 mA

3.3Vソースの電流:50mA

EEPROM(フラッシュメモリ):16 KB(うち2 KBはブートローダーによって使用されます)

RAM(SRAM):1 Kb

ROM(EEPROM):512バイト

クロック周波数:16 MHz



ロボットを作るには何が必要ですか?



多くの愛好家が行うように、ロボットを組み立てることができますが、既存のロボットをリサイクルすることは可能です。 ロボットとしては、可動部品のあるおもちゃが適しています。 私の場合は、内蔵モーターで動くトラックを備えた戦車です(戦車にはリモコンがありました)。 これらは、ボードの助けを借りて制御するモーターです。



もちろん、重要な段階は、Arduinoボードの1つを自由に使用できるようにすることです。 私の場合、これはArduino Diecimilaボードです。 また、ボードをコンピューターに接続するには、AB規格の任意の長さのUSBケーブルが必要です。 このケーブルを介して、コンピューターとマイクロコントローラーの間でデータが交換され、ボードへの電源も供給されます。 外部電源はオプションです。 モーターを制御するために必要な別のコンポーネントは、MotorShield拡張ボードです。



画像

MotorShield拡張ボードとパーツキット。



画像

MotorShieldへの接続方法と接続方法。



次に、目標を決定する必要があります。既存のおもちゃのタンクにリモコンを取り付ける必要がありますが、通常の「クリックした場所-私はそこに行った」ではなく、架空のフィールドでタンクに座標が送信され、独立してそれらに到達するものです。 つまり 部屋(またはタンクが移動する他のエリア)は、座標系である正方形に分割されることを想像する必要があります。 次に、タンクは正方形の座標を送信する必要があり、この正方形になるために必要な距離を駆動しなければなりません。



画像

マザーボード付きのおもちゃのタンク。



画像

マザーボードは明らかにArduinoよりも大きいです:)。



モーターを備えたタンク、ボード、拡張ボードがあります。 座標を送信するにはツールが必要です。 これは、Wi-Fi接続を介してこのデータをタンクに転送するユーザーのコンピューター上のプログラムです。 Wi-Fiはボードに対して明確ではないため、タンクには通常のマザーボード(後でラップトップに置き換えられます)があり、Wi-FiアダプターからArduinoボードと通信するCOMポートにデータを送信します。 それから、信号が拡張ボードにすでに到着し、モーターが回転する必要があります。 タスクは2つのプログラムを作成することです。1つはコンピューターからWi-Fiアダプターにデータを転送するためのもので、もう1つはマイクロコントローラー内でデータを処理するためのものです。



画像



さあ、行こう!



何でもCOMポートを介してPCとマイクロコントローラー間のデータ交換を行うプログラムを作成できます。 Delphiにしましょう。



簡潔にするために、目的の角度/距離への旋回と移動を担当するチームをタンクに送信する機能にのみソースコードを提供します。 この関数は、現在の座標(x0、y0)、新しい座標(x1、y1)、およびタンクアルファの現在の回転角を受け入れます。 関数は新しい現在の角度を返します。 現在の座標と角度は、関数の外部に保存されます。 コードは適切な場所でコメント化されているため、説明しません。



Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  1. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  2. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  3. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  4. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  5. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  6. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  7. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  8. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  9. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  10. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  11. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  12. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  13. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  14. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  15. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  16. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  17. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  18. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  19. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  20. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  21. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  22. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  23. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  24. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  25. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  26. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  27. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  28. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  29. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  30. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  31. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  32. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  33. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  34. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  35. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  36. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  37. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  38. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  39. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  40. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











  41. Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;











Copy Source | Copy HTML Function MoveTank(x0, y0, x1, y1, alpha: integer ): integer ; var newAlpha: integer ; // FlagsField : byte; // angle_tmp: integer ; TmpStr: string; angle, dist: byte; // , begin // newAlpha := Round(ArcTan(Abs((x0-x1)/(y0-y1)))); // angle_tmp := (360 + newAlpha - alpha) mod 360; // dist := Round(10*Sqrt(Sqr(x0-x1) + Sqr(y0-y1))); FlagsField := 0; // if angle_tmp <= 90 then FlagsField := 0 // , else if angle_tmp < 180 then begin angle_tmp := 180 - angle_tmp; FlagsField := FlagsField or 4; // , end else if angle_tmp < 270 then begin angle_tmp := angle_tmp - 180; FlagsField := FlagsField or 6; // , end else begin angle_tmp := angle_tmp - 270; FlagsField := FlagsField or 2; //, end ; angle := angle_tmp; // COM- , . FlagsField:= FlagsField or 1; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(angle); ComPort_. Write (TmpStr); FlagsField:= FlagsField and 254; // TmpStr := Chr(FlagsField); ComPort_. Write (TmpStr); TmpStr := Chr(dist); ComPort_. Write (TmpStr); Result := newAlpha; end ;















次のステップは、ボードにフラッシュするためのプログラムを作成することです。 必要なのは、シリアルポートからデータを受信し、受信したコマンドを処理して、タンクモーターの回転を正しい方向にオンにすることだけです。 モーターは一定時間オンになり、この時間の長さは必要な距離に移動します



データを受信するプログラムは、ピン番号9(TxD)を使用します。 したがって、マザーボードのCOMポートの2番目の接点(RxD)は、Arduinoのピン9に接続する必要があります。 別の要件:マザーボードのCOMポートを9600ボーの速度で構成する必要があります。



タンクの動きを制御するには、2つのモーターを使用します-左右のトラック(モーターシールドのコネクターM1およびM2)に使用します。 モーターでの作業を簡素化するために、AFMotorフレームワークを使用します。このフレームワークは、「#include」AFMotor.h」という1行でプロジェクトに簡単に接続できます。 モーターは、左のトラックに1、右のトラックに2の数字で示されています。 以下のコードは、モーターでの作業は大したことではないことを示しています。



Copy Source | Copy HTML



  1. #include "AFMotor.h" //エンジンの取り扱いを容易にするライブラリ
  2. #define TX 9 // COMポートからの出力が接続されているArduinoのピン
  3. //ジョイスティックからコマンドをエンコードします
  4. #define cmdForward 1
  5. #define cmdBackward 2
  6. #define cmdRapid Left 3
  7. #define cmdRapid Right 4
  8. #define cmd 5
  9. #define cmd Right 6
  10. //エンジン回転数
  11. // MaxSpeed-通常の動き
  12. // MinSpeed-急旋回時のトラックの1つの速度
  13. // HalfSpeed-スムーズに曲がるトラックの1つの速度
  14. #define MaxSpeed 200
  15. #define MinSpeed 100
  16. #define HalfSpeed 150
  17. // LTSおよびRTSの左右のトラックの速度に応じたタンクの動き
  18. //方向の方向
  19. void MoveTank( バイトLTS、バイトRTS、バイト方向 );
  20. // COMポートから1バイトを読み取ります
  21. バイトCOMread();
  22. // COMポートから受信したコマンドを保存します
  23. バイトコマンド = 0 ;
  24. //現在の移動方向
  25. バイト現在の方向 =前方;
  26. //エンジンが接続されているモーターシールドの1番目と2番目のコネクタを選択します
  27. AF_DCMotor トラック( 1、MOTOR12_1KHZ );
  28. AF_DCMotor トラック( 2、MOTOR12_1KHZ );
  29. ボイド設定()
  30. {
  31. Track.setSpeed( MaxSpeed );
  32. Track.setSpeed( MaxSpeed );
  33. pinMode( TX、INPUT );
  34. }
  35. ボイドループ()
  36. {
  37. コマンド = COMread();
  38. スイッチ( コマンド
  39. {
  40. case cmdForward:
  41. MoveTank( MaxSpeed、MaxSpeed、FORWARD );
  42. 現在の方向 =前方;
  43. 休憩;
  44. case cmdBackward:
  45. MoveTank( MaxSpeed、MaxSpeed、BACKWARD );
  46. 現在の方向 =後方;
  47. 休憩;
  48. case cmdRapid Left
  49. MoveTank( MinSpeed、MaxSpeed、CurrentDirection );
  50. 休憩;
  51. case cmdRapid Right
  52. MoveTank( MaxSpeed、MinSpeed、CurrentDirection );
  53. 休憩;
  54. case cmd Left
  55. MoveTank( HalfSpeed、MaxSpeed、CurrentDirection );
  56. 休憩;
  57. case cmd Right
  58. MoveTank( MaxSpeed、HalfSpeed、CurrentDirection );
  59. 休憩;
  60. デフォルト
  61. Track.run( RELEASE ); //エンジンを停止します
  62. Right Track.run( RELEASE );
  63. 休憩;
  64. }
  65. }
  66. void MoveTank( バイトLTS、バイトRTS、バイト方向
  67. {
  68. Track.setSpeed( LTS );
  69. Track.setSpeed( RTS );
  70. Track.run( Direction );
  71. Track.run( 方向 );
  72. }
  73. バイトCOMread()
  74. {
  75. バイトval = 0 ;
  76. while( digitalRead(TX ));
  77. //開始ビットを待つ
  78. if( digitalRead(TX )== LOW
  79. {
  80. delayMicroseconds( 42 );
  81. for( int k = 0; k <8; k ++
  82. {
  83. delayMicroseconds( 84 );
  84. val | = digitalRead( TX )<< k;
  85. }
  86. // 9番目のビットを待って停止します
  87. delayMicroseconds( 168 );
  88. return val;
  89. }
  90. }




Arduinoでこのプログラムをフラッシュするだけです(そして、これはArduino IDEインターフェースでボタンを1つ押すことで行われます)。敵のラインの後ろにタンクを送って楽しむことができます。



おわりに



もちろん、単に座標を送信するだけではありません。 ジョイスティックを使用してタンクを制御するインタラクティブ機能を追加できます。 また、戦車砲塔に取り付けられたウェブカメラを使用して、コンピューターに座ったままの動きを観察できます。 しかし、これには追加のソフトウェアが必要になります。 しかし、これでもArduinoプログラミングが耐え難いものになることはありません。 そのようなボードでの作業はシンプル、簡単、そして最も重要なのは手頃な価格です! そうではありませんが、主なことは、結果とプロセス自体の両方から多くの喜びを得ることです!






All Articles