PICAXE 20M2 + servo+7 segment

Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

PICAXE 20M2 + servo+7 segment

Příspěvek od Pepa z depa »

PICAXE 20M2 + 7 segment CA + HT12D - counter 0-9/ IR servocontroller

Zdravím všechny a obzvlášť picaxeodborníky...
Vymyslel jsem si takovej nesmysl a začínám ho realizovat.
Prostě potřebuju servo, kupodivu na dálkový ovládání, ale jelikož je to na malou vzdálenost, tak IR.
To IR jsou HT12A vysílač (hotová krabička kterou chci použít a nechci jí předělávat) a HT12D přijímač. Výstupy z HT12D jdou na PICAXE 20M2. Aby to bylo trochu jednodušší, tak mi stačí 10 poloh serva (0 až 9), ale aby to zase bylo trochu složitější, tak ty polohy potřebuju vidět na LED displeji (společná anoda nízkopříkonový). Vymyslel jsem tenhle rádobyprogram, ale má nějaký mouchy... teda hodně much... a možná jdu úplně blbou cestou... Tak kdyby někdo z vás byl ochotnej mně nakopnout správným směrem, tak mu budu velice zavázán.

Má to fungovat takto:
Po zapnutí se procesor vynuluje = nastaví na displej 0, servo dá do polohy 0 a potom servo vypne.
Pokud zmačknu swplus (tlačítko na hlavním panelu, na stejném vstupu je i výstup HT12D) - nastaví na displej 1...servo dá do polohy 1 ... vypne servo.
Pokud zmačknu opět swplus - nastaví na displej 2...servo dá do polohy 2 ... vypne servo.
Takhle to pokračuje až do polohy 9.
Pokud zmačknu swminus - vrátí kdykoli o jednu polohu zpět.

Dále by tam mělo bejt tlačítko sw0 (ještě nemám naimplementováno) a to by mělo dělat to, že z kterékoliv polohy:
1)při aktivaci - na displej nastaví 0...nastaví servo do polohy 0
2)při deaktivaci - vrátí displej i servo do polohy před aktivací.

