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)