Model Rail Digital DCC Command Station Arduino und kostenlose App
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 |
Apps und Onlinedienste
| ||||
|
Über dieses Projekt
Was ist an diesem System anders?
Eine sehr einfache elektronische Schaltung liefert das DCC-Signal und die Stromversorgung für die Strecke, aber die App erledigt die eigentliche Arbeit! Der Computer auf Ihrem Telefon wird voll ausgenutzt, indem die Codes erstellt werden, die zum Bilden jedes Befehlspakets erforderlich sind, wodurch die Arbeit des Arduino-Controllers vereinfacht wird!
Update 16. August 2019:Veröffentlichung einer neuen verbesserten App - mit der Möglichkeit zum Lesen / Schreiben von CV 1 bis 255
Diese App-Version kostet 5 £ plus Steuern und ist im Google Play Store erhältlich.
Update vom 18. Mai 2019:Veröffentlichung einer neuen verbesserten App - bis zu 28 Funktionen mit editierbaren Titeln, Sichtbarkeit und momentanen Optionen. Steuern Sie bis zu 4 Loks gleichzeitig mit Geschwindigkeitsbalken auf dem Bildschirm. Diese App-Version kostet 3 £ plus Steuern und ist im Google Play Store erhältlich.
Update 17. Feb. 2019:Möglicherweise müssen Sie das HC-06 Bluetooth-Modul modifizieren, um seine Empfangsreichweite zu erweitern Wellenlänge für 2,4 GHz). Siehe angehängtes Foto in Schritt 2.
Update 29. Jan. 2019:Momentanoption auf F2 und F3 für Hupengeräusche hinzugefügt Voreingestellte Höchstgeschwindigkeit für jede LokDies ist die effizienteste DCC-Zentrale, die man bauen kann. Kein anderes System kann mit so wenigen Komponenten so viel leisten.Eine einfach zu montierende, voll funktionsfähige DCC-Zentrale mit PCB bei eBay erhältlich und mit nur wenigen Teilen ausgestattet.Die App 'LocoMotive' ist für den Betrieb auf Android-Telefonen ab Version 4.1 ausgelegt . Sie müssen keine eigenen Systeme kaufen, dies ist eine eigenständige Einheit, die von einer kostenlosen App namens 'LocoMotive' betrieben wird. Arbeitet mit NMRA-konformen Decodern. Dieses System stellt die arbeitenden DCC-Pakete innerhalb der App zusammen, die an die Arduino-Schnittstelle gesendet werden, um sie mit den DCC-Taktsignalen zu kombinieren. Kaufen Sie diese Platine bei eBay. Holen Sie sich die kostenlose App LocoMotive im Google Play Store. Zu den Funktionen gehören:
- Steuerung von 1 bis 20 Loks
- Ideal für kleine bis mittelgroße Layouts
- 2-A-Last treibt bis zu 16 OO/HO-Lokomotiven über die angegebene H-Brücke an
- Fügen Sie eine mit höherem Strom kompatible H-Brücke hinzu, um die Belastbarkeit zu erhöhen
- Kurzschlussgeschützt
- Automatische Überstromabschaltung, einstellbar im Arduino-Code
- Lichter und Richtung
- Funktionen 1 bis 8
- Funktionsnamen, Sichtbarkeit und momentane Aktion bearbeiten
- Weiche / Weichen / Zubehör betreibt bis zu 8 Ausgangspaare
- Weichennamen bearbeiten
- Benutzerdefinierte Benennung Ihrer Loks und Festlegen der Höchstgeschwindigkeit für jede einzelne
- Programmierung der Lokadresse CV1
- CV 1 bis 255 lesen / schreiben
- Fügen Sie Ihre eigenen Zubehöradressen hinzu
- Wählen Sie eine Gleichstromquelle entsprechend der verwendeten Skala (Z/N/OO/HO/O/G) 12 V bis 20 V
Neben früheren Arbeiten an DCC-Funksystemen habe ich eine Bluetooth-Befehlsstation entwickelt, die mit einem Arduino-basierten Empfängerschaltkreis mit einem HC-06 BT-Modul und einem LMD18200 H-Brücken-Motortreiber mit 2 Ampere verbunden ist.
Die Gesamtkosten für Teile betragen etwa 20 £ mit bei eBay gekauften Teilen.
Schritt 1:Arduino-Skizze
Die vollständige Skizze ist beigefügt. Dieser Teil ist der Schleifen- und Datenempfängercode. Die Android App sendet ein komplettes Paket an den Empfänger und wird hier in ein Array von Daten dekodiert. Je nachdem ob 3 oder 4 Bytes empfangen werden, generiert der Code das richtige DCC-Paketformat für das Gleis.
Void Schleife () {if (bluetooth.available ()> 0); {inString =bluetooth.readStringUntil('\n');}if (inString.substring(0, 1)=="D") {string();}delay(20);}
string() void teilt dann die Daten aus dem empfangenen Textstring aus und platziert jede Anweisung an der entsprechenden Position im DCC-Paket.
Zum Beispiel:
Eine empfangene Textzeichenfolge von 'DD, 3, 63, 12, 48, ' wird in ein 4-Byte-Geschwindigkeitspaket von jeweils 8 Bit übersetzt:
DD =Nachrichten-IDByte:[1] [2] [3] [4]Dezimal:[3] [63] [12] [48] Binär:[0000 0011] [0001 1111] [0000 1100] [0001 1000] Aktion :[Lok 3] [Geschwindigkeitsstufen] [ Lokgeschwindigkeit] [ XOR-Datenprüfung]
Ein empfangener Textstring von 'DD, 1, 129, 128, ' wird in ein 3-Byte-Funktionspaket von jeweils 8 Bit übersetzt:Dezimal:[1] [129] [128] Binär:[0000 0001] [1000 0001] [1000 0000] Aktion:[Lok 1] [ F1 ein] [XOR Datenprüfung]
Weitere Informationen zum NMRA-Paketstandard finden Sie unter:https://www.nmra.org/sites/default/files/s-9.2.1_2...
s-9.2.1_2012_07.pdfDas LMD erfordert das DCC-Signal am DIR-Pin und den PWM-Pin auf HIGH gehalten.
command_station_bluetooth_oct_2018.ino
Schritt 2:Fritzing-Schaltplan
Der Arduino Pro Mini empfängt die Bluetooth-Daten über das HC-06-Modul. Der Arduino generiert die NMRA-Standardtaktzyklen von Daten im Paketformat. Die empfangenen Daten unterbrechen die Sequenz, wenn neue Daten empfangen werden und das DCC-Paket wird aktualisiert, um Anweisungen an die Bahngleise zu senden.
Liste der benötigten Teile:
Leiterplatte bei eBay erhältlich.
1 Stück Arduino Pro Mini Atmega328P 5V/16M eBay
1 Stück LMD18200T H-Brücke eBay
1 Stück HC-06 Bluetooth-Modul eBay
1 von 0,1 Ohm 2W Metallschichtwiderstand 0,1R 2 Watt (11,5 mm x 4,5 mm) eBay
3 von Kondensator 0.1uf eBay
2 von 10kΩ Widerstand eBay
1 aus Kondensator 10uf 25v; eBay
1 aus Kondensator 220uf 16v; eBay
1 Stück Phoenix Contact MKDS 1/ 2-3, 5 2-Wege-Schraub-Leiterplattenklemmenblock 13,5 A 200 V 3,5 mm eBay
1 von 4,7kΩ Widerstand eBay
1 von L7805 CV Positiver Spannungsregler IC eBay
1 von 4 Pin Buchsenleiste Rand Pins Streifen 0,1 "2,54 mm eBay
2 von 12-poligen Buchsenleisten-Edge-Stiftstreifen 0,1 "2,54 mm eBay
1 von 6 Pin 2,54 mm PCB Universal Schraubklemmenblock eBay
1 aus Zener-Diode 3,6 V; 0.5W 1N4732A eBay
Draht
Stromversorgung:Verwenden Sie für OO/HO-Layouts ein 14-V-DC-Netzteil (z. B. Laptop-Ladegerät von eBay). Dieser liefert beispielsweise bis zu 2,5 Ampere. Überprüfen Sie die Größe der Schalttafelsteckdose, die für den DC-Klinkenstecker des für dieses Projekt ausgewählten Netzteils erforderlich ist. https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter-...
Um die Reichweite des HC-06 Bt-Moduls zu erhöhen, löten Sie am Ende der Antenne des Moduls einen Draht an. Ich habe einen massiven Kupferdraht (vom Erdungsdraht) von 31,2 mm Länge (1/4 der Wellenlänge für 2,4 GHz) verwendet. Siehe Foto oben.Bitte beachten Sie - die HC-06-Anschlüsse sind Rx (auf PCB) zu Rx (auf Modul) und Tx zu Tx. Bitte beachten Sie, dass das Antennenkabel mit einer Ummantelung bedeckt sein sollte, um einen versehentlichen Kurzschluss mit anderen Komponenten zu vermeiden.
Für die Verwendung eines LMD18200 H-Brückenmoduls (wie oben abgebildet ist dies in Modulform mit Kühlkörper usw.) Code enthält jetzt die aktuelle Sense-Funktion.
Der Code begrenzt den maximalen Strom auf 2 Ampere, wenn die LMD18200 h-Brücke erreicht wird, indem ein HIGH-Signal von D13 auf dem Arduino an den 'Brake'-Eingang der h-Brücke angelegt wird.
Die Verwendung eines 0,1-Ohm-Strommesswiderstands ergibt einen analogen Eingangsbereich von 0 bis 200 mV am Arduino-Sensor-Pin A0 für eine Last von bis zu 2 Ampere. Für ca. 5 mV pro analogem Schritteingang (1023 Gesamtschritte oder Unterteilungen) ergeben sich 0 bis 40 Unterteilungen oder 2 Ampere / 40 =50 mA pro Unterteilung. Die gemessene Stromgenauigkeit beträgt 50 mA, jedoch schützen wir die H-Brücke, wenn 2 Ampere erreicht werden. Der LMD18200 hat auch einen eingebauten Übertemperaturschutz als Backup.if(C>2000){// 2 Ampere
Serial.println ("Überstrom"); digitalWrite(13, HOCH); }
Der Strombezugswert wird jede Sekunde über Bluetooth an die Android App gesendet.void send_c(){t =millis() - lastmillis; Wenn (t> =Intervall) {bluetooth.write (sensorValue); bluetooth.write('c'); lastmillis =millis(); } }
Schritt 3:Android-App
Laden Sie die kostenlose App aus dem Google Play Store herunter - 'LocoMotive'
Laden Sie die vollständige App (£5.99) aus dem Google Play Store herunter - 'LocoMotive DCC'
Anweisungen für die Vollversion App sind beigefügt.
Code
- locomotive_dcc_sep19.ino
locomotive_dcc_sep19.inoArduino
Arduino Code// 1. September 2019// Skizze zur Verwendung mit der Android-App 'Locomotive DCC' mit LMD18200 h-Bridge // CV-Lese-/Schreibfunktion hinzugefügt#includeSoftwareSerial 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;// für DCC-Ausgang 6 . und //Timerfrequenz beträgt 2MHz für (/8 Prescale von 16MHz)#define TIMER_SHORT 0x8D // 58usec Pulslänge #define TIMER_LONG 0x1B // 116usec Pulslänge unsigned char last_timer=TIMER_SHORT; // letzten Timer-Wert speichern unsigned char flag=0; // verwendet für kurze oder lange Pulseunsigned char every_second_isr =0; // Puls nach oben oder unten // Definitionen für Zustandsmaschine #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; // Dies ist die Standardadresse der Lok // Puffer für commandstruct Message { unsigned char data[7]; unsigned char len;};#define MAXMSG 3// Verwenden Sie vorerst nur 2 Nachrichten - die Leerlaufnachricht, die Lokgeschwindigkeitsnachricht, Funktion msgstruct Message msg[MAXMSG] ={ { { 0xFF,0, 0xFF, 0, 0, 0, 0}, 3}, // Leerlauf msg { { locoAdr, 0, 0, 0, 0, 0, 0}, 3} // locoMsg mit 128 Fahrstufen 0x3f }; // Lok msg muss später mit Geschwindigkeit und XOR-Datenbyte gefüllt werden int msgIndex=0; int byteIndex=0;//Setup Timer2.//Konfiguriert den 8-Bit Timer2, um einen Interrupt mit der angegebenen Frequenz zu erzeugen.//Gibt den Zeitladewert zurück, der in TCNT2 innerhalb Ihrer ISR-Routine geladen werden muss.void SetupTimer2(){ //Timer2 Einstellungen:Timer Prescaler /8, Mode 0 //Timmer Clock =16MHz/8 =2MHz oder 0,5usec TCCR2A =0; TCCR2B =0< =MAXMSG) { msgIndex =0; } ByteIndex =0; // msg mit Byte 0 starten } break; Fall SEPERATOR:Flag=0; // langer Impuls // dann weiter zum nächsten Zustand Zustand =SENDBYTE; // gehe zum nächsten Byte ... cbit =0x80; // dieses Bit beim nächsten Mal senden outbyte =msg[msgIndex].data[byteIndex]; brechen; case SENDBYTE:if (outbyte &cbit) { Flag =1; // kurzen Impuls senden} else {flag =0; // langen Impuls senden} cbit =cbit>> 1; if (cbit ==0) { // letztes gesendetes Bit, gibt es ein nächstes Byte? byteIndex++; if (byteIndex>=msg[msgIndex].len) { // dies war bereits das XOR-Byte, dann weiter zum Präambelzustand =PREAMBLE; if (preamable_type ==0) {preamble_count =16; // normale Präambellänge von 16 '1's} if (preamable_type ==1){ preamble_count =24; // Präambel von 24 '1en für CV1 schreiben } } else { // Trennzeichen senden und zum nächsten Bytezustand vorrücken =SEPERATOR; } } brechen; aufrechtzuerhalten. Wenn (Flag) {// wenn Daten ==1 dann kurze Impulslatenz =TCNT2; TCNT2=Latenz+TIMER_SHORT; last_timer=TIMER_SHORT; aufrechtzuerhalten. Sonst {// lange Pulslatenz =TCNT2; TCNT2=Latenz+TIMER_LONG; last_timer=TIMER_LONG; } }}void setup(){Serial.begin(115200);analogReference(INTERNAL);pinMode(13, OUTPUT); bluetooth.begin(9600); Verzögerung (500); // warten, bis das Bluetooth-Modul Serial.println startet ("Bluetooth gestartet"); bluetooth.println("Bluetooth gestartet");DDRD =B01100000; // D5 für digitalen Pin 5 registrieren, D6 für digitalen Pin 6 // Timer starten SetupTimer2 (); t =millis (); lastmillis =millis (); digitalWrite (6, LOW); digitalWrite (13, HIGH); // Brücke ausschalten o/p offint get_cv_val =cv_calc(test_num);}void current(){int i; int-Wert =0; int numReadings =5; for (i =0; i 2000) {// 2 Ampere Serial.println ("Überstrom"); bluetooth.println("Kurz!"); digitalWrite(6, LOW); // Logiksteuerung des DCC-Signals auf niedrig (aus) digitalWrite (13, HIGH); // zum Bremsen, h-Brücke kurzschließen 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(); } // eingehendes DCC-Paket if (inString.substring(0,1) =="C"){ digitalWrite(6, HIGH); digitalWrite(13, LOW); } // Reset nach Überstrom, logische Steuerung des DCC-Signals an, Bremse aus if (inString.substring (0,1) =="G") { digitalWrite (6, HIGH); digitalWrite(13, LOW); Strom(); bluetooth.println (C);} // Anforderung des Ladestromwertes if (inString.substring (0,1) =="A") { digitalWrite (6, HIGH); digitalWrite(13, LOW); get_cv_data(); cv1_prog(); digitalWrite(6, LOW); digitalWrite(13, HIGH);} if (inString.substring(0,3) =="get"){ cv_val =0; digitalWrite(6, HOCH); digitalWrite(13, LOW); get_cv_num(); cv_read(); digitalWrite(6, LOW); digitalWrite(13, HOCH); } if (inString.substring(0,3) =="add"){ cv_write_val =0; digitalWrite(6, HOCH); digitalWrite(13, LOW); get_cv_new_val(); repeat_cv_write(); digitalWrite(6, LOW); digitalWrite(13, HOCH); } if (inString.substring(0,1) =="V"){ delay(50);bluetooth.print("CV1 aktualisiert"); Serial.println (Adresse);} // cv1 schreiben wenn (inString.substring (0,1) =="E") {digitalWrite (6, LOW); // Logiksteuerung des DCC-Signals auf niedrig (aus) digitalWrite (13, HIGH); // zum Bremsen schließt h-Brücke o/p } // e-stop inString =""; }void get_cv_new_val () {Serial.println (inString); Zeichenfolge cv_w =""; int x =inString.indexOf("neu,") + 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-Adresse =""; int z =inString.indexOf("addr,") + 5; addr =inString.substring(z,z+1); Serial.println (Adresse); Adresse =addr.toInt(); Serial.print ("Adresse:"); Serial.println (Adresse); }void get_cv_num(){ cv_write_val =0; Serial.println (inString); Zeichenfolge temp =""; int x =inString.indexOf(",") + 1; temp =inString.substring(x,8); Serial.println (temp); Adresse =temp.toInt(); Serial.print ("Adresse:"); Serial.println (Adresse); aufrechtzuerhalten. Void get_cv_data () { unsigned long z =inString.length (); int y =0; int-Zählung =0; Zeichenfolge inChar; Zeichenfolge 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 ==",") {Adresse =(temp .toInt());y =y +1;temp ="";} } amend_len3(msg[1]); Assemble_3_byte(); Serial.println (inString); aufrechtzuerhalten. Void string () { unsigned long z =inString.length (); int y =0; für (int i =0; i<=5; i++){ a[i] =0; }int count =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_byte(); aufrechtzuerhalten. Wenn (Anzahl ==4) {//Serial.println (inString); //print_data(); amend_len4(msg[1]); Assemble_4_byte(); } //Seriell.println(inString); //Seriell.println(a[1]); // Serial.println (a [2]); //Seriell.println(a[3]); //Seriell.println(a[4]); //print_data(); aufrechtzuerhalten. Void amend_len4 (struct Nachricht &x) { x.len =4; //Serial.println(x.len);}voidassembl_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);}voidassembl_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; unterbricht(); }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 * Sensorwert; // mA if (C>=Cs) { cv_logic =true; } VerzögerungMikrosekunden (500); Serial.print ("C ="); Serial.println (C);}}void cv_read () { cv_val =0; Verzögerung (200); Strom(); if (bluetooth.available () ==true); { bluetooth.print ( "lesen.."); } Cs =C + 50; CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val0 =cv_calc(0); Verzögerung(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val1 =cv_calc(1); Verzögerung(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val2 =cv_calc(2); Verzögerung(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val3 =cv_calc(3); Verzögerung(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val4 =cv_calc(4); Verzögerung(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val5 =cv_calc(5); Verzögerung(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val6 =cv_calc(6); Verzögerung(10); } } CV_VAL =99; for (int f =1; f<=10; f++){ if (CV_VAL ==99){ cv_val7 =cv_calc(7); Verzögerung(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; wenn (cv_val0 ==1){ cv_val =cv_val + 1; } Wenn (cv_val1 ==1) {cv_val =cv_val + 2; aufrechtzuerhalten. Wenn (cv_val2 ==1) {cv_val =cv_val + 4; } Wenn (cv_val3 ==1) {cv_val =cv_val + 8; } Wenn (cv_val4 ==1) {cv_val =cv_val + 16; } wenn (cv_val5 ==1) {cv_val =cv_val + 32; aufrechtzuerhalten. Wenn (cv_val6 ==1) {cv_val =cv_val + 64; } Wenn (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(); Verzögerung(5); }für (int i =0; i<=5; i++){page_preset_packet(); Verzögerung(5); } für (int i =0; i<=9; i++){ reset_packet(); Verzögerung(5); } for (int i =0; i<=5; i++){cv1_write_packet(); Verzögerung(5); } current();for (int i =0; i<=10; i++){ cv1_write_packet(); Verzögerung(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 enclosureSchematics
Bluetooth receiver / H-Bridge amplifier circuit bluetooth_android_dcc_lmd18200_S8NTVsI4LY.fzzApp instructionsHerstellungsprozess
- MrRobot – Ubuntu Mobile App aktivierte Robotik (Raspberry Pi und Arduino beteiligt)
- 6-Shooter:Arduino-Getränkemischstation
- Arduino Digital Dice
- Arduino-Gamecontroller
- LCD-Animation und -Spiele
- Smarte Schuhe (automatische Schnürung und Stromerzeugung)
- Sonar mit Arduino und Anzeige bei der Verarbeitung von IDE
- Pixel-Chaser-Spiel
- Steuerung der LED-Helligkeit mit Bolt und Arduino
- $10 Portable Arduino Wetterstation (AWS)