NavestidlaShiftDekoder: Porovnání verzí

Z ModelWiki
Skočit na navigaci Skočit na vyhledávání
(MSS - Mast Signal Set)
(Rozšířený packet)
 
(Není zobrazeno 29 mezilehlých verzí od stejného uživatele.)
Řádek 2: Řádek 2:
 
[[Kategorie:Elektronika DCC]]
 
[[Kategorie:Elektronika DCC]]
  
Tento dekodér je založený na Arduinu Nano a překonává omezení jiných dekodérů daná počtem výstupů Arduina pomocí řetězených posuvných registrů 74HC595. Pro ovládání PWM pomocí posuvných registrů se používá knihovna [https://github.com/elcojacobs/ShiftPWM ShiftPWM]. Při vývoji jsem otestoval funkci do poctu 80 výstupů, tzn 16x pětisvětelné návěstidlo.  
+
Tento dekodér je založený na Arduinu Nano a překonává omezení jiných dekodérů daná počtem výstupů Arduina pomocí řetězených posuvných registrů 74HC595. Pro ovládání PWM pomocí posuvných registrů se používá knihovna [https://github.com/elcojacobs/ShiftPWM ShiftPWM]. Při vývoji jsem otestoval funkci '''do počtu 80 výstupů, tzn 16x pětisvětelné návěstidlo''', dekodér "stíhá" včetně PWM pro pozvolné pohasínání a rozsvěcení LEDek.  
  
 
Každé návěstidlo může mít jiná světla - výstupy se přiřazují jednotlivým indikátorům, kterých je 10. Jednotlivé návěstní znaky pak určují které indikátory budou svítit a jak (nesvítí, svítí, bliká, ...). Vejdou se do toho všechny používané druhy návěstidel včetně rychlostních pruhů. Dekodér obsahuje předdefinované sady návěstních znaků - každé návěstidlo musí určit, kterou sadu bude používat.
 
Každé návěstidlo může mít jiná světla - výstupy se přiřazují jednotlivým indikátorům, kterých je 10. Jednotlivé návěstní znaky pak určují které indikátory budou svítit a jak (nesvítí, svítí, bliká, ...). Vejdou se do toho všechny používané druhy návěstidel včetně rychlostních pruhů. Dekodér obsahuje předdefinované sady návěstních znaků - každé návěstidlo musí určit, kterou sadu bude používat.
  
Dekodér se konfiguruje primárně pomocí USB z počítače pomocí [[Terminál pro Arduino|terminálu]]
+
Dekodér se konfiguruje primárně pomocí USB z počítače pomocí [[Terminál pro Arduino|terminálu]], ale podporuje i konfiguraci pomocí CV.
  
 
Teoreticky jde počet návěstidel (a výstupů) i zvýšit, ale nedostačují pak CV pro tabulku přiřazení výstupů pro jednotlivá návěstidla. Případný úpravce se s tím musí popasovat změnou programu.
 
Teoreticky jde počet návěstidel (a výstupů) i zvýšit, ale nedostačují pak CV pro tabulku přiřazení výstupů pro jednotlivá návěstidla. Případný úpravce se s tím musí popasovat změnou programu.
 +
 +
== Přehled ==
 +
Dekodér používá '''šablony návěstidel''' pro éru ČSD. Jsou to předdefinované sady:
 +
- přiřazení světel výstupům
 +
- přiřazení povelů jednotlivým návěstním znakům
 +
Pro éru SŽDC se musí další šablony dodefinovat (použito 19 z 32 možných šablon, místo je). Navíc šablona slouží jen pro ''počáteční nastavení CV'', po jejím použití je možné všechna nastavení pro konkrétní návěstidlo '''libovolně změnit'''.
 +
 +
Dekodér umožňuje různé druhy ovládání návěstidla, aby bylo možné používat návěstidla např. v JMRI, TrainControlleru nebo při ježdění na ruku. Obsazené DCC adresy příslušenství (výhybky) a jejich stav (rovně / odbočkou) se podle stylu ovládání přeloží na '''povel'''. Podle něj se pak podle použité sady návěstí (ČSD, základní, vložené, SŽDC, ...) určí '''aspekt''' (kombinace rozsvícených pozic a způsob signalizace - bliká, svítí). Nakonec se pozice světel převedou na pozice výstupního konektoru.
 +
 +
Na následujícím schématu je znázorněno jak běží zpracování povelů ze 3 adres DCC "výhybek", kterými se návěstidlo ovládá:
 +
 +
[[Soubor:Navestidla.jpg]]
 +
 +
Jak převodní tabulka povelů na aspekty z dané sady, tak převodní tabulka pozic na výstupy, jsou plně konfigurovatelné.
  
 
== Způsoby ovládání návěstidla ==
 
== Způsoby ovládání návěstidla ==
Řádek 30: Řádek 44:
 
| 24 || rovně || 0
 
| 24 || rovně || 0
 
|}
 
|}
značí povel číslo 10 (ať to už znamená co chce). Neméně významný bit (hodnota 1) udává adresa 20 (první adresa), nejvýznamnější bit (hodnota 32) pak adresa 24.
+
značí povel číslo 10, binárně '''01010'''. Neméně významný bit (hodnota 1) udává adresa 20 (první adresa), nejvýznamnější bit (hodnota 16) pak adresa 24.
 +
 
 +
