Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Estação de comando modelo Rail Digital DCC Arduino e aplicativo gratuito

Componentes e suprimentos

SparkFun Arduino Pro Mini 328 - 5 V / 16 MHz
× 1
LMD18200t
× 1
PCB
× 1
Regulador linear (7805)
× 1
Diodo Zener 3,6 V 0,5 W
× 1
Capacitor 220 µF
16 volts
× 1
Capacitor 10 µF
16 volts
× 1
Capacitor de disco de cerâmica, 0,1 µF
× 3
Resistor 10k ohm
× 2
Resistor de furo passante, 4,7 kohm
× 1
terminal de parafuso 2 posições centros de 3,5 mm, diâmetro de pino de 1,1 mm
× 1
terminal de parafuso 6 posições 2,54 mm centros
× 1
Soquete de 4 pinos 2,54 mm
× 1
12 pinos 2,54 mm soquete
× 2

Aplicativos e serviços online

LocoMotive
Esta é a versão gratuita do aplicativo
LocoMotive DCC
Esta é a versão mais recente, incluindo leitura / gravação de cv 1 a 255

Sobre este projeto






O que há de diferente neste sistema?
Um circuito eletrônico muito simples fornece o sinal DCC e energia para a pista, no entanto, o aplicativo faz o trabalho real! O computador em seu telefone é totalmente utilizado para construir os códigos necessários para formar cada pacote de instruções, simplificando assim o trabalho do controlador Arduino!

Atualização de 16 de agosto de 2019:lançamento de um novo aplicativo aprimorado - com facilidade de leitura / gravação de CV 1 a 255
Esta versão do aplicativo custa £ 5 mais impostos e está disponível na Google Play Store.





Atualização de 18 de maio de 2019:lançamento de um novo aplicativo aprimorado - até 28 funções com títulos editáveis, visibilidade e opções momentâneas. Controle até 4 locomotivas em um tempo com barras de velocidade na tela. Esta versão do aplicativo custa £ 3 mais impostos e está disponível na Google Play Store.

Atualização de 17 de fevereiro de 2019:talvez seja necessário modificar o módulo HC-06 Bluetooth para estender seu alcance de recepção. Eu adicionei um fio de cobre sólido (do fio terra principal) de 31,2 mm de comprimento (1/4 de comprimento de onda para 2,4 GHz). Veja a foto anexada na Etapa 2.

Atualização em 29 de janeiro de 2019:adição da opção momentânea em F2 e F3 para sons de buzina Velocidade máxima predefinida para cada locomotiva. Esta é a estação de comando DCC mais eficiente possível de construir. Nenhum outro sistema pode fazer tanto com tão poucos componentes. Uma estação de comando DCC totalmente funcional e fácil de montar com PCB disponível no eBay e requer apenas algumas peças. O aplicativo 'LocoMotive' foi projetado para operar em telefones Android com a versão 4.1 e superior . Não há necessidade de comprar nenhum sistema de propriedade, esta é uma unidade autônoma operada por um aplicativo gratuito chamado 'LocoMotive'Works com decodificadores compatíveis com NMRA. Este sistema compila os pacotes DCC operacionais dentro do aplicativo que são enviados para a interface do Arduino para combinar com os sinais de relógio DCC. Compre este PCB no eBay. Obtenha o App LocoMotive gratuitamente na Google Play Store. Os recursos incluem:
  • Controle de 1 a 20 locomotivas
  • Ideal para layouts de pequeno e médio porte
  • A carga de 2 amperes conduz até 16 das locomotivas OO / HO usando a ponte H especificada
  • Adicione uma ponte H compatível com corrente mais alta para estender a capacidade de carga
  • Curto-circuito protegido
  • Corte automático de sobrecorrente, ajustável no código Arduino
  • Luzes e direção
  • Funções 1 a 8
  • Editar nomes de funções, visibilidade e ação momentânea
  • Turnout / points / accessories opera até 8 pares de saídas
  • Editar nomes de participação
  • Nomenclatura personalizada para suas locomotivas e defina a velocidade máxima para cada uma
  • Programação do endereço loco CV1
  • Ler / escrever CV 1 a 255
  • Adicione seus próprios endereços de acessórios
  • Escolha uma fonte de alimentação DC para se adequar à escala usada (Z / N / OO / HO / O / G) 12v a 20v

