Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Station de commande numérique DCC de modélisme ferroviaire Arduino et application gratuite

Composants et fournitures

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
LMD18200t
× 1
PCB
× 1
Régulateur linéaire (7805)
× 1
Diode Zener 3,6 V 0,5 W
× 1
Condensateur 220 µF
16 volts
× 1
Condensateur 10 µF
16 volts
× 1
Condensateur à disque céramique, 0,1 µF
× 3
Résistance 10k ohm
× 2
Résistance à trou traversant, 4,7 kohm
× 1
borne à vis 2 positions entraxe 3,5 mm, diamètre broche 1,1 mm
× 1
borne à vis 6 positions entraxe 2,54 mm
× 1
Douille 4 broches 2,54 mm
× 1
Douille 12 broches 2,54 mm
× 2

Applications et services en ligne

LocoMotive
Ceci est la version gratuite de l'App
LocoMotive DCC
Ceci est la dernière version incluant la lecture/écriture des cv 1 à 255

À propos de ce projet

En quoi ce système est-il différent ?
Un circuit électronique très simple fournit le signal DCC et l'alimentation de la piste, mais l'application fait le vrai travail ! L'ordinateur de votre téléphone est utilisé au maximum en construisant les codes nécessaires pour former chaque paquet d'instructions, simplifiant ainsi le travail du contrôleur Arduino !

Mise à jour du 16 août 2019 :sortie d'une nouvelle application améliorée - avec possibilité de lire/écrire les CV 1 à 255
Cette version de l'application coûte 5 £ hors taxes et disponible sur le Google Play Store.

Mise à jour du 18 mai 2019 :sortie d'une nouvelle application améliorée - jusqu'à 28 fonctions avec des titres modifiables, une visibilité et des options momentanées. Contrôlez jusqu'à 4 locomotives à la fois avec des barres de vitesse sur l'écran. Cette version de l'application coûte 3 £ plus taxes et disponible sur le Google Play Store.

Mise à jour du 17 février 2019 :Vous devrez peut-être modifier le module Bluetooth HC-06 pour étendre sa portée de réception. J'ai ajouté un fil de cuivre massif (issu du fil de terre secteur) de 31,2 mm de longueur (1/4 de longueur d'onde pour 2,4 GHz). Voir la photo ci-jointe à l'étape 2.

Mise à jour du 29 janvier 2019 :Ajout d'une option momentanée sur F2 et F3 pour les sons de klaxon Vitesse maximale prédéfinie pour chaque locoC'est la station de commande DCC la plus efficace possible à construire. Aucun autre système ne peut faire autant avec si peu de composants. Une station de commande DCC entièrement fonctionnelle et facile à assembler avec PCB disponible sur eBay et ne nécessitant que quelques pièces. L'application « LocoMotive » est conçue pour fonctionner sur les téléphones Android exécutant la version 4.1 et supérieure . Pas besoin d'acheter des systèmes propriétaires, il s'agit d'une unité autonome exploitée par une application gratuite appelée « LocoMotive » Fonctionne avec des décodeurs conformes à la NMRA. Ce système compile les paquets DCC opérationnels au sein de l'application qui sont envoyés à l'interface Arduino pour être combinés avec les signaux d'horloge DCC. Achetez ce PCB sur eBay.Obtenez l'application gratuite LocoMotive sur Google Play Store.Les fonctionnalités incluent :

  • Contrôle de 1 à 20 locomotives
  • Idéal pour les mises en page de petite à moyenne taille
  • Une charge de 2 A entraîne jusqu'à 16 locomotives OO/HO à l'aide d'un pont en H spécifié
  • Ajoutez un pont en h compatible à courant plus élevé pour étendre la capacité de charge
  • Protection contre les courts-circuits
  • Suppression automatique de surintensité, réglable en code Arduino
  • Lumières et direction
  • Fonctions 1 à 8
  • Modifier les noms de fonction, la visibilité et l'action momentanée
  • Aiguillage / aiguillages / accessoires exploite jusqu'à 8 paires de sorties
  • Modifier les noms des aiguillages
  • Nom personnalisé de vos locomotives et vitesse maximale définie pour chacune
  • Programmation de l'adresse de la locomotive CV1
  • Lire/écrire les CV 1 à 255
  • Ajoutez vos propres adresses d'accessoires
  • Choisissez une source d'alimentation CC adaptée à l'échelle utilisée (Z/N/OO/HO/O/G) 12 v à 20 v

