Добавить
Уведомления

javascript dcc multi train demo, using modified bachmann controller, source in the description

#javascript #dcc #dccjavascript #bachmanncontroller #bachmanntrain #kaluma #kalumajs // javascript uf2 from ---- https://kalumajs.org/docs // javascript notes: // when you use bit shifting, it turns into signed numbers // and result might be negative // you need to shift right 3x 0 to turn it back to positive // source code with angle brackets --- https://crus.in/codes/website_dcc_speed.txt // booster: https://www.pololu.com/product/2961 // pwm - 3.3v // dir - gpio14 // bachmann potentiometer - gpio26 // bachmann direction pulled up to 10k - gpio8 // external switch train choice pulled up to 10k - gpio6 // replace _GT_ with greater than symbol // replace _LT_ with less than symbol // youtube don't like angle brackets const {PIO, ASM, StateMachine} = require('rp2'); var amtrak_isActive = new Boolean(false); let f7b_address = Uint8Array; let amtrak_address = Uint8Array; let checksum = Uint32Array; let packet1 = Uint32Array; let packet2 = Uint32Array; let controller_speed = Uint8Array; // direction pin var dir_pin = 8; pinMode(dir_pin, INPUT_PULLUP); // train pin var train_pin = 6; pinMode(train_pin, INPUT_PULLUP); // speed hook up to bachman pot // i messed up the wiring so speed indicator is reverse // i will fix it later var speed_pin = 26; function getSpeed(){ var value = analogRead(speed_pin); return value * 10.0; // scale it } const asm = new ASM(); asm .label('bitloop') .set('pins', 1).delay(20) .out('x', 1) .jmp('!x', 'do_zero') .set('pins', 0).delay(21) .jmp('bitloop') .label('do_zero') .nop().delay(16) .set('pins', 0).delay(30) .nop().delay(8); const sm = new StateMachine(0, asm, { freq: 400000.0, autopull: true, fifoJoin: PIO.FIFO_JOIN_TX, outShiftDir: PIO.SHIFT_LEFT, setBase: 14, }); sm.active(true); f7b_address = 0x17; amtrak_address = 0x0e; // stop trains function init(){ controller_speed = 0x00; checksum = amtrak_address ^ controller_speed; packet1 = ((0xfff8 _LT_LT_ 16)|(amtrak_address _LT__LT_ 10)|(controller_speed _LT__LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; for (let i=0; i_LT_50; i++){ sm.put(packet1); sm.put(packet2); } checksum = f7b_address ^ controller_speed; packet1 = ((0xfff8 _LT__LT_ 16)|(f7b_address _LT__LT_ 10)|(controller_speed _LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; for (let i=0; i_LT_50; i++){ sm.put(packet1); sm.put(packet2); } } // start of program init(); // stop trains // refresh every 50 milliseconds setInterval(() =_GT_ { // check which train to operate if (digitalRead(train_pin)){ amtrak_isActive = true; } else {amtrak_isActive = false; } // get potentiometer value var tempSpeed = Math.round(getSpeed()); switch (true) { case (tempSpeed _LT_ 1): controller_speed = 9; break; case (tempSpeed _LT_ 3): controller_speed = 7; break; case (tempSpeed _LT_ 4): controller_speed = 6; break; case (tempSpeed _LT_ 5): controller_speed = 5; break; case (tempSpeed _LT_ 6): controller_speed = 4; break; case (tempSpeed _LT_ 7): controller_speed = 3; break; case (tempSpeed _LT_ 8): controller_speed = 1; break; case (tempSpeed _LT_ 9): controller_speed = 0; break; default: controller_speed = 0; break; } // check for direction change if (digitalRead(dir_pin)){ controller_speed += 0x60; } else { controller_speed += 0x40; } if (amtrak_isActive) { checksum = amtrak_address ^ controller_speed; packet1 = ((0xfff8 _LT__LT_ 16)|(amtrak_address _LT__LT_ 10)|(controller_speed _LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; } else { checksum = f7b_address ^ controller_speed; packet1 = ((0xfff8 _LT__LT_ 16)|(f7b_address _LT__LT_ 10)|(controller_speed _LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; } for (let i=0; i_LT_50; i++){ sm.put(packet1); sm.put(packet2); } }, 50);

Иконка канала JS Веб-гуру
73 подписчика
12+
17 просмотров
2 года назад
12+
17 просмотров
2 года назад