Além do trabalho anterior em sistemas sem fio DCC, desenvolvi uma estação de comando Bluetooth ligada a um circuito receptor baseado em Arduino com um módulo HC-06 BT e um driver de motor LMD18200 H-bridge com 2 amperes.

O custo total das peças é de cerca de £ 20 com peças adquiridas no eBay.





Etapa 1:esboço do Arduino


O esboço completo está anexado. Esta parte é o código do loop e do receptor de dados. O Android App envia um pacote completo para o receptor e é decodificado aqui em uma matriz de dados. Dependendo se 3 ou 4 bytes são recebidos, o código irá gerar o formato de pacote DCC correto para a linha do trem.

void loop () {if (bluetooth.available ()> 0); {inString =bluetooth.readStringUntil ('\ n');} if (inString.substring (0, 1) =="D") {string ();} atraso (20);}

A string () void então divide os dados da string de texto recebida e coloca cada instrução em sua posição apropriada no pacote DCC.

Por exemplo:

Uma sequência de texto recebida de 'DD, 3, 63, 12, 48,' se traduz em um pacote de velocidade de 4 bytes de 8 bits cada:

DD =mensagem IDByte:[1] [2] [3] [4] Decimal:[3] [63] [12] [48] Binário:[0000 0011] [0001 1111] [0000 1100] [0001 1000] Ação :[Loco 3] [passos de velocidade] [velocidade loco] [verificação de dados XOR]

Uma sequência de texto recebida de 'DD, 1, 129, 128,' se traduz em um pacote de Função de 3 bytes de 8 bits cada:Decimal:[1] [129] [128] Binário:[0000 0001] [1000 0001] [1000 0000] Ação:[Loco 1] [F1 on] [verificação de dados XOR]

Para obter mais informações sobre o padrão de pacote NMRA, consulte:https://www.nmra.org/sites/default/files/s-9.2.1_2 ...
s-9.2.1_2012_07.pdf
O LMD requer o sinal DCC no pino DIR e o pino PWM mantido ALTO.


command_station_bluetooth_oct_2018.ino





Etapa 2:Diagrama de circuito de Fritzing


O Arduino Pro Mini recebe os dados Bluetooth por meio do módulo HC-06. O Arduino gera os ciclos de clock padrão NMRA de dados em formato de pacote. Os dados recebidos interrompem a sequência quando novos dados são recebidos e o pacote DCC é atualizado para enviar instruções aos trilhos do trem.

Lista de peças necessárias:

PCB disponível no eBay.

1 Arduino Pro Mini Atmega328P 5V / 16M eBay

1 fora do eBay da ponte H LMD18200T

1 módulo Bluetooth HC-06 eBay

1 Resistor de filme metálico 2W de 0,1 ohm 0,1R 2 Watt (11,5 mm x 4,5 mm) eBay

3 fora do Capacitor 0.1uf eBay

2 Resistor eBay de 10kΩ

1 fora do capacitor 10uf 25v; eBay



1 fora do Capacitor 220uf 16v; eBay

1 fora da Phoenix Contact MKDS 1 / 2-3, 5 2 vias parafuso PCB bloco terminal 13,5A 200 V 3,5 mm eBay

1 Resistor eBay de 4,7 kΩ desligado

1 desligado L7805 CV Regulador de Tensão Positiva IC eBay

1 tira de pinos de borda de cabeceira fêmea de 4 pinos 0,1 "2,54 mm eBay

Tira de pinos de borda fêmea de 12 pinos de 2 pinos 0,1 "2,54 mm eBay

1 bloco de terminais de parafuso universal PCB de 6 pinos 2,54 mm eBay

1 diodo Zener de 3,6 V; 0,5 W 1N4732A eBay

Fio

