Railnet

Servo na Loconet.

DCC | Zdeno Janeček, 02. 01. 2015 (4780 zhliadnutí)

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.

Servo na Loconet - schema

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.

Board ze strany součástek

Zapojení součástek na plošném spoji.

Board ze strany součástek

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.

Prototyp

Toto je prototyp, teda nic extra na podívání. Ale je to 100% funkční.

Prototyp

Ú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
[Akt. známka: 1,25 / Počet hlasov: 4] -      + 

Pridať nový komentár

gamerik 03.01.2015 23:12:00

Celkom zaujímavé...inak nemyslím si, že budeš musieť Jozefa dlho ukecávať... bude rád, keď bude čo tlačiť :c)

Reagovať

eminem 11.01.2015 15:14:57

stretnutie

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)

Reagovať

Pridať nový komentár