Railnet

Detekce obsazení pro Loconet

DCC | Zdeno Janeček, 21. 02. 2018 (1116 zhliadnutí)

Mám ve zvyku dělat věci jednoduše a tak trochu nadčasově. Není to nové, jen je to udělané trošku jinak. Tím myslím připojení do layoutu. Největší výhoda je, že se nemusí nic nastavovat pomocí jiného programu.Tento modul neumí nic jiné než detekovat a poslat správu, o změně obsazení, paketem s opcode B2.

Teda je možné použít dělenou inteligenci a například shazovat návěstidlo nebo rozsvítit LEDku na panelu pomocí LocoIo. Jinak se tento modul bude dát použít na autoblok, pokud si ho někdo naplánuje, protože je dost univerzální.

Protokol Loconetu je velmi univerzální, tak jsem to využil při stavbě a tak lze modul detekce použít všeobecně, tam, kde se to bude hodit. Přednostně na automatizaci kolejiště pomocí PC nebo dělené inteligence.

Schéma

Popis součástek

Obvod je určený na trvalé připojení na Loconet, odkud bere energii na svůj chod a proto musí být navržený velice úsporně. Pokud se použijí předepsané součástky, tak je odběr proudu pod 4mA a to celkem vyhovuje. Stejně ale doporučuji provoz na paralelní sběrnici Loconet (X2), kterou celkem v pohodě obejdete všechny problémy, včetně neústupných “puristů”.

Klíčové součástky jsou procesor a stabilizátor. Pokud se použije stabilizátor na 3V3 typu drop-out, tak provoz procesoru na 8MHz / 2 je velmi úsporný a to doplňuje LM339, který má sám velmi nízkou spotřebu. Dále se musí použít tranzistory (BC337-40) s vysokým h21(min 450), které dokáží spolehlivě stáhnout zdroj proudu v Loconetu.

Na nastavování adresy slouží konfigurační lišta 2x9 jehel a ta se nastavuje pomoci zkratovacích spojek.

Je to klasika 4, 8, 16, 32, 64, 128, 256, 512, 1024 podle binární soustavy. Bity 1 a 2 se používají interně. Spojené piny znamenají zapnutá hodnota. Myslím, že trošku binární matematiky nikomu neuškodí.

Kondensátory ve vstupech jsou keramika 2.2nF a diody Zenerky 3V3, na ochranu vstupů.

Toroidy jsou namotané 2 + 6 závitu (primár, sekundár), to podle hodnoty Q toroidu. Tady je Q 1500.

Pojistka Polyswitch je na 100mA, to jen pro jistotu.

Popis funkce

Na vstupy toroidů se připojí do série detekovaná kolej a na výstupu LM339 se objeví kladný impuls při odběru. Ten se detekuje na vstupech procesoru a ten ho vyhodnotí a pošle příslušný paket s opcode B2.

Největší výhoda tohoto návrhu je absence nastavování pomocí cizího programu. Na portech B.0 až B.7 a D.6 se pomocí spojek vybere adresa, na kterou se posílají pakety s opcode B2. To znamená, že pomocí binární soustavy můžete nastavit čtveřici adres od 1-4 až po 2045-2048 včetně. Nejnižší bit LSB je na PD.6 a nejvyšší bit MSB je na PB.7. Nastavujeme teda 9 bitů, plus dva bity adresy interně, teda celkem 11-bitové adresování. Norma dovoluje adresovat až do 4096, ale na to už nemám volný pin. Ale myslím, že za cenu jednoduchého nastavování spojkami na switchi se to oplatí.

Nejmenší spolehlivě detekovaný proud je asi 750uA, teda 15V / 20k ohmů. Zakázané pásmo, kdy není jistota výstupního stavu je až do 25k ohmů, teda je nutné zabezpečit, aby parazitní odběr nikdy nepřekročil hodnotu 600uA. Hodnoty pod 600uA už obvod nedetekuje. Je tam poměrně dobře vyřešená hystereze, takže pokud není odběr přesně mezi 600 až 750uA, tak je údaj o <obsazení / neobsazení> velmi stabilní.

V zásadě by se to dalo udělat ještě citlivější, ale mam dojem, že by to už detekovalo i zapnutí konvice na čaj, což by asi nebylo dobré.

