Tentokrát jsem vymyslel a zhotovil ovladač a přestavník Loconetu na vyhybky z vykuchaného serva a malého procesoru Tina 25. Je to dost maličké a celkem spolehlivé. Zkusil jsem vymyslet i mechaniku, aby to bylo kompletní. Je to vymyšlené tak, ze se to dá použit i na přestavník Želva.
V čem je to jiné? Měl jsem pár diskuzí a z toho vyplynulo, že je určitá postupnost vývoje modeláře. Teda koberec (stůl), potom nějaká deska a potom kolejiště. No a to kolejiště se nestaví hned to nejlepší, ale postupně. Teda koleje, ovládání analog, krajina, budovy, digital loko a potom digi ovládání vyhybek a až úplně poslední jsou digi návěstidla a detekce úseků. Dokonce je nejvíc kolejišť, které vůbec nemají návěstidla a detekci obsazení. Proto je asi největší zájem o samotné digi přestavníky a o další příslušenství není skoro vůbec zájem
Z těchto důvodu prezentuji jeden ovladač, s jednou adresou, na jednu vyhybku. Dost podstatně to sníží náročnost stavby, oživení, montáže a obsluhy.
Elektronika se skládá z napájení, příjmu Loconetu, výstupu Loconetu, výkonového členu a vstupu od potenciometru.
Pro napájení jsou dvě možnosti, bud přes Loconet zásuvkou RJ12 anebo externí, přes konektor X1. Obvod má odběr okolo 20 mA (+ motor) a tak je možné použít oboje. Pokud je sběrnice Loconetu X2 oddělená od sběrnice pro ovládání lokomotiv X3, tak je to docela vhodné a nedělá to problémy. Externí rozvod by ale neměl byt střídavý, ale =12V až =15V. Nedoporučuji používat DCC, pokud ho přesto použijete, je nutné ho usměrnit pomoci Graetz můstku, aby se odstranila střídavá složka. Celkem nejschůdnější je použít rozvod X2 a konektory RJ12 a na piny 1 a 6 dát stejnosměrných 12V/500mA. Tím zároveň můžete použít rozvod X2 na napájení návěstidel, které vyžadují právě =12V. Vstupní napětí je stabilizováno na 78L05 a nestabilizované je použito na pohon motorku serva nebo Želvy. Napájení od zásuvky RJ12 se připojuje pomocí JP1. Používám to na základní nastaveni přestavníku, ale v zásadě to muže být i trvalé řešení. Výhoda X2 je, že ji můžete větvit a tak rozložit zatížení celkem rovnoměrně. Pokud použijete externí zdroj 12-15V, tak je vhodné použít plavající zdroj, teda nikde neuzemněné.
Příjem Loconetu je na Tina25 na pinu 7(PB2), kde se pomocí SoftUartu přijme a vyhodnotí. Program reaguje jen na dva pakety s opcode B0 a E5, kdy B0 je příkaz a E5 je konfigurace CV.
Výstup Loconetu je na pinu 5(PB0), kde se pomocí SoftUart inverted vysílá přes tranzistor Q2 do Loconetu. Celkem se mi podařilo vychytat problémy okolo přerušení, které jsou pro SoftUart typické a zrádné.
Ovládání motorku v servu je přes výkonový operační zesilovač L2722, který má celkem přehnané provozní parametry. Ale to není vůbec na škodu, spolehlivost je celkem důležitý parametr.
Vyhodnocení natočení potenciometru je na pinu 2(PB3), kde se pomoci ADC převodníku vyhodnotí a podle hodnoty se zastaví motorek serva. Metoda vyhodnocení je dost přesná a nedochází k zákmitům ramene serva.
Board ze strany součástek, sivé čáry jsou pro systém dělících čar, který používám.
Zapojení součástek na plošném spoji.
Rozměr plošného spoje je 55x33mm.
Určitě se mnozí budou ptát na to, proč jsem udělal dekodér jen pro jedno servo. Pohledem na schéma zjistíte, že společných součástek na více serv moc není a cena pro dvě nebo čtyři serva není až tak zajímavá, aby se vyplatilo ztratit výhodu, jeden ovladač na jedno servo. Tím myslím kolize SoftUartu při příjmu a vykonávání hromadných příkazů a kompaktnosti celého řešení. Cena jednoho ovladače se pohybuje od 5 do 8Eur, podle nákupu, kdy ceny součástek jsou dost rozdílné podle toho, přes kolik rukou to prošlo.
Programové vybavení:
Procesor Tina25/45/85 nemá zabudovaný USART a tak se musí použít SoftUart a jsou s tím trošku problémy. Zvlášť s přerušeními se musí opatrně, aby nedošlo k rozhození synchronizace SoftUart. Teda přerušení musí být krátká a příjem a vysílání Loconetu musí byt uskutečněn v globálním zákazu přerušení. Proto nesmí být vysílány celé pakety, ale jen bajty. Tím se komunikace rozdělí a bloky se zakázaným přerušením nejsou až tak dlouhé. Vyřešení problémů okolo SoftUart bylo naprosto klíčové pro použití tohoto procesoru.
Ovládání výkonového zesilovače L2722 je taky trosku zvláštní, protože používám nepřímé ovládáni přes bity GPIOR0.1 a GPIOR0.2, které podle svého stavu nahazují a shazují porty PB1 a PB4 v přerušení a tak vytvářejí PWM signál na buzení L2722. Odpory R4 a R5 jsou omezující, aby nedošlo k poškození L2722. Odpor R8 likviduje špičky napětí. Na ovládání obvodu používám pakety s opcode B0, které jsou předepsány na ovládání příslušenství. Pokud je nastaven bit „SYS.0 = 0“ v EEPROM, tak obvod odpovídá paketem B1, který se vysílá až po přestavení vyhybky. Takže je tu kontrola toho, že paket byl přijatý a došlo k přestavení vyhybky. Tvar paketu je : <B0, adrl, adrh + DIR, chk> a <B1, adrl, adrh + I + L, chk>.
Na nastavení CV v EEPROM používám paket s opcode E5, kde se dá přenést 8 byte najednou. Můj obvod používá jen 6 byte a to ADRL, ADRH, RYCH, LDO, PDO, SYS. Paket E5, HEX formát:
E5, 10, 50, adrL, adrH, PX1, adrl, adrh, NC, NC , PX2, rych, ldo, pdo, sys, CHK
E5H = opcode Loconet 10H = délka paketu 50H = kód vysílacího zařízeni adrL = 7bit LOW adresa, Loconet formát adrH = 7bit HIGH adresa, Loconet formát PX1 = osmé bity bajtu + ; 0, xc2, xc1,xc0, D4.7, D3.7, D2.7, D1.7, xc2 – xc0 = malá adresa, 0-7 v EEPROM D1 = 7bit data = ADRL 7-bitu LOW adresy na zápis D2 = 7bit data = ADRH 7-bitu HIGH adresy na zápis D3 = 7bit data = NC D4 = 7bit data = NC PX2 = osmé bity bajtu tvar + ; 0, xc5, xc4,xc3, D8.7, D7.7, D6.7, D5.7, xc5 – xc3 = příkaz, co se ma udělat D5 = 7bit data = RYCH 7-bitu rychlosti přesunu, 8-bit je v „PX2.0“ D6 = 7bit data.= LDO 7-bitu levého dorazu, osmý bit se nesmí používat D7 = 7bit data = PDO 7-bitu pravého dorazu, 8-bit je v „PX2.2“, tento bajt se vypočítává „NOT hodnota LDO“. D8 = 7bit data = SYS.0 = 0 povoluje vysílání paketu B1 CHK= kontrola předchozích BYTE pomoci EXOR instrukce a výsledek se zneguje.
V PX1 bajtu jsou bity „xc0“ až „xc2“, které jsem určil pro budoucí použití jako banky v EEPROM 0 az 7. Tim budu moci zapsat až 64 byte do EEPROM.
V PX2 bajtu jsou bity „xc3“ až „xc5“, které jsou příkazové a určují, co se má s paketem udělat.
PX2 = 0001_dddd = čtení hodnot CV, dddd jsou 8.bity D8 až D5 PX2 = 0010_dddd = zápis hodnot CV PX2 = 0011_dddd = odpověď obvodu, kde se vypíšou všechny CV.
LDO je levý doraz, rozsah je 20 až 127, PDO je pravý doraz, ten se nezadává, ale vypočítává jako negace LDO. Je to proto, aby výchylka ramene serva byla symetrická ku střední poloze.
Toto je prototyp, teda nic extra na podívání. Ale je to 100% funkční.
Úpravy a návrh přestavníku z vykuchaného serva.
Nejdůležitější je odstranit elektroniku původního serva a vyvést ven vývody od potenciometru a motorku. Teda celkem 5 vývodů. Na druhou stranu připevnit konektor 2+3 na propojeni s deskou ovladače pomocí klasických jumper konektorů.
Rozebraný přestavník.
Dále je nutné vyfrézovat v rameni serva podlouhlý otvor, kde se pohybuje trn od přestavované páky. Tím je připravené servo.
Přestavovací mechanismus je destička, kde se pomocí distančních trubiček připevní servo a nasadí se rameno serva na trn, který je připájený na samotné přestavovací rameno. Na tomto rameni jsou dva ocelové drátky z kancelářských spinek, které ovládají mikrospínače, na přepínání srdcovky. Je to tak navržené proto, aby šlo nastavovat přesně sepnutí mikrospínačů. Rameno se pohybuje zprava doleva a naopak a je to pohyb lineární a ne kruhový. Velikost výchylky ramena se řídí pomocí CV, Ldo a Pdo v EEPROM. Po každé úpravě CV se musí znovu nastavit spínání mikrospínačů, co je poměrně snadné, vychýlením „spinek“. Servo je nutné osadit tak, aby výškově vymezovalo přestavovací rameno, aby mělo určitou vůli, ale ne moc velkou. Pokud je malá vůle, rameno drhne, pokud velká, tak se to viklá. Na fotce jsou vidět vymezovací podložky.
Pro upevnění pod vyhybku se udělají čtyři díry v rozích podle potřeby a místa.
Drátek, z narovnané spinky, na přestavováni vyhybky se upevní do lustr svorky na konci ramene, pomocí dvou šroubků, protože jeden je málo.
Ted by to ještě chtělo ukecat JKI, aby mi pro to vyráběl krabičky na 3D tiskárně a bylo by to super a dokonalé.
'Pokud chcete grafické zvýraznění syntaxe, tak si to nahrajte do BascomBasic '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ '-------- program na vykuchane servo ------------------------------------------ '------------------------------------------------------------------------------ $regfile = "Attiny25.dat" $crystal = 8000000 ' used crystal frequency $hwstack = 32 $swstack = 24 $framesize = 16 'rozmisteni pinu: '1 RESET 8 VCC '2 portb.3 vstup potenciometru 7 portb.2 prijem Loconet '3 portb.4 vystup PWM, 6 portb.1 vystup PWM, '4 GND 5 portb.0 vysilani Loconet, inverted Portb = &B00000 Ddrb = &B10011 'nastaveni ADC pro cteni polohy pot. v servu pres pinb.2 Config Adc = Free , Prescaler = 128 , Reference = Avcc On Adc Zmerat Nosave Set Admux.mux0 Set Admux.mux1 'ADC3 = PB3 Set Admux.adlar 'chceme vyssi byte ADC Set Adcsrb.adts2 'start ADC pres OVF0 Enable Adc 'obsluha vysilani do Loconetu, kazda hrana zakazuje vysilani na dobu 1560uS + priorita On Pcint0 Hrana Nosave Set Pcmsk.pcint2 'pcint2 na pinu 7 Enable Pcint0 'ovladani PWM pro motorek serva. 125nS x 65536 = 122Hz je kmitocet PWM Config Timer0 = Timer , Prescale = 256 On Ovf0 Casa Nosave On Oc0b Casb Nosave Enable Ovf0 Enable Oc0b 'obsluha casovani pristupu na Loconet 64 x 125nS x (195 az 255) Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 Ocr1a = 200 On Oc1a Prior Nosave Enable Oc1a 'prijem a vysilani Loconetu Open "comb.2:16666,8,n,1" For Input As #1 Open "comb.0:16666,8,n,1,inverted" For Output As #2 'volne promenne Dim Acc As Byte 'volne Dim Bcc As Byte 'volne 'vazane promenne Dim Txd As Byte 'vysilani jednoho byte Dim Rxd As Byte 'prijem jednoho byte Dim Pocet As Byte 'kolik byte prijimame Dim Uart_dnu(16) As Byte 'bafr prijmu Dim Uart_ven(16) As Byte 'bafr vysilani Dim Prior As Byte 'bafr na pocitani priority Loconetu Dim Aadc As Byte 'bafr ADC prevodniku Dim Chk As Byte 'vypocet cheksum Dim Druh As Byte 'druh paketu na prijem 'promenne v EEPROM pameti Dim Nc As Eram Byte At 0 'nedoporuceno pouzivat Dim Adrl As Eram Byte At 1 'LOW adresa, podle normy Dim Adrh As Eram Byte At 2 'HIGH adresa, podle normy Dim Rych As Eram Byte At 3 'rychlost pohybu serva Dim Ldo As Eram Byte At 4 'levy doraz serva Dim Pdo As Eram Byte At 5 'pravy doraz serva Dim Sys As Eram Byte At 6 'stavovy byte 'gpior0.0 = CD Backoff na Loconet 'gpior0.1 = pohyb serva doleva 'gpior0.2 = pohyb serva doprava 'gpior0,3 = priznak prijmu 1 byte Loconet Ocr0b = Rych Enable Interrupts '------------------------------------------------------------------------------- '******************************************************************************* '-------------------------------------------------------- Do 'ceka na prijmu Loconetu sbic Gpior0,3 rcall Prijem 'pocitani priority lds r20,{prior} dec r20 cpi r20,195 brsh nic ser r20 Nic: sts {prior},r20 'vypinani motorku podle natoceni potenciometru If Aadc < Ldo Then Reset Gpior0.1 'ldo If Aadc > Pdo Then Reset Gpior0.2 'pdo Loop '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- Prijem: cbi gpior0,3 If Rxd.7 = 1 Then Uart_dnu(1) = Rxd Pocet = 1 Select Case Rxd Case &HB0 Druh = 1 Case &HE5 Druh = 2 Case Else Druh = 0 End Select Else Select Case Druh Case 1 Incr Pocet Uart_dnu(pocet) = Rxd If Pocet = 4 Then Gosub B0 Case 2 Incr Pocet Uart_dnu(pocet) = Rxd If Pocet = 16 Then Gosub E5 Case Else Pocet = 1 Druh = 0 End Select End If Return '------------------------------------------------------------------------------- B0: Gosub Chk_prij If Chk <> 255 Then Return 'vypocet musi byt 255 If Uart_dnu(2) <> Adrl Then Return 'kontrola low adresy A0 až A6 Chk = Uart_dnu(3) And &B1111 'maska na adresy A10,A9,A8,A7 If Chk <> Adrh Then Return 'kontrola high adresy Chk = Uart_dnu(3) And &B0010_0000 'maska na bit DIR If Chk = 32 Then sbi Gpior0,1 cbi gpior0,2 Else sbi Gpior0,2 cbi gpior0,1 End If Acc = Sys If Acc.0 = 0 Then Uart_ven(1) = &HB1 Uart_ven(2) = Uart_dnu(2) Acc = Uart_dnu(3) If Acc.5 = 1 Then Reset Acc.5 Set Acc.4 Uart_dnu(3) = Acc Else Set Acc.5 End If Uart_ven(3) = Acc Pocet = 3 Gosub Vysilani End If Return '-------------------------------------------------------- Chk_prij: Chk = 0 For Acc = 1 To Pocet Chk = Chk Xor Uart_dnu(acc) Next Acc Return '------------------------------------------------------------------------------ 'B0, 10, 50, adrL, adrH, PX1, adrl, adrh, NC, NC , PX2, rych, ldo, pdo, sys, CHK 'B0H = opcode Loconet '10H = delka paketu '50H = kod vysilaciho zarizeni 'adrL = 7bit LOW adresa 'adrH = 7bit HIGH adresa 'PX1 = osme bity bajtu;0, xc2, xc1,xc0, D4.7, D3.7, D2.7, D1.7, xc2 - xc0 = mala adresa, 0-7 v EEPROM 'D1 = 7bit data 'D2 = 7bit data 'D3 = 7bit data 'D4 = 7bit data 'PX2 = osme bity bajtu;0, xc5, xc4,xc3, D8.7, D7.7, D6.7, D5.7, xc6 - xc3 = prikaz, co se ma udelat 'D5 = 7bit data 'D6 = 7bit data 'D7 = 7bit data 'D8 = 7bit data 'CHK= kontrola predchozich BYTE pomoci EXOR instrukce a vysledek se zneguje. E5: Gosub Chk_prij 'kontrola Cheksum pomoci EXOR If Chk <> 255 Then Return 'vypocet musi byt 255 'kontrolna adresa (hodnota) vysilace If Uart_dnu(3) <> &H50 Then Return 'test na platny paket 'broadcast paket If Uart_dnu(4) = 0 Then If Uart_dnu(5) = 0 Then Goto Broad End If If Uart_dnu(4) <> Adrl Then Return 'test adresy LOW If Uart_dnu(5) <> Adrh Then Return 'test adresy HIGH If Uart_dnu(6) > 0 Then Return 'adresa v EEPROM 1 - 8 'hodnoty musi byt v rozsahu 0 - 127. Sedmy bit bude ignorovany nebo vypocitany ' Pdo se vypocitava “NOT Ldo“ '--- 'zjistime typ prikazu v PX2 bity xc0 az xc2 '16 = cteni; 32 = zapis; 48= odpoved prislusenstvi Broad: Acc = Uart_dnu(11) And &B0011_0000 If Acc = 16 Then Gosub Cteni If Acc = 32 Then Gosub Zapis Return '--- Cteni: Uart_ven(1) = &HE5 Uart_ven(2) = &H10 Uart_ven(3) = &H50 Uart_ven(4) = Adrl Uart_ven(5) = Adrh Uart_ven(6) = 0 Uart_ven(7) = Adrl Uart_ven(8) = Adrh Uart_ven(9) = 0 Uart_ven(10) = 0 Acc = Uart_ven(11) Or 48 Bcc = Rych Acc.0 = Bcc.7 Reset Bcc.7 Uart_ven(11) = Acc Uart_ven(12) = Bcc Uart_ven(13) = Ldo Bcc = Pdo Acc.2 = Bcc.7 Reset Bcc.7 Uart_ven(11) = Acc Uart_ven(14) = Bcc Uart_ven(15) = Sys Pocet = 15 Gosub Vysilani Return '--- Zapis: If Adrl <> Uart_dnu(7) Then Adrl = Uart_dnu(7) If Adrh <> Uart_dnu(8) Then Adrl = Uart_dnu(8) Acc = Uart_dnu(11) Bcc = Uart_dnu(12) Bcc.7 = Acc.0 If Rych <> Bcc Then Rych = Bcc If Ldo <> Uart_dnu(13) Then Ldo = Uart_dnu(13) Acc = Not Uart_dnu(13) If Pdo <> Acc Then Pdo = Acc If Sys <> Uart_dnu(15) Then Sys = Uart_dnu(15) Gosub Cteni Return '------------------------------------------------------------------------------ Vysilani: Chk = 0 For Acc = 1 To Pocet Chk = Chk Xor Uart_ven(acc) Next Acc Incr Pocet Uart_ven(pocet) = Not Chk Bitwait Gpior0.0 , Set For Acc = 1 To Pocet Txd = Uart_ven(acc) Disable Interrupts Printbin #2 , Txd Enable Interrupts Next Acc cbi gpior0,0 Return '------------------------------------------------------------------------------ '------ podprogramy od preruseni ---------------------------------------------- '------------------------------------------------------------------------------ 'zmerilo hodnotu na PINB.2 a zapise do "Aadc" Zmerat: push r20 in r20,adch sts {aadc},r20 pop r20 reti '--------------------- 'podle priznaku se nahazuje PWM Casa: sbic gpior0,1 sbi portb,1 sbic gpior0,2 sbi portb,4 Reti '----------------- 'zde se zhazuje PWM. Casb: cbi portb,1 cbi portb,4 Reti '----------------- Hrana: cbi gpior0,0 push r20 ldi r20,0 sts tcnt1,r20 lds r20,{prior} sts ocr1a,r20 pop r20 Sbic Pinb,2 reti rcall nacti sbi gpior0,3 reti '----------------- Prior: sbi gpior0,0 reti '----------------- Nacti: push r18 push r19 push r24 push r25 push r26 in r26,sreg push r26 Inputbin #1 , Rxd pop r26 !out sreg,r26 pop r26 pop r25 pop r24 pop r19 pop r18 ret Return '------------------------------------------------------------------------------ $eepromhex $eeprom Data 0 'nedoporucuje se pouzivat ' adrl adrh rych ldo pdo sys Data 007 , 000 , 180 , 098 , 158 , 0 $data 'promenna SYS obsahuje stavove priznaky pro ovladac serva '"sys.0" = 0 ; povoleni vysilat paket B1 '------------------------------------------------------------------------------ end
Celkom zaujímavé...inak nemyslím si, že budeš musieť Jozefa dlho ukecávať... bude rád, keď bude čo tlačiť :c)
AHOJ modelári, poprosím Vás, nejaké stretnutie ako minulý rok bolo v TRENČÍNE v Laugaríciu sa PRIPRAVUJE???-rád by som si Vás opäť pozrel. (sorry ale inak Vás kontaktovať mi nejde)