Nej nu #!@% (IR-kommunikation)

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Nej nu #!@% (IR-kommunikation)

Inlägg av net4all »

Hej alla!
Som rubriken antyder börjar jag bli lite irriterad på något....
Har nu försökt att få till trådlös kommunikation med IR i nästan ett halvår...

Så kort sagt: Har någon exempelkod som ni vet fungerar?
Järna för PIC 16F628A @ 4/20MHz
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Ett halvår säger du? Du har alltså lagt ner 40*52/2 ~1000 timmar och inte lyckats. Efter den insatsen är alla färdiga lösningar billiga :lol:

Exempelkod på vad? Enkelriktad kommunikation? dubbelriktad? duplex? modulering?

Jag byggde en enkelriktad variant med en Basic Stamp för länge sedan. Sändarmodulen byggdes kring en 555:a som var intrimmad till 40kHz. Utgången kopplade jag till en IR-diod via en drivtransistor.
Reset-ingången på 555:an kopplade jag till UART-tx på BS2:an.
På mottagarsidan använde jag en simpel avstämd IR-mottagare. Komplettera med lämplig nivåkonvertering så bör du ha en någorlunda stabil enkelriktad länk i lägre hastigheter.

Så, vad var DITT problem? Hur långt har du kommit, vad är det som inte fungerar?
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Hehe, kanske inte riktigt så länge då :roll:

Jag har fixat moduleringen(38KHz med PWM modulen)
Har har försökt att skapa pulser med TMR0 och sedan fånga dom med TMR0, det har inte fungerat.
Pulsernas lägd verkar variera, och jag har använt 4MHz kristall...

Så all kod som skickar data(enkelriktat) från en PIC till en annan med så få externa komponenter(tex 555'an) som möjligt är varmt välkommen!
(Och all liknande kod)

Men det räcker alltså med att tex ta bärvåg(38KHz) och data, slå ihop dom med tex AND grind, sedan iväg till IR-diodGenom drivtransistor)?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> det har inte fungerat.

Varför inte ?

> Pulsernas lägd verkar variera,

OK. Ta reda på varför de gör det, så kanske du har svaret...

> Men det räcker alltså med att tex ta bärvåg(38KHz) och data,

Ja, ditt "data" sätter 38 MHz signeln av och på i lämpliga intervall.

> slå ihop dom med tex AND grind,

Varför det ? Du gör allt i koden.

> sedan iväg till IR-diodGenom drivtransistor)?

Japp.

Hur tar du imot IR-signalen ?
I vilken ände (sändera eller mottagare) är det problem ?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

sodjan: skrev du lite fel? "38 MHz signeln"
Menar du "38 kHz signalen" kanske?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Japp....
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Problemet är att jag inte vet var det blir fel..
Hittils har jag gjort så här:

I sändaren används TMR0 till att skapa olika pulser genom att vänta på "timer overflow" interupptet, och laddar sedan in ett nytt värde som bestämmer hur länge PWM-modulen är på, dvs pulslängden.

I mottagaren används även här TMR0 med samma frekvens och prescaler till att mäta pulslängden. En avstämd IR-mottagare sitter på PORTB.0 och ger då INT-interuppt vid logisk 0(IR signal inkommer) då 0-ställs TMR0 och man väntar sedan på att PORTB.0 blir logisk 1, pulsen är slut.

Och närman sedan läser värdet i TMR0 så varierar det mycket både över och under det värde man ställde in i sändaren...

Vet ej om det är i mottagaren eller i sändaren som det går fel heller..
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ett tips:
Skapa en 38kHz puls som kör kontinuerligt.

Sedan använder du UART'en till att sända data. När utgången från UART'en är '1' ska IR-LED'n vara av, detta kan i första steget göras vit att koppla IR-LED'ns katod till UART TXD och anoden till de 38kHz med lämplig diod i serie självklart.

Sedan tar du en avstämd mottagare och ser till att signalen inte är för trög, de mottagna data ska vara polariserat så att de vid "icke-signal" in till IR-sensorn är '1'. Detta signal skickar du in på UART'en RXD och sedan ska det vara klart.

Beroende på hur bra din mottagare är kan du sedan välja baudrate till ett lämpligt värde, till en börja vill jag föreslå 1200 baud och sedan få det att fungera, i teorin bör du kunna få det att fungera en hel del snabbare men ta det i steg...
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Och närman sedan läser värdet i TMR0 så varierar det mycket...

Definiera "mycket". 5%? 50%?

Jag skulle säga att minst 10% svaj på pulserna är helt normalt.

> Vet ej om det är i mottagaren eller i sändaren som det går fel heller..

Med ett oscilioskop ser man det väldigt enkelt.
Annars kan det vara lite trixigt att felsöka...
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Icecap: Tack! Ska testas omedelbart!

Sodjan: Jaha, om 10% är normalt, då kan det nog vara det...
Och oscilioskop har jag inte :(
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jaha, om 10% är normalt,

Det beror på t.ex hur bra "sikt" det är mellan dioden och mottagaren.
Sedan så har ju mottagaren en del automatik för nivåjustering
och annat, så det tar ett par 38 KHz cykler att "svänga in" varje gång.
Slutligen så kan den ju i alla fall bara detektera hela 38 KHz cykler,
så det beror på hur bra du har synkat dina data-pulser till 38 KHz.

Jag gjorde en IR-länk för något år sedan. PWM modulen skapade
bärvågen precis som i ditt fall. Pulsernas längd räknade jag genom att
räkna "overflow" på Timer2 (som styr PWM modulen). På så sätt kunde jag
få väldigt rena och snygga pulser med alltid samma antal kompletta (hela)
38 KHz cykler.

D.v.s ISR'en för Timer2 hade bara en räknare som räknades ner, och när
den var "0" så stoppades PWM modulen.

Det blev väldigt stabila och rena pulsr som sagt. När du kör "timingen"
med'en annan timer, så kanske det är lite mer problem att få det
helt synkat mot PWM modulen...

I mottagaren använde jag en timer för att "mäta" pulslängden. Jag hade
satt pulserna så att beroende på om det var "1", "0" eller "stopp" som
sändes, så fick jag en viss bit satt i timern. En enkel bit-test mot
timerns register avgjorde vad som hade skickats. Betydeligt enkare
en "range-test" eller liknande.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Fick inte Icecap's ide att fungera :(

Sodjan:
Ok, så det spelar roll när man stänger av pulsen? Det visste jag inte...
Så på mottagar sidan kan man då tex använda Timer1 för mätning av pulserna in då?

Du har inte den koden kvar?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Ok, så det spelar roll när man stänger av pulsen?

Ingen aning, men det blir snyggare... :-)

> Så på mottagar sidan kan man då tex använda Timer1 för mätning av pulserna in då?

Tja, kanske...

> Du har inte den koden kvar?

Jag kan packa ihop den lite senare.
Den är inte så lätt att ta sig in i. Dels är den skriven
för Olin Lathrops assembler-utvecklingsmiljö, dels så
innehåller den dessutom avkodning av en rot-enkoder m.m.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Ok, då blir det till att exprimentera vidare, får se om jag hinner.
(massa prov i skolan)

Oavsett om koden inehåller massa annat så kan den nog vara till stor hjälp när man skriver eget :)
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

net4all: Vilken sorts kodning kör du med? Hur sändar du en '0' och hur en '1'?
Skriv svar