Proses manufaktur
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
| ||||
|
Menghubungkan Arduino ke FlightGear bukanlah hal baru, tetapi menurut saya wiki sudah ketinggalan zaman dan forum memberikan petunjuk berharga di mana Anda harus mengatasinya.
Idenya adalah untuk memiliki perintah analog yang bagus, murah, dan ringkas untuk mengontrol roda tab trim elevator pesawat di FlightGear. Wiki bekerja sampai bagian komunikasi. Sebenarnya, Anda tidak dapat langsung menggunakan komunikasi serial untuk meneruskan perintah dari Arduino ke FlightGear. Anda harus bekerja dengan Python untuk mengirim paket melalui UDP.
Apa itu roda trim? Ini adalah perangkat analog untuk mengontrol defleksi trim tab, yang merupakan perangkat aerodinamis untuk menjaga permukaan kontrol (dalam hal ini elevator yang mengontrol pitch pesawat) pada posisi tertentu tanpa usaha dari pilot. Dari wikipedia:
Persyaratan tambahan untuk proyek ini:python dengan pustaka serial
, soket
, dan sys
diinstal. Dengan asumsi bahwa Anaconda telah diinstal, perpustakaan yang hilang dapat diambil dengan Anaconda prompt dengan mengetik:
>>> conda install -c anaconda pyserial
sama dengan serial
dan soket
. Cari di internet untuk paket yang sesuai, biasanya yang paling banyak diunduh untuk platform Anda bagus. Setelah Anda memiliki python dengan pustaka ini (dan, tentu saja, FlightGear terinstal), Anda dapat pindah ke bagian berikutnya.
Ada tiga skrip kode:sketsa Arduino, skrip yang dapat dieksekusi python, dan skrip XML. Sketsa Arduino harus dimuat di papan Anda. Skrip python harus dijalankan untuk mengaktifkan komunikasi antara Arduino dan FlightGear. Skrip XML adalah protokol generik FlightGear yang harus dipindahkan ke
Sketsa Arduino membutuhkan U8glib
Perpustakaan. Seperti yang disebutkan dalam komentar, sesuaikan garis sketsa 2 dengan tampilan Anda:
#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
Lihat U8glib
contoh dan dokumentasi. Sketsa harus berfungsi bahkan tanpa tampilan, jadi Anda dapat bermain tanpa umpan balik visual dari papan Anda.
Jika Anda tidak puas dengan arah rotasi, cukup alihkan posisi dua argumen terakhir di peta
berikut instruksi
w =peta(p,0,1023,100,-100);m =peta(p,0,1023,90,0);
agar nilai potensiometer dari -100 menjadi 100 dan jarum pengukur dari 0 menjadi 90 (ini trik untuk menarik jarum pada posisi yang benar, coba sendiri jika penasaran).
Skrip python menyertakan alamat host dan nomor port serial. Host harus "localhost"
(jika tidak berhasil, coba dengan 127.0.0.1
), port any (mungkin lebih baik tidak digunakan oleh aplikasi lain, saya tidak tahu), port serial tempat board Anda terhubung dapat dibaca dari Arduino IDE. Dalam kasus saya, ini adalah "COM4"
. Catatan:jika Anda menguji Arduino dengan monitor serial, Anda mungkin harus memutuskan dan menyambungkan kembali papan Anda sebelum menjalankan skrip python agar dapat berfungsi dengan baik.
host ="localhost"port =21567#buf =1024addr =(host,port)UDPSock =socket(AF_INET,SOCK_DGRAM)tty="COM4"print("tty is ", tty)
Skrip python dapat ditemukan di mana saja. Anda dapat menjalankannya dari baris perintah sistem operasi Anda. Dalam kasus saya (Windows), saya mengetikkan command prompt:
python c:\path\to\file\arduinoElevatorTrim.py
Ini mungkin diluncurkan sebelum atau bahkan setelah memulai FlightGear.
Terakhir, seperti yang dinyatakan sebelumnya, skrip XML harus dipindahkan sekali untuk semua dalam folder protokol instalasi FlightGear Anda. Sekarang Anda siap untuk pergi. Luncurkan FlightGear dengan mode pilihan Anda (baris perintah atau peluncur) dengan menambahkan perintah berikut (tanpa spasi di antara karakter!) :
--generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim
di mana kami memberi tahu FlightGear untuk menerapkan protokol generik melalui soket, membaca input 30 kali per detik, pada alamat localhost, port 21567, protokol UDP, instruksi dalam file arduinoElevatorTrim.xml. Nikmati roda trim pribadi Anda!
#includeU8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI int xmax =128; int ymaks =64; int xpusat =xmax/2; int ycenter =ymax/2+10; int busur =ymax/2; int sudut =0; char* label ="TRIM"; int labelXpos =53; int p, w, m;u8g_uint_t xx =0;int const potPin =A6;float potVal;// Disesuaikan functionvoid gauge(uint8_t angle) { // menggambar batas gauge 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); // menggambar pelampung jarum x1 =sin(2*sudut*2*3.14/360); float y1 =cos(2*sudut*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); // tampilkan label skala// 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, "BAWAH"); u8g.drawStr( 52, 17 , "NETT"); u8g.drawStr( 105, 42, "NAIK"); // tampilkan label pengukur u8g.setPrintPos(labelXpos,32); u8g.print(label); // tampilkan nilai digital dan sejajarkan posisinya 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);}pengaturan batal() { Serial.begin(9600); u8g.setFont(u8g_font_chikita); u8g.setColorIndex(1); // menetapkan nilai warna default jika ( 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 sama dengan potVal, tetapi merupakan bilangan bulat p =analogRead(potPin); w =peta(p,0,1023,100,-100); m =peta(p,0,1023,90,0); // tunjukkan jarum dan dial xx =m; if (xx <45){ xx =xx + 135; } else { xx =xx - 45; } // loop gambar { u8g.Halaman pertama(); lakukan { pengukur(xx); } while( u8g.nextPage() ); } delay(10);}
#!/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:#beberapa nilai diubah print(line) outline=line UDPSock.sendto(outline,addr) prevline=line
\n , Trim elevator /controls/flight/elevator-trim float
Proses manufaktur
Komponen dan persediaan Arduino Nano R3 × 1 LED 5 mm:Merah × 1 LED 5 mm:Hijau × 1 LED (generik) × 1 Resistor 2K × 1 Kabel × 1 Alat dan mesin yang diperlukan Besi solder (generik) Pistol lem panas (generik)
Komponen dan persediaan Arduino Nano R3 × 1 Potensiometer putar (generik) × 7 Sakelar Tombol Tekan SparkFun 12mm × 7 port MIDI × 1 Resistor 221 ohm × 4 LED (generik) × 2 Tentang proyek ini Pembaruan 11.03.2019 Hai, Saya
Komponen dan persediaan Arduino UNO × 1 Adafruit RGB Backlight LCD - 16x2 × 1 Breadboard (generik) × 1 Resistor 220 ohm × 1 Sakelar Tombol Tekan SparkFun 12mm × 1 Kabel jumper (generik) × 1 Kabel USB-A ke B × 1 Aplik
Selamat datang di Tutorial Arduino ketiga dari Seri Tutorial Arduino kami. Dalam tutorial ini kita akan mempelajari cara kerja pin Input Analog Arduino dan membuat beberapa contoh menggunakan potensiometer dan fotosel. Ini adalah Video Tutorial Langkah demi Langkah yang mudah diikuti. Selain itu, d