#javascript #dcc #dccjavascript #bachmanncontroller #bachmanntrain #kaluma #kalumajs // javascript uf2 from ---- https://kalumajs.org/docs // javascript notes: // when you use bit shifting, it turns into signed numbers // and result might be negative // you need to shift right 3x 0 to turn it back to positive // source code with angle brackets --- https://crus.in/codes/website_dcc_speed.txt // booster: https://www.pololu.com/product/2961 // pwm - 3.3v // dir - gpio14 // bachmann potentiometer - gpio26 // bachmann direction pulled up to 10k - gpio8 // external switch train choice pulled up to 10k - gpio6 // replace _GT_ with greater than symbol // replace _LT_ with less than symbol // youtube don't like angle brackets const {PIO, ASM, StateMachine} = require('rp2'); var amtrak_isActive = new Boolean(false); let f7b_address = Uint8Array; let amtrak_address = Uint8Array; let checksum = Uint32Array; let packet1 = Uint32Array; let packet2 = Uint32Array; let controller_speed = Uint8Array; // direction pin var dir_pin = 8; pinMode(dir_pin, INPUT_PULLUP); // train pin var train_pin = 6; pinMode(train_pin, INPUT_PULLUP); // speed hook up to bachman pot // i messed up the wiring so speed indicator is reverse // i will fix it later var speed_pin = 26; function getSpeed(){ var value = analogRead(speed_pin); return value * 10.0; // scale it } const asm = new ASM(); asm .label('bitloop') .set('pins', 1).delay(20) .out('x', 1) .jmp('!x', 'do_zero') .set('pins', 0).delay(21) .jmp('bitloop') .label('do_zero') .nop().delay(16) .set('pins', 0).delay(30) .nop().delay(8); const sm = new StateMachine(0, asm, { freq: 400000.0, autopull: true, fifoJoin: PIO.FIFO_JOIN_TX, outShiftDir: PIO.SHIFT_LEFT, setBase: 14, }); sm.active(true); f7b_address = 0x17; amtrak_address = 0x0e; // stop trains function init(){ controller_speed = 0x00; checksum = amtrak_address ^ controller_speed; packet1 = ((0xfff8 _LT_LT_ 16)|(amtrak_address _LT__LT_ 10)|(controller_speed _LT__LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; for (let i=0; i_LT_50; i++){ sm.put(packet1); sm.put(packet2); } checksum = f7b_address ^ controller_speed; packet1 = ((0xfff8 _LT__LT_ 16)|(f7b_address _LT__LT_ 10)|(controller_speed _LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; for (let i=0; i_LT_50; i++){ sm.put(packet1); sm.put(packet2); } } // start of program init(); // stop trains // refresh every 50 milliseconds setInterval(() =_GT_ { // check which train to operate if (digitalRead(train_pin)){ amtrak_isActive = true; } else {amtrak_isActive = false; } // get potentiometer value var tempSpeed = Math.round(getSpeed()); switch (true) { case (tempSpeed _LT_ 1): controller_speed = 9; break; case (tempSpeed _LT_ 3): controller_speed = 7; break; case (tempSpeed _LT_ 4): controller_speed = 6; break; case (tempSpeed _LT_ 5): controller_speed = 5; break; case (tempSpeed _LT_ 6): controller_speed = 4; break; case (tempSpeed _LT_ 7): controller_speed = 3; break; case (tempSpeed _LT_ 8): controller_speed = 1; break; case (tempSpeed _LT_ 9): controller_speed = 0; break; default: controller_speed = 0; break; } // check for direction change if (digitalRead(dir_pin)){ controller_speed += 0x60; } else { controller_speed += 0x40; } if (amtrak_isActive) { checksum = amtrak_address ^ controller_speed; packet1 = ((0xfff8 _LT__LT_ 16)|(amtrak_address _LT__LT_ 10)|(controller_speed _LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; } else { checksum = f7b_address ^ controller_speed; packet1 = ((0xfff8 _LT__LT_ 16)|(f7b_address _LT__LT_ 10)|(controller_speed _LT__LT_ 1)) _GT__GT__GT_ 0; packet2 = ((checksum _LT__LT_ 24)|0x01|(0xffffff)) _GT__GT_ 0; } for (let i=0; i_LT_50; i++){ sm.put(packet1); sm.put(packet2); } }, 50);

, чтобы оставлять комментарии