Teď ty mouchy toho mýho skoroprogramu...
1) Servo občas "ujede" ze správné polohy (mám celý dvě a dělaj to obě...)
2) Při zmačknutí tlačítka swplus i swminus by se mi líbilo, kdyby to umělo tak, že bych si na displeji během xx sekund "namačkal" jakékoliv číslo 0 až 9 a servo by už mohlo "dojet " do téhle polohy až po posledním stisku + 2 s. Momentálně to skáče...
3) Tlačítko sw17 je vstup od HT a na funkci zvěrolékaře nemá vliv
4) Kdysi jsem se chvíli kamarádil s PICama a moc nám to nešlo, tak teď jsem objevil PICAXE, snad to bude lepší
5) Je to můj první picaxí program, tak mě moc nemlaťte
6) Kdyby se vám to zdálo moc dlouhý, tak je to vlastně 10x skoro to samý za sebou :(
Předem děkuji všem zúčastněným za připomínky.
A tady je ten zázrak :oops:


' PICAXE 20M2 + 7 segment CA + HT12D - counter 0-9/ IR servocontroller
' JP 31.01.2014

' servo = B.1

symbol swplus = pinB.5 'switch is on input pin B.5 = +od vystupu a HT12D
symbol swminus = pinB.4 'switch is on input pin B.4 = +od vystupu b HT12D
symbol sw17 = pinB.3 'switch is on input pin B.3 = +od vystupu 17 HT12D
symbol LEDa = C.5 'LED a is on output pin C.5
symbol LEDb = C.7 'LED b is on output pin C.7
symbol LEDc = C.0 'LED c is on output pin C.0
symbol LEDd = C.2 'LED d is on output pin C.2
symbol LEDe = C.4 'LED e is on output pin C.4
symbol LEDf = C.3 'LED f is on output pin C.3
symbol LEDg = C.1 'LED g is on output pin C.1

symbol poloha0 = 180
symbol poloha1 = 169
symbol poloha2 = 158
symbol poloha3 = 147
symbol poloha4 = 138
symbol poloha5 = 128
symbol poloha6 = 118
symbol poloha7 = 107
symbol poloha8 = 96
symbol poloha9 = 85




' START



pause 1000




svit0:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDb

low LEDc

low LEDd

low LEDe

low LEDf
pause 100
servo B.1,poloha0 ; inicializace serva
pause 1400
servo B.1,off
pause 100


svit00:
pause 2
if sw17=0 then svit00:
pause 2
if swminus=0 then svit00:
pause 2
if swplus=1 then svit00: 'cekej na tlacitko plus
pause 2




svit1:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDb

low LEDc
pause 100
servo B.1,poloha1 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit10:

pause 2
if sw17=0 then svit10:
pause 2
if swminus=0 then svit0: 'cekej na tlacitko minus
pause 2
if swplus=1 then svit10: 'cekej na tlacitko plus
pause 2

svit2:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDb

low LEDd

low LEDe

low LEDg
pause 100
servo B.1,poloha2 ; inicializace serva
pause 1400
servo B.1,off
pause 100


svit20:
pause 2
if sw17=0 then svit20:
pause 2
if swminus=0 then svit1: 'cekej na tlacitko minus
pause 100
if swplus=1 then svit20: 'cekej na tlacitko plus
pause 2

svit3:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDb

low LEDc

low LEDd

low LEDg
pause 100
servo B.1,poloha3 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit30:
pause 2
if sw17=0 then svit30:
pause 2
if swminus=0 then svit2: 'cekej na tlacitko minus
pause 2
if swplus=1 then svit30: 'cekej na tlacitko plus
pause 2

svit4:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDb

low LEDc

low LEDf

low LEDg
pause 100
servo B.1,poloha4 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit40:
pause 2
if sw17=0 then svit40:
pause 2
if swminus=0 then svit3: 'cekej na tlacitko minus
pause 2
if swplus=1 then svit40: 'cekej na tlacitko plus
pause 2

svit5:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDc

low LEDd

low LEDf

low LEDg
pause 100
servo B.1,poloha5 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit50:
pause 2
if sw17=0 then svit50:
pause 2
if swminus=0 then svit4: 'cekej na tlacitko minus
pause 2
if swplus=1 then svit50: 'cekej na tlacitko plus
pause 2

svit6:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDc

low LEDd

low LEDe

low LEDf

low LEDg
pause 100
servo B.1,poloha6 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit60:
pause 2
if sw17=0 then svit60:
pause 2
if swminus=0 then svit5: 'cekej na tlacitko minus
pause 2
if swplus=1 then svit60: 'cekej na tlacitko plus
pause 2

svit7:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDb

low LEDc
pause 100
servo B.1,poloha7 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit70:
pause 2
if sw17=0 then svit70:
pause 2
if swminus=0 then svit6: 'cekej na tlacitko minus
pause 2
if swplus=1 then svit70: 'cekej na tlacitko plus
pause 2

svit8:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDb

low LEDc

low LEDd

low LEDe

low LEDf

low LEDg
pause 100
servo B.1,poloha8 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit80:
pause 2
if sw17=0 then svit80:
pause 2
if swminus=0 then svit7: 'cekej na tlacitko minus
pause 2
if swplus=1 then svit80: 'cekej na tlacitko plus
pause 2

svit9:

high LEDa

high LEDb

high LEDc

high LEDd

high LEDe

high LEDf

high LEDg
pause 50
low LEDa

low LEDb

low LEDc

low LEDd

low LEDf

low LEDg
pause 100
servo B.1,poloha9 ; inicializace serva
pause 1400
servo B.1,off
pause 100

svit90:
pause 2
if sw17=0 then svit90:
pause 2
if swminus=0 then svit8: 'cekej na tlacitko minus
pause 100
if swplus=1 then svit90: 'cekej na tlacitko plus
pause 2

goto svit90



end
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od AlesH »

Ahoj.

Tak jsem si zkusil na nepájivém poli postavit něco podobného Tvému popisu a pak do PICAXE nahrál Tvůj program. Jakž takž to fungovalo. Na můj vkus to jen mělo trochu moc dlouhá "hluchá místa", kdy to nereagovalo na stisk tlačítka. Nebylo mi také jasné, jestli tlačítka mají zabírat v 1 nebo v 0. Fungovalo mi to jen tehdy, pokud tlačítka "swplus" a "swminus" zabírala v 1, ale "sw17" musel kupodivu zabírat v 0 (aby to vůbec někam postupovalo, tak vstup "sw17" musel být trvale na 1). Je to tak správně?

Program by se určitě dal vylepšit a "optimalizovat" (např. aby zabíral méně paměti), ale osobně zastávám názor, že to, co vyhovuje, není třeba měnit. Co hlavně bys chtěl na programu změnit nebo vylepšit? Udělal jsem si pár pokusů a měl bych pár námětů, ale nevím s čím začít.
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od Pepa z depa »

Já už ten program trochu tunim...
Přibudlo tam swnula= to má dělat to, že když je B.2 v log.0, tak na displej dá 0, nastaví servo do polohy 0. Pokud se swnula vrátí do klidu = log.1, tak se vrátí i displej a servo do původní polohy, a to se mi nějak zatím nedaří...
a koumám, kde nechal tesař díru...
Jo a to sw17 je právě jeden výstup z tý archaický HT12D - je v "1" při každým zmačknutí jakéhokoliv tlačítka DO a v tomhle programu ho netestuju.

A ještě EDIT: swplus, swminus i swnula mají "klidovou" polohu log.1, při aktivaci log.0

Tím zvýšením na 16MHz mi to přijde trochu rychlejší :mrgreen:

A zatím vypadá takhle:
Nevim, jestli to není moc velký svinění fóra...

' PICAXE 20M2 + 7 segment CA + HT12D - counter 0-9/ IR servocontroller
' JP 04.02.2014

' servo = B.1

symbol swplus = pinB.5 'switch is on input pin B.5 = +od vystupu a HT12D
symbol swminus = pinB.4 'switch is on input pin B.4 = +od vystupu b HT12D
symbol sw17 = pinB.3 'switch is on input pin B.3 = +od vystupu 17 HT12D
symbol swnula = pinB.2 'switch is on input pin B.2 = +od vystupu 17 HT12D
symbol LEDa = C.5 'LED a is on output pin C.5
symbol LEDb = C.7 'LED b is on output pin C.7
symbol LEDc = C.0 'LED c is on output pin C.0
symbol LEDd = C.2 'LED d is on output pin C.2
symbol LEDe = C.4 'LED e is on output pin C.4
symbol LEDf = C.3 'LED f is on output pin C.3
symbol LEDg = C.1 'LED g is on output pin C.1

symbol poloha0 = 180
symbol poloha1 = 169
symbol poloha2 = 158
symbol poloha3 = 147
symbol poloha4 = 138
symbol poloha5 = 128
symbol poloha6 = 118
symbol poloha7 = 107
symbol poloha8 = 96
symbol poloha9 = 85



' START
setfreq m16

svit0:
gosub nulovani:
let outpinsC = %01000010 ; nastav vystupni piny
pause 2

svit0a:
gosub spoloha0
pause 2
;if sw17=1 then svit0a:

svit00:

if swminus=0 then svit0:
if swplus=1 then svit00: 'cekej na tlacitko plus

svit1:
gosub nulovani:
pause 2
let outpinsC = %01111110 ; nastav vystupni piny
pause 2

svit1a:
gosub spoloha1
pause 2
;if sw17=1 then svit1a:

svit10:

if swnula=1 then s10a:
gosub svitnula
pause 2
s10a:
if swminus=0 then svit0: 'swminus=0 navrat na svit0
if swplus=1 then svit10: 'swplus=0 pokracuj

svit2:
gosub nulovani:
pause 2
let outpinsC = %01001001 ; nastav vystupni piny
pause 2

svit2a:
gosub spoloha2
pause 2

;if sw17=1 then svit2a:


svit20:

if swnula=1 then s20a:
gosub svitnula
pause 2
s20a:
if swminus=0 then svit1: 'swminus=0 navrat na svit0
if swplus=1 then svit20: 'swplus=0 pokracuj



svit3:
gosub nulovani:
pause 2
let outpinsC = %01011000 ; nastav vystupni piny
pause 2

svit3a:
gosub spoloha3
pause 2
;if sw17=1 then svit3a:

svit30:
if swnula=1 then s30a:
gosub svitnula
pause 2
s30a:
if swminus=0 then svit2: 'navrat na svit0
if swplus=1 then svit30: 'swplus=0 pokracuj

svit4:
gosub nulovani:
pause 2
let outpinsC = %01110100 ; nastav vystupni piny
pause 2

svit4a:
gosub spoloha4
pause 2
if swnula=1 then svit40:
gosub svitnula
pause 2

svit40:
if swnula=1 then s40a:
gosub svitnula
pause 2

s40a:
;if sw17=0 then svit40:
if swminus=0 then svit3:
if swplus=1 then svit40: 'swplus=0 pokracuj

svit5:
gosub nulovani:
pause 2
let outpinsC = %11010000 ; nastav vystupni piny
pause 2

svit5a:
gosub spoloha5
pause 2

svit50:
if swnula=1 then s50a:
gosub svitnula
pause 2

s50a:
;if sw17=0 then svit50:
if swminus=0 then svit4:
if swplus=1 then svit50: 'swplus=0 pokracuj

svit6:
gosub nulovani:
pause 2
let outpinsC = %11000000 ; nastav vystupni piny
pause 2

svit6a:
gosub spoloha6
pause 2

svit60:
if swnula=1 then s60a:
gosub svitnula
pause 2

s60a:
;if sw17=0 then svit60:
if swminus=0 then svit5:
if swplus=1 then svit60: 'swplus=0 pokracuj

svit7:
gosub nulovani:
pause 2
let outpinsC = %01011110 ; nastav vystupni piny
pause 2

svit7a:
gosub spoloha7
pause 2

svit70:
if swnula=1 then s70a:
gosub svitnula
pause 2

s70a:
;if sw17=0 then svit70:
if swminus=0 then svit6:
if swplus=1 then svit70: 'swplus=0 pokracuj

svit8:
gosub nulovani:
pause 2
let outpinsC = %01000000 ; nastav vystupni piny
pause 2

svit8a:
gosub spoloha8
pause 2

svit80:
if swnula=1 then s80a:
gosub svitnula
pause 2

s80a:
;if sw17=0 then svit80:
if swminus=0 then svit7:
if swplus=1 then svit80: 'swplus=0 pokracuj

svit9:
gosub nulovani:
pause 2
let outpinsC = %01010000 ; nastav vystupni piny
pause 2

svit9a:
gosub spoloha9
pause 2

svit90:
if swnula=1 then s90a:
gosub svitnula
pause 2

s90a:
;if sw17=0 then svit90:
if swminus=0 then svit8: 'cekej na tlacitko minus
if swplus=1 then svit90: 'swplus=0 nav

goto svit9a


svitnula:
pause 2
gosub nulovani:
pause 2
let outpinsC = %01000010 ; nastav vystupni piny
pause 2
gosub spoloha0:
pause 2
return

nulovani:
high LEDa
high LEDb
high LEDc
high LEDd
high LEDe
high LEDf
high LEDg
pause 10
return

spoloha0:
pause 2
servo B.1,poloha0
pause 3000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha1:
pause 2
servo B.1,poloha1
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha2:
pause 2
servo B.1,poloha2
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha3: ; make a sub-procedure called flash
pause 2
servo B.1,poloha3
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha4:
pause 2
servo B.1,poloha4
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha5:
pause 2
servo B.1,poloha5
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha6:
pause 2
servo B.1,poloha6
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha7:
pause 2
servo B.1,poloha7
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha8:
pause 2
servo B.1,poloha8
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

spoloha9:
pause 2
servo B.1,poloha9
pause 2000
servo B.1,OFF
pause 2
return ; return from the sub-procedure

end
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od AlesH »

OK, posílám svůj návrh řešení. Je to jen jedna z mnoha možností.

Můj kód obsahuje několik možných vylepšení Tvého programu:
- polohy serv jsou uloženy v RAM tabulce, takže je lze snadno vyčíst podle aktuálního čísla na displeji
- hlavní program je poměrně rychle běžící nekonečná smyčka (využívám tzv. "polling"), takže program může být doplněn o další funkce
- nastavení displeje a serva je řešeno jako podprogram (parametrem je proměnná "cislo")
- čas vypnutí serva odvozuji od proměnné "time" (na verzích M2 běží automaticky)
- někdy je vhodnější pro vypnutí serva použít nastavení pinu do HIGH (záleží to na konkrétním servu)

Pro lepší přehlednost zde na fóru používám pro výpis programu tag "Code". Ve svém testovacím zapojení mám použité trochu jiné piny, ale sem vkládám Tvoje nastavení pinů.

Snad Ti ten kód poslouží třeba pro inspiraci.

Kód: Vybrat vše

#picaxe 20M2
#no_data

' PICAXE 20M2 + 7 segment CA + HT12D - counter 0-9/ IR servocontroller

' servo = B.1

symbol swplus = pinB.5 'switch is on input pin B.5 = +od vystupu a HT12D
symbol swminus = pinB.4 'switch is on input pin B.4 = +od vystupu b HT12D
symbol sw17 = pinB.3 'switch is on input pin B.3 = +od vystupu 17 HT12D
symbol swnula = pinB.2 'switch is on input pin B.2 = +od vystupu 17 HT12D
symbol LEDa = C.5 'LED a is on output pin C.5
symbol LEDb = C.7 'LED b is on output pin C.7
symbol LEDc = C.0 'LED c is on output pin C.0
symbol LEDd = C.2 'LED d is on output pin C.2
symbol LEDe = C.4 'LED e is on output pin C.4
symbol LEDf = C.3 'LED f is on output pin C.3
symbol LEDg = C.1 'LED g is on output pin C.1 

symbol cislo0 = b0             ; paměť posledního nastaveného čísla na displeji
symbol cislo  = b1             ; aktuální zobrazované číslo
symbol stav   = b2             ; příznak stisknutého tlačítka
symbol poloha = b3             ; aktuální poloha serva
symbol cas    = w2             ; paměť času (pro vypnutí serva)

table 0,(180,169,158,147,138,128,118,107,96,85)  ; tabulka poloh serva

' START

setfreq m16

cislo0 = 1                     ; inicializace posledního čísla (jiné než aktuální)
cislo = 0                      ; aktuální zobrazované číslo
stav = 0                       ; příznak uvolněných tlačítek
cas = time                     ; aktuální čas (pro vypnutí serva)

cykl:
  if sw17=0 then               ; zpracování stisku sw17
    cislo = 0                  ; přímé nastavení čísla na 0
    gosub nastav               ; nastavení displeje a příslušné polohy serva
    do while sw17=0            ; čekání na konec stisku sw17
    loop
    cislo = cislo0             ; obnova původního čísla (polohy serva)
    gosub nastav               ; nastavení displeje a příslušné polohy serva
  endif
  if cislo != cislo0 then      ; nastavení měnit jen po změně čísla
    cislo0 = cislo             ; zapamatování nastaveného čísla
    gosub nastav               ; nastavení displeje a příslušné polohy serva
  endif
  if swplus=0 and stav=0 then  ; bylo nově stisknuto tlačítko swplus
    if cislo<9 then : inc cislo : endif  ; zvednout aktuální číslo (max na 9)
    stav = 1                   ; nastavit příznak stisknutého tlačítka
  endif
  if swminus=0 and stav=0 then ; bylo nově stisknuto tlačítko swminus
    if cislo>0 then : dec cislo : endif  ; smenšit aktuální číslo (min na 0)
    stav = 1                   ; nastavit příznak stisknutého tlačítka
  endif
  pause 10                     ; pauza pro ošetření zákmitů tlačítka
  if stav=1 and swplus=1 and swminus=1 then  ; test uvolnění tlačítek
    stav=0                     ; nastavit příznak uvolněných tlačítek
  endif
  if cas<time then             ; je už možno vypnout servo?
    ;servo B.1,off
    high B.1
  endif
goto cykl

nastav:                        ; podprogram pro nastavení displeje a serva
  readtable cislo,poloha       ; načíst polohu serva podle aktuálního čísla
  servo B.1,poloha             ; nastavit servo do požadované polohy
  high LEDa                    ; zhasnout všechny segmenty displeje
  high LEDb 
  high LEDc 
  high LEDd
  high LEDe 
  high LEDf 
  high LEDg 
  if cislo=0 then              ; rozsvítit segmenty pro 0 (atd.)
    low LEDa
    low LEDb
    low LEDc
    low LEDd
    low LEDe
    low LEDf 
  elseif cislo=1 then
    low LEDb
    low LEDc
  elseif cislo=2 then
    low LEDa
    low LEDb
    low LEDd
    low LEDe
    low LEDg
  elseif cislo=3 then
    low LEDa
    low LEDb
    low LEDc
    low LEDd
    low LEDg
  elseif cislo=4 then
    low LEDb
    low LEDc
    low LEDf 
    low LEDg
  elseif cislo=5 then
    low LEDa
    low LEDc
    low LEDd
    low LEDf 
    low LEDg
  elseif cislo=6 then
    low LEDa
    low LEDc
    low LEDd
    low LEDe
    low LEDf 
    low LEDg
  elseif cislo=7 then
    low LEDa
    low LEDb
    low LEDc
  elseif cislo=8 then
    low LEDa
    low LEDb
    low LEDc
    low LEDd
    low LEDe
    low LEDf
    low LEDg
  elseif cislo=9 then
    low LEDa
    low LEDb
    low LEDc
    low LEDd
    low LEDf
    low LEDg
  endif
  cas = time                   ; nastavit si čas vypnutí serva
return
Naposledy upravil(a) AlesH dne 05 úno 2014, 08:25, celkem upraveno 1 x.
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od Pepa z depa »

Díky moc za úspěšné nakopnutí.
Jenom se ještě zeptám: ten konec programu:

Kód: Vybrat vše

endif
  cas = time +1                ; nastavit si ?as vypnut? serva
  
return
Má vypadat nějak takhle?
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od AlesH »

Ano, může tam být i "cas = time + 1" nebo i delší čas. Mám ale vyzkoušeno, že stačí "cas = time", protože podmínka pro vypnutí serva čeká na dobu až "time" překročí hodnotu "cas". A jelikož "time" roste jen jednou za vteřinu, tak je obvykle dost času na to, aby se servo dotočilo do nastavené polohy. Dalo by se to asi řešit i nulováním proměnné "time" a pak testováním hodnoty "time" (nebyla by třeba proměnná "cas").
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od Pepa z depa »

Díky za rady
Já to ještě trochu překopal, swnula funguje místo té původní sw17 - tu zatím nechávám u ledu.
A asi jsem to zkraje napsal blbě... potřebuju, abych si na začátku "navolil polohu" = pokud zmačnu jednou swplus, tak se displej "překlopí" na 1 a čeká (dobu x) jestli nepřijde další impuls od swplus, pokud ano tak překlopí displej na 2 atd. Mohlo by to i registrovat dlouhý stisk swplus a začít čítat nahoru (stejně i swminus - dolů). A až všechny tyhle cykly proběhnou, tak teprve nastaví servo (se zpožděním třeba 2s a pak vypne servo) ... Teď to funguje tak, že každým zmačknutím tlačítka servo ihned reaguje a to se mi nelíbí :(

Zkrátil jsem trochu konec (svícení 7segm.) Jinak už to funguje suprově. To "vypínání" serva na HIGH mi dost pomohlo - dobrej nápad ;)

Kód: Vybrat vše

#picaxe 20M2
#no_data

' PICAXE 20M2 + 7 segment CA + HT12D - counter 0-9/ IR servocontroller
' 05.02.2014
' servo = B.1

symbol swplus = pinB.5 'switch is on input pin B.5 = +od vystupu a HT12D
symbol swminus = pinB.4 'switch is on input pin B.4 = +od vystupu b HT12D
symbol sw17 = pinB.3 'switch is on input pin B.3 = +od vystupu 17 HT12D
symbol swnula = pinB.2 'switch is on input pin B.2 = +od vystupu 17 HT12D
symbol LEDa = C.5 'LED a is on output pin C.5
symbol LEDb = C.7 'LED b is on output pin C.7
symbol LEDc = C.0 'LED c is on output pin C.0
symbol LEDd = C.2 'LED d is on output pin C.2
symbol LEDe = C.4 'LED e is on output pin C.4
symbol LEDf = C.3 'LED f is on output pin C.3
symbol LEDg = C.1 'LED g is on output pin C.1 

symbol cislo0 = b0             ; pamet posledniho nastaveneho cisla na displeji
symbol cislo  = b1             ; aktualni zobrazovane cislo
symbol stav   = b2             ; priznak stisknuteho tlacitka
symbol poloha = b3             ; aktualni poloha serva
symbol cas    = w2             ; pamet casu (pro vypnuti serva)

table 0,(180,169,158,147,138,128,118,107,96,85)  ; tabulka poloh serva

' START

setfreq m16

cislo0 = 1                     ; inicializace posledniho cisla (jine nez aktualni)
cislo = 0                      ; aktualni zobrazovane cislo
stav = 0                       ; priznak uvolnenych tlacitek
cas = time                     ; aktualni cas (pro vypnuti serva)

cykl:
  if swnula=0 then               ; zpracovani stisku swnula
    cislo = 0                  ; prime nastaveni cisla na 0
    gosub nastav               ; nastaveni displeje a prislusne polohy serva
    do while swnula=0            ; cekani na konec stisku swnula
    loop
    cislo = cislo0             ; obnova puvodniho cisla (polohy serva)
    gosub nastav               ; nastaveni displeje a prislusne polohy serva
  endif
  if cislo != cislo0 then      ; nastaveni menit jen po zmene cisla
    cislo0 = cislo             ; zapamatovani nastaveneho cisla
    gosub nastav               ; nastaveni displeje a prislusne polohy serva
  endif
  if swplus=0 and stav=0 then  ; bylo nove stisknuto tlacitko swplus
    if cislo<9 then : inc cislo : endif  ; zvednout aktualni cislo (max na 9)
    stav = 1                   ; nastavit priznak stisknuteho tlacitka
  endif
  if swminus=0 and stav=0 then ; bylo nove stisknuto tlacitko swminus
    if cislo>0 then : dec cislo : endif  ; zmensit aktualni cislo (min na 0)
    stav = 1                   ; nastavit priznak stisknuteho tlacitka
  endif
  pause 50                     ; pauza pro osetreni zakmitu tlacitka
  if stav=1 and swplus=1 and swminus=1 then  ; test uvolneni tlacitek
    stav=0                     ; nastavit priznak uvolnenych tlacitek
  endif
  if cas<time then             ; je uz mozno vypnout servo?
    ;servo B.1,off
    high B.1
  endif
goto cykl

nastav:                        ; podprogram pro nastaveni displeje a serva
  readtable cislo,poloha       ; nacist polohu serva podle aktualniho cisla
  servo B.1,poloha             ; nastavit servo do pozadovane polohy
  high LEDa                    ; zhasnout vsechny segmenty displeje
  high LEDb 
  high LEDc 
  high LEDd
  high LEDe 
  high LEDf 
  high LEDg 
  if cislo=0 then              ; rozsvitit segmenty pro 0 (atd.)
  let outpinsC = %01000010 ; nastav vystupni piny
	  
  elseif cislo=1 then
  let outpinsC = %01111110 ; nastav vystupni piny  
	  
  elseif cislo=2 then
  let outpinsC = %01001001 ; nastav vystupni piny    
	  
  elseif cislo=3 then
  let outpinsC = %01011000 ; nastav vystupni piny  
	  
  elseif cislo=4 then
  let outpinsC = %01110100 ; nastav vystupni piny   
	   
  elseif cislo=5 then
  let outpinsC = %11010000 ; nastav vystupni piny   
	  
  elseif cislo=6 then
  let outpinsC = %11000000 ; nastav vystupni piny  
	  
  elseif cislo=7 then
   let outpinsC = %01011110 ; nastav vystupni piny   
	   
  elseif cislo=8 then
    let outpinsC = %01000000 ; nastav vystupni piny   
	    
  elseif cislo=9 then
    let outpinsC = %01010000 ; nastav vystupni piny 
	    
  endif
cas = time+2            ; nastavit si cas vypnuti serva

return

AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od AlesH »

Výborně, zkrácení programu pomocí outpinsC je dobré a elegantní řešení.

Zkusil jsem upravit program pro to zpožděné nastavení serva i pro to automatické čítání po přidržení tlačítka. Dosáhl jsem toho tak, že jsem oddělil nastavení serva a samostatné zobrazení čísla na displeji. Místo proměnné "cas" jsem zavedl pomocnou proměnnou "pom" pro počítání proběhlých cyklů (v tomto případě tak lze časovat události v programu). Pomocí té "pom" pak dělám násilný "timeout" po dlouhém držení tlačítka (nastavím "falešně" příznak uvolnění tlačítek a tím se to v dalším cyklu projeví jako nový stisk tlačítka). Proměnná "pom" slouží i pro "zpoždění" nastavení serva a nakonec i pro načasování vypnutí serva.

V mém testovacím zapojení ten program fungoval solidně.

Kód: Vybrat vše

#picaxe 20M2
#no_data

' PICAXE 20M2 + 7 segment CA + HT12D - counter 0-9/ IR servocontroller
' 05.02.2014
' servo = B.1

symbol swplus = pinB.5 'switch is on input pin B.5 = +od vystupu a HT12D
symbol swminus = pinB.4 'switch is on input pin B.4 = +od vystupu b HT12D
symbol sw17 = pinB.3 'switch is on input pin B.3 = +od vystupu 17 HT12D
symbol swnula = pinB.2 'switch is on input pin B.2 = +od vystupu 17 HT12D
symbol LEDa = C.5 'LED a is on output pin C.5
symbol LEDb = C.7 'LED b is on output pin C.7
symbol LEDc = C.0 'LED c is on output pin C.0
symbol LEDd = C.2 'LED d is on output pin C.2
symbol LEDe = C.4 'LED e is on output pin C.4
symbol LEDf = C.3 'LED f is on output pin C.3
symbol LEDg = C.1 'LED g is on output pin C.1 

symbol cislo0 = b0             ; paměť posledního nastaveného čísla na displeji
symbol cislo  = b1             ; aktuální zobrazované číslo
symbol stav   = b2             ; příznak stisknutého tlačítka
symbol poloha = b3             ; aktuální požadovaná poloha serva
symbol pom    = w2             ; pomocná proměnná

table 0,(180,169,158,147,138,128,118,107,96,85)  ; tabulka poloh serva

' START

setfreq m16

cislo0 = 1                     ; inicializace posledního čísla (jiné než aktuální)
cislo = 0                      ; aktuální zobrazované číslo
stav = 0                       ; příznak uvolněných tlačítek
pom = 200                      ; inicializace počítadla cyklů (aby na začátku nebyla prodleva)

cykl:
  if pom<10000 then : inc pom : endif  ; zvýšení počítadla cyklů (časování) [na max. 10000]
  if swnula=0 then             ; zpracování stisku sw17
    cislo0 = cislo             ; zapamatování nastaveného čísla
    cislo = 0                  ; přímé nastavení čísla na 0
    gosub nastav               ; nastavení displeje a příslušné polohy serva
    do while swnula=0            ; čekání na konec stisku sw17
    loop
    cislo = cislo0             ; obnova původního čísla (polohy serva)
    gosub nastav               ; nastavení displeje a příslušné polohy serva
  endif
  if cislo != cislo0 and pom>200 then  ; nastavení měnit jen po změně čísla a po cca 1 sekundě
    cislo0 = cislo             ; zapamatování nastaveného čísla
    gosub nastav               ; nastavení displeje a příslušné polohy serva
  endif
  if swplus=0 and stav=0 then  ; bylo nově stisknuto tlačítko swplus
    if cislo<9 then : inc cislo : endif  ; zvednout aktuální číslo (max na 9)
    stav = 1                   ; nastavit příznak stisknutého tlačítka
    gosub zobraz               ; zobrazit číslo na displeji bez pohybu serva
  endif
  if swminus=0 and stav=0 then ; bylo nově stisknuto tlačítko swminus
    if cislo>0 then : dec cislo : endif  ; smenšit aktuální číslo (min na 0)
    stav = 1                   ; nastavit příznak stisknutého tlačítka
    gosub zobraz               ; zobrazit číslo na displeji bez pohybu serva
  endif
  pause 10                     ; pauza pro ošetření zákmitů tlačítka
  if stav=1 and swplus=1 and swminus=1 then  ; test uvolnění tlačítek
    stav=0                     ; nastavit příznak uvolněných tlačítek
    pom = 0                    ; vynulovat počítadlo cyklů
  endif
  if stav=1 and pom>50 then    ; příznak tlačítek uvolnit i po timeoutu (repeat)
    stav=0                     ; nastavit příznak uvolněných tlačítek
    pom = 0                    ; vynulovat počítadlo cyklů
  endif
  if pom>200 then              ; je už možno vypnout servo?
    ;servo B.1,off
    high B.1
  endif
goto cykl

nastav:                        ; podprogram pro nastavení serva (a displeje)
  readtable cislo,poloha       ; načíst polohu serva podle aktuálního čísla
  servo B.1,poloha             ; nastavit servo do požadované polohy
  
zobraz:                        ; podprogram pro nastavení displeje
  pom = 0                      ; vynulovat počítadlo cyklů
  let outpinsC = %11111111  ; zhasnout všechny segmenty displeje
  if cislo=0 then              ; rozsvitit segmenty pro 0 (atd.)
    let outpinsC = %01000010 ; nastav vystupni piny
  elseif cislo=1 then
    let outpinsC = %01111110 ; nastav vystupni piny  
  elseif cislo=2 then
    let outpinsC = %01001001 ; nastav vystupni piny    
  elseif cislo=3 then
    let outpinsC = %01011000 ; nastav vystupni piny  
  elseif cislo=4 then
    let outpinsC = %01110100 ; nastav vystupni piny   
  elseif cislo=5 then
    let outpinsC = %11010000 ; nastav vystupni piny   
  elseif cislo=6 then
    let outpinsC = %11000000 ; nastav vystupni piny  
  elseif cislo=7 then
     let outpinsC = %01011110 ; nastav vystupni piny   
  elseif cislo=8 then
    let outpinsC = %01000000 ; nastav vystupni piny   
  elseif cislo=9 then
    let outpinsC = %01010000 ; nastav vystupni piny 
  endif
return
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od Pepa z depa »

LUXUS!!! Funguje to úplně dokonale, jsi geniální !!!
Akorát teda ten konec mi funguje pouze takhle... Pokud tam dám to let outpinsC.... tak to nefunguje.
Aleši DÍKY VELICE MOC!!!

P.S. Nejde nějak normálně kopírovat ty znaky s diakritikou? Aby se to nemuselo přepisovat?

Kód: Vybrat vše

;  let outpinsC = %11111111  ; zhasnout v?echny segmenty displeje
  
  high LEDa                    ; zhasnout vsechny segmenty displeje
  high LEDb 
  high LEDc 
  high LEDd
  high LEDe 
  high LEDf 
  high LEDg 
  high LEDg 
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: PICAXE 20M2 + servo+7 segment

Příspěvek od AlesH »

Aha, asi by tam mělo být jen "pinsC = %11111111". Přiznám se, že to jsem u sebe nezkoušel.

Kopírování kódu s diakritikou funguje špatně? OK, příště budu psát kód bez diakritiky.

Jsem rád, že jsi spokojen. Pěkně jsme si pohráli :) Snad se to bude hodit i někomu dalšímu.
Odpovědět