Sida 1 av 9
Bygga egen sändare till Nexa trådlös dimmer
Postat: 15 juni 2006, 17:39:36
av chille
Tjackade en Nexa trådlös dimmer för installation. Köpte även en batteridriven trådlös sändare som ser ut som en vanlig trycknapp. Så nu ska det meckas
Första man gjorde var förståss att plocka isär sändaren. Nästa steg var att plocka isär och bröja mäta på mottagaren. Dock förstår jag mig inte riktigt på den. Den har 3 pinnar, plus, minus och data. Ganska självklart om man tänker lite. Men det skumma är, om man mäter på data med oscilloskopet och låter jorden hänga i luften funkar det kalas, men man får ett störande brum på signalen. Kopplar man på ground på oscilloskopet till plus eller minus på sändaren så är det helt dött. Tycker det är väldigt mysko. Någon som har en förklaring eller kanske tips på vad jag gjort fel? Kanske är min probe som är helt röjd?
Måste få tummen ur och skriva ett program till oscilloskopet så jag kan föra över skärmdumpar. Har ju redan skrivit ett för j00nix.. gah... jag hatar programmering i windows
Enligt vfr här på forumet så kommunicerar modulerna på 433.92MHz med ASK-modulering. En frame består av 25 bitar varav varannan är data. Dvs totalt 12 bitar; 4 huskod, 4 id och 4 styrdata. Det verkar stämma ganska bra. vad han däremot inte sa var vilken överföringshastighet det var. Men jag kom iaf fram till att den verkar vara cirka 700 BAUD. Får mecka igång oscilloskopet så man kan forska mer.
Det roliga är att jag redan har både en sändare och mottagare för 433MHz bandet. Ganska säker på att det är 433.92MHz. Med lite tur är det även rätt modulering
Frågan är om man ska bygga en 433MHz<->Bluetooth-adapter eller om man ska bygga en sändare som man kan plugga in i datorn.
Lite obligatoriska bilder

Glömde ju förståss att fota själva dimmern. Aja, uppdaterar väl under dagen
EDIT: Hoppsan. Tur att man är moderator så man själv hinner rätta till felen man gör innan någon upptäcker dom. Postade i fel forumdel

Postat: 16 juni 2006, 17:46:30
av chille
Såja. Då har man letat hela morgonen och äntligen hittat mina sändar och mottagarmoduler. Självlart var jag lyckligt lottad då även de använde sig av ASK-modulering. Nu blev även oscilloskopet på bra humör när den fick en vettig RF-mottagare
Precis som jag sa tidigare så kommunicerar de med en hastighet av 700 BAUD. Och precis som jag hade hoppats på så kör även IKEA's dimmer med 433.92MHz och ASK-modulering, dock en aning lägre överföringshastighet. Det blir ju perfekt att kunna använda IKEA's där det är möjligt och Nexa's när man bara ska switcha on/off eller vill ha en dimmer för installation. IKEA's dimmer går ju att styra till absolutvärden direkt, vilket inte Nexas gör

Postat: 16 juni 2006, 19:06:01
av rehnmaak
Att det ballar ur när du ansluter proben kan bero på den kapacitiva last som du tillför med proben. Kör du med x1 probe? Testa isåfall med en x10 probe som lastar *betydligt* mindre. Eller var det så att det slutar funka bara du ansluter jordsladden?
Postat: 16 juni 2006, 19:35:31
av chille
Nja, det var bara när jag anslöt jordsladden den ballade ur. Körde jag med flytande jord så funkade det ju.
Jag kom att tänka på att både oscilloskopet och dimmern var inkopplade till samma vägguttag. Då kanske den har jord utan att jag ansluter jorden på proben? För det funkade ju hyffsat så iaf.
Fast skit samma, den andra RF-mottagaren var på bättre humör och fungerade direkt som ni ser på bilden
Kom att tänka på att RF-sändaren jag har är ju en sån där modell som man brukar ha för att larma av bilar med. En stor och en liten knapp. Den skulle man ju kunna programmera om (sitter en PIC i den) så den kan tända och släcka taklampan. Är ju perfekt att ha en liten sändare i fickformat. Hoppas verkligen man kan få tag i en pinkompatibel AVR. Vill ju inte mecka PIC i onödan

