제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 |
| ||||
|
이 시스템의 차이점은 무엇입니까?
매우 간단한 전자 회로가 트랙에 DCC 신호와 전원을 제공하지만 앱이 실제 작업을 수행합니다! 명령의 각 패킷을 구성하는 데 필요한 코드를 구성하여 휴대전화의 컴퓨터를 최대한 활용하여 Arduino 컨트롤러의 작업을 단순화합니다!
2019년 8월 16일 업데이트:새롭게 개선된 앱 출시 - CV 1~255 읽기/쓰기 기능 포함
이 앱 버전 5파운드(세금 별도)이며 Google Play 스토어에서 구매할 수 있습니다.
그림> 그림> 그림> 그림>
업데이트 2019년 5월 18일:새롭게 개선된 앱 출시 - 편집 가능한 제목, 가시성 및 임시 옵션이 포함된 최대 28개의 기능. 화면의 스피드 바를 사용하여 한 번에 최대 4개의 로코스를 제어할 수 있습니다. 이 앱 버전 3파운드(세금 별도)이며 Google Play 스토어에서 구매할 수 있습니다.
2019년 2월 17일 업데이트:수신 범위를 확장하려면 HC-06 Bluetooth 모듈을 수정해야 할 수 있습니다. 길이 31.2mm(1/4의 1/4)인 단선 구리선(주 접지선)을 추가했습니다. 2.4GHz의 파장). 2단계에서 첨부된 사진을 참조하세요.
업데이트 2019년 1월 29일:경적 소리에 대한 F2 및 F3에 임시 옵션 추가 각 로코에 대해 사전 설정된 최대 속도이것은 구축 가능한 가장 효율적인 DCC 명령 스테이션입니다. 다른 어떤 시스템도 그렇게 적은 수의 구성 요소로 많은 작업을 수행할 수 없습니다. eBay에서 사용할 수 있는 PCB와 함께 몇 가지 부품만 필요로 하는 완벽하게 작동하는 DCC 명령 스테이션을 쉽게 조립할 수 있습니다. 앱 'LocoMotive'는 버전 4.1 이상을 실행하는 Android 휴대폰에서 작동하도록 설계되었습니다. . 적절한 시스템을 구입할 필요가 없으며 NMRA 호환 디코더와 함께 작동하는 'LocoMotive'라는 무료 앱에서 작동하는 독립 실행형 장치입니다. 이 시스템은 DCC 클럭 신호와 결합하기 위해 Arduino 인터페이스로 전송되는 앱 내에서 작동하는 DCC 패킷을 컴파일합니다. eBay에서 이 PCB를 구입하세요. Google Play 스토어에서 무료 앱 LocoMotive를 받으세요. 기능은 다음과 같습니다.
<울>DCC 무선 시스템에 대한 이전 작업에 더하여 HC-06 BT 모듈 및 2A를 제공하는 LMD18200 H-브리지 모터 드라이버가 있는 수신기 Arduino 기반 회로에 연결된 Bluetooth 명령 스테이션을 개발했습니다.
전체 부품 비용은 eBay에서 구입한 부품을 포함하여 약 20파운드입니다.
1단계:Arduino 스케치
전체 스케치가 첨부되어 있습니다. 이 부분은 루프 및 데이터 수신기 코드입니다. Android 앱은 완전한 패킷을 수신기로 보내고 여기에서 데이터 배열로 디코딩됩니다. 3바이트 또는 4바이트 수신 여부에 따라 코드는 기차 트랙에 대한 올바른 DCC 패킷 형식을 생성합니다.
무효 루프() {if(bluetooth.available()> 0); {inString =bluetooth.readStringUntil('\n');}if (inString.substring(0, 1)=="D") {string();}delay(20);}
그런 다음 string() void는 수신된 텍스트 문자열에서 데이터를 분리하고 각 명령어를 DCC 패킷의 적절한 위치에 배치합니다.
예:
수신된 텍스트 문자열 'DD, 3, 63, 12, 48, '은 각각 8비트의 4바이트 속도 패킷으로 변환됩니다.
DD =메시지 IDByte:[1] [2] [3] [4]십진수:[3] [63] [12] [48] 바이너리:[0000 0011] [0001 1111] [0000 1100] [0001 1000] 작업 :[로코 3] [속도 단계] [ 로코 속도] [ XOR 데이터 확인]
수신된 텍스트 문자열 'DD, 1, 129, 128,'은 각각 8비트의 3바이트 기능 패킷으로 변환됩니다.십진수:[1] [129] [128] 이진:[0000 0001] [1000 0001] [1000 0000] 조치:[위치 1] [ F1 켜기] [XOR 데이터 검사]
NMRA 패킷 표준에 대한 자세한 내용은 https://www.nmra.org/sites/default/files/s-9.2.1_2...
를 참조하십시오. s-9.2.1_2012_07.pdfLMD는 DIR 핀에 DCC 신호가 필요하고 PWM 핀은 HIGH로 유지되어야 합니다.
command_station_bluetooth_oct_2018.ino
2단계:Fritzing 회로도
Arduino Pro Mini는 HC-06 모듈을 통해 Bluetooth 데이터를 수신합니다. Arduino는 패킷 형식으로 데이터의 NMRA 표준 클록 주기를 생성합니다. 수신된 데이터는 새로운 데이터가 수신되고 DCC 패킷이 업데이트되어 열차 트랙에 명령을 보낼 때 시퀀스를 중단합니다.
필요한 부품 목록:
PCB는 eBay에서 구할 수 있습니다.
Arduino Pro Mini Atmega328P 5V/16M eBay 1개
1 LMD18200T H-bridge eBay
1 오프 HC-06 블루투스 모듈 eBay
1 off 0.1ohm 2W 금속 필름 저항기 0.1R 2W(11.5mm x 4.5mm) eBay
0.1uf eBay에서 커패시터 3개 할인
10kΩ 저항기 eBay 2개 끄기
1 오프 커패시터 10uf 25v; 이베이
1 오프 커패시터 220uf 16v; 이베이
1 off 피닉스컨택트 MKDS 1/2-3, 5 2 웨이 나사 PCB 터미널 블록 13.5A 200V 3.5mm eBay
4.7kΩ 저항 eBay 1개 끄기
1 off L7805 CV 포지티브 전압 레귤레이터 IC eBay
1 오프 4 핀 암 헤더 에지 핀 스트립 0.1 "2.54mm eBay
2개의 12핀 암 헤더 에지 핀 스트립 0.1" 2.54mm eBay
1 오프 6 핀 2.54mm PCB 범용 나사 고정 터미널 블록 eBay
제너 다이오드 3.6V 1개, 0.5W 1N4732A 이베이
와이어
전원 공급 장치:OO/HO 레이아웃의 경우 14v DC 전원 공급 장치(예:eBay의 노트북 충전기 장치)를 사용합니다. 예를 들어 최대 2.5A를 제공합니다. 이 프로젝트를 위해 선택한 전원 공급 장치의 DC 잭 플러그를 맞추는 데 필요한 패널 장착 소켓의 크기를 확인하십시오. https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter-...
HC-06 Bt 모듈의 범위를 확장하려면 모듈의 안테나 끝에 와이어를 납땜합니다. 나는 길이 31.2mm(2.4GHz의 경우 파장의 1/4)인 단선 구리선(주 접지선에서)을 사용했습니다. 위의 사진을 참조하십시오. 참고 - HC-06 연결은 Rx(PCB에서)에서 Rx(모듈에서) 및 Tx에서 Tx입니다. 다른 구성 요소와 우발적으로 단락되는 것을 방지하기 위해 안테나 와이어를 슬리브로 덮어야 합니다.
LMD18200 h-브리지 모듈을 사용하기 위해(위에 표시된 것처럼 이것은 히트싱크 등의 모듈 형태임), 나는 열차 트랙의 단락 또는 과부하 문제로부터 보호하기 위해 전류 감지 구성요소를 추가했습니다. 업데이트된 회로도 및 Arduino 이제 코드에 현재 감지 기능이 포함됩니다.
코드는 도달 시 최대 전류를 2A로 제한하고, Arduino의 D13에서 HIGH 신호를 h-브리지의 '브레이크' 입력에 적용하여 LMD18200 h-브리지를 종료합니다.
0.1옴 전류 감지 저항기를 사용하면 최대 2A 부하에 대해 Arduino 센서 핀 A0에서 0~200mv의 아날로그 입력 범위를 제공합니다. 아날로그 단계 입력당 약 5mv의 경우(총 1023개의 단계 또는 분할) 분할당 0 ~ 40 분할 또는 2A/40 =50mA를 제공합니다. 측정된 전류 정밀도는 50mA이지만 2A에 도달하면 h-브리지를 보호합니다. LMD18200은 또한 백업으로 과열 보호 기능이 내장되어 있습니다.if(C>2000){ // 2 amps
Serial.println("과전류"); 디지털 쓰기(13, 높음); }
현재 그려진 값은 매 초마다 블루투스를 통해 Android 앱으로 전송됩니다.void send_c(){t =millis() - lastmillis; if (t>=간격){ bluetooth.write(sensorValue); 블루투스.write('c'); lastmillis =millis(); } }
3단계:Android 앱
Google Play 스토어에서 무료 앱 다운로드 - 'LocoMotive'
Google Play 스토어에서 전체 앱(5.99파운드) 다운로드 - 'LocoMotive DCC'
정식 버전 앱에 대한 지침이 첨부되어 있습니다.
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">
// 2019년 9월 1일// LMD18200 h-bridge// CV 읽기/쓰기 기능을 사용하여 Android 앱 '기관차 DCC'와 함께 사용하기 위한 스케치 추가#include섹션>SoftwareSerial bluetooth(8,9); // RX TXint C;int sensorValue;long t =0;long lastmillis =0;long interval =1000;String inString;int a[8];int preamable_type =0;int 주소;float CV_VAL;float cv_val;float cv_val0; float cv_val1;float cv_val2;float cv_val3;float cv_val4;float cv_val5;float cv_val6;float cv_val7;int test_num;int cv_write_val;int Cs;boolean cv_logic;boolean ok;int num;// 디지털 핀 5개 사용 //타이머 주파수는 2MHz(16MHz에서 /8 프리스케일) #define TIMER_SHORT 0x8D // 58usec 펄스 길이 #define TIMER_LONG 0x1B // 116usec 펄스 길이 unsigned char last_timer=TIMER_SHORT; // 마지막 타이머 값 저장 unsigned char flag=0; // 짧거나 긴 펄스에 사용됨 unsigned char every_second_isr =0; // 펄스 업 또는 다운// 상태 머신에 대한 정의 #define PREAMBLE 0 #define SEPERATOR 1#define SENDBYTE 2unsigned char state=PREAMBLE;unsigned char preamble_count =16;unsigned char outbyte =0;unsigned char cbit =0x80;// variablesunsigned 문자 xdata =0, 데이터 =0, data_f =0, data_f1 =0, data_f2 =0, int locoAdr =9; // 이것은 loco // commandstruct용 버퍼의 기본 주소입니다. Message { unsigned char data[7]; unsigned char len;};#define MAXMSG 3// 당분간은 2개의 메시지만 사용하십시오 - 유휴 메시지, 로코 속도 메시지, 함수 msgstruct 메시지 msg[MAXMSG] ={ { { 0xFF,0, 0xFF, 0, 0, 0, 0}, 3}, // 유휴 msg { { locoAdr, 0, 0, 0, 0, 0, 0}, 3} // 128개의 속도 단계 0x3f가 있는 locoMsg }; // loco msg는 나중에 속도와 XOR 데이터 바이트로 채워야 합니다. int msgIndex=0; int byteIndex=0;//Setup Timer2.//지정된 주파수에서 인터럽트를 생성하도록 8비트 Timer2를 구성합니다.//ISR 루틴 내부의 TCNT2에 로드되어야 하는 시간 로드 값을 반환합니다.void SetupTimer2(){ //타이머2 설정:타이머 프리스케일러 /8, 모드 0 //타이머 클럭 =16MHz/8 =2MHz 이상 0,5usec TCCR2A =0; TCCR2B =0< =MAXMSG) { msgIndex =0; } 바이트 인덱스 =0; //바이트 0으로 메시지 시작 } break; 대소문자 구분자:플래그=0; // 긴 펄스 // 다음 상태로 진행 상태 =SENDBYTE; // 다음 바이트로 이동 ... cbit =0x80; // 다음에 이 비트를 먼저 보냅니다. outbyte =msg[msgIndex].data[byteIndex]; 부서지다; 케이스 SENDBYTE:if (outbyte &cbit) { 플래그 =1; // 짧은 펄스 전송 } else { flag =0; // 긴 펄스 보내기 } cbit =cbit>> 1; if (cbit ==0) { // 마지막 비트 전송, 다음 바이트가 있습니까? 바이트 인덱스++; if (byteIndex>=msg[msgIndex].len) { // 이것은 이미 XOR 바이트이고 프리앰블 상태로 진행합니다. =PREAMBLE; if (preamable_type ==0){ preamble_count =16; // 일반 프리앰블 길이 16 '1's } if (preamable_type ==1){ preamble_count =24; // CV1 쓰기를 위한 24 '1의 프리앰블 } } else { // 구분자를 보내고 다음 바이트로 진행 state =SEPERATOR; } } 부서지다; } if (flag) { // 데이터==1이면 짧은 펄스 대기 시간=TCNT2; TCNT2=대기 시간+TIMER_SHORT; last_timer=TIMER_SHORT; } else { // 긴 펄스 대기 시간=TCNT2; TCNT2=대기 시간+TIMER_LONG; last_timer=TIMER_LONG; } }} 무효 설정(){Serial.begin(115200);analogReference(INTERNAL);pinMode(13, OUTPUT); 블루투스.begin(9600); 지연(500); // 블루투스 모듈이 시작될 때까지 기다립니다. Serial.println("Bluetooth Started"); bluetooth.println("블루투스 시작됨");DDRD =B01100000; // 디지털 핀 5에 D5, 디지털 핀 6에 D6 등록 // 타이머 시작 SetupTimer2();t =millis();lastmillis =millis();digitalWrite(6, LOW);digitalWrite(13, HIGH); // 브리지 o/p를 끕니다. get_cv_val =cv_calc(test_num);}void current(){int i; 정수 값 =0; int numReadings =5;for (i =0; i 2000){ // 2 amps Serial.println("과전류"); bluetooth.println("짧습니다!"); 디지털 쓰기(6, 낮음); // DCC 신호의 논리 제어를 로우(off)로 설정합니다. digitalWrite(13, HIGH); // 제동하기 위해 h-bridge o/p를 단락시킵니다. bluetooth.println(C); }} 무효 루프() { if(bluetooth.available() ==true); { inString =블루투스.readStringUntil('\n'); Serial.println(문자열); } if (inString.substring(0,1) =="D"){ string(); } // 들어오는 DCC 패킷 if (inString.substring(0,1) =="C"){ digitalWrite(6, HIGH); 디지털 쓰기(13, 낮음); } // 과전류 후 리셋, DCC 신호의 논리 제어 켜짐, 제동 해제 if (inString.substring(0,1) =="G"){ digitalWrite(6, HIGH); 디지털 쓰기(13, 낮음); 현재의(); bluetooth.println(C);} // 로드 현재 값 요청 if (inString.substring(0,1) =="A"){ digitalWrite(6, HIGH); 디지털 쓰기(13, 낮음); get_cv_data(); cv1_prog(); 디지털 쓰기(6, 낮음); digitalWrite(13, HIGH);} if (inString.substring(0,3) =="get"){ cv_val =0; 디지털 쓰기(6, 높음); 디지털 쓰기(13, 낮음); get_cv_num(); cv_read(); 디지털 쓰기(6, 낮음); 디지털 쓰기(13, 높음); } if (inString.substring(0,3) =="추가"){ cv_write_val =0; 디지털 쓰기(6, 높음); 디지털 쓰기(13, 낮음); get_cv_new_val(); repeat_cv_write(); 디지털 쓰기(6, 낮음); 디지털 쓰기(13, 높음); } if (inString.substring(0,1) =="V"){ delay(50);bluetooth.print("CV1 업데이트됨"); Serial.println(Address);} // cv1 write if (inString.substring(0,1) =="E"){ digitalWrite(6, LOW); // DCC 신호의 논리 제어를 로우(off)로 설정합니다. digitalWrite(13, HIGH); // 제동, h-bridge o/p 단락 } // e-stop inString =""; } 무효 get_cv_new_val(){ Serial.println(inString); 문자열 cv_w =""; int x =inString.indexOf("신규,") + 4; cv_w =inString.substring(x,x+3); Serial.println(cv_w); cv_write_val =cv_w.toInt(); Serial.print("cv_write_val:");Serial.println(cv_write_val); 문자열 추가 =""; 정수 z =inString.indexOf("추가,") + 5; addr =inString.substring(z,z+1); Serial.println(주소); 주소 =addr.toInt(); Serial.print("주소:");Serial.println(주소); } 무효 get_cv_num(){ cv_write_val =0; Serial.println(문자열); 문자열 온도 =""; 정수 x =inString.indexOf(",") + 1; 임시 =inString.substring(x,8); Serial.println(임시); 주소 =temp.toInt(); Serial.print("주소:");Serial.println(주소); } 무효 get_cv_data(){ unsigned long z =inString.length(); 정수 y =0; 정수 개수 =0; 문자열 inChar; 문자열 온도 =""; for (int i =0; i<=z; i++){ inChar =inString.substring(i,i+1); if (inChar ==",") {count++;} if (inChar !="," &&inChar !="A") {temp +=inChar;} if (inChar ==",") {주소 =(temp .toInt());y =y +1;temp ="";} } amend_len3(msg[1]); assemble_3_byte(); Serial.println(문자열); } 무효 string(){ unsigned long z =inString.length(); 정수 y =0; for (int i =0; i<=5; i++){ a[i] =0; } 정수 개수 =0; 문자열 inChar;문자열 임시 =""; for (int i =0; i<=z; i++){ inChar =inString.substring(i,i+1); if (inChar ==",") { count++; } if (inChar !="," &&inChar !="D") { 임시 +=inChar; } if (inChar ==",") { a[y] =(temp.toInt()); y =y +1; 온도 =""; } } if (count ==3){ //Serial.println(inString); //print_data(); 수정_len3(msg[1]); assemble_3_byte(); } if (count ==4){ //Serial.println(inString); //print_data(); 수정_렌4(msg[1]); assemble_4_byte(); } //Serial.println(inString); //Serial.println(a[1]); // Serial.println(a[2]); //Serial.println(a[3]); //Serial.println(a[4]); //print_data(); } 무효 amend_len4 (구조 메시지 &x) { x.len =4; //Serial.println(x.len);}void assemble_4_byte() { preamable_type =0; // 16 x '1의 noInterrupts(); msg[0].data[0] =B11111111; msg[0].data[1] =B00000000; msg[0].data[2] =B11111111; 메시지[1].데이터[0] =a[1]; msg[1].data[1] =a[2]; msg[1].data[2] =a[3]; msg[1].data[3] =((a[1] ^ a[2])^ a[3]); 인터럽트();} 무효 amend_len3(구조 메시지 &x) { x.len =3; //Serial.println(x.len);}void assemble_3_byte() { preamable_type =0; // 16 x '1의 noInterrupts(); msg[0].data[0] =B11111111; msg[0].data[1] =B00000000; msg[0].data[2] =B11111111; 메시지[1].데이터[0] =a[1]; msg[1].data[1] =a[2]; msg[1].data[2] =(a[1] ^ a[2]); 메시지[1].데이터[3] =0; 인터럽트(); } 무효 print_data(){ Serial.print(msg[1].data[0], DEC); Serial.print(","); Serial.print(msg[1].data[1], DEC); Serial.print(","); Serial.print(msg[1].data[2], DEC); Serial.print(","); Serial.print(msg[1].data[3], DEC); Serial.println(","); }//CV readvoid cv_current(){for (int i =1; i<=10; i++){ sensorValue =analogRead(A0); C =10.8 * 센서값; // mA if (C>=Cs){ cv_logic =true; } 지연마이크로초(500); Serial.print("C =");Serial.println(C);}} 무효 cv_read(){ cv_val =0; 지연(200); 현재의(); if(bluetooth.available() ==true);{ bluetooth.print("읽기.."); } Cs =C + 50; CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val0 =cv_calc(0); 지연(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val1 =cv_calc(1); 지연(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val2 =cv_calc(2); 지연(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val3 =cv_calc(3); 지연(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val4 =cv_calc(4); 지연(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val5 =cv_calc(5); 지연(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val6 =cv_calc(6); 지연(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val7 =cv_calc(7); 지연(10); } } Serial.print("cv_val0");Serial.println(cv_val0); Serial.print("cv_val1");Serial.println(cv_val1); Serial.print("cv_val2");Serial.println(cv_val2); Serial.print("cv_val3");Serial.println(cv_val3); Serial.print("cv_val4");Serial.println(cv_val4); Serial.print("cv_val5");Serial.println(cv_val5); Serial.print("cv_val6");Serial.println(cv_val6); Serial.print("cv_val7");Serial.println(cv_val7); int cv_val_total =cv_val0+cv_val1+cv_val2+cv_val3+cv_val4+cv_val5+cv_val6+cv_val7; 이력서_발 =0; if (cv_val0 ==1){ cv_val =cv_val + 1; } if (cv_val1 ==1){ cv_val =cv_val + 2; } if (cv_val2 ==1){ cv_val =cv_val + 4; } if (cv_val3 ==1){ cv_val =cv_val + 8; } if (cv_val4 ==1){ cv_val =cv_val + 16; } if (cv_val5 ==1){ cv_val =cv_val + 32; } if (cv_val6 ==1){ cv_val =cv_val + 64; } if (cv_val7 ==1){ cv_val =cv_val + 128; } if(bluetooth.available() ==true);{ if (cv_val_total> 9){ bluetooth.print("읽기 =오류"); } if (cv_val_total <9){ bluetooth.print("읽기 ="); 블루투스.println(int(cv_val + 0.5)); } }Serial.print("cv_val");Serial.println(int(cv_val + 0.5));}void cv1_prog(){for (int i =0; i<=3; i++){ reset_packet(); 지연(5); }(int i =0; i<=5; i++){ page_preset_packet(); 지연(5); }(int i =0; i<=9; i++){ reset_packet(); 지연(5); } for (int i =0; i<=5; i++){ cv1_write_packet(); 지연(5); } 현재();for(int i =0; i<=10; i++){ cv1_write_packet(); 지연(5); } } 무효 reset_packet() { noInterrupts(); preamable_type =0; msg[0].data[0] =B11111111; msg[0].data[1] =B11111111; msg[0].data[2] =B11111111; msg[1].data[0] =B00000000; msg[1].data[1] =B00000000; msg[1].data[2] =B00000000; 인터럽트();} 무효 page_preset_packet() { noInterrupts(); preamable_type =0; // 16 x '1's msg[0].data[0] =B11111111; msg[0].data[1] =B11111111; msg[0].data[2] =B11111111; msg[1].data[0] =B01111101; msg[1].data[1] =B00000001; msg[1].data[2] =B01111100; 인터럽트();} 무효 cv1_write_packet() { preamable_type =1; // 24 x '1의 noInterrupts(); msg[0].data[0] =B11111111; msg[0].data[1] =B11111111; msg[0].data[2] =B11111111; msg[1].data[0] =B01111000; // Address only mode msg[1].data[1] =B00000000 | 주소; msg[1].data[2] =(msg[1].data[0] ^ msg[1].data[1]); interrupts();}void cv_verify1_packet() { noInterrupts(); preamable_type =1; // 24 x '1's msg[0].data[0] =B11111111; msg[0].data[1] =B11111111; msg[0].data[2] =B11111111; msg[1].data[0] =B01111000; // bit manipulation mode msg[1].data[1] =B00000000 | (Address -1); msg[1].data[2] =B11101000 | num; msg[1].data[3] =(msg[1].data[0] ^ msg[1].data[1]) ^ msg[1].data[2]; interrupts(); }void cv_verify0_packet() { noInterrupts(); preamable_type =1; // 24 x '1's msg[0].data[0] =B11111111; msg[0].data[1] =B11111111; msg[0].data[2] =B11111111; msg[1].data[0] =B01111000; // bit manipulation mode msg[1].data[1] =B00000000 | (Address -1); msg[1].data[2] =B11100000 | num; msg[1].data[3] =(msg[1].data[0] ^ msg[1].data[1]) ^ msg[1].data[2]; interrupts(); }void cv_write_packet() { preamable_type =1; // 24 x '1's noInterrupts(); msg[0].data[0] =B11111111; msg[0].data[1] =B11111111; msg[0].data[2] =B11111111; msg[1].data[0] =B01111100; // write mode msg[1].data[1] =B00000000 | (Address -1); msg[1].data[2] =B00000000 | cv_write_val; msg[1].data[3] =(msg[1].data[0] ^ msg[1].data[1]) ^ msg[1].data[2]; interrupts(); }void valid_packet(){ noInterrupts(); msg[0].data[0] =B11111111; msg[0].data[1] =B00000000; msg[0].data[2] =B11111111; preamable_type =0; // 16 x '1's msg[1].data[0] =(Address - 1); msg[1].data[1] =0x80; // locoMsg with group one instruction 0x80 msg[1].data[2] =msg[1].data[0] ^ msg[1].data[1]; msg[1].data[3] =0; interrupts();}//CV writevoid repeat_cv_write() { current(); Cs =C + 50; Serial.print("C =");Serial.println(C); Serial.print("Cs =");Serial.println(Cs); if(bluetooth.available() ==true);{ bluetooth.print("writing.."); } ok =false; for (int f =1; f<=10; f++){ if (ok ==false){ cv_write(); delay(10); } } }void cv_write(){ delay(100); amend_len3(msg[1]); assemble_3_byte(); delay(5);for (int i =1; i<=20; i++){ valid_packet(); delay(5); } for (int i =1; i<=6; i++){ reset_packet(); delay(5); } cv_logic =false; amend_len4(msg[1]); assemble_4_byte();for (int i =1; i<=10; i++){ cv_write_packet(); cv_current(); Serial.print("C=");Serial.println(C); if (cv_logic){ ok =true; cv_logic =false; i =11; amend_len3(msg[1]); assemble_3_byte(); for (int i =1; i<=10; i++){ reset_packet(); delay(5); } if(bluetooth.available() ==true);{ bluetooth.print("write ="); bluetooth.println(cv_write_val); Serial.print("cv_write_val ");Serial.println(cv_write_val); } } } if(bluetooth.available() ==true);{ if (ok ==false){ bluetooth.print("write =error"); } }}int cv_calc(int test_num) { amend_len3(msg[1]); assemble_3_byte(); delay(5);for (int i =1; i<=20; i++){ valid_packet(); delay(5); } num =test_num; amend_len3(msg[1]); assemble_3_byte(); for (int k =1; k<=4; k++){ reset_packet(); delay(5); } amend_len4(msg[1]); assemble_4_byte(); cv_logic =false; delay(2); for (int m =1; m<=5; m++){ cv_verify1_packet(); cv_current();if (cv_logic){ cv_logic =false; CV_VAL =1; Serial.print("test_num =");Serial.println(test_num); Serial.println(CV_VAL); preamable_type =0; amend_len3(msg[1]); assemble_3_byte(); delay(5); for (int j =1; j<=3; j++){ reset_packet(); delay(5); }}}Serial.println("test for 0 "); amend_len3(msg[1]); assemble_3_byte(); for (int k =1; k<=4; k++){ reset_packet(); delay(5); } amend_len4(msg[1]); assemble_4_byte(); cv_logic =false; delay(2);for (int m =1; m<=5; m++){ cv_verify0_packet(); cv_current();if (cv_logic){ cv_logic =false; CV_VAL =0; Serial.print("test_num =");Serial.println(test_num); Serial.println(CV_VAL); preamable_type =0; amend_len3(msg[1]); assemble_3_byte(); delay(5); for (int j =1; j<=3; j++){ reset_packet(); delay(5); }}}Serial.println(CV_VAL);return CV_VAL; }
제조공정
구성품 및 소모품 Arduino Nano R3 × 1 PCBWay 맞춤형 PCB × 1 Espressif ESP8266 ESP-01 × 1 2채널 릴레이 모듈 × 1 LED(일반) × 2 브레드보드(일반) × 1 점퍼 와이어(일반) × 1 저항 1k 옴 × 2 저항 2.21k 옴 × 1 필요한 도구 및 기계 납땜 인두(일반)
이 튜토리얼에서는 Arduino 범위 측정기와 디지털 수준기를 만드는 방법을 배웁니다. 다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다. 개요 이 장치는 가장 가까운 물체까지의 거리를 측정하기 위한 초음파 센서, 지면에 대한 각도를 측정하기 위한 가속도계, 결과를 표시하는 LCD 디스플레이 및 모든 구성 요소가 연결된 맞춤형 설계 PCB를 갖추고 있습니다. 버튼 하나만으로 기기를 조작할 수 있습니다. 장치에 전원을 공급하면 측정 단위를 선택해야 합니다. 버튼을 눌러 단위를 전환할 수 있으며 잠시 동안 버튼