Fonte de alimentação:para layouts OO / HO, use uma fonte de alimentação de 14 V DC (por exemplo, carregador de laptop do eBay). Por exemplo, isso fornece até 2,5 Amps. Verifique o tamanho do soquete montado no painel necessário para encaixar o plugue DC na fonte de alimentação escolhida para este projeto. https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter -...

Para estender o alcance do módulo HC-06 Bt, solde um fio na extremidade da antena do módulo. Usei um fio de cobre sólido (do fio de aterramento da rede) de 31,2 mm de comprimento (1/4 do comprimento de onda para 2,4 GHz). Veja a foto acima. Observe - as conexões do HC-06 são Rx (no PCB) para Rx (no módulo) e Tx para Tx. Observe que o fio da antena deve ser coberto com uma capa para evitar curto-circuito acidental com outros componentes.

Para o uso de um módulo de ponte H LMD18200 (conforme exibido acima, ele está em forma de módulo com dissipador de calor, etc.), adicionei componentes de detecção de corrente para fornecer proteção contra curto-circuito ou problemas de sobrecarga na linha do trem, o diagrama de circuito atualizado e o Arduino o código agora inclui a função de detecção atual.

O código limita a corrente máxima a 2 Amps quando alcançada, o LMD18200 h-bridge é desligado aplicando um sinal HIGH de D13 no Arduino à entrada 'Brake' na h-bridge.

O uso de um resistor de detecção de corrente de 0,1 ohm fornece uma faixa de entrada analógica de 0 a 200 mv no pino A0 do sensor Arduino para carga de até 2 Amps. Para aproximadamente 5mv por entrada analógica de passo (total de 1023 passos ou divisões) dá 0 a 40 divisões ou 2 Amps / 40 =50mA por divisão. A precisão da corrente medida é de 50 mA, no entanto, estamos protegendo a ponte h quando 2 Amps são alcançados. O LMD18200 também possui proteção embutida contra temperatura excessiva como reserva. Se (C> 2000) {// 2 amps

Serial.println ("Over Current"); digitalWrite (13, ALTO); }

O valor da sacada atual é enviado ao aplicativo Android via Bluetooth a cada segundo.void send_c () {t =millis () - lastmillis; if (t> =intervalo) {bluetooth.write (sensorValue); bluetooth.write ('c'); lastmillis =millis (); }}





Etapa 3:Aplicativo Android


Baixe o aplicativo gratuito da Google Play Store - 'LocoMotive'

Baixe o aplicativo completo (£ 5,99) na Google Play Store - 'LocoMotive DCC'

As instruções estão anexadas para a versão completa do aplicativo.




Código

  • locomotive_dcc_sep19.ino