Postat: 16 juni 2006, 21:34:01
av vfr
Håll till godo, Chille!
Kod: Markera allt
extern IntRet
; extern ReceiveB,RT1Ini,IntRet,TxCharB
extern STRTUP
; extern STRTUP,TBuffCB
global RFNIni,RFNTrns
; global RTTrnsB
global CCP1Int,CCP2Int
include SYSTEM.INC ;System definitions
include P16C74A.INC ;Definitions for PIC16C74A
;************************************************************************
;* *
;* CONSTANTS *
;* *
;* Constant definitions for this program module. *
;* *
;************************************************************************
;
; Bittime definitions for NEXA RF transmitter
;
BITTIM1 equ 295 ;1/4 bittime
BITTIM2 equ 590 ;2/4 bittime
BITTIM3 equ 885 ;3/4 bittime
BITTIM4 equ 1180 ;4/4 bittime
BITTIMP equ 10240 ;Bittime for preamble
;BITTIME equ 590 ;Bittime for NEXA RF transmitter
BITTIME equ 295 ;Bittime for NEXA RF transmitter
;************************************************************************
;* *
;* VARIABLES *
;* *
;* Variable definitions for this program module. *
;* *
;************************************************************************
RAM0 UDATA
TXCount res 1 ;Transmission counts
BCount res 1 ;Transmit bit counter
XmtHldH res 1 ;Transmit/receive holding register high
XmtHldL res 1 ;Transmit/receive holding register low
XmtRegH res 1 ;Transmit/receive shift register high
XmtRegL res 1 ;Transmit/receive shift register low
BCountR res 1 ;Receive bit counter
XFlag res 1
;************************************************************************
;* *
;* FUNCTIONS *
;* *
;* Functions for this program module. *
;* *
;************************************************************************
PROM CODE
;
; Initalize device driver.
;
RFNIni movlw B'00000001' ;Enable timer 1
movwf T1CON
movlw B'00001000' ;CCP2 as output compare (pin RC1)
movwf CCP2CON
; movlw B'00000100' ;CCP1 as input capture (pin RC2)
; movwf CCP1CON
errorlevel -302
bsf STATUS,RP0 ;Bank 1
; bsf PIE1,CCP1IE ;Enable capture/compare 1 interrupt
bsf PIE2,CCP2IE ;Enable capture/compare 2 interrupt
bcf STATUS,RP0 ;Bank 0
errorlevel +302
return
;
; Transmitt data.
;
; IN: W = Data
; FSR = Address
; OUT: W,FSR destroyed
;
RFNTrns movwf XmtHldH ;Data
movfw FSR
movwf XmtHldL ;Address
swapf XmtHldL,f
movlw 4
movwf TXCount ;Number of transmissions
bsf XFlag,0
return
;
; Capture/compare 1 interrupt service routine.
;
CCP1Int bcf STATUS,RP0 ;Bank 0
bcf PIR1,CCP1IF ;Clear interrupt flag
tstf BCountR
bnz BitRead
; movlw low ( BITT15 ) ;Low byte of timer value (1.5 bittime)
addwf CCPR1L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
; movlw high ( BITT15 ) ;High byte of timer value (1.5 bittime)
btfsc STATUS,C ;Update high byte of compare register
addlw 1 ;Add one for carry
addwf CCPR1H,f
movfw FSR
movwf CCPR1L
btfbs PORTC,2,IntRet ;Verify startbit twice
btfbs PORTC,2,IntRet
movlw 9
movwf BCountR
movlw B'00001010' ;CCP1 as interrupt only
movwf CCP1CON
goto IntRet
BitRead movlw low ( BITTIME ) ;Low byte of timer value
addwf CCPR1L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high ( BITTIME );High byte of timer value
btfsc STATUS,C ;Update high byte of compare register
addlw 1 ;Add one for carry
addwf CCPR1H,f
movfw FSR
movwf CCPR1L
clrc
btfsc PORTC,2 ;Test receive bit (RC2)
setc
; rrf XmtReg,f ;Shift bit into receive register
decfsz BCountR,f ;Increment bitcount
goto IntRet
movlw B'00000100' ;CCP1 as input capture (pin RC2)
movwf CCP1CON
; rlf XmtReg,f ;Stopbit -> carry
bnc FErr ;Framing error if no stopbit
; movfw XmtReg ;Read received character
clrc
; call ReceiveB ;Decode message. Complete ?
goto IntRet
FErr setc
; call ReceiveB ;Decode message. Complete ?
goto IntRet
;
; Capture/compare 2 interrupt service routine.
;
CCP2Int bcf PIR2,CCP2IF ;Clear interrupt flag
bcf STATUS,RP0 ;Bank 0
btfbc XFlag,0,C2Norm0 ;Exit if transmission disabled
movfw BCount
bz C2z1
decfsz BCount,f
goto C2z2
decfsz TXCount,f
goto C2z1
bcf XFlag,0
goto C2Norm0
C2z1 movfw XmtHldH
movwf XmtRegH
movfw XmtHldL
movwf XmtRegL
rlf XmtRegL,f
rlf XmtRegH,f
movlw 50
movwf BCount
bsf CCP2CON,CCP2M0 ;Send bit = 1
movlw low (BITTIMP) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIMP) ;High byte of timer value
goto C2SetL
; goto C2Norm
C2z2 btfsc BCount,0
bcf CCP2CON,CCP2M0 ;Send bit = 0
btfss BCount,0
bsf CCP2CON,CCP2M0 ;Send bit = 1
bcf STATUS,C ;Bit = 0
btfbc BCount,1,???1
btfbc BCount,0,???3
rrf XmtRegH,f
rrf XmtRegL,f
bcf STATUS,C ;Bit = 0
???3 btfsc XmtRegL,0
bsf STATUS,C ;Bit = 1
???1 btfbc BCount,0,???2
btfbs STATUS,C,???4
???5 movlw low (BITTIM1) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIM1) ;High byte of timer value
goto C2SetL
???2 btfbs STATUS,C,???5
???4 movlw low (BITTIM3) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIM3) ;High byte of timer value
goto C2SetL
C2Norm0 bcf CCP2CON,CCP2M0 ;Send bit = 0
C2Norm movlw low (BITTIM2) ;Low byte of timer value (1/4 duty cycle)
addwf CCPR2L,w ;Update low byte of compare register
movwf FSR ;Use FSR for temp storage
movlw high (BITTIM2) ;High byte of timer value
C2SetL btfsc STATUS,C ;Update high byte of compare register
addlw 1 ;Add one for carry
addwf CCPR2H,f
movfw FSR
movwf CCPR2L
goto IntRet
Kan tillägga att PIC:en går på 3.68MHz kristall med den här koden.
Postat: 17 juni 2006, 14:43:28
av chille
Usch vilken rörig kod. Blir ju helt förvirrad av att kolla på den. Behöver det verkligen vara sådär mycket kod? :-x
Aja, tjackade en sändarmodul idag, så nu ska det labbas. Hoppas man hinner få ihop något innan man ska iväg ikväll
Preics som vfr så så var det 25 bitar som skickas, varav 12 data:
Kod: Markera allt
Hus ID Styr Hus ID Styr
A 1 On 0000 0000 0111 (00000000 00000000 00010101 0)
A 1 Off 0000 0000 0110 (00000000 00000000 00010100 0)
B 3 On 1000 0100 0111 (01000000 00010000 00010101 0)
C 13 On 0100 0011 0111 (00010000 00000101 00010101 0)
Huskoden är A till P, dvs 4 bitar. ID är 1-16, dvs även där 4 bitar. Styrkoderna är också 4bit. 011 verkar vara för att tala om att det är en dimmer/switch och följande bit om det är på/av.
OBS: Datan skickas med LSB först
EDIT: Har lyckats styra Nexa-dimmern nu iaf

