Hjälp med Arduino och IR
Hjälp med Arduino och IR
Håller på att bygga en IR sensor runt en Arduino Uno som ska gå minst 10 meter till en reflektor och sedan tillbaka.
Detta har jag fått att fungera inomhus i mitt garage.
Klarar faktiskt 12 m och sedan tillbaka.
Problemet jag har är att den är känslig för solljus.
Kör jag den på labb bordet utan reflektor så kan jag sätta handen framför och den detekterar, fast det är falsklarm.
Just nu skapar jag en 38KkHz från en timer som sedan får driva min IR-diod via en transistor.
Har sedan även som mål att ha en lins framför för att komma upp i ännu längre avstånd.
Detta är också provat men nu blir den ännu känsligare.
Någon som provat att göra något liknande som kan hjälpa mig?
Måste jag modulera 38 kHz för att få den stabilare?
Alla förslag är välkomna.
Detta har jag fått att fungera inomhus i mitt garage.
Klarar faktiskt 12 m och sedan tillbaka.
Problemet jag har är att den är känslig för solljus.
Kör jag den på labb bordet utan reflektor så kan jag sätta handen framför och den detekterar, fast det är falsklarm.
Just nu skapar jag en 38KkHz från en timer som sedan får driva min IR-diod via en transistor.
Har sedan även som mål att ha en lins framför för att komma upp i ännu längre avstånd.
Detta är också provat men nu blir den ännu känsligare.
Någon som provat att göra något liknande som kan hjälpa mig?
Måste jag modulera 38 kHz för att få den stabilare?
Alla förslag är välkomna.
Re: Hjälp med Arduino och IR
Din 38kHz ska ha en duty-cycle på 10% till en början. Detta gör att du kan klämma mer ström i LEDn, ofta 100mA fast i mycket korta pulser. Kolla datablad för exakta gränser.
Sedan ska du definitivt ha mottagaren sittande i någon form av rör (svart på insidan) som skyddar mot ströljus.
Sedan ska du definitivt ha mottagaren sittande i någon form av rör (svart på insidan) som skyddar mot ströljus.
Re: Hjälp med Arduino och IR
Jag får kolla på hur jag kan implementera duty cycle.
Har ingen koll på detta just nu.
Har du kanske ett exempel som kan hjälp mig på vägen?
Både sändare och mottagare sitter i svarta rör ca 8cm djupa.
Tillverkade i min 3D skrivare.
Har ingen koll på detta just nu.
Har du kanske ett exempel som kan hjälp mig på vägen?
Både sändare och mottagare sitter i svarta rör ca 8cm djupa.
Tillverkade i min 3D skrivare.
Re: Hjälp med Arduino och IR
Utan att veta hur du har kopplat just nu är det svårt att skriva vad du ska ändra.
JAG hade tagit en ICM7555 o kopplat den som oscillator med 10% duty-cycle och drivit via en transistor då 100mA är gränsfall för ICM7555.
Detta medger också att drivningen kan kopplas som en strömdrivning.
Rören - är de MATTsvarta på insidan?
Om de är BLANKsvarta letar reflexar sig fortfarande fram.
JAG hade tagit en ICM7555 o kopplat den som oscillator med 10% duty-cycle och drivit via en transistor då 100mA är gränsfall för ICM7555.
Detta medger också att drivningen kan kopplas som en strömdrivning.
Rören - är de MATTsvarta på insidan?
Om de är BLANKsvarta letar reflexar sig fortfarande fram.
- SeniorLemuren
- Inlägg: 8332
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Hjälp med Arduino och IR
Tack för svaren så långt.
Nu har jag något att tänka på under semestern.
Hoppas att det är okej att återkomma om jag kör fast.
Nu har jag något att tänka på under semestern.
Hoppas att det är okej att återkomma om jag kör fast.
Re: Hjälp med Arduino och IR
LÅNGT de flest av oss lär nog ha det som mig: Att ge råd o tips är lite trivialt - men att "se" hur det går framåt i en tråd o till slut kommer till målet tycker i.a.f. JAG är jättekul.
Så ja, kom med frågor, det visar bara att du ämnar att komma vidare - och det är kul.
Så ja, kom med frågor, det visar bara att du ämnar att komma vidare - och det är kul.
Re: Hjälp med Arduino och IR
Förutom att modulera med någon frekvens måste man bandpassfiltrera mottagen signal för att det ska ge något som särskiljer från den allmänna bruskällan solen utgör.
Om IR så se till att mottagaren har ljusfilter som endast släpper igenom IR så blir du av med ytterligare solljus.
Mitt hemliga knep för långväga störningafri reflexförbindelse över långa avstånd är att mha av en CD40106 hex smithtrigger skapa två frekvenser, en signalgenerator på 1kHz och som modulerar en smithtrigger på 40 kHz, Utöver kretsen behövs två motstånd och två kondensatorer.
Mottagen reflekterad analog signal xoras först styrt av samma 40 kHz generator som svarar för sändmodulreingen därefter ny xor-procesdur för 1kHz.
Xor-proceduren görs genom att via två vanliga analog OP skapa invers signal och en orinverterad signal som sedan skiftas mellan mha en CD4066 som styrs av generatorerna.Samma procesudr för 1kHz nedskiftningen. Därefter lågpassfiltrering där DC-nivån visar hur mycket av mottagna brusspektrat som är modulerat på detta sättet. Det är simpelt att bygga och eliminerar störningar i önskad grad genom att välja vilken nivå av DC-spänning som ska anses vara detekterad signal-
För detta används ledig port på CD40106 för minimalt med komponen-behov.
Detta är ett exempel på synkron koherent kommunikation då samma generator används för både sändmodulering och mottagar demodulering vilket gör det svårt för solen att störa.
Det går göra oändligt mycket mer svårutstört genom att minska modulationsbandbredd. Man kan t.ex. använda 40kHz samt 10 Hz. och ett riktigt lågpass detektering av DC-nivå. Det begränsar hur korta perioder reflex-avbrott som kan detekteras.
Optiskt smalbandiga filter för aktuell IR-vågländ är ett måste för långa avstånd även om mottagar-dioden ofta redan är ingjuten i ett något IR-filtrerande plasthölje.
Bra optiska linser och tillräckligt fysiskt stora linser på mottagarsidan så att man kan samla in nyttoreflexen till fullo är bra men man måste ha koll på så inte mottagardioden tappar i känslighet genom att bli mättad med oväsentligt ströljus.
Om det finns mättande ströljus är den något ortodoxa varianten att använd två mottagardioder kopplade motvända parallellt och sedan AC.koppla till OP med AGC-funktion. Den ena dioden ska gärna vara medvetet fokuserat vid sidan av färväntad reflex men det brukar ge sej självt om man placerar dioderna jämte varandra bakom linser.
Det vanliga varianten att backlspänna en diod för bästa känslighet blir då reglerat av den andra dioden som stryper mer ju mer ströljus som finns.
Vill man ha bra linser är en variant att köpa billiga webkameralinser med fokus och bländare från AliX. De kommer oftast med förinstallerat IR-filter i botten som är lätt att pilla bort och ersätta med filre som släpper igenom IR anpassat för aktuella IR-frekvenser.
Yterligare ett steg för lång räckvidd om man inte kan använda välriktade speglar är sk. laserreflektorer. De returnera ljus i samma riktning som ljuset kom från. Det är så bättre mörker-reflexer och bilreflexer fungerar.
Ett alternativ till IR lysdioder är billiga IR laser-dioder som ofta redan har fokuser-optik och kan ge samlad ljusstråle över långa avstånd.
De kan moduleras precis som LED-dioder vid dessa rätt låga moduleringsfrekvenser.
Exempel på långväga reflexdetektorer är laserbaserade enkla avståndsmätare som kan mäta kilometer-avstånd och NASA har satt en laser-reflektor på månen så att de kan få noggranna mätningar på månens avstånd till jorden.. Det är mer komplicerade system än några enkla cmos-kapslar enligt mitt förslag men det ger ändå möjlighet tlll riktigt långa reflektions-avstånd med enkla dioder.
Om reflektionen inte måste vara en för människoögat osynlig strålbarriär kan synliga lysdioder vara enklare att hantera om man ska kunna justera optik och se vad som fkatiskt händer med ljusstrålen och vart den reflekteras. Då måste man välja lysdioder som endast avger en grundfrrekvens.. Många lysdioder avger en mix av frekvenser som för det svårt att filtrera en specifik ljusvåglängd. En billig röd laser gör jobbet utmärkt om man bara ska nå 10-100 meter med hygglig reflektor.
Med bra filter och elektronik så detekteras ljus-reflexer svagare än man kan se med ögat på tillförlitligt sätt även om solen skiner..
Ett sätt att ytterligare öka max avstånd som kan övervakas är att inte ha en passiv reflektor utan en repeater.som återsänder mottagen detekterad direktsignal.
Skulle det inte fungera eller verka allt för krångligt att nå behövda tillförlitligheten så är det inte så dyrt att köpa halvfabrikat avståndsmätare på AliuX som man sedan kan modifiera efter behov.
https://vi.aliexpress.com/item/1005005236475334.html
https://vi.aliexpress.com/item/1005005236475334.html
Om IR så se till att mottagaren har ljusfilter som endast släpper igenom IR så blir du av med ytterligare solljus.
Mitt hemliga knep för långväga störningafri reflexförbindelse över långa avstånd är att mha av en CD40106 hex smithtrigger skapa två frekvenser, en signalgenerator på 1kHz och som modulerar en smithtrigger på 40 kHz, Utöver kretsen behövs två motstånd och två kondensatorer.
Mottagen reflekterad analog signal xoras först styrt av samma 40 kHz generator som svarar för sändmodulreingen därefter ny xor-procesdur för 1kHz.
Xor-proceduren görs genom att via två vanliga analog OP skapa invers signal och en orinverterad signal som sedan skiftas mellan mha en CD4066 som styrs av generatorerna.Samma procesudr för 1kHz nedskiftningen. Därefter lågpassfiltrering där DC-nivån visar hur mycket av mottagna brusspektrat som är modulerat på detta sättet. Det är simpelt att bygga och eliminerar störningar i önskad grad genom att välja vilken nivå av DC-spänning som ska anses vara detekterad signal-
För detta används ledig port på CD40106 för minimalt med komponen-behov.
Detta är ett exempel på synkron koherent kommunikation då samma generator används för både sändmodulering och mottagar demodulering vilket gör det svårt för solen att störa.
Det går göra oändligt mycket mer svårutstört genom att minska modulationsbandbredd. Man kan t.ex. använda 40kHz samt 10 Hz. och ett riktigt lågpass detektering av DC-nivå. Det begränsar hur korta perioder reflex-avbrott som kan detekteras.
Optiskt smalbandiga filter för aktuell IR-vågländ är ett måste för långa avstånd även om mottagar-dioden ofta redan är ingjuten i ett något IR-filtrerande plasthölje.
Bra optiska linser och tillräckligt fysiskt stora linser på mottagarsidan så att man kan samla in nyttoreflexen till fullo är bra men man måste ha koll på så inte mottagardioden tappar i känslighet genom att bli mättad med oväsentligt ströljus.
Om det finns mättande ströljus är den något ortodoxa varianten att använd två mottagardioder kopplade motvända parallellt och sedan AC.koppla till OP med AGC-funktion. Den ena dioden ska gärna vara medvetet fokuserat vid sidan av färväntad reflex men det brukar ge sej självt om man placerar dioderna jämte varandra bakom linser.
Det vanliga varianten att backlspänna en diod för bästa känslighet blir då reglerat av den andra dioden som stryper mer ju mer ströljus som finns.
Vill man ha bra linser är en variant att köpa billiga webkameralinser med fokus och bländare från AliX. De kommer oftast med förinstallerat IR-filter i botten som är lätt att pilla bort och ersätta med filre som släpper igenom IR anpassat för aktuella IR-frekvenser.
Yterligare ett steg för lång räckvidd om man inte kan använda välriktade speglar är sk. laserreflektorer. De returnera ljus i samma riktning som ljuset kom från. Det är så bättre mörker-reflexer och bilreflexer fungerar.
Ett alternativ till IR lysdioder är billiga IR laser-dioder som ofta redan har fokuser-optik och kan ge samlad ljusstråle över långa avstånd.
De kan moduleras precis som LED-dioder vid dessa rätt låga moduleringsfrekvenser.
Exempel på långväga reflexdetektorer är laserbaserade enkla avståndsmätare som kan mäta kilometer-avstånd och NASA har satt en laser-reflektor på månen så att de kan få noggranna mätningar på månens avstånd till jorden.. Det är mer komplicerade system än några enkla cmos-kapslar enligt mitt förslag men det ger ändå möjlighet tlll riktigt långa reflektions-avstånd med enkla dioder.
Om reflektionen inte måste vara en för människoögat osynlig strålbarriär kan synliga lysdioder vara enklare att hantera om man ska kunna justera optik och se vad som fkatiskt händer med ljusstrålen och vart den reflekteras. Då måste man välja lysdioder som endast avger en grundfrrekvens.. Många lysdioder avger en mix av frekvenser som för det svårt att filtrera en specifik ljusvåglängd. En billig röd laser gör jobbet utmärkt om man bara ska nå 10-100 meter med hygglig reflektor.
Med bra filter och elektronik så detekteras ljus-reflexer svagare än man kan se med ögat på tillförlitligt sätt även om solen skiner..
Ett sätt att ytterligare öka max avstånd som kan övervakas är att inte ha en passiv reflektor utan en repeater.som återsänder mottagen detekterad direktsignal.
Skulle det inte fungera eller verka allt för krångligt att nå behövda tillförlitligheten så är det inte så dyrt att köpa halvfabrikat avståndsmätare på AliuX som man sedan kan modifiera efter behov.
https://vi.aliexpress.com/item/1005005236475334.html
https://vi.aliexpress.com/item/1005005236475334.html
Re: Hjälp med Arduino och IR
@Kafeman
Tack för alla ledtrådar.
Finns dock lite i din beskrivning jag får läsa på.
På senare tiden har jag gjort många projekt, både på jobb och privat men de har i första hand varit i cpu världen.
Var ett tag sedan jag gjorde saker analogt, men ge mig lite tid.
Ska försöka att komma ihåg och skriva här när jag har ett resultat jag är nöjd med.
Tack för alla ledtrådar.
Finns dock lite i din beskrivning jag får läsa på.
På senare tiden har jag gjort många projekt, både på jobb och privat men de har i första hand varit i cpu världen.
Var ett tag sedan jag gjorde saker analogt, men ge mig lite tid.
Ska försöka att komma ihåg och skriva här när jag har ett resultat jag är nöjd med.
Re: Hjälp med Arduino och IR
Tillbaka igen.
Jag tror jag fått det att fungera med 10% "duty cycle" men kört fast när det gäller att modulera.
Det analoga har jag lagt på hyllan tills vidare.
Blir kanske att jag provar detta i nästa förbättrade version.
Som IR sändare använder jag 2 stycken TSUS5202 och mottagare TSSP4038.
Hittade någon på nätet som använde dessa och därför provar jag med detta paret.
Kan vara som så att det är helt fel och i så fall skulle jag vilja ha hjälp med att hitta ett annat par som fungerar på långa avstånd.
Detta fungerar nästan som jag har tänkt.
Dock känslig för solljus och konstiga fenomen mycket nära sändaren.
Men det går att använda på ett avstånd på 12 meter.
Skulle även vilja ha lite hjälp med att modulera min 38kHz, säg med 1 kHz.
Sedan också hur jag ska detektera denna.
Alla ledtrådar är välkomna.
Har Ni kodexempel är det kul, annars räcker det med ledtrådar.
Jag jobbar i Arduino IDE och har gjort följande: (detta är avskrivet, ej kopierat, från min kod så vissa fel kan ha uppstått)
Mycket andra experiment är gjorda, men då inget fungerat visar jag inte denna usla kod.
Som Ni ser, inte mycket till kod än.
Nu måste jag ha hjälp med att komma in på rätt spår.
Jag tror jag fått det att fungera med 10% "duty cycle" men kört fast när det gäller att modulera.
Det analoga har jag lagt på hyllan tills vidare.
Blir kanske att jag provar detta i nästa förbättrade version.
Som IR sändare använder jag 2 stycken TSUS5202 och mottagare TSSP4038.
Hittade någon på nätet som använde dessa och därför provar jag med detta paret.
Kan vara som så att det är helt fel och i så fall skulle jag vilja ha hjälp med att hitta ett annat par som fungerar på långa avstånd.
Detta fungerar nästan som jag har tänkt.
Dock känslig för solljus och konstiga fenomen mycket nära sändaren.
Men det går att använda på ett avstånd på 12 meter.

