산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

모델 레일 디지털 DCC 명령 스테이션 Arduino 및 무료 앱

구성품 및 소모품

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
LMD18200t
× 1
PCB
× 1
선형 조정기(7805)
× 1
3.6V 0.5W 제너 다이오드
× 1
커패시터 220μF
16볼트
× 1
커패시터 10μF
16볼트
× 1
세라믹 디스크 커패시터, 0.1μF
× 3
저항 10k 옴
× 2
스루 홀 저항기, 4.7kohm
× 1
스크류 터미널 2 위치 3.5mm 중심, 1.1mm 핀 직경
× 1
스크류 터미널 6 위치 2.54mm 중심
× 1
4핀 2.54mm 소켓
× 1
12핀 2.54mm 소켓
× 2

앱 및 온라인 서비스

로코모티브
이 앱은 무료 버전입니다.
로코모티브 DCC
이것은 cv 1 ~ 255의 읽기/쓰기를 포함한 최신 버전입니다.

이 프로젝트 정보

이 시스템의 차이점은 무엇입니까?
매우 간단한 전자 회로가 트랙에 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를 받으세요. 기능은 다음과 같습니다.

<울>
  • 1~20개 위치 제어
  • 중소 규모 레이아웃에 이상적
  • 지정된 H 브리지를 사용하여 최대 16대의 OO/HO 기관차를 구동하는 2A의 부하
  • 부하 용량 확장을 위해 더 높은 전류 호환 h-브리지 추가
  • 단락 보호
  • 자동 과전류 차단, Arduino 코드에서 조정 가능
  • 조명 및 방향
  • 기능 1~8
  • 기능 이름, 가시성 및 일시적인 작업 수정
  • 출력/포인트/액세서리는 최대 8쌍의 출력으로 작동합니다.
  • 투표 이름 수정
  • 로코스의 사용자 지정 이름 지정 및 각각의 최대 속도 설정
  • CV1 주소 프로그래밍
  • 이력서 1~255 읽기/쓰기
  • 나만의 액세서리 주소 추가
  • 사용된 규모에 맞게 DC 전원 선택(Z/N/OO/HO/O/G) 12v ~ 20v
  • 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.pdf

    LMD는 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="코드">

    코드

    <울>
  • 기관차_dcc_sep19.ino
  • locomotive_dcc_sep19.ino아두이노
    Arduino 코드
    // 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; }

    Custom parts and enclosures

    Complete circuit within enclosure

    Schematics

    Bluetooth receiver / H-Bridge amplifier circuit bluetooth_android_dcc_lmd18200_S8NTVsI4LY.fzzApp instructions

    제조공정

    1. MrRobot – Ubuntu Mobile 앱 지원 Robotics(Raspberry Pi 및 arduino 관련)
    2. 6-Shooter:Arduino 음료 혼합 스테이션
    3. Arduino 디지털 주사위
    4. Arduino 게임 컨트롤러
    5. LCD 애니메이션 및 게임
    6. 스마트 신발(자동 끈 및 전기 생성)
    7. arduino를 사용한 소나 및 IDE 처리 시 표시
    8. 픽셀 체이서 게임
    9. 볼트와 Arduino를 사용하여 LED 밝기 제어
    10. $10 휴대용 Arduino 기상 관측소(AWS)