Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Model Rail Digital DCC Command Station Arduino en gratis app

Componenten en benodigdheden

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
LMD18200t
× 1
PCB
× 1
Lineaire regelaar (7805)
× 1
3,6V 0,5W zenerdiode
× 1
Condensator 220 µF
16 volt
× 1
Condensator 10 µF
16 volt
× 1
Keramische schijfcondensator, 0,1 µF
× 3
Weerstand 10k ohm
× 2
Through Hole Resistor, 4,7 kohm
× 1
schroefaansluiting 2 positie 3,5 mm middelpunt, 1,1 mm pin-dia
× 1
schroefaansluiting 6 positie 2,54 mm middelpunt
× 1
4-pins 2,54 mm-aansluiting
× 1
12-pins 2,54 mm-aansluiting
× 2

Apps en online services

LocoMotive
Dit is de gratis versie van de app
LocoMotive DCC
Dit is de laatste versie inclusief lezen/schrijven van cv 1 tot 255

Over dit project

Wat is er anders aan dit systeem?
Een zeer eenvoudig elektronisch circuit levert het DCC-signaal en de stroom voor de baan, maar de app doet het echte werk! De computer op je telefoon wordt optimaal benut door de codes te construeren die nodig zijn om elk pakket instructies te vormen, waardoor het werk van de Arduino-controller wordt vereenvoudigd!

Update 16 augustus 2019:release van nieuwe verbeterde app - met mogelijkheid om CV 1 tot 255 te lezen / schrijven
Deze app-versie kost £ 5 plus belasting en is beschikbaar in de Google Play Store.

Update 18 mei 2019:release van nieuwe verbeterde app - tot 28 functies met bewerkbare titels, zichtbaarheid en tijdelijke opties. Bestuur tot 4 locomotieven tegelijk met snelheidsbalken op het scherm. Deze app-versie kost £ 3 plus belasting en is beschikbaar in de Google Play Store.

Update 17 februari 2019:Mogelijk moet u de HC-06 Bluetooth-module aanpassen om het ontvangstbereik uit te breiden. golflengte voor 2,4 GHz). Zie bijgevoegde foto in stap 2.

Update 29 jan 2019:Toevoeging van tijdelijke optie op F2 en F3 voor claxongeluiden Vooraf ingestelde maximale snelheid voor elke locomotief Dit is de meest efficiënte DCC-centrale die mogelijk is om te bouwen. Geen enkel ander systeem kan zoveel met zo weinig componenten. Een eenvoudig te monteren, volledig functionerend DCC-commandostation met PCB dat beschikbaar is op eBay en waarvoor slechts een paar onderdelen nodig zijn. De app 'LocoMotive' is ontworpen om te werken op Android-telefoons met versie 4.1 en hoger . U hoeft geen eigen systemen aan te schaffen, dit is een op zichzelf staande eenheid die wordt bediend door een gratis app genaamd 'LocoMotive'Works met NMRA-compatibele decoders. Dit systeem compileert de werkende DCC-pakketten binnen de app die naar de Arduino-interface worden gestuurd om te combineren met de DCC-kloksignalen. Koop deze PCB op eBay. Ontvang de gratis App LocoMotive in de Google Play Store. Functies zijn onder meer:​​

  • Besturing van 1 tot 20 locs
  • Ideaal voor kleine tot middelgrote lay-outs
  • Belasting van 2 ampère drijft tot 16 OO/HO-locomotieven aan met gespecificeerde H-brug
  • Voeg een hogere stroom compatibele h-brug toe om de laadcapaciteit uit te breiden
  • Beveiligd tegen kortsluiting
  • Automatische overstroomuitschakeling, instelbaar in Arduino-code
  • Licht en richting
  • Functies 1 tot 8
  • Bewerk functienamen, zichtbaarheid en tijdelijke actie
  • Uitslag / wissels / accessoires bedient tot 8 paar uitgangen
  • Bewerk namen van wissels
  • Aangepaste naamgeving van je locomotieven en maximale snelheid voor elk instellen
  • Het CV1 locadres programmeren
  • Lees/schrijf CV 1 tot 255
  • Voeg uw eigen accessoire-adressen toe
  • Kies een gelijkstroombron die past bij de gebruikte schaal (Z/N/OO/HO/O/G) 12v tot 20v