locomotive_dcc_sep19.ino Arduino
Código Arduino
 // 1 de setembro de 2019 // esboço para uso com Android App 'Locomotive DCC'using LMD18200 h-bridge // Instalação de leitura / gravação de CV adicionada # 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 Address; 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; booleano cv_logic; booleano ok; int num; // usar pinos digitais 6 e 5 booleanos; // A frequência do temporizador é 2MHz para (/ 8 pré-escala de 16MHz) #define TIMER_SHORT 0x8D // comprimento do pulso 58usec # define TIMER_LONG 0x1B // Comprimento do pulso 116usec unsigned char last_timer =TIMER_SHORT; // armazena o último valor do temporizador unsigned char flag =0; // usado para curto ou longo pulseunsigned char every_second_isr =0; // pulsar para cima ou para baixo // definições para máquina de estado #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 char xdata =0, data =0, data_f =0, data_f1 =0, data_f2 =0; int locoAdr =9; // este é o endereço padrão do loco // buffer para commandstruct Message {unsigned char data [7]; unsigned char len;}; #define MAXMSG 3 // por enquanto, use apenas 2 mensagens - o idle msg, o loco Speed ​​msg, function msgstruct Message msg [MAXMSG] ={{{0xFF, 0, 0xFF, 0, 0, 0, 0}, 3}, // mensagem ociosa {{locoAdr, 0, 0, 0, 0, 0, 0}, 3} // locoMsg com 128 passos de velocidade 0x3f}; // loco msg deve ser preenchido posteriormente com velocidade e byte de dados XOR int msgIndex =0; int byteIndex =0; // Setup Timer2.// Configura o 8-Bit Timer2 para gerar uma interrupção na frequência especificada.//Retorna o valor de carregamento de tempo que deve ser carregado em TCNT2 dentro de sua rotina ISR.void SetupTimer2 () { // Timer2 Settings:Timer Prescaler / 8, modo 0 // Timmer clock =16MHz / 8 =2MHz oder 0,5usec TCCR2A =0; TCCR2B =0 < =MAXMSG) {msgIndex =0; } byteIndex =0; // inicia a mensagem com byte 0} break; case SEPERATOR:flag =0; // pulso longo // então avança para o próximo estado state =SENDBYTE; // ir para o próximo byte ... cbit =0x80; // envie este bit da próxima vez primeiro outbyte =msg [msgIndex] .data [byteIndex]; pausa; case SENDBYTE:if (outbyte &cbit) {flag =1; // envia pulso curto} else {flag =0; // envia pulso longo} cbit =cbit>> 1; if (cbit ==0) {// último bit enviado, há um próximo byte? byteIndex ++; if (byteIndex> =msg [msgIndex] .len) {// este já era o byte XOR, então avance para o estado do preâmbulo =PREAMBLE; if (preamable_type ==0) {preamble_count =16; // comprimento normal do preâmbulo de 16 '1's} if (preamable_type ==1) {preamble_count =24; // preâmbulo de 24 '1's para CV1 escrever}} else {// enviar o separador e avançar para o próximo byte state =SEPERATOR; } } pausa; } if (sinalizar) {// se dados ==1 então latência de pulso curto =TCNT2; TCNT2 =latência + TIMER_SHORT; last_timer =TIMER_SHORT; } else {// latência de pulso longo =TCNT2; TCNT2 =latência + TIMER_LONG; last_timer =TIMER_LONG; }}} void setup () {Serial.begin (115200); analogReference (INTERNAL); pinMode (13, OUTPUT); bluetooth.begin (9600); atraso (500); // aguarde o módulo bluetooth iniciar Serial.println ("Bluetooth Started"); bluetooth.println ("Bluetooth iniciado"); DDRD =B01100000; // registrar D5 para o pino digital 5, D6 para o pino digital 6 // Iniciar o cronômetro SetupTimer2 (); t =millis (); lastmillis =millis (); digitalWrite (6, LOW); digitalWrite (13, HIGH); // desativa a ponte o / p get_cv_val =cv_calc (test_num);} void current () {int i; valor int =0; int numReadings =5; for (i =0; i  2000) {// 2 amps Serial.println ("Over Current"); bluetooth.println ("Curto!"); digitalWrite (6, BAIXO); // controle lógico do sinal DCC para baixo (desligado) digitalWrite (13, HIGH); // para frear, coloca em curto o h-bridge o / p bluetooth.println (C); }} void loop () {if (bluetooth.available () ==true); {inString =bluetooth.readStringUntil ('\ n'); Serial.println (inString); } if (inString.substring (0,1) =="D") {string (); } // pacote DCC de entrada if (inString.substring (0,1) =="C") {digitalWrite (6, HIGH); digitalWrite (13, BAIXO); } // reset após sobrecorrente, controle lógico do sinal DCC ligado, freio desligado if (inString.substring (0,1) =="G") {digitalWrite (6, HIGH); digitalWrite (13, BAIXO); atual(); bluetooth.println (C);} // solicitação para carregar o valor atual if (inString.substring (0,1) =="A") {digitalWrite (6, HIGH); digitalWrite (13, BAIXO); get_cv_data (); cv1_prog (); digitalWrite (6, BAIXO); digitalWrite (13, HIGH);} if (inString.substring (0,3) =="get") {cv_val =0; digitalWrite (6, ALTO); digitalWrite (13, BAIXO); get_cv_num (); cv_read (); digitalWrite (6, BAIXO); digitalWrite (13, ALTO); } if (inString.substring (0,3) =="add") {cv_write_val =0; digitalWrite (6, ALTO); digitalWrite (13, BAIXO); get_cv_new_val (); repeat_cv_write (); digitalWrite (6, BAIXO); digitalWrite (13, ALTO); } if (inString.substring (0,1) =="V") {delay (50); bluetooth.print ("CV1 atualizado"); Serial.println (Address);} // cv1 write if (inString.substring (0,1) =="E") {digitalWrite (6, LOW); // controle lógico do sinal DCC para baixo (desligado) digitalWrite (13, HIGH); // para frear, provoca um curto-circuito na h-bridge o / p} // e-stop inString =""; } void get_cv_new_val () {Serial.println (inString); String cv_w =""; int x =inString.indexOf ("novo,") + 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); String addr =""; int z =inString.indexOf ("addr,") + 5; addr =inString.substring (z, z + 1); Serial.println (addr); Endereço =addr.toInt (); Serial.print ("Endereço:"); Serial.println (Endereço); } void get_cv_num () {cv_write_val =0; Serial.println (inString); String temp =""; int x =inString.indexOf (",") + 1; temp =inString.substring (x, 8); Serial.println (temp); Endereço =temp.toInt (); Serial.print ("Endereço:"); Serial.println (Endereço); } void get_cv_data () {unsigned long z =inString.length (); int y =0; contagem interna =0; String inChar; String temp =""; para (int i =0; i <=z; i ++) {inChar =inString.substring (i, i + 1); if (inChar ==",") {contagem ++;} if (inChar! ="," &&inChar! ="A") {temp + =inChar;} if (inChar ==",") {Endereço =(temp .toInt ()); y =y +1; temp ="";}} correct_len3 (msg [1]); assemble_3_byte (); Serial.println (inString); } void string () {unsigned long z =inString.length (); int y =0; para (int i =0; i <=5; i ++) {a [i] =0; } contagem interna =0; String inChar; String temp =""; para (int i =0; i <=z; i ++) {inChar =inString.substring (i, i + 1); if (inChar ==",") {contagem ++; } if (inChar! ="," &&inChar! ="D") {temp + =inChar; } if (inChar ==",") {a [y] =(temp.toInt ()); y =y +1; temp =""; }} if (count ==3) {//Serial.println(inString); // print_data (); emendar_len3 (msg [1]); assemble_3_byte (); } if (count ==4) {//Serial.println(inString); // print_data (); emendar_len4 (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 (); } void alteração_len4 (struct Message &x) {x.len =4; //Serial.println(x.len);}void assemble_4_byte () {preamable_type =0; // 16 x '1's noInterrupts (); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; msg [1] .data [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]); interrupts ();} void alteração_len3 (struct Message &x) {x.len =3; //Serial.println(x.len);}void assemble_3_byte () {preamable_type =0; // 16 x '1's noInterrupts (); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; msg [1] .data [0] =a [1]; msg [1] .data [1] =a [2]; msg [1] .data [2] =(a [1] ^ a [2]); msg [1] .data [3] =0; interrupções (); } void 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 * sensorValue; // mA if (C> =Cs) {cv_logic =true; } atraso Microssegundos (500); Serial.print ("C ="); Serial.println (C);}} void cv_read () {cv_val =0; atraso (200); atual(); if (bluetooth.available () ==true); {bluetooth.print ("reading .."); } Cs =C + 50; CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val0 =cv_calc (0); atraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val1 =cv_calc (1); atraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val2 =cv_calc (2); atraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val3 =cv_calc (3); atraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val4 =cv_calc (4); atraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val5 =cv_calc (5); atraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val6 =cv_calc (6); atraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val7 =cv_calc (7); atraso (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; cv_val =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 ("ler =erro"); } if (cv_val_total <9) {bluetooth.print ("read ="); bluetooth.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 (); atraso (5); } para (int i =0; i <=5; i ++) {page_preset_packet (); atraso (5); } para (int i =0; i <=9; i ++) {reset_packet (); atraso (5); } para (int i =0; i <=5; i ++) {cv1_write_packet (); atraso (5); } current (); para (int i =0; i <=10; i ++) {cv1_write_packet (); atraso (5); }} void 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; interrupts ();} void page_preset_packet () {noInterrupts (); preamable_type =0; // mensagem de 16 x '1's [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; interrupts ();} void cv1_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] =B01111000; // Modo de endereço apenas msg [1] .data [1] =B00000000 | Endereço; 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; // modo de manipulação de bits msg [1] .data [1] =B00000000 | (Endereço 1); msg [1] .data [2] =B11101000 | num; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1]) ^ msg [1] .data [2]; interrupções (); } 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; // modo de manipulação de bits msg [1] .data [1] =B00000000 | (Endereço 1); msg [1] .data [2] =B11100000 | num; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1]) ^ msg [1] .data [2]; interrupções (); } 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; // modo de gravação msg [1] .data [1] =B00000000 | (Endereço 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]; interrupções (); } 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] =(Endereço - 1); msg [1] .data [1] =0x80; // locoMsg com instrução de grupo um 0x80 msg [1] .data [2] =msg [1] .data [0] ^ msg [1] .data [1]; msg [1] .data [3] =0; interrupts ();} // CV Writeevoid 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 ("escrevendo .."); } ok =falso; para (int f =1; f <=10; f ++) {if (ok ==false) {cv_write (); atraso (10); }}} void cv_write () {delay (100); emendar_len3 (msg [1]); assemble_3_byte (); atraso (5); para (int i =1; i <=20; i ++) {pacote_válido (); atraso (5); } para (int i =1; i <=6; i ++) {reset_packet (); atraso (5); } cv_logic =false; emendar_len4 (msg [1]); assemble_4_byte (); para (int i =1; i <=10; i ++) {cv_write_packet (); cv_current (); Serial.print ("C ="); Serial.println (C); if (cv_logic) {ok =verdadeiro; cv_logic =false; i =11; emendar_len3 (msg [1]); assemble_3_byte (); para (int i =1; i <=10; i ++) {reset_packet (); atraso (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) {alteração_len3 (msg [1]); assemble_3_byte (); atraso (5); para (int i =1; i <=20; i ++) {pacote_válido (); atraso (5); } num =test_num; emendar_len3 (msg [1]); assemble_3_byte (); para (int k =1; k <=4; k ++) {reset_packet (); atraso (5); } emendar_len4 (msg [1]); assemble_4_byte (); cv_logic =false; atraso (2); para (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; emendar_len3 (msg [1]); assemble_3_byte (); atraso (5); para (int j =1; j <=3; j ++) {reset_packet (); atraso (5); }}} Serial.println ("teste para 0"); emendar_len3 (msg [1]); assemble_3_byte (); para (int k =1; k <=4; k ++) {reset_packet (); atraso (5); } emendar_len4 (msg [1]); assemble_4_byte (); cv_logic =false; atraso (2); para (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; emendar_len3 (msg [1]); assemble_3_byte (); atraso (5); para (int j =1; j <=3; j ++) {reset_packet (); atraso (5); }}} Serial.println (CV_VAL); retornar CV_VAL; } 

Peças personalizadas e gabinetes

Circuito completo dentro do gabinete

Esquemas

Receptor Bluetooth / circuito amplificador H-Bridge bluetooth_android_dcc_lmd18200_S8NTVsI4LY.fzzApp instruções

Processo de manufatura

  1. MrRobot - Robótica habilitada para aplicativo Ubuntu Mobile (Raspberry Pi e arduino envolvidos)
  2. 6-Shooter:Estação de Mistura de Bebidas Arduino
  3. Dados digitais Arduino
  4. Controlador de jogo Arduino
  5. Animação de LCD e jogos
  6. Sapatos inteligentes (com laço automático e geração de eletricidade)
  7. Sonar usando arduino e exibição no IDE de processamento
  8. Jogo Pixel Chaser
  9. Controle de brilho do LED usando Bolt e Arduino
  10. $ 10 Estação meteorológica portátil Arduino (AWS)