Po změně na přiřazených adresách dekodér chvíli čeká, aby bylo možné měnit další bity a až '''pak''' došlo k přenastavení návěstního znaku. Výchozí nastavení je čekání '''0.128s''', což je málo pro člověka, ale dostačující pro software/PC, např JMRI.
  
 
=== Sada výhybek ===
 
=== Sada výhybek ===
Řádek 38: Řádek 54:
  
 
Například, obsadí-li návěstidlo adresy 20-27 (8 adres, 16 návěstí), pak povel ''2, do odbočky'' zobrazí návěst číslo 6:. 1 '(počítáme od 1)' + (22-20)*2 + 1 '(do odbočky)'.
 
Například, obsadí-li návěstidlo adresy 20-27 (8 adres, 16 návěstí), pak povel ''2, do odbočky'' zobrazí návěst číslo 6:. 1 '(počítáme od 1)' + (22-20)*2 + 1 '(do odbočky)'.
 +
 +
Toto ovládání je vhodné pro ruční ovládání návěstních znaků z MultiMaus - je mírně složitější než varianta "bez rozlišení směru", ale nespotřebuje tolik DCC adres.
  
 
=== Sada výhybek, bez rozlišení směru ===
 
=== Sada výhybek, bez rozlišení směru ===
Řádek 43: Řádek 61:
  
 
=== Rozšířený packet ===
 
=== Rozšířený packet ===
Návěstidlo obsadí jen jedinou DCC adresu, ale pro ovládání se používá rozšířený DCC packet, který MultiMaus a podobné ovladače neumějí - JMRI však ano.
+
Návěstidlo obsadí jen jedinou DCC adresu, ale pro ovládání se používá rozšířený DCC packet, který MultiMaus a podobné ovladače neumějí - JMRI však ano. '''Funkce není zatím dopsaná'''.
 
 
== CLR - Clear ==
 