Suite à des travaux antérieurs sur les systèmes sans fil DCC, j'ai développé une station de commande Bluetooth liée à un circuit récepteur basé sur Arduino avec un module HC-06 BT et un pilote de moteur à pont en H LMD18200 délivrant 2 ampères.

Le coût global des pièces est d'environ 20 £ avec les pièces achetées sur eBay.

Étape 1 : esquisse Arduino

Le croquis complet est joint. Cette partie est la boucle et le code du récepteur de données. L'application Android envoie un paquet complet au récepteur et est décodée ici en un tableau de données. Selon que 3 ou 4 octets sont reçus, le code générera le format de paquet DCC correct pour la voie ferrée.

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

La chaîne () void sépare ensuite les données de la chaîne de texte reçue et place chaque instruction dans sa position appropriée dans le paquet DCC.

Par exemple :

Une chaîne de texte reçue de 'DD, 3, 63, 12, 48,' se traduit par un paquet Speed ​​de 4 octets de 8 bits chacun :

DD =message IDByte :[1] [2] [3] [4] Décimal :[3] [63] [12] [48] Binaire :[0000 0011] [0001 1111] [0000 1100] [0001 1000] Action :[Loco 3] [speed step] [ loco speed] [ XOR data check]

Une chaîne de texte reçue de 'DD, 1, 129, 128, ' se traduit par un paquet de fonction de 3 octets de 8 bits chacun :Décimal :[1] [129] [128] Binaire :[0000 0001] [1000 0001] [1000 0000] Action :[Loco 1] [ F1 activé] [XOR data check]

Pour plus d'informations sur la norme de paquet NMRA, consultez :https://www.nmra.org/sites/default/files/s-9.2.1_2...

s-9.2.1_2012_07.pdf

Le LMD nécessite le signal DCC sur la broche DIR et la broche PWM maintenue HAUTE.

command_station_bluetooth_oct_2018.ino

Étape 2 : Schéma du circuit de frittage

L'Arduino Pro Mini reçoit les données Bluetooth via le module HC-06. L'Arduino génère les cycles d'horloge standard NMRA des données au format paquet. Les données reçues interrompent la séquence lorsque de nouvelles données sont reçues et le paquet DCC est mis à jour pour envoyer des instructions aux voies ferrées.

Liste des pièces requises :

PCB disponible sur eBay.

1 sur Arduino Pro Mini Atmega328P 5V/16M eBay

1 sur eBay LMD18200T pont en H

1 module Bluetooth HC-06 eBay

1 résistance à film métallique 0,1 ohm 2W 0,1R 2 watts (11,5 mm x 4,5 mm) eBay

3 sur le condensateur 0.1uf eBay

2 de 10kΩ de résistance eBay

1 hors condensateur 10uf 25v; eBay

1 sur condensateur 220uf 16v; eBay

1 sur Phoenix Contact MKDS 1/2-3, 5 Bornier PCB à vis 2 voies 13,5A 200V 3,5 mm eBay

1 sur 4,7kΩ de résistance eBay

1 régulateur de tension positive CV L7805 IC eBay

1 bande de broches femelles à 4 broches pour bord d'en-tête 0,1 "2,54 mm eBay

2 bandes de broches femelles à 12 broches pour bord d'en-tête 0,1 "2,54 mm eBay

1 bornier à vis universel PCB 2,54 mm à 6 broches eBay

1 diode Zener 3,6 V ; 0.5W 1N4732A eBay

Fil