Naast eerder werk aan draadloze DCC-systemen, heb ik een Bluetooth-commandostation ontwikkeld dat is gekoppeld aan een op Arduino gebaseerd ontvangercircuit met een HC-06 BT-module en een LMD18200 H-bridge Motordriver die 2 ampère levert.

De totale kosten van onderdelen bedragen ongeveer £ 20 met onderdelen die zijn gekocht bij eBay.

Stap 1:Arduino-schets

De volledige schets is bijgevoegd. Dit gedeelte is de lus- en gegevensontvangercode. De Android-app stuurt een compleet pakket naar de ontvanger en wordt hier gedecodeerd tot een reeks gegevens. Afhankelijk van of er 3 of 4 bytes worden ontvangen, genereert de code het juiste DCC-pakketformaat voor het treinspoor.

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

De string() void splitst vervolgens de gegevens uit de ontvangen tekststring en plaatst elke instructie op de juiste positie in het DCC-pakket.

Bijvoorbeeld:

Een ontvangen tekstreeks van 'DD, 3, 63, 12, 48' vertaalt zich in een snelheidspakket van 4 bytes van elk 8 bits:

DD =bericht IDByte:[1] [2] [3] [4]Decimaal:[3] [63] [12] [48] Binair:[0000 0011] [0001 1111] [0000 1100] [0001 1000] Actie :[Loco 3] [snelheid stappen] [ loc snelheid] [ XOR data check]

Een ontvangen tekstreeks van 'DD, 1, 129, 128' vertaalt zich in een functiepakket van 3 bytes van elk 8 bits:Decimaal:[1] [129] [128] Binair:[0000 0001] [1000 0001] [1000 0000] Actie:[Loco 1] [ F1 aan] [XOR data check]

Raadpleeg voor meer informatie over de NMRA-pakketstandaard:https://www.nmra.org/sites/default/files/s-9.2.1_2...

s-9.2.1_2012_07.pdf

De LMD vereist het DCC-signaal op de DIR-pin en de PWM-pin moet HOOG worden gehouden.

command_station_bluetooth_oct_2018.ino

Stap 2:Fritsend schakelschema

De Arduino Pro Mini ontvangt de Bluetooth-gegevens via de HC-06-module. De Arduino genereert de NMRA-standaardklokcycli van gegevens in pakketformaat. De ontvangen gegevens onderbreken de reeks wanneer nieuwe gegevens worden ontvangen en het DCC-pakket wordt bijgewerkt om instructies naar de treinsporen te sturen.

Lijst met benodigde onderdelen:

PCB beschikbaar op eBay.

1 korting op Arduino Pro Mini Atmega328P 5V/16M eBay

1 van LMD18200T H-brug eBay

1 uit HC-06 Bluetooth-module eBay

1 uit 0,1 ohm 2W metaalfilmweerstand 0,1R 2 watt (11,5 mm x 4,5 mm) eBay

3 korting op condensator 0.1uf eBay

2 van 10kΩ Weerstand eBay

1 uit Condensator 10uf 25v; eBay

1 uit Condensator 220uf 16v; eBay

1 van Phoenix Contact MKDS 1/2-3, 5 2-weg schroef PCB-aansluitblok 13.5A 200V 3.5mm eBay

1 uit 4.7kΩ Weerstand eBay

1 uit L7805 CV Positieve spanningsregelaar IC eBay

1 off 4-pins Female Header Edge Pins Strip 0.1" 2.54mm eBay

2 van 12 pin Female Header Edge Pins Strip 0.1" 2.54mm eBay

1 uit 6-pins 2,54 mm PCB universeel schroefaansluitblok eBay

1 uit Zenerdiode 3.6V; 0,5W 1N4732A eBay

Draad