Příkaz vymaže konfiguraci, a restartuje dekodér.
 
  
== DEF - Define ==
+
== Nastavení dekodéru ==
Definuje návěstidlo. Definice jsou číslované od jedničky do povoleného maxima (16). Při použití čísla již vytvořeného návěstidla se definice přepíše. Definice dále obsahuje:
+
Dekodér se primárně nastavuje pomocí [[Terminál pro Arduino|terminálu]] pomocí příkazů. Terminál také umožňuje vzít v textové formě konfiguraci a uložit si ji. Pro lepší spolupráci s běžnými řídícími programy samozřejmě funguje pomocí konfigurace CV:
- způsob ovládání DCC (bitové, jako výhybka, rozšířený paket) - Viz dále
+
* [[NavestidlaShiftDekoder/Terminálové Příkazy|Terminálové Příkazy]]
- první výstup příslušející návěstidlu (předpokládá se, že návěstidlo obsadí určitý počet po sobě jdoucí výstupů
+
* [[NavestidlaShiftDekoder/Nastavení CV|Nastavení CV]]
- počet světel (max 32 světel na každé návěstidlo)
 
  
<blockquote><pre>
+
Nejjednodušší nastavení pomocí CV je asi toto:
DEF:číslo návěstidla:první výstup:počet světel:režim:počet návěstí
 
</pre></blockquote>
 
  
 +
# Rozmyslet pořadí fyzického zapojení návěstidel, jejich pořadí pak určí obsazené DCC adresy
 +
# Přiřadit dekodéru počáteční adresu '''do CV 1 (+9)'''
 +
# Určit si způsob ovládání návěstidel (viz výše) a převést na část kódu pro řídící CV podle následující tabulky:
 
{| class="wikitable sortable"
 
{| class="wikitable sortable"
 +
|-
 +
! Hodnota !! Význam
 +
|-
 +
| 0 || Bitové
 +
|-
 +
| 32 || Samostatné adresy
 +
|-
 +
| 64 || Rozšířený packet
 +
|-
 +
| 96 || Výhybky
 
|-
 
|-
! Režim !! Druh ovládání !! Počet obsazených adres (N je počet návěstí)
 
|-
 
| b, B || Bitové ovládání (výchozí) || log2 N
 
|-
 
| t, T || Sada výhybek, bez směrů || N / 2
 
|-
 
| c, C || Sada výhybek || N
 
|-
 
| e, E || Rozšířený packet || 1
 
 
|}
 
|}
  
Pro již existující návěstidlo je možné použít zkrácenou formu
+
Pro každé návěstidlo určit kód pro jeho typ, podle následující tabulky:
<blockquote><pre>
+
{{:NavestidlaShiftDekoder/Jednoduchý seznam typů}}
DEF:číslo návěstidla
 
</pre></blockquote>
 
která sice neumožní měnit znaky a počet světel návěstidla, ale otevře definici pro další úpravy, např. mapování výstupů apod.
 
  
Definice se ukončuje příkazem ''END''. Dokud je definice "otevřená" (před vydáním příkazu END), je možné nastavovat další vlastnosi návěstidla.
+
Pak, postupně pro každé zapojené návěstidlo nastavit '''řídící CV''' podle následující tabulky. Hodnota pro řídící CV se vypočítá jako:
 
+
<blockquote>
== SGN - Signal ==
+
'''128''' + kód typu návěstidla + kód způsobu ovládání
Nastaví návěst na návěstidlu
+
</blockquote>
<blockquote><pre>
 
SGN:číslo návěstidla:návěst
 
</pre></blockquote>
 
 
 
Návěst je skutečná návěst podle tabulky JMRI; překladová tabulka podle typu návěstidla se zde neuplatňuje.
 
 
 
== MSS - Mast Signal Set ==
 
Nastaví pro návěstidlo tabulku návěstí. Syntaxe je:
 
<blockquote><pre>
 
MSS:číslo návěstidla:číslo sady
 
</pre></blockquote>
 
  
 
{| class="wikitable sortable"
 
{| class="wikitable sortable"
|-
+
|-  
! Sada návěstí !! rowspan="2" | 1: ČSD: Základní sada !! rowspan="2" | 2: ČSD: Cestová !! rowspan="2" | 3: ČSD: Vložená !! rowspan="2" | 4: SŽDC základní !! rowspan="2" | 5: ČSD: Mechanická
+
! scope="row" | Pořadí návěstidla
|-
+
| 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16  
! Číslo návěsti
+
|-  
|-
+
! scope="row" | Řídící CV
| 1 || Stůj || Stůj || Stůj || Stůj || Stůj
+
| 138 || 151 || 164 || 177 || 190 || 203 || 216 || 229 || 242 || 257 || 270 || 283 || 296 || 309 || 322 || 335
|-
+
|-  
| 2 || Volno || Volno || Volno || Volno || Volno
 
|-
 
| 3 || Výstraha || Výstraha || Výstraha || Výstraha || Výstraha
 
|-
 
| 4 || Očekávej 40 || Očekávej 40 || Očekávej 40 || Očekávej 40 || Pomalu
 
|-
 
| 5 || Očekávej 60 || 40 a opakovaná volno || - || Očekávej 60 || -
 
|-
 
| 6 || Očekávej 80 || 60 a opakovaná volno || Odjezdové návěstidlo dovoluje jízdu || - || Odjezdové návěstidlo dovoluje jízdu
 
|-
 
| 7 || 40 a volno || 40 a volno || Stůj s modrou || 40 a volno || -
 
|-
 
| 8 || 40 a výstraha || 40 a výstraha || 40 a výstraha || 40 a výstraha || Vjezd odbočkou
 
|-
 
| 9 || 40 a očekávej 40 || 40 a očekávej 40 || - || 40 a očekávej 40 || - 
 
|-
 
| 10 || 40 a očekávej 60 || 80 a opakovaná volno || - || 40 a očekávej 60
 
|-
 
| 11 || 40 a očekávej 80 || 40 a opakovaná výstraha || - || - || -
 
|-
 
| 12 || 60 a volno || 60 a volno || - || 60 a volno || -
 
|-
 
| 13 || 60 a výstraha || 40 a opakovaná očekávej 40 || - || 60 a výstraha || -
 
|-
 
| 14 || 60 a očekávej 40 || 40 a opakovaná očekávej 60 || - || 60 a očekávej 40 || -
 
|-
 
| 15 || 60 a očekávej 60 || 40 a opakovaná očekávej 80 || - || 60 a očekávej 60 || -
 
|-
 
| 16 || 60 a očekávej 80 || 60 a opakovaná výstraha || Sunout zakázáno opakovaná || - || - 
 
|-
 
| 17 || 80 a volno || 80 a volno || Sunout zakázáno || 40 a opakovaná výstraha || -
 
|-
 
| 18 || 80 a výstraha || 60 a opakovaná očekávej 40 || Sunout pomalu || 40 a opakovaná očekávej 40 || - 
 
|-
 
| 19 || 80 a očekávej 40 || 60 a opakovaná očekávej 60 || Sunout rychleji || 40 a opakovaná očekávej 60 || -
 
|-
 
| 20 || 80 a očekávej 60 || 60 a opakovaná očekávej 80 || Zpět || Jízda podle rozhledových poměrů || - 
 
|-
 
| 21 || 80 a očekávej 80 || 80 a opakovaná výstraha || Zpět opakovaná || 40 a jízda podle rozhledových poměrů || -
 
|-
 
| 22 || Opakovaná volno || Opakovaná volno || Opakovaná volno || Opakovaná volno || -
 
|-
 
| 23 || Opakovaná výstraha || Opakovaná výstraha || Opakovaná výstraha || Opakovaná výstraha|| -
 
|-
 
| 24 || Opakovaná očekávej 40 || Opakovaná očekávej 40 || Opakovaná očekávej 40 || Opakovaná očekávej 40|| -
 
|-
 
| 25 || Opakovaná očekávej 60 || Opakovaná očekávej 60 || - || Opakovaná očekávej 60 || -
 
|-
 
| 26 || Opakovaná očekávej 80 || Opakovaná očekávej 80 || Posun zakázán opakovaná || - || Uzavření koleje zrušeno
 
|-
 
| 27 || - || 80 a opakovaná očekávej 40 || Na spádovišti se neposunuje || Jízda vlaku dovolena || Stůj, kolej uzavřena
 
|-
 
| 28 || Posun zakázán || - || Posun zakázán || Posun zakázán || Posun zakázán
 
|-
 
| 29 || Posun dovolen || Posun dovolen || Posun dovolen || Posun dovolen || Posun dovolen
 
|-
 
| 30 || Posun dovolen - nezabezpečený || 80 a opakovaná očekávej 60 || Posun dovolen - nezabezpečený || Posun dovolen - nezabezpečený || -
 
|-
 
| 31 || Opatrně na přivolávací návěst bez červené || 80 a opakovaná očekávej 80 || - || Opatrně na přivolávací návěst bez červené || -
 
|-
 
| 32 || Opatrně na přivolávací návěst || Opatrně na přivolávací návěst || Opatrně na přivolávací návěst vložená návěstidla || Opatrně na přivolávací návěst ||
 
Opatrně na přivolávací návěst
 
|-
 
 
|}
 
|}
 
== OUT - Map Output ==
 
Přiřadí světla návěstidla jednotlivým pinům. Při ''zřízení'' návěstidla (plná forma příkazu DEF) se přiřadí všechna světla, počínaje číslem prvního světla v příkazu DEF. Ale někdy je nutné přiřazení světel změnit, nebo např. některá světla úplně vynechat (např. zelené světlo v případě, že návěstidlo vůbec nemá možnost signalizovat volno, vede vždy do odbočky).
 
 
Při mapování výstupů se dá použít několik variant:
 
* ''od''-''do'' přiřadí následujícím světlům výstupy v rozsahu od-do.
 
* ''číslo'' přiřadí následující světlo na požadovaný výstup
 
* ''-'' (pomlčka) - zruší světlo
 
* ''-číslo'' zruší udaný počet následujících světel
 
 
Například:
 
<blockquote><pre>
 
OUT:5-11:-2:20-21
 
</pre></blockquote>
 
* přiřadí pozice 1-6 postupně výstupům 5-11
 
* další 2 pozice označí jako neobsazené
 
* pozice 9 a 10 přiřadí výstupům 20 a 21
 
 
Příkaz '''OUT''' nastaví všechny pozice. Nespecifikované pozice se nastaví jako nepoužité-neobsazené.
 

Aktuální verze z 21. 8. 2023, 08:26


Tento dekodér je založený na Arduinu Nano a překonává omezení jiných dekodérů daná počtem výstupů Arduina pomocí řetězených posuvných registrů 74HC595. Pro ovládání PWM pomocí posuvných registrů se používá knihovna ShiftPWM. Při vývoji jsem otestoval funkci do počtu 80 výstupů, tzn 16x pětisvětelné návěstidlo, dekodér "stíhá" včetně PWM pro pozvolné pohasínání a rozsvěcení LEDek.

Každé návěstidlo může mít jiná světla - výstupy se přiřazují jednotlivým indikátorům, kterých je 10. Jednotlivé návěstní znaky pak určují které indikátory budou svítit a jak (nesvítí, svítí, bliká, ...). Vejdou se do toho všechny používané druhy návěstidel včetně rychlostních pruhů. Dekodér obsahuje předdefinované sady návěstních znaků - každé návěstidlo musí určit, kterou sadu bude používat.

Dekodér se konfiguruje primárně pomocí USB z počítače pomocí terminálu, ale podporuje i konfiguraci pomocí CV.

Teoreticky jde počet návěstidel (a výstupů) i zvýšit, ale nedostačují pak CV pro tabulku přiřazení výstupů pro jednotlivá návěstidla. Případný úpravce se s tím musí popasovat změnou programu.

Přehled

Dekodér používá šablony návěstidel pro éru ČSD. Jsou to předdefinované sady: - přiřazení světel výstupům - přiřazení povelů jednotlivým návěstním znakům Pro éru SŽDC se musí další šablony dodefinovat (použito 19 z 32 možných šablon, místo je). Navíc šablona slouží jen pro počáteční nastavení CV, po jejím použití je možné všechna nastavení pro konkrétní návěstidlo libovolně změnit.

Dekodér umožňuje různé druhy ovládání návěstidla, aby bylo možné používat návěstidla např. v JMRI, TrainControlleru nebo při ježdění na ruku. Obsazené DCC adresy příslušenství (výhybky) a jejich stav (rovně / odbočkou) se podle stylu ovládání přeloží na povel. Podle něj se pak podle použité sady návěstí (ČSD, základní, vložené, SŽDC, ...) určí aspekt (kombinace rozsvícených pozic a způsob signalizace - bliká, svítí). Nakonec se pozice světel převedou na pozice výstupního konektoru.

Na následujícím schématu je znázorněno jak běží zpracování povelů ze 3 adres DCC "výhybek", kterými se návěstidlo ovládá:

Navestidla.jpg

Jak převodní tabulka povelů na aspekty z dané sady, tak převodní tabulka pozic na výstupy, jsou plně konfigurovatelné.

Způsoby ovládání návěstidla

Bitové ovládání

Návěstidlo obsadí tolik po sobě jdoucích DCC adres, kolik je potřeba bitů pro bitově zapsané číslo povelu. Např. je-li počet podporovaných povelů 18, návěstidlo obsadí 5 po sobě jdoucích adres (4 bity je málo, vyjádří jen čísla 0-15). Nastavení "výhybky" na dané DCC adrese "rovně" znamená bitovou hodnotu 0, nastavení "výhybky" do odbočky pak hodnotu 1.

Pokud návěstidlo používá adresy 20-24, pak následující kombinace

Adresa Stav "výhybky" Hodnota bitu
20 rovně 0
21 odbočka 1
22 rovně 0
23 odbočka 1
24 rovně 0

značí povel číslo 10, binárně 01010. Neméně významný bit (hodnota 1) udává adresa 20 (první adresa), nejvýznamnější bit (hodnota 16) pak adresa 24.

Po změně na přiřazených adresách dekodér chvíli čeká, aby bylo možné měnit další bity a až pak došlo k přenastavení návěstního znaku. Výchozí nastavení je čekání 0.128s, což je málo pro člověka, ale dostačující pro software/PC, např JMRI.

Sada výhybek

Návěstidlo obsadí po sobě jdoucí adresy tak, že vždy 2 po sobě jdoucí povely obsadí 1 DCC adresu. Návěst s lichým číslem se zobrazí při "přehození výhybky" na dané adrese rovně, Návěst se sudým číslem pak při přehození této adresy do odbočky. Například návěstidlo zobrazující 16 různých návěstí obsadí po 8 adres jdoucí po sobě.

Povel vydaný pro adresu v obsazeném rozsahu vždy zobrazí povel příslušný pro danou adresu - předchozí stav se zapomene. Taková návěstidla se obtížně používají, pokud se kolejiště po startu systému "inicializuje" a všem "výhybkám" se přisoudí a vydá povel pro výchozí stav. V takovém případě je nutné aby poslední povel v rozsahu adres návěstidla byl ten, který má být nakonec zobrazený, nelze jen adresy projet vzestupně.

Například, obsadí-li návěstidlo adresy 20-27 (8 adres, 16 návěstí), pak povel 2, do odbočky zobrazí návěst číslo 6:. 1 '(počítáme od 1)' + (22-20)*2 + 1 '(do odbočky)'.

Toto ovládání je vhodné pro ruční ovládání návěstních znaků z MultiMaus - je mírně složitější než varianta "bez rozlišení směru", ale nespotřebuje tolik DCC adres.

Sada výhybek, bez rozlišení směru

Návěstidlo obsadí stejný počet adres jako má návěstních znaků. Vydáním povelu pro obsazenou adresu (lhostejno zda "do odbočky" nebo "rovně") se zobrazí příslušná návěst.

Rozšířený packet

Návěstidlo obsadí jen jedinou DCC adresu, ale pro ovládání se používá rozšířený DCC packet, který MultiMaus a podobné ovladače neumějí - JMRI však ano. Funkce není zatím dopsaná.

Nastavení dekodéru

Dekodér se primárně nastavuje pomocí terminálu pomocí příkazů. Terminál také umožňuje vzít v textové formě konfiguraci a uložit si ji. Pro lepší spolupráci s běžnými řídícími programy samozřejmě funguje pomocí konfigurace CV:

Nejjednodušší nastavení pomocí CV je asi toto:

  1. Rozmyslet pořadí fyzického zapojení návěstidel, jejich pořadí pak určí obsazené DCC adresy
  2. Přiřadit dekodéru počáteční adresu do CV 1 (+9)
  3. Určit si způsob ovládání návěstidel (viz výše) a převést na část kódu pro řídící CV podle následující tabulky:
Hodnota Význam
0 Bitové
32 Samostatné adresy
64 Rozšířený packet
96 Výhybky

Pro každé návěstidlo určit kód pro jeho typ, podle následující tabulky:

Typ návěstidla Varianta Světla Číselný kód
Odjezdové Kompletní ZČBŽ 0
Jen rovně ZČB 4
Jen odbočkou ČBŽ 5
Vjezdové Kompletní ŽZČBŽ 1
Jen rovně ŽZČB 4
Jen odbočkou ŽČBŽ 5
Oddílové Autoblok ŽZČ 6
Jednoduché Základní 10
S posunem ZČB 11
S odbočkou ČBŽ 12
Seřaďovací BM 24
Předvěsti Výstraha základní Ž 15
Výstraha opakovací ŽB 16
Vjezdové základní ŽZ 17
Vjezdové opakovací ŽZB 18

Pak, postupně pro každé zapojené návěstidlo nastavit řídící CV podle následující tabulky. Hodnota pro řídící CV se vypočítá jako:

128 + kód typu návěstidla + kód způsobu ovládání

Pořadí návěstidla 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Řídící CV 138 151 164 177 190 203 216 229 242 257 270 283 296 309 322 335