FlightGearアナログトリムタブホイール
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
| |||
| ||||
|
このプロジェクトについて
ArduinoをFlightGearに接続することは目新しいことではありませんが、ウィキは時代遅れであり、フォーラムは回避しなければならない貴重なヒントを提供していることがわかりました。
アイデアは、FlightGearで航空機のエレベータートリムタブホイールを制御するための、安価でコンパクトなアナログコマンドを使用することでした。 wikiはコミュニケーション部分まで機能します。厳密に言えば、シリアル通信を直接使用してArduinoからFlightGearにコマンドを渡すことはできません。 UDP経由でパケットを送信するには、Pythonを使用して回避する必要があります。
<図>トリムホイールとは何ですか?トリムタブのたわみを制御するアナログ装置であり、パイロットの努力なしに操縦翼面(この場合は航空機のピッチを制御するエレベータ)を所定の位置に維持するための空力装置です。ウィキペディアから:
<図>
このプロジェクトの追加要件:ライブラリ serial
を使用したPython 、 socket
、および sys
インストールされています。 Anacondaがインストールされていると仮定すると、不足しているライブラリは、次のように入力することでAnacondaプロンプトで取得できます。
>>> conda install -c anaconda pyserial
serial
でも同じです および socket
。インターネットで適切なパッケージを検索します。通常、プラットフォームに最もダウンロードされているものが適しています。これらのライブラリを使用してPythonを入手したら(もちろん、FlightGearをインストールしたら)、次のセクションに進むことができます。
コードスクリプトには、Arduinoスケッチ、Python実行可能スクリプト、およびXMLスクリプトの3つがあります。 Arduinoスケッチをボードにロードする必要があります。 ArduinoとFlightGear間の通信を有効にするには、Pythonスクリプトを実行する必要があります。 XMLスクリプトはFlightGearの汎用プロトコルであり、
Arduinoスケッチには U8glib
が必要です 図書館。コメントに記載されているように、ディスプレイでスケッチの2行目を調整します。
#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI
U8glib
を参照してください 例とドキュメント。スケッチはディスプレイがなくても機能するはずなので、ボードからの視覚的なフィードバックなしでプレイできます。
回転の方向に不満がある場合は、次の map
の最後の2つの引数の位置を切り替えるだけです。 指示
w =map(p、0,1023,100、-100); m =map(p、0,1023,90,0);
ポテンショメータの値が-100から100になり、針のゲージが0から90になるようにします(これは、針を正しい位置に引くためのトリックです。興味がある場合は、自分で試してください)。
Pythonスクリプトには、ホストアドレスとシリアルポート番号が含まれています。ホストは "localhost"
である必要があります (機能しない場合は、 127.0.0.1
を試してください )、任意のポート(他のアプリケーションで使用されていない方が良いかもしれませんが、わかりません)、ボードが接続されているシリアルポートはArduinoIDEから読み取ることができます。私の場合は "COM4"
。 注:シリアルモニターでArduinoをテストする場合、Pythonスクリプトを実行する前に、ボードを切断して再接続しなければならない場合があります。
host ="localhost" port =21567#buf =1024addr =(host、port)UDPSock =socket(AF_INET、SOCK_DGRAM)tty ="COM4" print( "tty is"、tty)
Pythonスクリプトはどこにでも配置できます。オペレーティングシステムのコマンドラインから実行できます。私の場合(Windows)、コマンドプロンプトを入力します:
python c:\ path \ to \ file \ arduinoElevatorTrim.py
これは、FlightGearを開始する前または開始した後に起動される場合があります。
最後に、前述のように、XMLスクリプトは、FlightGearインストールのプロトコルフォルダーに一度移動する必要があります。これで準備が整いました。次のコマンドを追加して、好みのモード(コマンドラインまたはランチャー)でFlightGearを起動します(文字の間にスペースを入れないでください!) :
-generic =socket、in、30、localhost、21567、udp、arduinoElevatorTrim
ここで、FlightGearに、ソケットを介して汎用プロトコルを適用するように指示し、アドレスlocalhost、ポート21567、UDPプロトコル、arduinoElevatorTrim.xmlファイルの命令で1秒間に30回入力を読み取ります。パーソナルトリムホイールをお楽しみください!
コード
- arduinoElevatorTrimOLED.ino
- arduinoElevatorTrim.py
- arduinoElevatorTrim.xml
arduinoElevatorTrimOLED.ino Arduino
ArduinoNanoにロードするコード。必要に応じて2行目(ディスプレイのタイプ)を調整します。#includeU8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI int xmax =128; int ymax =64; int xcenter =xmax / 2; int ycenter =ymax / 2 + 10; int arc =ymax / 2; int角度=0; char * label ="TRIM"; int labelXpos =53; int p、w、m; u8g_uint_t xx =0; int const potPin =A6; float potVal; //カスタマイズされたfunctionvoidgauge(uint8_t angle){//ゲージの境界線を描画u8g.drawCircle(xcenter、ycenter、arc + 6、 U8G_DRAW_UPPER_RIGHT); u8g.drawCircle(xcenter、ycenter、arc + 4、U8G_DRAW_UPPER_RIGHT); u8g.drawCircle(xcenter、ycenter、arc + 6、U8G_DRAW_UPPER_LEFT); u8g.drawCircle(xcenter、ycenter、arc + 4、U8G_DRAW_UPPER_LEFT); //針のフロートを描画しますx1 =sin(2 * angle * 2 * 3.14 / 360); float y1 =cos(2 * angle * 2 * 3.14 / 360); u8g.drawLine(xcenter、ycenter、xcenter + arc * x1、ycenter-arc * y1); u8g.drawDisc(xcenter、ycenter、5、U8G_DRAW_UPPER_LEFT); u8g.drawDisc(xcenter、ycenter、5、U8G_DRAW_UPPER_RIGHT); u8g.setFont(u8g_font_chikita); //スケールラベルを表示//u8g.drawStr(10、42、 "-1.0"); // u8g.drawStr(19、14、 "-0.5"); // u8g.drawStr(63、14、 "0"); // u8g.drawStr(92、14、 "0.5"); // u8g。 drawStr(105、42、 "1.0"); u8g.drawStr(1、42、 "DOWN"); u8g.drawStr(52、17、 "NEUT"); u8g.drawStr(105、42、 "UP"); //ゲージラベルを表示u8g.setPrintPos(labelXpos、32); u8g.print(label); //デジタル値を表示し、その位置を揃えますu8g.setFont(u8g_font_profont22); if(w> =99){u8g.setPrintPos(47,60); } if(w> =10 &&w <99){u8g.setPrintPos(54,60); } if(w> =0 &&w <9){u8g.setPrintPos(60,60); } if(w> =-9 &&w <0){u8g.setPrintPos(48,60); } if(w> =-99 &&w <-9){u8g.setPrintPos(42,60); } if(w <-99){u8g.setPrintPos(35,60); } u8g.print(w);} void setup(){Serial.begin(9600); u8g.setFont(u8g_font_chikita); u8g.setColorIndex(1); //デフォルトの色値を割り当てますif(u8g.getMode()==U8G_MODE_R3G3B2){u8g.setColorIndex(255); } else if(u8g.getMode()==U8G_MODE_GRAY2BIT){u8g.setColorIndex(3); } else if(u8g.getMode()==U8G_MODE_BW){u8g.setColorIndex(1); } else if(u8g.getMode()==U8G_MODE_HICOLOR){u8g.setHiColorByRGB(255,255,255); }} void loop(){potVal =analogRead(potPin); potVal =(potVal-512.0)/512.0; Serial.print(potVal); Serial.print( "\ n"); // pはpotValと同じですが、整数ですp =analogRead(potPin); w =map(p、0,1023,100、-100); m =map(p、0,1023,90,0); //針を表示してダイヤルしますxx =m; if(xx <45){xx =xx + 135; } else {xx =xx-45; } //画像ループ{u8g.firstPage(); {ゲージ(xx); } while(u8g.nextPage()); } delay(10);}
arduinoElevatorTrim.py Python
シリアル通信をUDPパケットに「変換」するためにFlightGearと一緒に実行されるスクリプト。このスクリプトを実行するには、Pythonをインストールする必要があります。必要に応じて14行目(Arduinoが接続されているUSBポート)を変更します。#!/ usr / bin / pythonimport sysimport serialfrom socket import * host ="localhost" port =21567#buf =1024addr =(host、port)UDPSock =socket(AF_INET、SOCK_DGRAM)tty ="COM4" print( "tty is"、tty)try:ser =serial.Serial(tty、9600)except:print( "Error connect to"、tty)prevline ="" while 1:outline ='' line =ser.readline()if line!=prevline:#some value changed print(line)outline =line UDPSock.sendto(outline、addr)prevline =line
arduinoElevatorTrim.xml XML
<?xmlversion ="1.0"?>\ n 、 エレベータートリム / controls / flight / elevator-trim フロート チャンク>
Github
Githubのオンラインリポジトリhttps://github.com/dciliberti/arduinoElevatorTrimOLED 回路図
フリッツでは、コンポーネントの下にワイヤーを通すことはできません。ディスプレイのアース線はArduinoNanoの下にある場合があります。 製造プロセス