Postat: 18 juni 2006, 10:53:49
av Croaton
Trevligt Projekt, har själv funderat på att testa detta men ej tagit mig tid ännu.
Jag skulle vara mycket tacksam om du kunde posta ett schema samt lite excempelkod (AVR?)
BTW: Vilken sändarmodul kör du med?
Ett tips: De billiga 3-pack med dimmrar / switchar som bland annat
Rusta säljer skall enligt utsago vara helt kompatibla med Nexa systemet.
/Croaton
Postat: 18 juni 2006, 12:53:22
av chille
Självklart kommer jag posta exempelkod och scheman. Funderar på om man skulle knåpa ihop en liten sändare med en Tiny15 och MAX232 på, som man kopplar till serieporten. Skulle ju kunna sälja färgidbyggda för typ 200-250:- för dom som inte vill bygga själv. Är säkert många som har typ hemmabio och sånt som kanske inte är så sugna på att löda
Jag kör med Kjell's 433MHz sändarmodul för 99kr.
Jo, en kompis har tjatat väldigt mycket om ett 3-pack som finns på Clasisjön. 200:- för tre mottagare och en sändare. Får nästan åka runt i alla affärer och köpa en av varje, så man kan få sändaren kompatibel med allt.
Fast roligast är nog IKEA. För de går ju att styra till direktvärden, vilket inte de andra gör
Aja, nu är det en ny dag. Får se om jag kan ränsa upp koden och posta lite. Eller jag kanske hinner få igång IKEA-grejerna

Postat: 18 juni 2006, 18:25:02
av chille
Nu får jag verkligen inte ihop det här.
Såhär ser det ut när man skickar en "On" på kanal 1:
Efter lite trixande skickade min kod det här:
Men det stämmer inte, för egentligen skulle jag skicka det här:

