Model Rail Digital DCC Command Station Arduino y aplicación gratuita
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 |
Aplicaciones y servicios en línea
| ||||
|
Acerca de este proyecto
¿Qué tiene de diferente este sistema?
Un circuito electrónico muy simple proporciona la señal DCC y la energía para la pista, ¡sin embargo, la aplicación hace el trabajo real! La computadora de su teléfono se utiliza al máximo al construir los códigos necesarios para formar cada paquete de instrucciones, ¡simplificando así el trabajo del controlador Arduino!
Actualización del 16 de agosto de 2019:lanzamiento de una nueva aplicación mejorada, con capacidad para leer / escribir CV 1 a 255
Esta versión de la aplicación cuesta £ 5 más impuestos y está disponible en Google Play Store.
Actualización del 18 de mayo de 2019:lanzamiento de una nueva aplicación mejorada:hasta 28 funciones con títulos editables, visibilidad y opciones momentáneas. Controla hasta 4 locomotoras a la vez con barras de velocidad en la pantalla. Esta versión de la aplicación cuesta £ 3 más impuestos y está disponible en Google Play Store.
Actualización 17 de febrero de 2019:es posible que deba modificar el módulo Bluetooth HC-06 para ampliar su rango de recepción. Agregué un cable de cobre sólido (del cable de tierra de la red eléctrica) de 31,2 mm de longitud (1/4 de longitud de onda para 2,4 GHz). Vea la foto adjunta en el paso 2.
Actualización 29 de enero de 2019:adición de la opción momentánea en F2 y F3 para sonidos de bocina Velocidad máxima preestablecida para cada locomotora Esta es la estación de comando DCC más eficiente posible de construir. Ningún otro sistema puede hacer tanto con tan pocos componentes.Una estación de comando DCC completamente funcional y fácil de ensamblar con PCB disponible en eBay y que requiere solo unas pocas piezas.La aplicación 'LocoMotive' está diseñada para funcionar en teléfonos Android con versión 4.1 y superior . No es necesario comprar ningún sistema propietario, esta es una unidad independiente operada por una aplicación gratuita llamada 'LocoMotive' funciona con decodificadores compatibles con NMRA. Este sistema compila los paquetes DCC operativos dentro de la aplicación que se envían a la interfaz Arduino para combinarlos con las señales de reloj DCC. Compre este PCB en eBay. Obtenga la aplicación gratuita LocoMotive en Google Play Store. Las características incluyen:
- Control de 1 a 20 locomotoras
- Ideal para diseños de tamaño pequeño a mediano
- La carga de 2 amperios impulsa hasta 16 de las locomotoras OO / HO usando el puente H especificado
- Agregue un puente en h compatible con corriente más alta para extender la capacidad de carga
- Protegido contra cortocircuitos
- Corte automático de sobrecorriente, ajustable en código Arduino
- Luces y dirección
- Funciones 1 a 8
- Edite los nombres de las funciones, la visibilidad y la acción momentánea
- Turnout / points / accessories opera hasta 8 pares de salidas
- Edite los nombres de los participantes
- Nombre personalizado de sus locomotoras y establezca la velocidad máxima para cada una
- Programación de la dirección de la locomotora CV1
- Leer / escribir CV 1 a 255
- Agregue sus propias direcciones de accesorios
- Elija una fuente de alimentación de CC que se adapte a la escala utilizada (Z / N / OO / HO / O / G) 12v a 20v
Además del trabajo anterior en sistemas inalámbricos DCC, he desarrollado una estación de comando Bluetooth vinculada a un circuito receptor basado en Arduino con un módulo HC-06 BT y un controlador de motor de puente H LMD18200 que entrega 2 amperios.
El costo total de las piezas es de alrededor de £ 20 con las piezas compradas en eBay.
Paso 1:Bosquejo de Arduino
Se adjunta el croquis completo. Esta parte es el código del receptor de datos y bucle. La aplicación de Android envía un paquete completo al receptor y se decodifica aquí en una matriz de datos. Dependiendo de si se reciben 3 o 4 bytes, el código generará el formato de paquete DCC correcto para la vía del tren.
bucle vacío () {if (bluetooth.available ()> 0); {inString =bluetooth.readStringUntil ('\ n');} if (inString.substring (0, 1) =="D") {string ();} retraso (20);}
El string () void luego divide los datos de la cadena de texto recibida y coloca cada instrucción en su posición apropiada en el paquete DCC.
Por ejemplo:
Una cadena de texto recibida de 'DD, 3, 63, 12, 48' se traduce en un paquete Speed de 4 bytes de 8 bits cada uno:
DD =mensaje IDByte:[1] [2] [3] [4] Decimal:[3] [63] [12] [48] Binario:[0000 0011] [0001 1111] [0000 1100] [0001 1000] Acción :[Loco 3] [pasos de velocidad] [velocidad de la locomotora] [Verificación de datos XOR]
Una cadena de texto recibida de 'DD, 1, 129, 128' se traduce en un paquete de funciones de 3 bytes de 8 bits cada uno:Decimal:[1] [129] [128] Binario:[0000 0001] [1000 0001] [1000 0000] Acción:[Loco 1] [F1 activado] [Verificación de datos XOR]
Para obtener más información sobre el estándar de paquetes NMRA, consulte:https://www.nmra.org/sites/default/files/s-9.2.1_2 ...
s-9.2.1_2012_07.pdfEl LMD requiere la señal DCC en el pin DIR y el pin PWM en ALTO.
command_station_bluetooth_oct_2018.ino
Paso 2:diagrama de circuito de Fritzing
El Arduino Pro Mini recibe los datos de Bluetooth a través del módulo HC-06. El Arduino genera los ciclos de reloj estándar NMRA de datos en formato de paquete. Los datos recibidos interrumpen la secuencia cuando se reciben nuevos datos y el paquete DCC se actualiza para enviar instrucciones a las vías del tren.
Lista de piezas necesarias:
PCB disponible en eBay.
1 descuento en Arduino Pro Mini Atmega328P 5V / 16M eBay
1 descuento en LMD18200T H-bridge eBay
1 módulo de Bluetooth HC-06 de descuento en eBay
1 resistencia de película metálica de 0,1 ohmios 2 W 0,1 R 2 vatios (11,5 mm x 4,5 mm) eBay
3 de descuento en el condensador 0.1uf eBay
2 de descuento en eBay de resistencia de 10kΩ
1 condensador 10uf 25v; eBay
1 condensador 220uf 16v; eBay
1 descuento en Phoenix Contact MKDS 1 / 2-3, 5 Bloque de terminales de PCB de tornillo de 2 vías 13.5A 200V 3.5mm eBay
1 de descuento en eBay de resistencia de 4,7 kΩ
1 descuento L7805 CV regulador de voltaje positivo IC eBay
1 de 4 clavijas, hembra, encabezado, borde, tira de clavijas, 0,1 ", 2,54 mm, eBay
2 de 12 pines Hembra Encabezado Borde Pernos Tira 0.1 "2.54mm eBay
1 bloque de terminales de tornillo universal PCB de 6 pines y 2,54 mm eBay
1 diodo Zener de 3,6 V; 0,5 W 1N4732A eBay
Alambre
Fuente de alimentación:para diseños OO / HO, utilice una fuente de alimentación de 14 V CC (por ejemplo, una unidad de carga para computadora portátil de eBay). Por ejemplo, esto ofrece hasta 2,5 amperios. Verifique el tamaño de la toma de montaje en panel que se requiere para encajar el conector de CC en la fuente de alimentación elegida para este proyecto. https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter -...
Para ampliar el alcance del módulo HC-06 Bt, suelde un cable en el extremo de la antena del módulo. Utilicé un cable de cobre sólido (del cable de tierra de la red eléctrica) de 31,2 mm de longitud (1/4 de la longitud de onda para 2,4 GHz). Vea la foto de arriba.Tenga en cuenta que las conexiones del HC-06 son Rx (en PCB) a Rx (en el módulo) y Tx a Tx. Tenga en cuenta que el cable de la antena debe cubrirse con una funda para evitar un cortocircuito accidental con otros componentes.
Para el uso de un módulo de puente en h LMD18200 (como se muestra arriba, esto está en forma de módulo con disipador de calor, etc.), he agregado componentes de detección de corriente para brindar protección contra problemas de cortocircuito o sobrecarga en la vía del tren, el diagrama de circuito actualizado y Arduino El código ahora incluye la función de detección actual.
El código limita la corriente máxima a 2 amperios cuando se alcanza, el puente h LMD18200 se apaga aplicando una señal ALTA de D13 en el Arduino a la entrada 'Freno' en el puente h.
El uso de una resistencia de detección de corriente de 0,1 ohmios proporciona un rango de entrada analógica de 0 a 200 mv en el pin A0 del sensor Arduino para una carga de hasta 2 amperios. Para aproximadamente 5mv por entrada de paso analógico (1023 pasos o divisiones totales) da 0 a 40 divisiones o 2 Amps / 40 =50mA por división. La precisión de la corriente medida es de 50 mA; sin embargo, estamos protegiendo el puente h cuando se alcanzan los 2 amperios. El LMD18200 también tiene una protección contra sobrecalentamiento incorporada como respaldo. Si (C> 2000) {// 2 amperios
Serial.println ("Sobre corriente"); escritura digital (13, ALTA); }
El valor de la corriente extraída se envía a la aplicación de Android a través de Bluetooth cada segundo. Void send_c () {t =millis () - lastmillis; if (t> =intervalo) {bluetooth.write (sensorValue); bluetooth.write ('c'); lastmillis =millis (); }}
Paso 3:aplicación de Android
Descargue la aplicación gratuita de Google Play Store - 'LocoMotive'
Descargue la aplicación completa (£ 5.99) de Google Play Store - 'LocoMotive DCC'
Se adjuntan instrucciones para la versión completa de la aplicación.
Código
- locomotive_dcc_sep19.ino
locomotora_dcc_sep19.ino Arduino
Código Arduino// 1 de septiembre de 2019 // boceto para usar con la aplicación de Android 'Locomotive DCC' usando LMD18200 h-bridge // Se agregó la función de lectura / escritura de CV # incluyeSoftwareSerial 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; boolean cv_logic; boolean ok; int num y 5 para usar DCC pines digitales 6 // La frecuencia del temporizador es 2MHz para (/ 8 preescala desde 16MHz) #define TIMER_SHORT 0x8D // 58usec longitud de pulso #define TIMER_LONG 0x1B // 116usec longitud de pulso unsigned char last_timer =TIMER_SHORT; // almacena el último valor del temporizador unsigned char flag =0; // se usa para char sin signo de pulso corto o largo every_second_isr =0; // pulsa hacia arriba o hacia abajo // definiciones para la máquina de estado #define PREAMBLE 0 #define SEPERATOR 1 # define SENDBYTE 2unsigned char state =PREAMBLE; unsigned char premble_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; // esta es la dirección predeterminada de la locomotora // búfer para commandtruct Mensaje {unsigned char data [7]; unsigned char len;}; #define MAXMSG 3 // por el momento, utilice solo 2 mensajes:el mensaje inactivo, el mensaje de velocidad de la locomotora, la función msgstruct Mensaje de mensaje [MAXMSG] ={{{0xFF, 0, 0xFF, 0, 0, 0, 0}, 3}, // mensaje inactivo {{locoAdr, 0, 0, 0, 0, 0, 0}, 3} // locoMsg con 128 pasos de velocidad 0x3f}; // loco msg debe llenarse más tarde con la velocidad y el byte de datos XOR int msgIndex =0; int byteIndex =0; // Setup Timer2.//Configura el Timer2 de 8 bits para generar una interrupción a la frecuencia especificada .// Devuelve el valor de carga de tiempo que debe cargarse en TCNT2 dentro de su rutina ISR.void SetupTimer2 () { // Configuración del Timer2:Timer Prescaler / 8, mode 0 // Timmer clock =16MHz / 8 =2MHz oder 0,5usec TCCR2A =0; TCCR2B =0 < =MAXMSG) {msgIndex =0; } byteIndex =0; // iniciar mensaje con byte 0} break; caso SEPERATOR:bandera =0; // pulso largo // luego avanza al siguiente estado state =SENDBYTE; // ir al siguiente byte ... cbit =0x80; // envía este bit la próxima vez first outbyte =msg [msgIndex] .data [byteIndex]; descanso; caso SENDBYTE:if (outbyte &cbit) {flag =1; // enviar pulso corto} else {flag =0; // enviar pulso largo} cbit =cbit>> 1; if (cbit ==0) {// último bit enviado, ¿hay un byte siguiente? byteIndex ++; if (byteIndex> =msg [msgIndex] .len) {// este ya era el byte XOR entonces avanza al estado del preámbulo =PREÁMBULO; if (tipo_preámbulo ==0) {recuento_preámbulo =16; // longitud normal del preámbulo de 16 '1's} if (preamable_type ==1) {premble_count =24; // preámbulo de 24 '1's para escritura CV1}} else {// enviar separtor y avanzar al siguiente byte state =SEPERATOR; } } descanso; } if (bandera) {// si datos ==1 entonces latencia de pulso corto =TCNT2; TCNT2 =latencia + TIMER_SHORT; last_timer =TIMER_SHORT; } else {// latencia de pulso largo =TCNT2; TCNT2 =latencia + TIMER_LONG; last_timer =TIMER_LONG; }}} void setup () {Serial.begin (115200); analogReference (INTERNAL); pinMode (13, OUTPUT); bluetooth.begin (9600); retraso (500); // espera a que se inicie el módulo bluetooth Serial.println ("Bluetooth iniciado"); bluetooth.println ("Bluetooth iniciado"); DDRD =B01100000; // registra D5 para el pin digital 5, D6 para el pin digital 6 // Inicia el temporizador SetupTimer2 (); t =millis (); lastmillis =millis (); digitalWrite (6, LOW); digitalWrite (13, HIGH); // apaga el puente o / p offint get_cv_val =cv_calc (test_num);} void current () {int i; valor int =0; int numReadings =5; for (i =0; i 2000) {// 2 amperios Serial.println ("Sobrecorriente"); bluetooth.println ("¡Corto!"); digitalWrite (6, BAJO); // control lógico de la señal DCC a baja (desactivada) digitalWrite (13, HIGH); // para frenar, cortocircuita el puente h o / p bluetooth.println (C); }} bucle vacío () {if (bluetooth.available () ==true); {inString =bluetooth.readStringUntil ('\ n'); Serial.println (inString); } if (inString.substring (0,1) =="D") {cadena (); } // paquete DCC entrante if (inString.substring (0,1) =="C") {digitalWrite (6, HIGH); digitalWrite (13, BAJO); } // restablecer después de sobrecorriente, control lógico de la señal DCC activado, freno desactivado if (inString.substring (0,1) =="G") {digitalWrite (6, HIGH); digitalWrite (13, BAJO); Actual(); bluetooth.println (C);} // solicitud de carga valor actual if (inString.substring (0,1) =="A") {digitalWrite (6, HIGH); digitalWrite (13, BAJO); get_cv_data (); cv1_prog (); digitalWrite (6, BAJO); digitalWrite (13, HIGH);} if (inString.substring (0,3) =="get") {cv_val =0; escritura digital (6, ALTA); digitalWrite (13, BAJO); get_cv_num (); cv_read (); digitalWrite (6, BAJO); escritura digital (13, ALTA); } if (inString.substring (0,3) =="agregar") {cv_write_val =0; escritura digital (6, ALTA); digitalWrite (13, BAJO); get_cv_new_val (); repeat_cv_write (); digitalWrite (6, BAJO); escritura digital (13, ALTA); } if (inString.substring (0,1) =="V") {delay (50); bluetooth.print ("CV1 actualizado"); Serial.println (Dirección);} // cv1 write if (inString.substring (0,1) =="E") {digitalWrite (6, LOW); // control lógico de la señal DCC a baja (desactivada) digitalWrite (13, HIGH); // para frenar, cortocircuita el puente h o / p} // e-stop inString =""; } void get_cv_new_val () {Serial.println (inString); String cv_w =""; int x =inString.indexOf ("nuevo") + 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 ("dirección") + 5; addr =inString.substring (z, z + 1); Serial.println (dirección); Dirección =addr.toInt (); Serial.print ("Dirección:"); Serial.println (Dirección); } vacío 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); Dirección =temp.toInt (); Serial.print ("Dirección:"); Serial.println (Dirección); } void get_cv_data () {unsigned long z =inString.length (); int y =0; int count =0; String inChar; String temp =""; para (int i =0; i <=z; i ++) {inChar =inString.substring (i, i + 1); if (inChar ==",") {count ++;} if (inChar! ="," &&inChar! ="A") {temp + =inChar;} if (inChar ==",") {Address =(temp .toInt ()); y =y +1; temp ="";}} modificar_len3 (msg [1]); ensamblar_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; } int count =0; String inChar; String temp =""; para (int i =0; i <=z; i ++) {inChar =inString.substring (i, i + 1); if (inChar ==",") {count ++; } if (inChar! ="," &&inChar! ="D") {temp + =inChar; } if (inChar ==",") {a [y] =(temp.toInt ()); y =y +1; temp =""; }} if (cuenta ==3) {//Serial.println(inString); // imprimir_datos (); enmendar_len3 (msg [1]); ensamblar_3_byte (); } if (cuenta ==4) {//Serial.println(inString); // imprimir_datos (); enmendar_len4 (msg [1]); ensamblar_4_byte (); } //Serial.println(inString); //Serial.println(a[1]); // Serial.println (a [2]); //Serial.println(a[3]); //Serial.println(a[4]); // imprimir_datos (); } void modificar_len4 (estructura Mensaje &x) {x.len =4; //Serial.println(x.len);}void assembly_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]); interrupciones ();} void modificar_len3 (estructura Mensaje &x) {x.len =3; //Serial.println(x.len);}void ensamblar_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; interrumpe (); } 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; } delayMicroseconds (500); Serial.print ("C ="); Serial.println (C);}} void cv_read () {cv_val =0; retraso (200); Actual(); if (bluetooth.available () ==true); {bluetooth.print ("leyendo .."); } Cs =C + 50; CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val0 =cv_calc (0); retraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val1 =cv_calc (1); retraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val2 =cv_calc (2); retraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val3 =cv_calc (3); retraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val4 =cv_calc (4); retraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val5 =cv_calc (5); retraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val6 =cv_calc (6); retraso (10); }} CV_VAL =99; para (int f =1; f <=10; f ++) {if (CV_VAL ==99) {cv_val7 =cv_calc (7); retraso (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 ("leer =error"); } if (cv_val_total <9) {bluetooth.print ("leer ="); 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 (); retraso (5); } para (int i =0; i <=5; i ++) {page_preset_packet (); retraso (5); } para (int i =0; i <=9; i ++) {reset_packet (); retraso (5); } para (int i =0; i <=5; i ++) {cv1_write_packet (); retraso (5); } actual (); para (int i =0; i <=10; i ++) {cv1_write_packet (); retraso (5); }} vacío 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; interrupciones ();} void 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; interrupciones ();} 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 solo dirección msg [1] .data [1] =B00000000 | Habla a; msg [1] .data [2] =(msg [1] .data [0] ^ msg [1] .data [1]); interrupciones ();} 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 manipulación de bits msg [1] .data [1] =B00000000 | (Dirección 1); msg [1] .data [2] =B11101000 | num; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1]) ^ msg [1] .data [2]; interrumpe (); } 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 manipulación de bits msg [1] .data [1] =B00000000 | (Dirección 1); msg [1] .data [2] =B11100000 | num; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1]) ^ msg [1] .data [2]; interrumpe (); } vacío 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 escritura msg [1] .data [1] =B00000000 | (Dirección 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]; interrumpe (); } 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] =(Dirección - 1); msg [1] .data [1] =0x80; // locoMsg con instrucción de grupo uno 0x80 msg [1] .data [2] =msg [1] .data [0] ^ msg [1] .data [1]; msg [1] .data [3] =0; interrupciones ();} // 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 ("escribiendo .."); } ok =falso; for (int f =1; f <=10; f ++) {if (ok ==false) {cv_write (); retraso (10); }}} void cv_write () {retraso (100); enmendar_len3 (msg [1]); ensamblar_3_byte (); retraso (5); para (int i =1; i <=20; i ++) {paquete_valido (); retraso (5); } para (int i =1; i <=6; i ++) {reset_packet (); retraso (5); } cv_logic =falso; enmendar_len4 (msg [1]); ensamblar_4_byte (); para (int i =1; i <=10; i ++) {cv_write_packet (); cv_current (); Serial.print ("C ="); Serial.println (C); if (cv_logic) {ok =verdadero; cv_logic =falso; i =11; enmendar_len3 (msg [1]); ensamblar_3_byte (); para (int i =1; i <=10; i ++) {reset_packet (); retraso (5); } if (bluetooth.available () ==true); {bluetooth.print ("escribir ="); bluetooth.println (cv_write_val); Serial.print ("cv_write_val"); Serial.println (cv_write_val); }}} if (bluetooth.available () ==true); {if (ok ==false) {bluetooth.print ("escribir =error"); }}} int cv_calc (int test_num) {modificar_len3 (msg [1]); ensamblar_3_byte (); retraso (5); para (int i =1; i <=20; i ++) {paquete_valido (); retraso (5); } num =test_num; enmendar_len3 (msg [1]); ensamblar_3_byte (); para (int k =1; k <=4; k ++) {reset_packet (); retraso (5); } enmendar_len4 (mensaje [1]); ensamblar_4_byte (); cv_logic =falso; retraso (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; enmendar_len3 (msg [1]); ensamblar_3_byte (); retraso (5); para (int j =1; j <=3; j ++) {reset_packet (); retraso (5); }}} Serial.println ("prueba para 0"); enmendar_len3 (msg [1]); ensamblar_3_byte (); para (int k =1; k <=4; k ++) {reset_packet (); retraso (5); } enmendar_len4 (msg [1]); ensamblar_4_byte (); cv_logic =falso; retraso (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; enmendar_len3 (msg [1]); ensamblar_3_byte (); retraso (5); para (int j =1; j <=3; j ++) {reset_packet (); retraso (5); }}} Serial.println (CV_VAL); return CV_VAL; }
Piezas y carcasas personalizadas
Circuito completo dentro del recintoEsquemas
Receptor Bluetooth / circuito amplificador H-Bridge bluetooth_android_dcc_lmd18200_S8NTVsI4LY.fzz Instrucciones de la aplicaciónProceso de manufactura
- MrRobot - Robotics habilitado para la aplicación Ubuntu Mobile (Raspberry Pi y arduino involucrados)
- 6-Shooter:Arduino Drink Mixing Station
- Dados digitales Arduino
- Controlador de juego Arduino
- Animación LCD y juegos
- Zapatos inteligentes (autoajuste y generación de electricidad)
- Sonda usando arduino y visualización en procesamiento IDE
- Pixel Chaser Game
- Control del brillo del LED usando Bolt y Arduino
- $ 10 Estación meteorológica portátil Arduino (AWS)
- Python3 y comunicación Arduino