Alimentation :pour les configurations OO/HO, utilisez une alimentation CC 14v (par exemple, un chargeur pour ordinateur portable d'eBay). Par exemple, cela fournit jusqu'à 2,5 ampères. Vérifiez la taille de la prise montée sur panneau requise pour s'adapter à la prise jack CC sur l'alimentation choisie pour ce projet. https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter-...

Pour étendre la portée du module HC-06 Bt, soudez un fil à l'extrémité de l'antenne du module. J'ai utilisé un fil de cuivre massif (provenant du fil de terre du secteur) de 31,2 mm de longueur (1/4 de longueur d'onde pour 2,4 GHz). Voir photo ci-dessus. Veuillez noter - les connexions HC-06 sont Rx (sur PCB) à Rx (sur module) et Tx à Tx. Veuillez noter que le fil d'antenne doit être recouvert d'une gaine pour éviter tout court-circuit accidentel avec d'autres composants.

Pour l'utilisation d'un module de pont en h LMD18200 (comme indiqué ci-dessus, il s'agit d'un module avec dissipateur thermique, etc.), j'ai ajouté des composants de détection de courant pour fournir une protection contre les problèmes de court-circuit ou de surcharge sur la voie ferrée, le schéma de circuit mis à jour et Arduino le code inclut maintenant la fonction de détection actuelle.

Le code limite le courant maximal à 2 ampères lorsqu'il est atteint, le pont en h LMD18200 est arrêté en appliquant un signal HAUT de D13 sur l'Arduino à l'entrée « frein » sur le pont en h.

L'utilisation d'une résistance de détection de courant de 0,1 ohm donne une plage d'entrée analogique de 0 à 200 mv sur la broche A0 du capteur Arduino pour une charge allant jusqu'à 2 ampères. Pour environ 5 mv par pas analogique, l'entrée (1023 pas ou divisions au total) donne 0 à 40 divisions ou 2 ampères / 40 =50 mA par division. La précision du courant mesuré est de 50 mA, mais nous protégeons le pont en h lorsque 2 ampères sont atteints. Le LMD18200 dispose également d'une protection intégrée contre la surchauffe en tant que sauvegarde.if(C>2000){ // 2 amps

Serial.println("Sur courant"); digitalWrite(13, ÉLEVÉ); }

La valeur du courant consommé est envoyée à l'application Android via Bluetooth toutes les secondes.void send_c(){t =millis() - lastmillis; if (t>=intervalle){ bluetooth.write(sensorValue); bluetooth.write('c'); lastmillis =millis(); } }

Étape 3 : application Android

Téléchargez l'application gratuite sur Google Play Store - 'LocoMotive'

Téléchargez l'application complète (5,99 £) sur Google Play Store - « LocoMotive DCC »

Des instructions sont jointes pour la version complète de l'application.

Code

  • locomotive_dcc_sep19.ino