Skulle även vilja ha lite hjälp med att modulera min 38kHz, säg med 1 kHz.
Sedan också hur jag ska detektera denna.
Alla ledtrådar är välkomna.
Har Ni kodexempel är det kul, annars räcker det med ledtrådar.
Jag jobbar i Arduino IDE och har gjort följande: (detta är avskrivet, ej kopierat, från min kod så vissa fel kan ha uppstått)
Mycket andra experiment är gjorda, men då inget fungerat visar jag inte denna usla kod.
Som Ni ser, inte mycket till kod än.
Nu måste jag ha hjälp med att komma in på rätt spår.
Kod: Markera allt
//Definitioner:
IR_TX = 11;
IR_RX = 8;
//Timer
TCCR2A = _BV(COM2A0) | _BV(WGM21);
TCCR2B = _BV(CS20);
OCR2A = 209;
OCR2B = 21;
setup()
{
pinMode(IR_TX, OUTPUT);
pinMode(IR_RX, INPUT_PULLUP);
}
loop()
if(digitalRead(IT_RX) == LOW)
{
// Do something
}
else
{
// Do something else
}
Re: Hjälp med Arduino och IR
Dom LED har en spridningsvinkel på ±15°.
Detta betyder att ska du upp i avstånd måste du ha någon form av lins till att samla strålen och få en acceptabel räckvidd.
En lins till mottagaren ville vara en stor hjälp också.
Alla linser vill samla IR-pulserna och ge större skillnad mellan signal och ströljus vilket get längre räckvidd.
Det vill också betyda att du bara behöver 1 st LED för att få ett enkelt punkt för linsen att fokusera på.
Alternativt vill vara att dubbla antalet LED, i teorin vill varje fördubbling ge en fördubbling av räckvidden.
Detta betyder att ska du upp i avstånd måste du ha någon form av lins till att samla strålen och få en acceptabel räckvidd.
En lins till mottagaren ville vara en stor hjälp också.
Alla linser vill samla IR-pulserna och ge större skillnad mellan signal och ströljus vilket get längre räckvidd.
Det vill också betyda att du bara behöver 1 st LED för att få ett enkelt punkt för linsen att fokusera på.
Alternativt vill vara att dubbla antalet LED, i teorin vill varje fördubbling ge en fördubbling av räckvidden.
Re: Hjälp med Arduino och IR
Jag har provat med lins också, men då är den bara mer känslig.
Vill se om jag kan bli av med en del av felen redan på korta avstånd.
Nu leker jag på avstånd från 0.5 -1.5 m.
Vill se om jag kan bli av med en del av felen redan på korta avstånd.
Nu leker jag på avstånd från 0.5 -1.5 m.
Re: Hjälp med Arduino och IR
Ah - på det avstånd ska det ju vara enkelt.
Moduleringen ska göras vid att tända o släcka för pulserna med en lägre frekvens.
Då jag inte befattar mig med Arduino kan jag inte ge svar på den del men JAG hade löst det vid att ha en timer-interrupt som styr moduleringen vid att - för varje intervall - växlar mellan att tända o släcka PWM-signalen, antingen vid att starta/stoppa PWM-delen SAMT släcka utgången när det är passande.
Då jag är old-school har jag inte petat i Arduino och deras mjukvara så det är så långt jag kan ge svar.
Moduleringen ska göras vid att tända o släcka för pulserna med en lägre frekvens.
Då jag inte befattar mig med Arduino kan jag inte ge svar på den del men JAG hade löst det vid att ha en timer-interrupt som styr moduleringen vid att - för varje intervall - växlar mellan att tända o släcka PWM-signalen, antingen vid att starta/stoppa PWM-delen SAMT släcka utgången när det är passande.
Då jag är old-school har jag inte petat i Arduino och deras mjukvara så det är så långt jag kan ge svar.
Re: Hjälp med Arduino och IR
@Icecap
Tack för ledtråden.
Nu har jag något att leta efter och prova.
Tack för ledtråden.
Nu har jag något att leta efter och prova.
Re: Hjälp med Arduino och IR
Finns det någon som kan förklara denna kod för mig.
Jag ställde en fråga till ett AI och fix samma svar hela tiden.
Detta ska tydligen lämna 38kHz på pinne 11 med en modulation på 100Hz.
Var ställer man in 38kHz och hur får den det att bli 100Hz.
Ber jag den ändra modulationen så får jag samma svar.
Behöver hjälp med att tolka denna underliga kod.
Har inte förstått mig på Timers än.
Det är första projektet som jag har börjat att använda Timers.
Jag ställde en fråga till ett AI och fix samma svar hela tiden.
Detta ska tydligen lämna 38kHz på pinne 11 med en modulation på 100Hz.
Var ställer man in 38kHz och hur får den det att bli 100Hz.
Ber jag den ändra modulationen så får jag samma svar.
Behöver hjälp med att tolka denna underliga kod.
Har inte förstått mig på Timers än.
Det är första projektet som jag har börjat att använda Timers.
Kod: Markera allt
volatile byte pulse = 0;
ISR(TIMER2_COMPB_vect) {
pulse++;
if (pulse >= 8) { // Change the number for the desired modulation cycles
pulse = 0;
TCCR2A ^= _BV(COM2B1); // Toggle pin 11 (turn it on and off)
}
}
void setIrModOutput() {
pinMode(11, OUTPUT); // Set pin 11 as output
TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); // Enable output on Pin 11
TCCR2B = _BV(WGM22) | _BV(CS22); // Set prescale value to 64 (for 100 Hz modulation)
OCR2A = 125; // Defines the frequency (125 = 56 kHz)
OCR2B = 12; // Defines the duty cycle (10%)
}
void setup() {
setIrModOutput();
TIMSK2 = _BV(OCIE2B); // Enable Output Compare Match B Interrupt
}
void loop() {
// Your other tasks can go here
}