Stroomvoorziening:Gebruik voor OO/HO-lay-outs een 14v DC-voeding (bijv. laptopoplader van eBay). Deze levert bijvoorbeeld tot 2,5 Ampère. Controleer de grootte van de op een paneel gemonteerde aansluiting die nodig is om de DC-jackplug op de voeding te passen die voor dit project is gekozen. https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter-...

Om het bereik van de HC-06 Bt-module te vergroten, soldeert u een draad aan het uiteinde van de antenne op de module. Ik gebruikte een massieve koperdraad (van het aardingsnet) met een lengte van 31,2 mm (1/4 van de golflengte voor 2,4 GHz). Zie foto hierboven. Let op - de HC-06 aansluitingen zijn Rx (op PCB) naar Rx (op module) en Tx naar Tx. Houd er rekening mee dat de antennedraad moet worden bedekt met een kous om onbedoelde kortsluiting met andere componenten te voorkomen.

Voor het gebruik van een LMD18200 h-bridge-module (zoals hierboven weergegeven is dit in modulevorm met koellichaam enz.), heb ik stroomgevoelige componenten toegevoegd om bescherming te bieden tegen kortsluiting of overbelastingsproblemen op het treinspoor, het bijgewerkte schakelschema en Arduino code bevat nu de huidige betekenisfunctie.

De code beperkt de maximale stroom tot 2 ampère wanneer deze wordt bereikt, de LMD18200 h-brug wordt uitgeschakeld door een HOOG-signaal van D13 op de Arduino toe te passen op de 'Brake'-ingang op de h-brug.

Het gebruik van een stroomdetectieweerstand van 0,1 ohm geeft een analoog ingangsbereik van 0 tot 200 mv op Arduino-sensorpen A0 voor een belasting tot 2 ampère. Voor ongeveer 5mv per analoge stapingang (1023 totale stappen of divisies) geeft 0 tot 40 divisies of 2 Ampère / 40 =50mA per divisie. De gemeten stroomprecisie is 50 mA, maar we beschermen de h-brug wanneer 2 Ampère is bereikt. De LMD18200 heeft ook een ingebouwde oververhittingsbeveiliging als back-up.if(C>2000){ // 2 ampère

Serial.println ("Overstroom"); digitalWrite(13, HOOG); }

De waarde van de huidige trekking wordt elke seconde via Bluetooth naar de Android-app verzonden.void send_c(){t =millis() - lastmillis; if (t>=interval){ bluetooth.write (sensorValue); bluetooth.write('c'); lastmillis =millis(); } }

Stap 3:Android-app

Download de gratis app uit de Google Play Store - 'LocoMotive'

Download de volledige app (£ 5,99) uit de Google Play Store - 'LocoMotive DCC'

Instructies zijn bijgevoegd voor de app met volledige versie.

Code

  • locomotive_dcc_sep19.ino