Kolla noga så ser ni att det är en bit som är lite annorlunda placerad. Jag förstår inte varför
Jag provade även att tweak:a in så den skulle skicka i rätt hastighet. Men då insåg jag att det är något lurt med vad den skickar. Pulserna verkar ju ha 50% duty cycle. En kort puls för en 0:a och en lång för en 1:a, ser det ju ut som. Dock så verkar det ju inte alltid vara exakt 50% duty cycle. Eller så är det olika långa bitar eller nått. Jämför den här bilden med den första så får ni se. Hela paketet är exakt lika långt, men bitarna i slutet är lite annorlunda placerade.
Vad är det för typ av kodning som används för att skicka datan? Jag kanske har gissat mig till fel lösning?

Postat: 18 juni 2006, 18:46:57
av vfr
Det är olika långa pulser. Nu är det ett tag sedan jag skrev koden som du fick, men jag vill minnas att det var 25% låg följt av 75% hög för etta och 75% låg och 25% hög för nolla eller precis tvärtom. Alltså i % av periodtiden för varje databit (12 st). Däremellan ligger dom 13 utfyllnadsbitarna som var antingen noll eller ett allihopa.
Edit: Periodtiden för varje bit är alltstå alltid lika lång, men dutycykeln ändrar sig beroende på om det är nolla eller etta.
Postat: 18 juni 2006, 18:52:11
av chille
Japp, det du skriver stämmer perfekt för Nexa. Men den har jag redan fått igång, så det kapitlet är avklarat.
Om du kollar på mina screenshots så ser du att det är olika längder på bitarna. Dock verkar alla ha 50% duty cycle.
Postat: 18 juni 2006, 23:27:47
av vfr
Ok. Så detta var inte Nexan då, om jag förstår dig rätt. Var kanske inte helt tydligt i det inlägget. Är det IKEA-modulen då, eller vilken är det?
Vet du vad det är för sändarkrets i originalfjärren?
Jag håller med om att IKEA-grunkan är intressant iom att den verkar gå att absolutstyra. Det är den absolut största nackdelen med dom andra och gör dom tyvärr mer eller mindre värdelösa för centralstyrning.
Postat: 19 juni 2006, 01:25:03
av chille
Nä, jag kom på att jag var nog lite otydlig. Det var typ 3-4 inlägg tidigare jag nämde att jag var klar med Nexa och numera gått över till IKEA. Dock har jag lyckats styra IKEA'n nu. Men jag kan verkligen inte få fram logiken i protokollet. Datan verkar vara kodat på något skumt sätt. För rätt som det är så kommer det en bit som ser helt annorlunda ut. Jag antar att den där "annorlunda" biten betyder något speciellt. Typ som om det är trinärt eller något.
Kollar man riktigt noga är det långa eller korta pulser mer 50% duty cycle, fram tills de 4 sista. Där stämmer inte mönstret in längre.
Screenshot
Försöker man koda av det till 1:or och 0:or så blir det bara konstigt.
Protokoll
Postat: 19 juni 2006, 03:08:05
av matte_amal
Det här var intressant, har själv haft planer på att ta en fjärrkontroll och styra genom att kortsluta benen på knapparna. Skulle göra det antingen med skrivarporten eller med en AVR om man nån gång fick tummen ur och köpte ett startkit.
Men din lösning är ju mycket snyggare, tyvärr kan jag inte tillföra något till ditt problem.
Föresten vad inbär det att man kan "absolutstyra" Ikeas?
Postat: 19 juni 2006, 08:20:38
av vfr
Det innebär att du kan skicka abolutvärden, t.ex 40%, till den för direkt inställning istället för att stega upp och ner som dom flesta har. Det finns då givetvis ett förutbestämt antal steg man kan styra till.
Att stega upp och ner är värdelöst när man vill centralstyra sakerna eftersom man oftast inte har en aning om vilket dimmervärde som är inställt från början och sedan måstre man gå på tid för att få ungefär rätt nivå. Har man hållit på sådär några ggr fram o tillbaka så har man definitivt ingen koll på värdet längre. Ungefär som att navigera med död räkning. Alla förändringar är reletivt det första utgångsvärdet och alla fel däremellan adderas.
Hmm. Då kanske man skulle se om det fortfarande finns några såna IKEA-dimmrar kvar. Det är precis den funktionen jag har letat efter eftersom Nexa-dimmrarna tyvärr inte är absolutstyrda. Egentligen skulle dom ju kunna varit det. Protokollet verkar ha plats för 4 styrbitar och det skulle ju bli 16 nivåer. Räcker ju alldeles utmärkt i dom flesta fall.