Pokud dojde k přeslechům mezi kanály detekce, musí se osadit železné plechy mezi jednotlivé toroidy, aby se obmezil magnetický přenos. Jsou tam vedeny zemnící spoje, aby se to dalo připájet. Hodně taky pomůže natočení nesouhlasně o 90 stupňů, které to obmezí.

Návod na stavbu

Mám dojem, že toto je celkem vhodné na stavbu i pro začátečníky, tak zkusím napsat návod a dám podklady na stavbu. Zkontroluje se plošný spoj na zkraty a praskliny proti ostrému světlu. Součástky se osazují od nejnižších, teda od drátové spojky až po konektory RJ12 6/6. Celkem doporučuji mikropájku, ale dá se to i pistolovkou. Zapojení nemá záludnosti, jen je třeba pracovat pečlivě.

Jediná věc, která se nedá koupit jsou namotané toroidy, ty si musíme vyrobit sami. Použije se obyčejný telefonní drát 0,5mm v bužírce, z kterého se namotá 2 + 6 závitů a osadí se hotový toroid na plošný spoj. Toroidy se dají sehnat na starých motherboardech anebo se dají koupit v e-obchodech. Soupis a popis součástek je v souborech Eagle. Pokud něco nevíte, zkuste mi napsat, pokud budu vědět, poradím.

Programové vybavení

Toto je naprosto klíčové, protože falešné ohlasy, teda hazardy dělají velké problémy při automatizaci kolejiště. Určitý počet hazardů teda musíme tolerovat a počítat s nimi. Další problém je vynechání impulsů detekce nějakou dobu, například BMF, když se měří otáčky motoru naprázdno a motor teda funguje jako generátor napětí a loko neodebírá proud. Toto vše se musí vzít do úvahy při psaní programu.

Pokud obvod detekce zjisti nad 50 impulsu, tak se usek považuje za obsazený. Maximum detekovaných impulsů za 20mS může být asi 300, proto hodnota 50 je tak nějak odpovídající. (0,02 / 0,00006 = 333).

Zapojení do layoutu

Obvod je navrhnutý trošku univerzálně a tak se to musí vzít do úvahy při zapojení do kolejiště. Tím myslím, že to není typická jednoúčelovka, takže při zapojování je nutné trošku přemýšlet.

Důležité je si uvědomit, že se to zapojuje do série s kolejí !!

Tu například zapojeni detekce 4 modulu, kde leva kolej je zapojená průběžně a pravá kolej přes detekci obsazeni. To znamená, že se 4 vývody do toroidů zapojí paralelně na vstup DCC a každý výstup toroidu se zapojí samostatně na jednotlivý modul, viz obrázek.

Poznámky

Obvod neumí nic jiné, než poslat paket s opcode B2 o obsazení nebo uvolnění úseku. Teda musí existovat další obvod, který to vyhodnotí. V současnosti pracuji na LocoIo pro Atmega, která bude umožňovat použití a napojení tohoto modulu. Přikládám RAR soubor, kde jsou podklady pro EAGLE a HEX soubor pro Attiny2313A. Původně byl tento modul plánovaný na DCC GateWay, ale přišel jsem na jednodušší řešení, tak to dávám samostatně.

 

‚--------------------------------------------------------------------------------------------------------------------
Program na Attiny 2313A, napsaný v BascomBasic, který je do 4kB kódu  FREE.
https://www.mcselec.com/index.php?option=com_docman&task=cat_view&gid=99&Itemid=54 
'--------------------------------------------------------------
'---------- At2313A na detekci obsazeni -----------------------
'--------------------------------------------------------------
'---------- 4x detekce obsazeni -------------------------------
'--------------------------------------------------------------
 'obsazeni pinů
 '1 - reset                                 20 - VCC
 '2 - pind.0 RxD Loconet        19 - pinb.7  adresa 10.bit
 '3 - pind.1 TxD Loconet        18 - pinb.6  adresa  9.bit
 '4 - pina.1 krystal 8 MHz      17 - pinb.5  adresa  8.bit
 '5 - pina.0 krystal 8 MHz      16 - pinb.4  adresa  7.bit
 '6 - pind.2 vstup detekce       15 - pinb.3  adresa  6.bit
 '7 - pind.3 vstup detekce       14 - pinb.2  adresa  5.bit
 '8 - pind.4 vstup detekce       13 - pinb.1  adresa  4.bit
 '9 - pind.5 vstup detekce       12 - pinb.0  adresa  3.bit
 '10- zem                                11 - pind.6  adresa  2 bit
