En anpassad sköld för Propeller ASC - Infra-röd avlägsen kontroll- och flera kuggar!
( )
I detta projekt kommer vi också att införa användning av flera kuggar, en unik funktion av Parallax Propeller chip.
LCD-Display:
Displayen är tillgängliga från Radio Shack och behöver bara tre kablar att köra.
IR-detektor:
Nu, för att ge användarkontroll och input till ASC systemet, vi kommer att lägga till en infraröd detektor så
att en gemensam universal TV fjärrkontroll kan användas. Denna kod använder SONY enheten
protocalls, så satt de TC kod till den första SONY koden anges i dess "häfte.
Jag använder PNA4602 IR-detektor chip. Det ser väldigt lik en normal trebenta transistor, men det är inte.
Den innehåller på chip 38 KHZ demodulator och filter som gör det mycket lätt att använda med gemensam TV
fjärrkontroller. De kostar ca $2 vardera.
Alla fascinerande tekniska detaljer finns på Ada frukt på: http://learn.adafruit.com/ir-sensor
Proto-Shield:
För att montera detektorn, använder jag en Seeed "Proto-Shield" från Radio Shack.
Det är lite overkill för sådan en liten krets, men det kommer att växa mer saker inom en snar framtid.
Ett 3 x 2 kvinnliga huvud installerades som en socket för dekoder chip.
Det är IR-detektorn gömmer sig i det övre högra hörnet under denna röra av ledningar.
Eftersom Proto-Shield stift ansluter till ASC socket rubrikerna är det inte möjligt att använda
normala wire-wrap tekniker. Det skulle ta upp för mycket av klämma fast, längd
gör det tveksamt om skölden kan anslutas till mottagande ASC styrelsen alls.
Så jag använder en modifierad teknik - en enkel sjal runt stift, sedan löda.
Det är delikat arbete. Men för tillfället. Det är endast tre kablar, power (3.3V), mark, och
signal, så inga problem här. Se tråd foto.
Programvara:
Demo programvara använder flera objekt från Parallax Object Exchange (OBEX).
IR remote drivrutin: "IR_Remote.Spin"
LCD-chaufför: "serial_lcd.spin"
Nummer: "simple_numbers.spin"
Dessa kan hämtas från OBEX, men jag har tagit dem i denna ZIP-fil bifogade
till denna Instructible.
Detta demo program läser fjärrkontrollskoder och visar resultatet på LCD-skärmen.
Denna del är ganska enkel och rak vidarebefordra.
Men...
Vad händer om vi ville ha LCD displayen för att stänga av back-ljuset efter några sekunders inaktivitet?
Normalt använder vi en avbrottshanterare för detta.
En periodisk avbryta skulle ge tid basen, och föraren skulle räkna ner att avgöra
När det var dags att stänga ner den bakgrundsbelysning.
Men propellern använder inte avbryter. Det är vad flera kuggar för. Det tar en bit av en
paradigmskifte att Linda ditt sinne omkring parallell bearbetning, men det är väl värt ansträngningen.
I detta demo program, kommer vi knoppa av en liten procedur till en annan kugge.
Det kommer att ge en tid bas och räkna ner en timeout variabel.
Du kan hitta denna kod i slutet av demoversionen av programmet.
Leta efter - PUB Timeout.
Och observera att alla som gör vänta en sekund, sedan kontrollera att se om variabeln LCDtime
är större än noll, och stegvis minskning det om det är. Det är det /.
Också överväga detta. Vad händer om du behövde två (eller fler) helt annan tid baser?
Tilldela varje aktivitet till en annan kugge och de körs samtidigt och helt oberoende av varandra.
Det bli bara inte enklare.
Spinn kan se lite konstigt först, men det är lätt att lära och gör jobbet ganska bra.
Men kom ihåg att indrag definierar strukturen av programmet och carelesly ändra den
indrag kommer att helt förändra flödet av programmet! Så var försiktig med att.
Propeller verktyg (med all dokumentation) kan laddas ner gratis från Parallax på:
http://www.Parallax.com/tabid/832/default.aspx
Demo källkoden:
{{ASC_LCD_IR_TimeOut.spin}}
CON
_CLKMODE = XTAL1 + PLL16X ' 80 Mhz klocka
_XINFREQ = 5_000_000
IRpin = 23' IR mottagare - Propeller Pin
LcdTimeOut = 10
LcdOn1 = $16 ' LCD på; markören off, blink off
LcdLine0 = $80 ' flytta till linje 1, kolumn 0
LcdLine1 = $94 ' flytta till rad 2, kolumn 0
POL = 15' bevis av liv LED
OBJ
IR: "IR_Remote"
LCD: "serial_lcd"
NUM: "simple_numbers"
VAR
byte IRcode ' keycode från IR-mottagaren här
byte LCDtime
lång IRcog
lång Stack1 [6] "stackutrymme för LCDtimeout cog
PUB Init | index-frekv, cog, lcode
"init LCD
om lcd.start (0, 9600, 2)
LCD.putc(LCD#LcdOn1) ' ingen markören
LCD.CLS
LCD.backlight(1)
LCD.Str (sträng (LcdLine0, "IR Remote"))
' Bevis av liv
Dira [pol] ~ ~
! outa [pol]
"Starta Timeout
LCDTime: = LCDTimeout ' återställa timeout varje gång en knapp trycks
cognew (TimeOut)
"Init IR fjärrkontroll
IRcog: = ir. Starta (IRpin, "Pin för IR-mottagare, adress för variabel
om IRcog > 0
Upprepa
Om LCDtime > 0
LCD.backlight(1) "slå på den
annat "timeout
LCD.backlight(0) ' vända om off
Om IRcode <> ir #NoNewCode ' vi har en nyckel koden
lcode: = IRcode
IR. Starta (IRpin, ' in för nästa kod
om LCDtime: = 0' om det var av,
LCD.backlight(1) "slå på den
LCDTime: = LCDTimeout ' återställa timeout varje gång en knapp trycks
LCD.gotoxy(1,1)
mål lcode
IR #one: lcd.str (sträng ("< 1 >"))
IR #two: lcd.str (sträng ("< 2 >"))
IR #three: lcd.str (sträng ("< 3 >"))
IR #four: lcd.str (sträng ("< 4 >"))
IR #five: lcd.str (sträng ("< 5 >"))
IR #six: lcd.str (sträng ("< 6 >"))
IR #seven: lcd.str (sträng ("< 7 >"))
IR #eight: lcd.str (sträng ("< 8 >"))
IR #nine: lcd.str (sträng ("< 9 >"))
IR #zero: lcd.str (sträng ("< 0 >"))
IR #chUp: lcd.str (sträng ("chUp"))
IR #chDn: lcd.str (sträng ("chDn"))
IR #volUp: lcd.str(string("volUp"))
IR #volDn: lcd.str(string("volDn"))
IR #mute: lcd.str (sträng ("mute"))
IR #power: lcd.str(string("power"))
IR #last: lcd.str (sträng ("sista"))
andra: lcd.str (string(""))
waitcnt ((clkfreq / 1000) * 30 + cnt)
! outa [pol]
PUB Timeout
Upprepa "slinga för evigt
waitcnt (clkfreq + cnt) "vänta en sekund
om byte [= > 1' hålla räknar
byte [--' ner