locomotive_dcc_sep19.inoArduino
Arduino Code
// 1 sep 2019// schets voor gebruik met Android App 'Locomotive DCC' met LMD18200 h-bridge// CV lees-/schrijffaciliteit toegevoegd#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;boolean cv_logic;boolean ok;int num;// gebruik digitale pinnen 6 en 5 voor DCC uit // Timerfrequentie is 2 MHz voor (/8 voorschaal vanaf 16 MHz) #define TIMER_SHORT 0x8D // 58usec pulslengte #define TIMER_LONG 0x1B // 116usec pulslengte unsigned char last_timer=TIMER_SHORT; // bewaar laatste timerwaarde unsigned char flag =0; // gebruikt voor korte of lange pulseunsigned char elke_seconde_isr =0; // pulse up of down// definities voor state machine #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; // dit is het standaard adres van de loco// buffer voor commandstruct Message { unsigned char data [7]; unsigned char len;};#define MAXMSG 3// gebruik voorlopig slechts 2 berichten - de idle msg, de loco Speed ​​msg, functie msgstruct Message msg[MAXMSG] ={ { { 0xFF,0, 0xFF, 0, 0, 0, 0}, 3}, // idle msg { { locoAdr, 0, 0, 0, 0, 0, 0}, 3} // locoMsg met 128 snelheidsstappen 0x3f }; // loco-bericht moet later worden gevuld met snelheid en XOR-gegevensbyte int msgIndex=0; int byteIndex=0;//Setup Timer2.//Configureert de 8-Bit Timer2 om een ​​interrupt op de gespecificeerde frequentie te genereren.//Retourneert de tijdbelastingswaarde die in TCNT2 moet worden geladen binnen uw ISR-routine.void SetupTimer2(){ //Timer2-instellingen:Timer Prescaler /8, modus 0 //Timmerklok =16MHz/8 =2MHz of 0,5usec TCCR2A =0; TCCR2B =0<=MAXMSG) { msgIndex =0; } byteIndex =0; // start bericht met byte 0 } pauze; geval SEPERATOR:vlag=0; // lange puls // ga dan verder naar de volgende staat =SENDBYTE; // ga naar volgende byte ... cbit =0x80; // stuur dit bit de volgende keer eerst outbyte =msg[msgIndex].data[byteIndex]; pauze; case SENDBYTE:if (outbyte &cbit) { flag =1; // stuur korte puls } else { flag =0; // stuur lange puls } cbit =cbit>> 1; if (cbit ==0) { // laatst verzonden bit, is er een volgende byte? byteIndex++; if (byteIndex>=msg[msgIndex].len) {// dit was al de XOR-byte, ga dan verder naar de preambule-status =PREAMBLE; if (preamable_type ==0){ preamble_count =16; // normale preambule lengte van 16 '1's } if (preamable_type ==1){ preamble_count =24; // preambule van 24 '1's voor CV1 schrijven}} else { // stuur separtor en ga door naar de volgende bytestatus =SEPERATOR; } } pauze; } if (vlag) {// if data==1 dan korte pulslatentie=TCNT2; TCNT2=latentie+TIMER_SHORT; last_timer=TIMER_SHORT; } else { // lange pulslatentie =TCNT2; TCNT2=latentie+TIMER_LONG; last_timer=TIMER_LONG; } }}void setup(){Serial.begin(115200);analogReference(INTERN);pinMode(13, OUTPUT); bluetooth.begin (9600); vertraging (500); // wacht tot de Bluetooth-module Serial.println start ("Bluetooth Started"); bluetooth.println ("Bluetooth gestart");DDRD =B01100000; // registreer D5 voor digitale pin 5, D6 voor digitale pin 6 //Start de timer SetupTimer2();t =millis();lastmillis =millis();digitalWrite(6, LAAG);digitalWrite(13, HOOG); // draai bridge o/p offint get_cv_val =cv_calc(test_num);}void current(){int i; int-waarde =0; int numReadings =5; for (i =0; i  2000) { // 2 ampère Serial.println ("Overstroom"); bluetooth.println ("Kort!"); digitalWrite (6, LAAG); // logische controle van DCC-signaal naar laag (uit) digitalWrite (13, HOOG); // om te remmen, sluit h-brug uit 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(); } // inkomend DCC-pakket if (inString.substring (0,1) =="C") {digitalWrite (6, HIGH); digitalWrite(13, LAAG); } // reset na overstroom, logische controle van DCC-signaal aan, rem uit if (inString.substring (0,1) =="G") {digitalWrite (6, HIGH); digitalWrite(13, LAAG); stroom(); bluetooth.println (C);} // verzoek om laadstroomwaarde if (inString.substring (0,1) =="A") {digitalWrite (6, HIGH); digitalWrite(13, LAAG); get_cv_data(); cv1_prog(); digitalWrite (6, LAAG); digitalWrite(13, HIGH);} if (inString.substring(0,3) =="get"){ cv_val =0; digitalWrite(6, HOOG); digitalWrite(13, LAAG); get_cv_num(); cv_read(); digitalWrite (6, LAAG); digitalWrite(13, HOOG); } if (inString.substring(0,3) =="toevoegen"){ cv_write_val =0; digitalWrite(6, HOOG); digitalWrite(13, LAAG); get_cv_new_val(); herhaal_cv_write(); digitalWrite (6, LAAG); digitalWrite(13, HOOG); } if (inString.substring(0,1) =="V"){ delay(50);bluetooth.print("CV1 bijgewerkt"); Serial.println (Adres);} // cv1 write if (inString.substring (0,1) =="E") {digitalWrite (6, LOW); // logische controle van DCC-signaal naar laag (uit) digitalWrite (13, HOOG); // om te remmen, sluit h-brug uit o/p} // e-stop inString =""; }void get_cv_new_val(){ Serial.println(inString); Tekenreeks cv_w =""; int x =inString.indexOf("nieuw,") + 4; cv_w =inString.substring(x,x+3); Serieel.println(cv_w); cv_write_val =cv_w.toInt(); Serial.print("cv_write_val:");Serial.println(cv_write_val); String-adr =""; int z =inString.indexOf("addr,") + 5; addr =inString.substring(z,z+1); Serial.println(addr); Adres =addr.toInt(); Serial.print("Adres:");Serial.println(Adres); }void get_cv_num(){ cv_write_val =0; Serial.println(inString); Stringtemp =""; int x =inString.indexOf(",") + 1; temp =inString.substring(x,8); Serieel.println(temp); Adres =temp.toInt(); Serial.print("Adres:");Serial.println(Adres); } void get_cv_data(){ unsigned long z =inString.length(); int y =0; aantal int =0; Tekenreeks inChar; Stringtemp =""; for (int i =0; i<=z; i++){ inChar =inString.substring(i,i+1); if (inChar ==",") {count++;} if (inChar !="," &&inChar !="A") {temp +=inChar;} if (inChar ==",") {Adres =(temp .toInt());y =y +1;temp ="";} } wijziging_len3(msg[1]); assemble_3_byte(); Serial.println(inString); } void string(){ unsigned long z =inString.length(); int y =0; voor (int i =0; i<=5; i++){ a[i] =0; }int aantal =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; temperatuur =""; } } if (count ==3) { //Serial.println(inString); //print_data(); amendement_len3(msg[1]); assemble_3_byte(); } if (count ==4) { //Serial.println(inString); //print_data(); amendement_len4(msg[1]); assemble_4_byte(); } //Serial.println(inString); //Serial.println(a[1]); // Serieel.println(a[2]); //Serial.println(a[3]); //Serial.println(a[4]); //print_data(); } void amendement_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] =een[1]; msg[1].data[1] =een[2]; msg[1].data[2] =een[3]; msg[1].data[3] =((a[1] ^ a[2])^ a[3]); interrupts();}void amendement_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] =een[1]; msg[1].data[1] =een[2]; msg[1].data[2] =(a[1] ^ a[2]); bericht[1].data[3] =0; onderbreekt(); }void print_data(){ Serial.print(msg[1].data[0], DEC); Serieel.print(","); Serial.print(msg[1].data[1], DEC); Serieel.print(","); Serial.print(msg[1].data[2], DEC); Serieel.print(","); Serial.print(msg[1].data[3], DEC); Serieel.println(","); }//CV readvoid cv_current(){for (int i =1; i<=10; i++){ sensorValue =analogRead(A0); C =10,8 * sensorwaarde; // mA als (C>=Cs) {cv_logic =waar; } vertraging Microseconden (500); Serial.print("C =");Serial.println(C);}}void cv_read(){ cv_val =0; vertraging (200); stroom(); if(bluetooth.available() ==true);{ bluetooth.print("lezen.."); } Cs =C + 50; CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val0 =cv_calc (0); vertraging(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val1 =cv_calc(1); vertraging(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val2 =cv_calc(2); vertraging(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val3 =cv_calc(3); vertraging(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val4 =cv_calc(4); vertraging(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val5 =cv_calc(5); vertraging(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val6 =cv_calc (6); vertraging(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val7 =cv_calc(7); vertraging(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("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(); vertraging (5); }voor (int i =0; i<=5; i++){ page_preset_packet(); vertraging (5); }voor (int i =0; i<=9; i++){ reset_packet(); vertraging (5); } voor (int i =0; i<=5; i++){ cv1_write_packet(); vertraging (5); } current();for (int i =0; i<=10; i++){ cv1_write_packet(); vertraging (5); } } ongeldig 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; bericht[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; // Alleen adres modus msg[1].data[1] =B00000000 | Adres; 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; // bitmanipulatiemodus msg[1].data[1] =B00000000 | (Adres 1); msg[1].data[2] =B11101000 | aantal; msg[1].data[3] =(msg[1].data[0] ^ msg[1].data[1]) ^ msg[1].data[2]; onderbreekt(); }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; // bitmanipulatiemodus msg[1].data[1] =B00000000 | (Adres 1); msg[1].data[2] =B1110000 | aantal; msg[1].data[3] =(msg[1].data[0] ^ msg[1].data[1]) ^ msg[1].data[2]; onderbreekt(); }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; // schrijfmodus msg [1].data [1] =B00000000 | (Adres 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]; onderbreekt(); }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] =(Adres - 1); bericht[1].data[1] =0x80; // locoMsg met groep één instructie 0x80 msg[1].data[2] =msg[1].data[0] ^ msg[1].data[1]; bericht[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("schrijven.."); } ok =onwaar; for (int f =1; f<=10; f++){ if (ok ==false){ cv_write(); vertraging(10); } } } ongeldig cv_write(){ delay(100); amendement_len3(msg[1]); assemble_3_byte(); delay(5);for (int i =1; i<=20; i++){ valid_packet(); vertraging (5); } voor (int i =1; i<=6; i++){ reset_packet(); vertraging (5); } cv_logic =onwaar; amendement_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 =waar; cv_logic =onwaar; ik =11; amendement_len3(msg[1]); assemble_3_byte(); for (int i =1; i<=10; i++){ reset_packet(); vertraging (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) {amendeer_len3(msg[1]); assemble_3_byte(); delay(5);for (int i =1; i<=20; i++){ valid_packet(); vertraging (5); } num =test_num; amendement_len3(msg[1]); assemble_3_byte(); for (int k =1; k<=4; k++){ reset_packet(); vertraging (5); } wijziging_len4(msg[1]); assemble_4_byte(); cv_logic =onwaar; vertraging(2); voor (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; amendement_len3(msg[1]); assemble_3_byte(); vertraging (5); for (int j =1; j<=3; j++){ reset_packet(); vertraging (5); }}}Serial.println("test voor 0 "); amendement_len3(msg[1]); assemble_3_byte(); for (int k =1; k<=4; k++){ reset_packet(); vertraging (5); } wijziging_len4(msg[1]); assemble_4_byte(); cv_logic =onwaar; vertraging(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; amendement_len3(msg[1]); assemble_3_byte(); vertraging (5); voor (int j =1; j<=3; j++){ reset_packet(); vertraging (5); }}}Serial.println(CV_VAL);return CV_VAL; }

Aangepaste onderdelen en behuizingen

Compleet circuit in behuizing

Schema's

Bluetooth-ontvanger / H-Bridge-versterkerschakeling bluetooth_android_dcc_lmd18200_S8NTVsI4LY.fzzApp-instructies

Productieproces

  1. MrRobot – Ubuntu Mobile-app ingeschakeld Robotics (betrokken bij Raspberry Pi en arduino)
  2. 6-Shooter:Arduino-drankmengstation
  3. Arduino digitale dobbelstenen
  4. Arduino-gamecontroller
  5. LCD-animatie en gaming
  6. Slimme schoenen (automatisch rijgen en elektriciteit opwekken)
  7. Sonar met arduino en weergave op verwerkings-IDE
  8. Pixel Chaser-game
  9. LED-helderheid regelen met Bolt en Arduino
  10. $10 draagbaar Arduino-weerstation (AWS)
  11. Python3- en Arduino-communicatie