'--------------------------------------------------------------
 'obvod ma 4 detekce obsazeni, proto adresa zacina kazdy 4 byte
 'teda nasobky 4 =0, 4, 8, 12, 16 ....2044
 'celkovy adresovy prostor je teda 11 bitu = 0 - 2047 adres po skocich 4 adres
 '<0xB2>, , , 
 ' =<0,A6,A5,A4- A3,A2,A1,A0>, 7 ls adr bits. A1,A0 select 1 of 4 inputs pairs in a DS54
 ' =<0,X,I,L- A10,A9,A8,A7> Report/status bits and 4 MS adr bits.
 '"I"=0 for DS54 "aux" inputs and 1 for "switch" inputs mapped to 4K SENSOR space.
 ' (This is effectively a least significant adr bit when using DS54 input configuration)
 '"L"=0 for input SENSOR now 0V (LO) , 1 for Input sensor >=+6V (HI)
 '"X"=1, control bit , 0 is RESERVED for future!

 $regfile = "Attiny2313a.dat"           'Soubor s deklaracemi
 $crystal = 4000000                     'Kmitočet krystalu v Hz
 Config Clockdiv = 2                    'basic 8MHz /2
 $hwstack = 24
 $swstack = 16
 $framesize = 16
 $baud = 16666

  Ddrb = 0
  Portb = 255                           'portB vstupy s pull-up
  Ddrd = 2                              'TxD
  Portd = &B0111_1110                   'RxD = 0 a zbytek = pull-up
 
 'premenne
  Dim Acc As Byte
  Dim Chk As Byte
  Dim Adrl As Byte
  Dim Adrh As Byte
  Dim Uart(4) As Byte
  Dim Rxd As Byte
  Dim Wcc As Word

 'nulovani Timer1 od hrany Loconetu, tady je zvlastnost prepinani PCMSK2, viz program
  On Pcint2 Hrana Nosave                'preruseni od PCINT2
  Pcmsk2 = 1                            'pin RxD
  Enable Pcint2                         'povoleni PCINT2

 'nastaveni Timer1 na casovani Loconetu, povoleni vysilani do Loconetu
  Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1
  On Oc1a Cas1 Nosave                   '250nS x 6240 = 1560 uS
  Wcc = Pinb * 8                        '250nS * 8 = 2uS, použije se adresa na rozliseni po 2uS
  Ocr1a = 6240 + Wcc                    'cas priorit po 2uS
  Enable Oc1a

 'ziskani adresy pro paket B2 z portB.0 až B.7 a D.6 do formatu Loconet
 'je to pomerne slozite, vsak norma Loconet je taky pekne sprasena
 'napisane v ASM, protože na toto je Bascom prilis ukecany.
  clr r21
  in  r20,pinb                          'Adr 3 az A11
  com r20
  in  r22,pind                          'Adr 2
  com r22
  lsl r20
  rol r21
  lsl r20
  rol r21
  lsl r20
  rol r21
  lsr r20
  bst r22,6
  bld r20,1
  Sbr r21,64                            'bit X podle normy
  sts {adrl},r20
  sts {adrh},r21

  Enable Interrupts
 '***************************************************************
 'hlavni program
 '***************************************************************
 'tady se volaji jednotlive detekce jedna po druhe a nasledne se vyhodnocuji
 'protoze do smycky vstupuji ruzne hazard impulsy a taky treba BMF,
 'je nutne to pocitat a spravne vyhodnotit.
 'tu to probehne 4x pro kazdy vstup detekce samostatne, podle PCMSK2
 Do
   Pcmsk2 = 4                           'preruseni od detekce 1
   Wcc = 0                              'vynulovani pocitadla
   Waitms 20                            'nascitani pocitadla detekce
    If Wcc => 50 Then                   'vyhodnoceni
     sbi gpior1,0                       'obsazeno
    Else
     cbi gpior1,0                       'neobsazeno
    End If
   Pcmsk2 = 1                           'pin RxD
   If Gpior1.0 <> Gpior1.4 Then Gosub Prvni
 '----------------------------
   Pcmsk2 = 8                           'preruseni od detekce 2
   Wcc = 0
   Waitms 20
    If Wcc => 50 Then
     sbi gpior1,1
    Else
     cbi gpior1,1
    End If
   Pcmsk2 = 1                           'pin RxD
  If Gpior1.1 <> Gpior1.5 Then Gosub Druha
 '----------------------------
   Wcc = 0
   Pcmsk2 = 16                          'preruseni od detekce 3
   Waitms 20
    If Wcc => 50 Then
     sbi gpior1,2
    Else
     cbi gpior1,2
    End If
   Pcmsk2 = 1                           'pin RxD
  If Gpior1.2 <> Gpior1.6 Then Gosub Treti
 '----------------------------
   Pcmsk2 = 32                          'preruseni od detekce 4
   Wcc = 0
   Waitms 20
    If Wcc => 50 Then
     sbi gpior1,3
    Else
     cbi gpior1,3
    End If
   Pcmsk2 = 1                           'pin RxD
  If Gpior1.3 <> Gpior1.7 Then Gosub Ctvrta

 Loop
 '***************************************************************
 'podprogramy
 '----------------------------
 'priznaky se srovnaji a vysila se paket B2
 'to probiha pro kazdu detekci a preruseni samostatne
  Prvni:
   Gpior1.4 = Gpior1.0
    Reset Adrl.0
    Reset Adrh.5
    Adrh.4 = Gpior1.0                   '1=obsazeno / 0=neobsazeno
    Uart(1) = &HB2
    Uart(2) = Adrl
    Uart(3) = Adrh
    Gosub Vysilej
  Return
 '----------------------------
  Druha:
   Gpior1.5 = Gpior1.1
    Reset Adrl.0
    Set Adrh.5
    Adrh.4 = Gpior1.1
    Uart(1) = &HB2
    Uart(2) = Adrl
    Uart(3) = Adrh
    Gosub Vysilej
  Return
 '----------------------------
  Treti:
   Gpior1.6 = Gpior1.2
    Set Adrl.0
    Reset Adrh.5
    Adrh.4 = Gpior1.2
    Uart(1) = &HB2
    Uart(2) = Adrl
    Uart(3) = Adrh
    Gosub Vysilej
  Return
 '----------------------------
  Ctvrta:
   Gpior1.7 = Gpior1.3
    Set Adrl.0
    Set Adrh.5
    Adrh.4 = Gpior1.3
    Uart(1) = &HB2
    Uart(2) = Adrl
    Uart(3) = Adrh
    Gosub Vysilej
  Return
 '----------------------------
 'vysilani do Loconetu s kontrolu prvniho byte
  Vysilej:
   Chk = Uart(1) Xor Uart(2)
   Chk = Chk Xor Uart(3)
   Uart(4) = Not Chk

  Vysi:
    cbi gpior0,0                        'vynulovani priznaku vysilani
    Bitwait Gpior0.0 , Set
    Udr = Uart(1)

    While Ischarwaiting() = 1           'splachnuti bafru prijmu
      Chk = Udr
    Wend

    Gosub Prijmi_bajt
    If Uart(1) <> Rxd Then Goto Kolize  'kontrola 1. byte
    Printbin Uart(2) , 3
  Return

  Kolize:
    Reset Ucsrb.txen                    'uvolneni pinu od funkce TxD
    Reset Portd.1
    Waitus 900
    Set Portd.1
    Set Ucsrb.txen
   Goto Vysi
 '---------------------------------------------------------------------------
  'cekani na prijem jednoho byte od UART
   Prijmi_bajt:
    If Ischarwaiting() <> 1 Then Goto Prijmi_bajt 
      Inputbin Rxd
   Return
 '***************************************************************
 'podprogramy od preruseni
 '-----------------------------
  Cas1:
   sbi gpior0,0                         'povoleni vysilani do Loconet
  Reti
 '-----------------------------
  Hrana:
   push r28
   push  r29
   in    r29,sreg
   push  r29

    sbi gpior0,0                        'zakaz vysilani do Loconet

    clr r28
    sts tcnt1h,r28                      'vymazani citace 1
    sts tcnt1l,r28

   sbic pcmsk2,0                        'preskoceni detekce pri nepouzivani
   rjmp Fff

    lds   r28,{wcc}                     'pocitani detekce
    lds   r29,{wcc+1}
    adiw  r28,1
    sts  {wcc},r28
    sts  {wcc+1},r29

   Fff:
   pop  r29
  !out  sreg,r29
   pop  r29
   pop r28
  Return
 '------------------------------------------------------------------------------
[Akt. známka: 5,00 / Počet hlasov: 4] -      + 

K tomuto článku nebol doposiaľ priradený žiadny komentár!

Pridať nový komentár