Gå til innhold

Automatisert rom! Nøyaktighet på timer.. [løst]


Anbefalte innlegg

Hey!

 

Jeg har tenkt på å lage et automatiserings-prosjekt som involverer bruk av printerporten for å styre reléer og dermed lys ol. og en selv-bygget ir-transceiver som kan ta opp og lagre ir-signaler fra alle fjernkontrollene jeg har og spille dem av igjen mot tv/dvd/vhs og andre enheter med fjernkontroll.

 

Det eneste som egentlig står i veien er programvaren, rettere sagt timingen av opptaket av ir-signalet. Jeg må polle inngangen jeg bruker et helt fast antall ganger i sekundet. Hvordan skal jeg oppnå dette? Jeg vet ikke helt hvor ofte jeg må lese av inngangen for å lese av signalet nøyaktig nok, men så ofte som mulig er nok en fordel. Problemet er at timeren i vb og GetTick-API'en bare lar deg telle i millisekunder og dette blir etter hva jeg har hørt unøyaktig avhengig av hvor mye belastning maskinen er under.

 

En liten prosjektbeskrivelse følger:

 

- Bruke printerporten til å styre enheter.

-- Både elektronikken og programvaren er i boks. Trenger bare finpussing.

 

- Ta opp og spille av ir-signaler fra fjernkontroller og bruke dette f.eks. til å styre pc med fjernkontroll eller styre tv/dvd/vhs/lyd-anlegg mm. fra pc.

-- Har mer eller mindre løst elektronikken, men problemet med timingen av opptaket gjennstår.

 

- Lage en web-basert frontend i php til programmet som styrer alt, som jeg kan aksessere f.eks. fra mobiltelefonen min via WAP.

-- Dette har jeg også gjort. Jeg satte opp en webside, et serverprogram som tok kommandoer fra denne via WinSock og styrte printerporten )som var koblet til juletrebelysning som hang i vinduet mitt :p).

 

- Bruke inngangene på printerporten til... noe.. :p

-- Har også gjort dette. Hadde en bryter i døra på rommet mitt så dataprogrammet kunne logge når døra ble åpnet og lukket. Et php-script bad om loggen fra programmet og parset dette til en webside.

 

- Hente inn analog info fra joystick-porten.

-- Dette har jeg ikke sett så mye på, men den porten kan leses på samme måte som printerporten. Har sett folk på nettet som har koblet til temperaturmålere og lagt ut på siden sin og slikt.

 

 

OM jeg noengang får gjort dette prosjektet ferdig vet jeg i allefall om en kamerat som vil ha meg til å sette opp noe lignende for han i leiligheten hans og det vil garantert komme opp en side med DIY (do it yourself) info om hele greia. Det står og faller på om noen vet om en nøyaktig timer med ganske høy oppløsning...

 

 

Mvh, Kim Helberg

Endret av PlastBox
Lenke til kommentar
Videoannonse
Annonse

Du kan eksempelvis benytte API-kallene QueryPerformanceCounter samt QueryPerformanceFrequency, hvilket muliggjør tilgang til en ytelsesteller med høyere oppløsning:

 

Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long

Private Sub Form_Load()

   Dim Tell As Long, liFrequency As Currency, liStart As Currency, liStop As Currency
   
   QueryPerformanceFrequency liFrequency
   QueryPerformanceCounter liStart
   
   ' Utfør ett eller annet
   For Tell = 0 To 100000
       DoEvents
   Next

   QueryPerformanceCounter liStop

   MsgBox "Tid: " & CStr(((liStop - liStart) / liFrequency) * 1000) & " ms"
       
End Sub

Lenke til kommentar

Høres veldig interesann ut denne posten, jeg holder på med ett lignende prosjekt, men "motsatt", jeg prøver og ta i mot signalet og dekode det, derreter utføre visse funksjoner... har du gjort noe så langt eller? hvordan tar du opp signalet fra fjernkontrollen? (Jeg har en gammel Canal Digital fjernkontroll og mottaker til dette formålet)...

Lenke til kommentar

nomore

Det kan jeg sikkert, men for øyeblikket har jeg fint lite å poste. Har elektronikken for å skru ting av og på med printerporten men det finnes allerede 1000 steder på nettet. Bilder blir det også fint lite av, når jeg bare har koblet 2 utganger opp på et kontaktbrett. Samme med software. Bare noe gamle greier jeg lagde for å teste en gang. Tror heller jeg kommer tilbake til det om/når jeg får til ir-greiene.

 

Richard87

Du kan kanskje kjøpe deg en IR-demodulator hos Elfa. Denne har 3 pinner, +,- og data. Data er lav, med mindre føleren får et ir-signal på rundt 38-40KHz, altså det de fleste fjernkontroller bruker.

 

Du kan koble denne til inngangen på f.eks. en printer port og lage software som leser av inngangen og tar opp signalet. (hvorvidt øvrig elektronikk trengs vet jeg ikke) Så kan du få programmet ditt til å sjekke data det evt. får inn på porten mot signaler det allerede har tatt opp og utføre funksjoner utifra dette.

 