locomotive_dcc_sep19.inoArduino
Code Arduino// 1er septembre 2019// croquis à utiliser avec l'application Android 'Locomotive DCC' utilisant le pont en h LMD18200// installation de lecture/écriture CV ajoutée#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;booléen cv_logic;booléen ok;int num out;// utiliser pour les broches numériques DCC //La fréquence de la minuterie est de 2MHz pour (/8 pré-échelle à partir de 16MHz)#define TIMER_SHORT 0x8D // 58usec longueur d'impulsion #define TIMER_LONG 0x1B // 116usec longueur d'impulsion unsigned char last_timer=TIMER_SHORT; // stocker la dernière valeur du temporisateur unsigned char flag=0; // utilisé pour les chars pulseunsigned courts ou longs every_second_isr =0; // impulsion vers le haut ou vers le bas// définitions pour la machine à états #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; // c'est l'adresse par défaut de la locomotive // ​​buffer pour commandstruct Message { unsigned char data[7]; unsigned char len;};#define MAXMSG 3// pour le moment, n'utilisez que 2 messages - le msg ralenti, le msg vitesse loco, fonction msgstruct Message msg[MAXMSG] ={ { { 0xFF,0, 0xFF, 0, 0, 0, 0}, 3}, // msg ralenti { { locoAdr, 0, 0, 0, 0, 0, 0}, 3} // locoMsg avec 128 pas de vitesse 0x3f } ; // loco msg doit être rempli plus tard avec la vitesse et l'octet de données XOR int msgIndex=0; int byteIndex=0;//Setup Timer2.//Configure le 8-Bit Timer2 pour générer une interruption à la fréquence spécifiée.//Renvoie la valeur de temps de chargement qui doit être chargée dans TCNT2 à l'intérieur de votre routine ISR.void SetupTimer2(){ //Paramètres Timer2 :Timer Prescaler /8, mode 0 //Horloge du minuteur =16MHz/8 =2MHz ou 0,5usec TCCR2A =0 ; TCCR2B =0<=MAXMSG) { msgIndex =0; } octetIndex =0; //commencer le message avec l'octet 0 } break ; cas SEPERATOR :flag=0; // impulsion longue // puis avance à l'état suivant state =SENDBYTE; // aller à l'octet suivant ... cbit =0x80; // envoyer ce bit la prochaine fois first outbyte =msg[msgIndex].data[byteIndex]; Pause; case SENDBYTE:if (outbyte &cbit) { flag =1; // envoie une impulsion courte } else { flag =0; // envoie une impulsion longue } cbit =cbit>> 1; if (cbit ==0) { // dernier bit envoyé, y a-t-il un octet suivant ? byteIndex++ ; if (byteIndex>=msg[msgIndex].len) { // c'était déjà l'octet XOR puis passer à l'état de préambule =PREAMBLE ; if (preamable_type ==0){ preamble_count =16 ; // longueur de préambule normale de 16 '1 } if (preamable_type ==1){ preamble_count =24; // préambule de 24 '1's pour CV1 write } } else { // envoyer le séparateur et passer à l'état d'octet suivant =SEPERATOR; } } Pause; } if (drapeau) { // if data==1 then short pulse latency=TCNT2; TCNT2=latence+TIMER_SHORT ; last_timer=TIMER_SHORT; } else { // latence d'impulsion longue =TCNT2; TCNT2=latence+TIMER_LONG ; last_timer=TIMER_LONG; } }}void setup(){Serial.begin(115200);analogReference(INTERNAL);pinMode(13, OUTPUT); bluetooth.begin(9600); retard (500); // attend que le module Bluetooth démarre Serial.println("Bluetooth Started"); bluetooth.println("Bluetooth démarré");DDRD =B01100000; // enregistrer D5 pour la broche numérique 5, D6 pour la broche numérique 6 // Démarrer le minuteur SetupTimer2();t =millis();lastmillis =millis();digitalWrite(6, LOW);digitalWrite(13, HIGH); // désactiver le pont o/p get_cv_val =cv_calc(test_num);}void current(){int i; valeur entière =0 ; int numReadings =5;for (i =0; i 2000){ // 2 amps Serial.println("Over Current"); bluetooth.println("Court !"); digitalWrite (6, FAIBLE); // contrôle logique du signal DCC sur low (off) digitalWrite (13, HIGH); // pour freiner, court-circuite le pont en h o/p bluetooth.println(C); }}boucle vide() { if(bluetooth.available() ==true); { inString =bluetooth.readStringUntil('\n'); Serial.println(inString); } if (inString.substring(0,1) =="D"){ string(); } // Paquet DCC entrant if (inString.substring(0,1) =="C"){ digitalWrite(6, HIGH); digitalWrite(13, LOW); } // réinitialiser après une surintensité, contrôle logique du signal DCC activé, frein désactivé si (inString.substring(0,1) =="G"){ digitalWrite(6, HIGH); digitalWrite(13, LOW); courant(); bluetooth.println(C);} // demande de chargement de la valeur actuelle if (inString.substring(0,1) =="A"){ digitalWrite(6, HIGH); digitalWrite(13, LOW); get_cv_data(); cv1_prog(); digitalWrite (6, FAIBLE); digitalWrite(13, HIGH);} if (inString.substring(0,3) =="get"){ cv_val =0; digitalWrite (6, HAUT); digitalWrite(13, LOW); get_cv_num(); cv_read(); digitalWrite (6, FAIBLE); digitalWrite(13, ÉLEVÉ); } if (inString.substring(0,3) =="add"){ cv_write_val =0; digitalWrite (6, HAUT); digitalWrite(13, LOW); get_cv_new_val(); repeat_cv_write(); digitalWrite (6, FAIBLE); digitalWrite(13, ÉLEVÉ); } if (inString.substring(0,1) =="V"){ delay(50);bluetooth.print("CV1 mis à jour"); Serial.println(Address);} // cv1 write if (inString.substring(0,1) =="E"){ digitalWrite(6, LOW); // contrôle logique du signal DCC sur low (off) digitalWrite (13, HIGH); // pour freiner, court-circuite le pont en h o/p } // e-stop inString =""; }void get_cv_new_val(){ Serial.println(inString); Chaîne cv_w ="" ; int x =inString.indexOf("nouveau,") + 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); Adr de chaîne ="" ; int z =inString.indexOf("addr,"") + 5; addr =inString.substring(z,z+1); Serial.println(addr); Adresse =addr.toInt(); Serial.print("Adresse : ");Serial.println(Adresse); }void get_cv_num(){ cv_write_val =0 ; Serial.println(inString); Chaîne temp="" ; int x =inString.indexOf(",") + 1 ; temp =inString.substring(x,8) ; Serial.println(temp); Adresse =temp.àInt(); Serial.print("Adresse : ");Serial.println(Adresse); } void get_cv_data(){ unsigned long z =inString.length(); entier y =0 ; nombre entier =0 ; Chaîne inChar; Chaîne temp="" ; for (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 ="";} } amend_len3(msg[1]); assemble_3_octet(); Serial.println(inString); } void string(){ unsigned long z =inString.length(); entier y =0 ; pour (int i =0; i<=5; i++){ a[i] =0; } nombre int =0 ; String inChar;String temp =""; for (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 (count ==3){ //Serial.println(inString); //print_data(); amend_len3(msg[1]); assemble_3_octet(); } if (count ==4){ //Serial.println(inString); //print_data(); amend_len4(msg[1]); assemble_4_byte(); } //Série.println(inString); //Série.println(a[1]); // Serial.println(a[2]); //Série.println(a[3]); //Série.println(a[4]); //print_data(); } void amend_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 amend_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 ; interruptions(); }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; } délaiMicrosecondes (500); Serial.print("C =");Serial.println(C);}}void cv_read(){ cv_val =0; retard (200); courant(); if(bluetooth.available() ==true);{ bluetooth.print("lecture.."); } Cs =C + 50 ; CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val0 =cv_calc(0); retard(10) ; } } CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val1 =cv_calc(1); retard(10) ; } } CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val2 =cv_calc(2); retard(10) ; } } CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val3 =cv_calc(3); retard(10) ; } } CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val4 =cv_calc(4); retard(10) ; } } CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val5 =cv_calc(5); retard(10) ; } } CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val6 =cv_calc(6); retard(10) ; } } CV_VAL =99 ; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val7 =cv_calc(7); retard(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 ; } si (cv_val1 ==1){ cv_val =cv_val + 2; } si (cv_val2 ==1){ cv_val =cv_val + 4; } si (cv_val3 ==1){ cv_val =cv_val + 8; } si (cv_val4 ==1){ cv_val =cv_val + 16; } si (cv_val5 ==1){ cv_val =cv_val + 32; } si (cv_val6 ==1){ cv_val =cv_val + 64; } si (cv_val7 ==1){ cv_val =cv_val + 128; } if(bluetooth.available() ==true);{ if (cv_val_total> 9){ bluetooth.print("read =error"); } 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(); retard (5) ; }for (int i =0; i<=5; i++){ page_preset_packet(); retard (5) ; }for (int i =0; i<=9; i++){ reset_packet(); delay(5); } for (int i =0; i<=5; i++){ cv1_write_packet(); delay(5); } current();for (int i =0; i<=10; i++){ cv1_write_packet(); delay(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; // 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; 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; // Address only mode msg[1].data[1] =B00000000 | Address; 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

Processus de fabrication

  1. MrRobot – Robotique compatible avec l'application mobile Ubuntu (Raspberry Pi et arduino impliqués)
  2. 6-Shooter :Station de mélange de boissons Arduino
  3. Dés numériques Arduino
  4. Contrôleur de jeu Arduino
  5. Animation LCD et jeux
  6. Chaussures intelligentes (laçage automatique et génération d'électricité)
  7. Sonar utilisant arduino et affichage lors du traitement de l'IDE
  8. Jeu Pixel Chaser
  9. Contrôle de la luminosité des LED à l'aide de Bolt et Arduino