제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
| ||||
|
Arduino를 FlightGear에 연결하는 것은 새로운 것이 아니지만 Wiki가 구식이며 포럼에서 해결해야 할 귀중한 힌트를 제공한다는 것을 알게 되었습니다.
아이디어는 FlightGear에서 항공기의 엘리베이터 트림 탭 휠을 제어하기 위해 훌륭하고 저렴하며 컴팩트한 아날로그 명령을 사용하는 것이었습니다. 위키는 커뮤니케이션 부분까지 작동합니다. 엄밀히 말하면 직렬 통신을 직접 사용하여 Arduino에서 FlightGear로 명령을 전달할 수 없습니다. UDP를 통해 패킷을 보내려면 Python으로 해결해야 합니다.
트림 휠이란 무엇입니까? 트림 탭의 처짐을 제어하는 아날로그 장치로, 조종사의 노력 없이 제어면(이 경우 항공기 피치를 제어하는 엘리베이터)을 주어진 위치에 유지하기 위한 공기역학적 장치입니다. 위키피디아에서:
이 프로젝트에 대한 추가 요구 사항:serial
라이브러리가 있는 python , 소켓
, 및 sys
설치되었습니다. Anaconda가 설치되었다고 가정하고 다음을 입력하여 Anaconda 프롬프트에서 누락된 라이브러리를 검색할 수 있습니다.
>>> conda install -c anaconda pyserial
serial
과 동일 및 소켓
. 인터넷에서 적절한 패키지를 검색합니다. 일반적으로 플랫폼에 가장 많이 다운로드된 패키지가 좋습니다. 이 라이브러리와 함께 Python이 있으면(물론 FlightGear도 설치됨) 다음 섹션으로 이동할 수 있습니다.
세 가지 코드 스크립트가 있습니다:Arduino 스케치, Python 실행 스크립트 및 XML 스크립트. Arduino 스케치를 보드에 로드해야 합니다. Arduino와 FlightGear 간의 통신을 활성화하려면 python 스크립트를 실행해야 합니다. XML 스크립트는
Arduino 스케치에는 U8glib
가 필요합니다. 도서관. 댓글에서 언급했듯이 디스플레이로 스케치의 2번째 줄을 조정합니다.
#include U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
U8glib
참조 예제 및 문서. 스케치는 디스플레이 없이도 작동하므로 보드의 시각적 피드백 없이 플레이할 수 있습니다.
회전 방향이 마음에 들지 않으면 다음 map
에서 마지막 두 인수의 위치를 바꾸면 됩니다. 지침
w =지도(p,0,1023,100,-100);m =지도(p,0,1023,90,0);
전위차계의 값이 -100에서 100으로 이동하고 바늘의 게이지가 0에서 90으로 이동하도록 합니다(바늘을 올바른 위치에 그리는 트릭입니다. 궁금하면 직접 시도해 보세요).
python 스크립트에는 호스트 주소와 직렬 포트 번호가 포함됩니다. 호스트는 "localhost"
여야 합니다. (작동하지 않으면 127.0.0.1
로 시도하십시오. ), 포트 (어쩌면 다른 응용 프로그램에서 사용하지 않는 것이 더 나을 수도 있음, 나는 모릅니다), 보드가 연결된 직렬 포트는 Arduino IDE에서 읽을 수 있습니다. 제 경우에는 "COM4"
입니다. . 참고:직렬 모니터로 Arduino를 테스트하는 경우 제대로 작동하려면 python 스크립트를 실행하기 전에 보드를 분리했다가 다시 연결해야 할 수 있습니다.
호스트 ="localhost" 포트 =21567#buf =1024addr =(호스트, 포트)UDPSock =소켓(AF_INET,SOCK_DGRAM)tty="COM4"print("tty는 ", tty)
파이썬 스크립트는 어디에나 있을 수 있습니다. 운영 체제의 명령줄에서 실행할 수 있습니다. 제 경우(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 파일의 지침에서 초당 30번 입력을 읽도록 지시합니다. 나만의 트림 휠을 즐겨보세요!
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">
#includeU8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI int xmax =128; 정수 ymax =64; int xcenter =xmax/2; 정수 ycenter =ymax/2+10; 정수 호 =ymax/2; 정수 각도 =0; char* 레이블 ="트림"; 정수 레이블Xpos =53; int p, w, m;u8g_uint_t xx =0;int const potPin =A6;float potVal;// 사용자 정의 functionvoid 게이지(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); // 바늘 그리기 float x1 =sin(2*angle*2*3.14/360); float y1 =cos(2*각도*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, "아래로"); u8g.drawStr( 52, 17 , "중립"); u8g.drawStr(105, 42, "UP"); // 게이지 라벨 표시 u8g.setPrintPos(labelXpos,32); u8g.print(라벨); // 디지털 값을 표시하고 위치를 정렬합니다. 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);} 무효 설정() { 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); }} 무효 루프() { potVal =analogRead(potPin); potVal =(potVal - 512.0)/512.0; Serial.print(potVal); Serial.print("\n"); // p는 potVal과 동일하지만 정수입니다. p =analogRead(potPin); w =맵(p,0,1023,100,-100); m =지도(p,0,1023,90,0); // 바늘과 다이얼 표시 xx =m; if (xx <45){ xx =xx + 135; } 그렇지 않으면 { xx =xx - 45; } // 그림 루프 { u8g.firstPage(); do { 게이지(xx); } 동안( u8g.nextPage() ); } 지연(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("에 연결 중 오류 발생", tty) prevline=""동안 1:outline='' line=ser.readline() if line !=prevline:#어떤 값이 변경됨 print(line) outline=line UDPSock.sendto(outline,addr) prevline=line
\n , 엘리베이터 트림 /controls/flight/elevator-trim float
제조공정
구성품 및 소모품 Arduino UNO × 1 Adafruit RGB 백라이트 LCD - 16x2 × 1 브레드보드(일반) × 1 저항 220옴 × 1 SparkFun 푸시버튼 스위치 12mm × 1 점퍼 와이어(일반) × 1 USB-A-B 케이블 × 1 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 필요한 부품은 위의 그림과
Arduino 자습서 시리즈의 세 번째 Arduino 자습서에 오신 것을 환영합니다. 이 튜토리얼에서는 Arduino 아날로그 입력 핀이 어떻게 작동하는지 배우고 전위차계와 광전지를 사용하여 몇 가지 예를 만들 것입니다. 이것은 따라하기 쉬운 단계별 비디오 자습서입니다. 또한 동영상 아래에서 이 튜토리얼에 필요한 부품과 동영상의 예제 소스 코드를 찾을 수 있습니다. 이 Arduino 튜토리얼에 필요한 구성요소 아두이노 보드 ........................................................