Har desverre ikkeno mer håndgripelig enn det, men håper å ha det etterhvert. Å styre pc'n fra fjernkontroll er ikke mitt mål. Syns det er tøffere å styre ting fra mobilen og det vet jeg faktisk hvordan jeg skal gjøre.

Lenke til kommentar

Satt og tenkte litt...

 

Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

Dim curFreq as Currency
Dim curStart as Currency
Dim curEnd as Currency
Dim dblResult as Double
Dim portdata as Integer
Dim portdataold as Integer

QueryPerformanceFrequency curFreq  	'Get the timer frequency
QueryPerformanceCounter curStart  	'Get the start time

portdataold = Inp(Val("&H379"))

Do
 DoEvents
 portdata = Inp(Val("&H379"))
 If portdataold <> portdata Then
   portdataold = portdata
   QueryPerformanceCounter curEnd
   dblResult = (curEnd - curStart) / curFreq
   curStart = curEnd
   'På en eller annen måte lagre om inngangen var høy eller lav, og hvor lenge den var det; dblResult.
 End If
Loop

 

Sitter barnevakt i kveld så har ingen mulighet til å teste koden i vb men konseptet fungerer tror jeg. Looper så fort jeg kan, og hver gang inputen på porten ir-demodulatoren er koblet til forrandrer seg lagrer jeg hvor lenge det nåværende signalet har vært. Klarer VB å kjøre Loopen fort nok burde det vel fungere sånn halvveis...

 

For å spille signalet av igjen bør det vel bare være å sette riktig bit på utgangen man bruker, så Loope i så mange Ticks man har lagret at man skal telle, før bit'en forandres og man teller Ticks igjen.

 

Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

Dim curFreq as Currency
Dim curStart as Currency
Dim curEnd as Currency
Dim dblResult as Double
Dim portdata as Integer
Dim portdataold as Integer

Dim data() as Integer   'Et array jeg bruker for å lagre hvilket bit som skal ut.
Dim tick() as Integer    'Array for å lagre hvor lenge dette bit'et skal stå.

QueryPerformanceFrequency curFreq  	'Get the timer frequency
QueryPerformanceCounter curStart  	'Get the start time

Out Val("&H378"), 0

Do
1
 On Error Goto 666
 Out Val("&H378"), data(a%)
 Do  
   DoEvents
   QueryPerformanceCounter curEnd
   dblResult = (curEnd - curStart) / curFreq

   If dblResult >= tick(a%) Then
     a% = a% + 1
     curStart = curEnd
     goto 1
   End If

 Loop
Loop
666

 

Alt dette er bare psuedo-kode fra en rimelig trøtt, slapp dude som ikke engang har mulighet til å teste om koden funker. :p

 

Edit: Inp og Out ligger i en modul jeg fant på nettet. Man får ikke direkte kontakt med porter i Windows NT baserte systemer men jeg hadde griseflaks og fant en enkel modul som jeg bare legger til i prosjektet også er det så enkelt som "variabel = Inp(portadresse)" eller "Out portadresse, data".

Endret av PlastBox
Lenke til kommentar

Jeg ser du er en flittig bruker av GoTo-kommandoen - dette er ikke å anbefale. Greit nok, feilhåndteringsteknikken i Visual Basic 6.0 krever det til tider, hvilket gjør deg tilgitt der, men GoTo 1-linjen kan problemfritt erstattes med Exit Do.

 

Etter å ha testet koden ut, ser jeg først og fremst at du bør bruke arrayer av typen Double for riktig nøyaktighet:

 

   Dim Data() As Double
   Dim tick() As Double

 

I tillegg er det verd å merke seg at DoEvents kan forkludre det hele, idet et kall til denne krever mange instruksjoner og prosedyrer før den fullføres. Dersom du virkelig skal ha nøyaktighet, bør denne unngås.

Lenke til kommentar

Thanks, aadnk. Så koden fungerer? Jøss, nå Dét var en overaskelse! =P Bare å bestille meg en ir-demodulator da. Noen som vet om noen lokale Tønsbergs-sjapper som har sånt, evt. et billigere online alternativ til www.elfa.se?

 

Enda en ting.. Noen som kan gi meg en så konsis som mulig innføring i hvordan jeg genererer en 38KHz frekvens med en 555-timer? Står utallige steder på nettet, jeg vet, men når det står på engels, og med fagord som "..sets the latch.." ol. bare gir hjernen min opp hvis dere skjønner. :p

Lenke til kommentar
hva mener du med en 555 timer? du trenger vel en oscilator eller?

En 555 er en brikke som inneholder alt man trenger for å lage en astabil eller en monostabil vippe. Det eneste man trenger er noen kondensatorer og noen motstander for å bestemme frekvensen. Desverre stopper kunskapen min om 555-timere, vipper og oscilatorer der, så hadde vært kjekt med en liten forklaring. ;)

 

Edit: Tror jeg har funnet ut verdier, og den enkleste måten å koble oscillatoren opp på. (Sjekk vedlagt fil) Pin 4 kobles til en utgang på printer/com-porten, og IR-leds kobles mellom pin 3 og minus/jord. Denne linken var utrolig nyttig. Masse geek-cred til forfatteren av siden. :thumbup:

post-32-1115812255_thumb.jpg

Endret av PlastBox
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...