From 63e4147cf13da6508817fbdefb3096c7bd9f772d Mon Sep 17 00:00:00 2001 From: Peter Hinch Date: Sun, 15 Mar 2020 18:43:35 +0000 Subject: [PATCH] Doc improvements. Add acquire script. --- README.md | 12 ++--- RECEIVER.md | 44 ++++++++++++------ TRANSMITTER.md | 13 ++++-- images/circuits.fzz | Bin 3603 -> 5098 bytes images/gate_mosfet.png | Bin 0 -> 29332 bytes ir_rx/__init__.py | 10 +++-- ir_rx/acquire.py | 99 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 154 insertions(+), 24 deletions(-) create mode 100644 images/gate_mosfet.png create mode 100644 ir_rx/acquire.py diff --git a/README.md b/README.md index 371615f..44318d5 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,14 @@ require `uasyncio` but are compatible with it, and are designed for standard firmware builds. The receiver is cross platform and has been tested on Pyboard, ESP8266 and -ESP32. The transmitter driver is compatible with Pyboard (1.x and D series) and -also (subject to limitations) with ESP32. For the transmitter a Pyboard is -recommended. +ESP32. -The transmitter is documented [here](./TRANSMITTER.md) and the receiver is -[here](./RECEIVER.md). +#### [Receiver docs](./RECEIVER.md) + +The transmitter driver is compatible with Pyboard (1.x and D series) and ESP32. +ESP8266 is unsupported; it seems incapable of generating the required signals. + +#### [Transmitter docs](./TRANSMITTER.md) # 1. IR communication diff --git a/RECEIVER.md b/RECEIVER.md index edd27dc..12d9577 100644 --- a/RECEIVER.md +++ b/RECEIVER.md @@ -21,26 +21,43 @@ On the WeMos D1 Mini the equivalent pin is D7. A remote using the NEC protocol is [this one](https://www.adafruit.com/products/389). -# 2. Installation and demo script +# 2. Installation and demo scripts The receiver is a Python package. This minimises RAM usage: applications only -import the device driver for the protocol in use. - +import the device driver for the protocol in use. Clone the repository to the +current directory of your PC with: +```bash +$ git clone https://github.com/peterhinch/micropython_ir +``` Copy the following to the target filesystem: 1. `ir_rx` Directory and contents. There are no dependencies. -The demo can be used to characterise IR remotes. It displays the codes returned -by each button. This can aid in the design of receiver applications. The demo -prints "running" every 5 seconds and reports any data received from the remote. +## 2.1 Test scripts +The demo can be used to characterise IR remotes where the protocol is known. It +displays the codes returned by each button. This can aid in the design of +receiver applications. The demo prints "running" every 5 seconds and reports +any data received from the remote. ```python from ir_rx.test import test ``` Instructions will be displayed at the REPL. +If the protocol in use is unknown, there are two options: trial and error with +the above script or run the following: +```python +from ir_rx.acquire import test +test() +``` +This script is under development. + +It waits for a single burst from the remote and prints the timing of the pulses +followed by its best guess at the protocol. It correctly identifies supported +protocols, but can wrongly identify some unsupported proprietary protocols. + # 3. The driver This implements a class for each supported protocol. Each class is subclassed @@ -92,13 +109,14 @@ The user callback takes the following args: Bound variable: 1. `verbose=False` If `True` emits debug output. -Method: - 1. `error_function` Arg: a function taking a single `int` arg. If this is - specified it will be called if an error occurs. The value corresponds to the - error code (see below). Typical usage might be to provide some user feedback - of incorrect reception although beware of occasional triggers by external - events. In my testing the TSOP4838 produces 200µs pulses on occasion for no - obvious reason. See [section 4](./RECEIVER.md#4-errors). +Methods: + 1. `error_function` Arg: a function taking a single `int` arg. If specified + the function will be called if an error occurs. The arg value corresponds to + the error code. Typical usage might be to provide some user feedback of + incorrect reception although beware of occasional triggers by external events. + In my testing the TSOP4838 produces 200µs pulses on occasion for no obvious + reason. See [section 4](./RECEIVER.md#4-errors). + 2. `close` No args. Shuts down the pin and timer interrupts. A function is provided to print errors in human readable form. This may be invoked as follows: diff --git a/TRANSMITTER.md b/TRANSMITTER.md index 24cd244..c29a0dd 100644 --- a/TRANSMITTER.md +++ b/TRANSMITTER.md @@ -37,10 +37,13 @@ which is the driver default. If using a circuit where "off" is required to be The ESP32 RMT device does not currently support the carrier option. A simple hardware gate is required to turn the IR LED on when both the carrier pin and -the RMT pin are high. A suitable circuit is below. +the RMT pin are high. A suitable circuit is below; the transistor type is not +critical. ![Image](images/gate.png) -The transistor type is not critical. +This simpler alternative uses MOSFETS, but the device type needs attention. The +chosen type has a low gate-source threshold voltage and low Rdson. +![Image](images/gate_mosfet.png) # 2. Dependencies and installation @@ -57,7 +60,11 @@ from [this repo](https://github.com/peterhinch/micropython-async). ## 2.2 Installation The transmitter is a Python package. This minimises RAM usage: applications -only import the device driver for the protocol in use. +only import the device driver for the protocol in use. Clone the repository to +the current directory of your PC with: +```bash +$ git clone https://github.com/peterhinch/micropython_ir +``` Copy the following to the target filesystem: 1. `ir_tx` Directory and contents. diff --git a/images/circuits.fzz b/images/circuits.fzz index ad48376633883df0873fd8ea95d6eae757485228..7ecee24c990016c6821d293cd215f0fc1567bb81 100644 GIT binary patch literal 5098 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 zU*mEU007fP0RRgC00000000310000000000V`*|@b!l{SE@paAO9ci1000010096w M0001+6951J05F-;;{X5v delta 3599 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 V$p8Qg0001!yAvq}#0>xd005jN@izbf diff --git a/images/gate_mosfet.png b/images/gate_mosfet.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e137c849f5df1b7e3af68f615a49824af3e6a5 GIT binary patch literal 29332 zcmaI81yogS*adh=X%J~aK)O>&QA8R6=|(!FyFrwYlx|Q$8Wg0YMFgZoq@`QwZsxh) zKl86yvu5UgOTXpKbKdjBe)it)d84Wj8JArL4k@Mjnc6`o6sMp}-!vUlP%!sxrF0CDSWHDMk%GyLGepE~~-~=|>TC z&(Ut;{lb>Aj4e4~tMrXxLUsFFevXz_RxOID zoFu}JDrT0JKhR^LW_CWWDoRu+c)a39pp|Z-YgGD7Bnz!;A2VTO_$eB3w?L}6!9B)x zKh`Kq1#XrRg^*zpRl(kmWmr-%8zUo>u8F`Hwy=RM$K5OWzw>J4|sZg&oGw$XyKh`CxnqTee zLq$nyzXx10_0lKhP~sy~qs#J-63xWLQA{q{_=Y&4bo-`~Zf<@%8evn~GTC%cP$2FUMB-Po`rBqa1LMhnWxF>dtO^w=1u zcQE?mwtjVa?tgyN>GXawu4=kg0Phwl=}579p?m^!L1AI!`T60$I{$MINg~Aa^P^2J z{aQRcyl==i^DFJI^rvv@?#+kM5>WCl{VrDT&k!10cSHOvRLKb=q=he+*YLf*y5!UH znvF@c7k}_THj0A&Y8qbtk;FkO?)A~QHK3)X#nj3uZ-|kJsrhszgMvdtOfBH2Z4Eqs zdV0EG37^+4*IQm+pMX^g3PMB?9xcUHMH^MtUHYHyE&CpCNk4fKp3&@k+~To0xze8j z2OReDYb_1ieqWlv>fpocGUL{k9`ngY&+Vn2gxmM+Snuo|9@-Co=+6nfvbmiptGX#i zX*pV^%cb{OPFeZr=qUTXy`Gm>{pFBj>*Z1Vs~bri+TR}`&p1{lZ+*Ja(^eM#$X!wyC>qnN@L=XO7!`DK7@xl+TbmvK%YD$vmMdIl+ycH~x6Rs34 z&j=}Y+vS?bc;q*8%g5ABbYe_I*jn81dVA!QA7i$Cr0(4#$aWg)zd0C*5l76=cjLbo zvFWXnwe!?_}xRGwvh+jki$5^ZTqWq-)b=1-}j_ZEpszJ>}zrl z$KcCVCQZj=Uj^1B%TlQae7K#d<)2AvkXi9^nbCW|g_=j&l6p{|RmLLe_vvTVC^cn8 z5qwrl}2`jwQx!%K>nbhYs|6*KY>+7~xTF|r!ib((V z3?&%fGE#qaHc^UhQlPt@U5(SAv~bTtN78Rs2@bGc`GmDFk(U>Ux+6ojyfO z{f0Rm16DAjd_0{6e;W0Y3(G&^NbUK8mu7od!M3tQ=#Z*#{UnJr#Df1fXWvcUM3=0A zkHH)Mzn=d;Kj__wg=%hvhS;G_?WZ6_My|XvnTreJ(VTF-4=Fl|l-gO`>Y7qae(y*I zhUD9Y$2PqBnm95MxJ=RloGhwQ`^vEXx0OhE%57ID`>0vuoZk!TS~o3cDn1npCX3`}=jDCvh>M->EqJ+NA4 zTwm6SQ^X1_)MAj{RA?v@^cq0jnHdQEI=4WKwYOxah@s_#t)byG#*S@O5vf3*uqE=M z_7^dYnfJ`8YIwKYs-7M9Jf@NOxqvmRWh}N&b=d@W5Zz{fwciI+nu0{K{oq( zd5v$kdhME8TCO~lQed1YR%b!f`yATp=}{qyG)g9GUTBwS6xZX>kds^SQsn05?w~@d zs0Mvqo)TYNIH_N^V>HsFRxT3=F$-= zYU+!{*oQJQGGyIH-=lBSh`M26V@uYM--zj9CTT;(P2+ zs#PxPw&pa~_A+p~s%m3rz5~ijINy^RhUMID-~+amf#};)accdYk>ocBs9CS3i=O4F zNSx+(o8NmeiXNn2=P*)Xm|-#Tj6qf@U9ed46{hdeMmt3=6!4b{1tmJ4a!=|~Qna0W z1gY>5I^|jjohGlFy;bTTl-k#jRsM;N&iJna#hi3bCMFDo?MTVtm~mkL_1QnPuqzE# z5{d_KYy=av_8Fz6FXZI9zlPxAV@gF@MsLOvqkr-{-Gg3c_D*#(T!8vvfI;CfTap68 z$<_76`rosX0rRdHnuixV9e)~J4Gj&U3(WkD9wq4yzok4@X?(p3C3mlvXCe9lBv{>*NhvBa()W1UlSL^Nffy;##KkHz&0wJ=Ctv;hm)$Z1@|fjWvBtHWA(dWv zt?TLl<$n+AE;LC&2NDznEcKTW+vwO>@`MS8&VQrj8QIwZe}A*_@Knaohy`38jzPEM z{|Xfh@7Bt1E>9 zWI)3Y1s<#o!9k@9+AM5t_E&90{~L=wYXa0UTB50VLHBgHxVZS9?eFgHZaE0O@bI18 zT@*y=NP22&(TMH8-^C0GJsUq>#55+aZEYFVIZWS;q{I3ejDZ`9f17!w8q(~&R9MUT zRwF{SHQ+LmoQK=E_5e<-`fvo&M8fo2`1)|+l*l~(5FufxL5Pfy>l zb;Z(NPkYYNh`8kIMvgKS8#-2rx}4$z&Sqfp8Tf_Avx`mLwW~&LCXy|b%9f_27W@7A z2f5(H6%oZA^L&ynod`?Hn52a)4y@Jg@A--8kA64&BG736wBn1~0Z8a9SCwjNre zztRM*5v=nDZZeARrwp@AM4EeSYgHj^V*ZXh45aL@45TeDub-|Bi?ucU{qGZgxroY_2?{IU(W&Yyy z>hergD}u47c60K_k_$&a+0V|T-jqti#@dZW&4sHe&n>sVzebWjxMz5Xd4B)6ix0l1#j3 zK%AUtJHV0u9eMGUN|5cn<&P1CuyoI)#~-wQ6clAyF4-0sL`o87KpJJNy-igWznVI2 zQIboDfd^!@#Vq$5F?T&S7R00Cx5Y_&Wfun7tEHHj;}XO~L~paw*w}+tPtne=>V3Cc zA|qD{x3wcWk1KVa6~Fz&d7IpGVRz9jN#WkcW?dM;9bvDXw^4mc*{h8n(R#vxMs*b` zb`3Mum){-#jd3h98LAUeGl#YEsm;ZpVt`SOLDp(XSpGe4 zY8hEXa{Q|#(*x$nL~1Xi?g631)S%e#a72*jjCWyp2XlhciIZm#n%Q?OHnx!1uFlQ} zLp>q5A+fb~6MN0aGq=#&t!uw$iJ~E<>Kw@lVeBA8C})eaIgC~qo=5Vu5M7hWHo??l zmP6YA@f5R~4r>8bhcD;0kOQL4bJpKVvDU1MAf7Q=Ca+$^|Lh=wlmjQ&>2%Kmabk8& z?;I#2gNfkOt;%o14upyWi&$-s#7Z3<4EOKf7ZEvy!nD7)SEBkJwg02w)7GoAf4Jn_ zB7UGpfh{>XIb0p?|3*>TI=a%B4Ah$(Wh2%lh`vGN@I6@j$>z;zcP_HX%W7=jUPJxe z&6KT3jbgRVE7eDjg6xL_GF3jKbr1Fu7Oh3*xpfN+!w-jthrfRPny2-`1v+!c-KfQmS#?$7R^$wF@s;4PKV0haDLi8A(b?GA+T-KL!_i zo0#O;^``9hhWg|~7Hw7%fU(&Rd~53`V4D57vr|@9CgQsC*=BeJxC8_up$8oS;K=58 z(GVal<@o&ON=q%RM#De+jcv`iETf$3h{bGnR{kj25)K#p($&X_F z$l3YmpU}dqxWj*AJl?sAS)%TEm{LGEOifD0=bxa(x$tz3hW>N=@|E`Z@Q_sOGz4JS zpGHr|<2w&fp0@>|kaB2!zKT9^3;JM_rUbEBJzS`A{XniKOU!d1ZXGiwAu9_XaVI;w z$YY63Jm6y7T99n4$(8zeImK8sHR%?9<8XaLgJFZ;gl)|)L3{l>`iyW0CC~D{L(_0| zb?w}{Bj$mJ_}YPdq;Tmzc}CLZT)XlG0qwHM_qbv+tnL11XE`si`IHBB{Aa&~f}QKBJFt;JdKunE9Tettd< zDSQ2wF92@5fiXcmieG{uV||eii4bq&;^r3@AqEWrFT8#G z7J{67&5?X1@cMlAExpv;yLbQm`9sEI1YdkVFz|ZS9RovB*zd&2Jd8j^CCqH^dYSK3 zF@@XP*H_5q7b6ePw(gBpl)1v302e=2BO>&eMYU^YF0Ov-+LeFN&}RiN8R04J9^lI6@CzWI568jZ~jUL-Gh8Gzoss9t2_l1PC|0Fo_4)?W|2zBs=4AQf( zu+Y=Dw_w#ieq*+G)LExj4o8C55zf|c>1u1s-sP-f8`r+GGcUEfohKWM+GZShnN%p0 z;xzPZ^V+5+Qq2)yq_Z0N1Wa$jeoTMgqt|$Dj6bs*rxC}`o3O1_zzNyJ&LpYY!&7L_rF=A*r=9kr;N^^ZihU^<8;k2NAnjq)>fefRT~ z=4W{_OoH3MfN^)>`<^03u4qkRqTF8{41__3fq~)Gt5#=D!Fe_7wi7{$3RixV?+heP`#wjj^|XS_4~6IzmIp9YuaMnROUxwcT@Crj;ZD zTq_0v8pj|TLoK4_XHn(Pa|M$cO(Dv@`uIYZj@s^?8__Iwpn|a{Xa{P~U zf!>SE?6prg0}PH^M#1&o8;SRU;X--jM-YoI24tU_q^j!ApYNq|B7bjYc#?K$BD@a9 zjK@DB8PJ)S<~5$w^s{#=gIi2;hMB(F=FHU(ue>Jo9oZ1*LG1QZqm{<3_1a=h)VI98 z(F6B28Rw>zUaJ~!z{*9!h1IsJHhadJAQDIbJQ&;LWBHOmt%zDy#s*bAR=t6^VDw&{ z-SXHyE1|(==vzX#WMyabVPS;BKJNb%;=f(J3cFy}VmH7)y4vk}_Yy6__mezY(CF6I zw6QN26UU3=Pi6`sx%FS49B(zxA4fC24rc5jrg@Qr+To%Vk-Xx-uH~p_T26=cT%_31 zKXJ+7hcoiWBOl!G=4+h}30!%(Dj7U3IhSL;ASiy#c#BPBCpe!Pku60~$xAX@sdqT# z_zz#k%yfYX<@xrN)XSHek$o&29F0q!6y82wZ~4=@hAkH#1RT`A-X|e!K6~-w)?k5_ z99K7P#mtG!s?~>$mLc8Bu^Z^<;dk!ol^=QiNeeyfP?XEb%v2hduJihvpML?YH8C-| z_Snyv=4ks#k}(o=42*_)lJgi7zdYBMwU;3+LzLUaS5jq$jiZ*b7J^i*x;uww?yY1t zUs#E$sSPevD(`g;3*2~==Zues_xh)*Jk7(Uf*`0|q+Z$NS-Ya?-)R7!)gDJ#9 z?Svy#l<7Lh>vh*%DC^(4FFf0_F9Jh=8fa{2Xx<+XgCbF(Tm69!w1sdJ7)h6-FD@MxiUuYMedO1Z-6f)c62m&}z5hvAHOGoAjC4LU!HA0T~#U}YN9@FB?m{I|b# z?l0Ha?eZ9NbKYkz@rk(}uhMdDjQ)pL>;iDgM2&fiiGgXll|qRGJD-GHAt5BbS5B`- z9t)$_DUx}UZXdwb|^KtZDO=Iv^?c0R$4|CkIS`u>x-xF4HO#|zm-4E)RaHUT=p`8 zM3Bz~=8=7g$$Madm1cqD<;y1_IEY8AN!G&pT90ZN2JWUCv1z_jea?%NR{rla?Gs|* z6asH~D0q*F(Bm07G)qWs-ZXK16PJ;3{;#rC!fS_4P|$7d=Xuf9jrqqzzizauVp2P0MJvZSMwKYCNy9a6(WK(Dy+u+pHNz$_xG@ za@^Zc0a4^r-b!$A;3E9|{ZZa&yKQ?L`#0E*uKH6CR32Umii)3L-0!!L@ebrdMzm_A52^?oc zD_}PGj@dd#+V41!UN?+yV{6MkZKtW7Mi76T)U1BAGYQM zoW03qg^_e)>KM?aO9K*|19OJFH0p%}p}26#@T%=5_|N-M&@h2KYcqe3cn2RZ*Q@!8 z{5raBSKBGqLuT1u%anbHV8KD%QiXQ8GoY7`Y&|l$58blcIhTV` zgJ#TYenq(r>P9%X_(Wz``|WCdb5SXmii{Rk-ubPtm&x=-ZC*qXb^Uo<P?*b&MKzA0Mk^an8GUk=Dxf5AZ{?-Kq(3$WCM~E zmbb95aFf0%x~z;-k_c)lj+OMVn~O_TWln2YX(XId@-ovX4k{zi{MoNo%QEvHC}M@o zQB0i5?23v+0|RQUr9eOyaX+<8&E>fWx3(2=eq5e_OJ=?*g_0Jov|>-Y0-sNUv;u)R zkNN8D%xm!utU_hVx~{78qubll`i&k?i|tX`#>PCqzQzWPlY37}$l*^Bthu>)zJ2VF zU30b@hoB${V#($72CZM4^PdEqykSTj<+1`AF%Lni=vtM64<~$Lrb0eDvsRrC=m1mhbl`yb1{bB=l%SY_d@mON0W}2 zI}g$`GsSIx7r_hx@L_gp>Kx+rC}+IdN~PMeA4jE-R`{KX?Y{H1 zyx3pE!+>5g;^X7v;`lr^bevn23jt<6gZBa45fBg^KbYdiemX(Sof zNBgc?8t-R2;#dpCLjRW+An@v<0mxTK0T!r}^It>Wzke_0vC-Y%54tMyN9=&)UoKEg z!6dw+H2m400LIY6gT1N;&jS~ug(?gha>xDwm1fDGmM-MTz2!Jkk~Cr0;J9Q{=aApM&1Mc6f$~PlZQ&<<^cSb@H^q{ zt%CS~>hDo$)QnW{9eH2evt=8!Xl`oiV@_y3L1`NvR^KR!^xR%pi|;YtJ2*fO`uX!` zhL9s!_bLqAAWDGt@6`-S%0802wXMO##EhZfGli0OH1PA+?*4x7j~@%(MsBr8zFKT& zfyN8uDJLgh#M1KeCr%EJjq`(b0f#^JO-J0IuKbQ#Pu^%MKPNg7~zw2Fw0*Sc;Mn z+h97qT00TnEo~tO#s})ma0HyZjUQZ7iiBpopy}QQZpF>jRlnZpy_fagQV)xDUq3d^stZ=p+$f3~T9{63Y}x3Rgtgp59QyPJbTU*>%j|YvK?R+K9))+K=v9ZJN8eZWhYUmv>tovL}_G7c)Q@G}&PV7lAeeY5aGra(iV3(sXOKH770YO&pu%+%4fJ z#2}3MUXS0pecKn%P^gLCXKOy-42_z7M#^+=y?OFOmsBB?DLTQ)kFmgxJFuK zIxw{n1_lP=5dccr-x1Gw`D5^5>%`NuzG{2YujrI;r1p=RhPH850 zkLb32D)=^~z+KSEKjsr1J`Aus8-_9nV=`N1&~Ab#Zs`G=D_O!;6TUI9H+n3yy~3;yM$T^Uz!r+_@5?=f9+`Jz}kUVCKQj7n1<%E zvTzrPW*f~dEH)>qS?=FInrnYWB7M((^rCw3!@(8}4KZ?$=vVGQGZi>@q*X&~To4fv?W_$kM9Uz_R&X65SFje7dG`7D6JR#>I*@G!!U04! zhpAdFXuS9C)o525L7;SXCyIO|3>6RY-e1WQab*@0^M$H}f`TGoHGoGz;PCTZJFwA} zMhy#d8=S~Fj}nkL&=KUfZY89pdGE}%!zy1L46Bsu->allGXp#fOJku+miHR6gjAuR z3iJ+uoN`Z}KJYs@X_I_Ka7TQ+#org$5g<-B$3JzLAAev$esg4rRQ%1G(JKR&d+-C$ z`T>)!!}-880i574bl#o>mW+PkP?#=%&;ZWK20*(t-3Xp5H85}iTIPZ2d37L*B25hg zObTl76*v3;E-WmV^Xo!Ygk+e2uVdFNdF}-0J5848^|x=|qBH6?&KF~$C;`{%zBzf1 znVFfL{YOU!+9EQ~#W{Q7XVmO^z@9Z{{K*u08yRQnY=xm%l0wM;WUw>75_D^*_Aaij zQc_a0KL5%gh11`gZ0X?-WJ<&3dyVAL{*IJVcY!xcDOCy@Tez z)k1@=;_dAXbRe*=mer@Ab0Q(&R8d@@OO?2>N>L)w9ZUj!b^1!RO_I%@B&_L{Z0Si= zZfUu?sB&z#xY*Jybd4eo$-DMR`bBk?h?QUE>VjE{q~AqcJ}95sI$85a7Ed^xc*6&k zrw#MRPZ95i*8z9AFP!Y&Vu`svS&TjOYSFH-YdVvBe4=V4 zMRG#G)AiM79OjHY`|%}0gZnON`y(04*~B;^o8zx#(-*C^;wLF%m~@G;Ry!oCIlFcR zIpjC-x`uwOctwcFJrnErB>q;-<()3lM}=|oHOtuV_5<#UiZ~iEX^#zbgikZKO-E>% z)C~(vDP>FMUT4l;(L#?<3+(vB9>!urQ&zhXeZBJMHpwK9)DFqKIm2B}IX9KwOo3Y?U*oVleeHtyJ{>iixT9(Nlq(M*W zz3S%|V+05=5kl=T5N?M=V0oIZ@w~9H@m&8^nBRR11=XZSQS?w?w4cbx5Ks%hT|NE% z`!|rNw8Bnv=b9Xzn^Dj<1E;^Z^GWXIBvZI>oDI6p%6geaeM$)W0P#tS!hcQfnxQLdMZFBugtMB9%FFmOz3 z^!E1l5N-Ya({J|MU;OnV*z?Pis+=B4<7C7Jt_I(-G|94{UR6!7!$rK;Re7~-x2gTf z&0nH|q6rv?{Cd@N&O`$lJtpKkdY!1d_SJq@2U z;_#jV@s8rdBYy$?;zWSkv#8~Tb+2lM?jTtrhRzMmrVlO+`L^$cbZwH8!01*$VKhfM zaQe63C9~&i;`4u;#~z;UA6>i}Ux3~3KkI>>jm#GqBNM$FUN9boi`P)G*=qk-CVpTg z{m>g?5fS`KyA`WR{B!mlUGE0|q#x4%{w{3kRZZTrWkM7sMWD_WsdalAMcfEV2U`>l zfy=@Ziev$O8^ZF)Z^;vave zC2yLN>uMiL5V)vJRE-6TJif7Ep^861K_s%PicNIBW3@ey&HFV>3toz7N&(DQXSwZZ z)!n@eVq)jOG2nH8M+OG5EzsLqJh!v8N~fE=t7Bsczu$lgPiy+$W8?UV$J)o|?Lzp* zm9hWzx7XnCh`BAa)icc?@8jcxBo%;OzDh!sBX(o~dR!zIL>CZHd75U;-}4Id;9uxU z|F0Kur-dd?0Y=LCjxcpKH9X8$VCYR^*My^4U0pr49c1U?;t~@R6BHDbkT7CSxM%YV zT_0ORY(X59fmCQAz;odowaB@^ls)UW-(M=qm;T`vF)V}JpOJ@Y>195R~ zqb9713a=5>&2E8&oSa$EJV34l_e^Rk1wh8B_pstzMolLp5^)}`uIj}ah@YR#WD!5t z-N2OdTyP;os)k{(4|Hq5s?dl!ffu$B#28y;BZ<%s2nF*}Z7b5sgm{}8PF~UXGLNe= z8{z=b216{aBC>8Rhe7%SkU*@Bl#Rk}VUh6Z;T#DtB|(|QyHs1Z7xWCwRE& zk&E!SVq3g5s4Mx_>*+E-97^B*PNoHu?*N%&E614VioOD0rdD2Zu7?p3m~($D^RH)D zixcW$Yn3A&RsYW`h_5rQwX(5WFuEEwTucEdCXGv^L$r-ZTLezxh$vRu^S1R>O1=&;^;5!43DJ@b93 z>bKX!0`sm2Oa>pKTOqXTU&mgk*O@c&h!@Z;P)0~|Q-|et{1dKhUMU&2Zw$E1>z319 zl$o>RO6ir0Pjr(;m-I41(&@ydLMlO@hrJY7cUmq-hU=Xd!D^4v26XGJ?{>3#q4N5n zk0gWcoT>{P!t4`#8hCwqOu$^L!-)imv&XngKs+JcmEe(NX%P}xHUdBU%*L%~ zcaRika}|=-Hk$n#(fREhCfXHx0sdMR1;6LFQ9+I;G+K+)zNWV=4nRj&v;I_ z=0IeDW2_W>0j_LAE&k{62?-n;MXJEVfp3$n)*GHWg28lqwzX2N7%X8(&v4;bZmT&k z&0Zi$q8@J!JdJgJ3zRb$fbs5#pFmB6&(v(j#m+D%K{*oy?|(e>a)18U?(PRmA$*z z6`2uC2X0WP#=vliIh1Fmq;MlkGZPjrYIW`uS)5R2zaSNw7VXeb7d%!syk)0U8OR&?xLOdNN2nn|w&+A%L zs91t7W4Zvk;hO~z*<<{fb-jT!eKIu*vd%bdI-gmnzZQR*9rUu=yoZ+u>e#cl$;d1f z)8gZasi@ZX)~T@_fqI6^2$aGsc%$O8vmK_Y zp&G)(j2(;|WI@HT1-C~e8IJ^Q&f1gasE7#Epa;H3;kK*wcOT!pbqfsvBo=$1?L+Uq zCGf{+uqP=L5IZJ*lVMYFG}ResxEp?X3h<_7SLQ`99q=iZfr4PEu+Y6RlI?h+O-jrA z9DxWwHpN&2vp1OjwaU{sZIjD9b}e*F539Fhk!Jiy1E-h*{THrZb2)n88@@gLRA*di z^dNG%M>EexFVlw_%HtNFZc$Qcz{l;(D$a9|+0bA?Zv4oem~RUMH^W z(Z&SvZ|)gX7@beqywjAvPxXu@`hM*QQ@+kq+oE)sCB+LRFF6971_~R1M@_tXf1h>R z*q9gxuz06%KSR5LUt-vJB(~kOXdp3I;(>rn!$p7+(ea`A?g)tE%JJp^SA@56_+6-1 z|NSdfD~3TLLj4>>a}peBxKMTvb#nanuo0X(AKR`N7RHyLFMfMkope7P*TWDz{HCd~ zZEGFugP#ZKKnla7`~^y@UX5+iPCIz!Aoi3q?w5lpiz?c3v$Ay{lg|u*Dg?p7;i3CZ zA6WM)4H|&s*qeOO+0uOiWG@_uySw`(=r0N}sNXuV({#y_EttHBKT)gvFrQOLnejsV z^C$bf6ZR8Kfi)^UKK|=|ll^P?i&u15Z<1pXPEf0%?%6}+^`{#n=Ae+@0V6y3fOL!1 z3Q|-_f%c~%C9Q#D0tgVn-C1^c%RSot>S)Q8jlHR_N74n4|&} z?lD)vYl4=(*gO5mp-MF-UqGKN>G8@to-7^dG7__#)A&wB zegS?7iqrX}!R&9x<@AoYj{4-g)nnRkxm{n|W(T+nzLDEBYRI z&1f4BWE>xQa%jKlsn2amG)aw>i9J0@=vi2K{U+h+#B3WVTjg(Ae}6IkXs75u_krzj zR1YjU*|cH)n^0gg=Z|OPHdYq*TT=}PxH@dT67|}7^a`_*$M{ojaAhDiJ(JpSYM4#R z=;ayp#XQD5u{2Y|mk%}(0Szw7%C!{9UsoAIf8Tl4PC+^{Qri%C-9jAdj`DnM%JBv! z`uFc!I(wTg87bMDh4aM_O}qeXTs7))0*v~rE;24Lm7w(uEihGE4tkIB@^V_exAqmd zpS*|?lsoYigWS+ZpxUJ+yLAVO5)j6l!*zi$>hx(%n!o>+M;1Z$@Pv2sCPJfxT9qzG zAqfpJCuy608Bm=>j4nx^qFX)+wXb;O?@LGgPfRd*AP}^z5l6JUN4sc22M2D>g(0Rm z=x-P6>(vVpbev7u45Ahy19k4MZ{F9buhh@WyeT zS(+^WNP3vTzr5|}vlsZ-?;>h_IGNMPZLaMKtekb2gcVxllj;JAarv7p#_{7Qz%hW7 z)tO3MRZMYeCp!8FzjAhE#e+Mzx7lU+SmDZ(^Lm zh-evsy^d$4+ShjXGqQ@EuDNr^8A*!*0?9Lp0#RO!mfUl=K#%O)>s-y5s3PhxJvZ?1 zxR3Di@geK}1{N9wV9*HhFzEQ^R#t=*yg$3Tx;#F1myzIvz>XkgWr8keX|fmpM!DE} zdJG%gOKGV78nEKfdH(#PU9M4IL_$!znLAaiu&c5XO!r5z;ReFJ!?^ldhCE63`SUsO zg2r#pkZngtc1P2J+$M)lo)nz4yU-=|A|%}PdEy?+0^3Ew-O7<-`>BrIrpCtGh>v)i za_unchBn;`rwfn1ErhAzQ|0h2R}FrPQ64Ygg=%B1J=p#A^d^Col*rkG$k|6y!r(wP zbuFX9D%QL!L4nc6K{_xi!-v;}=C-pJq*eYdRj30%7*ruMMtKr$Hr+K*TSG%=aaL2* z0+t7Q+*SQ0o>{~li97TfO-V((hkB%rX(5j!SVo7?klB?F2DzSNt&o@!xq>cn;-<*0PQ+um+Xjux~aaA1zdsF7HF(lO^x zO9|6Q!GNBg&|}U=`RDSob0BV09bnxpmZ&jn!ANp07u9@DS(i-J#|tTLv)MU0j{KCQ zI3fD)Gn8m)bAYW7A9*pfIQ#vBLV+6We2e}LgE{f2<4yGW`7#DuEiEnR#lyqHW99nC z-)}pTOtegVFlmC#xp3|7fKmyg5fJ{G8-uxe_~m-oloPO*P+Qb7cVL*a%Xw}U&Gs;| z-Uu8gBA#2+($4^}>sFcfK1imiCWKK%J zw65#t;-uQzW8gW#hb>EeseECvout~!eU`5CcM(DQ&pMb`lr!tW(hFiX)qOi_V{Q0e z>1TKyB&qD`23n$7+@hkQ4<7~s&<6|>U?d$NzrWOZ(-4&0F6GLx$XEL+Sqn#%Ief|B zwn3L9Nj=gyk?9m6^n2A#L`v!oybA^{S@@uGjsp16nwy)q|1|8+NxrExQ7uNNrEMQ0 zXS}%O=Z}#?&g6d1W-S$pCod-l&G9>Qv2QU&-%?ZnHH<#zMH-5B-os2FeD9tnHE*EE z0l+qBGhk^rIqll+T)l^}vP4qhRZFG6bU9Er8-R%MX65I|Ud6|J6&b1cl2!t) z4h@Yz)D1Akn*z!j{L}>dhPk=9Uuu>h+CT!pjgkTr5=xM;RUZ1C2R<5e*l$m6?~1RI zUg1kW8yXq{qz`-UP62*X<1@)ejD%R|zF}$OReE{+s6`JHAaWj~i?yM-v;f)v%L|YP zOw@xzg(PvmMyL6&ppP~i1wuSP)TH(?ziOwu>fiSR!4V8Mr72q6!F0*s)JW(d^Sc~b z?25%LQcf%qZnKPC!!pp>gl$RRzJEVEKcC`3XQeNNUA>Y-I7=N>8}B4vL0>$Y@!fti zsM?!7iSiC4^_}B9<=e2~5f~tVn!_Zn`!;|pvW_wq7+H4Pul7S0>%m2F4FY_gOmw=K zXT>6|I8ebdGNFx)jhEuKEIp2#I?p!Au}IQl>9A=1b|mfW>>yfTE5(h+3%7A2{od`lSdQh3 zd#%mS&o3-gdGA~9670Z6%7v)2c$V>SbxEvXozLd-TFMfG`$(|eC5_zOxVJ%-rlj?J zWutzV7Of559(n!+01@gV*iHin5wJJ=t+Vq@^$T!eRM|~b0k`FR_PWz_;){E!PBMUJ zg#`oA>WR#poIt=|YGNugp$Y|h=l{M~opl31<(?SIwdfr%%-uLnG}u|?Z(M<~_d1;- zA!qyFDoc!3TkGmC$QS~|#+U>MODG5`L2FgI)z1e?;1EkwI)d%3UuS){{)iyLqoO{) z312-Gn)SPtEgUJHW+*Vf_yz&#BmFG#R!Sa8f5q<6(beVg(~eMl*a_GQ`w@#ZM6;B+ zQ(#>F8And2l*Vtd@ESWuIXxflZh)Z=G3qU!H#@L*zTJw}24+v(z7V3@LeB9$NgOF= zrUAFbJjx!w-#Iww`|*R=caK3P3Yg5QgT`!fe=cBIKI?IHxYX8>h)Rsf-938o711`` zKRw)A4HRSL$H9g9c|Nnz%puwUC*WvM!)Aa?0ia6&=hvIe1yU#6g8`ZBDDQSQ4?Yas#v`O#$n)r~m>blqJs@bo$)B2)We9@@Y@8u+u!=ATL2;8o?4ruD zKTp;MRv+o^whwtF2M)d4g4WL;PO=P$a*h|;j`{&S4QVvFFLALW<(&UH{CQ8#>wn{) z7C{L_nl~&hKlGTF0E~vyfjb~*KR0qJUJj!TcvM&th(C5nTW@k%8Di)L>E*T59S1QF z@~$ei_KhHzV@WA2mb|adlQ?;%##BC~VmKDgw+z`0%-6)}-P`)?$s~Ux{q$ncWE=)|1QiK-SHz7ZN2WI9TY6 z#D$IbBkn(gTA2KXU;xeb;fEmv*d5r8A^bO=gqW066DZ!hg(Alr69SBk`8#G9@r>XQ zJclDi-mxO5Ss@UJAt*P>sZ6I#zSNjq=9CUZ1Y%$vOV25eT^Qw?0hc(?DD)!)#D zz+&A}hYE-szvKE{awNb9v9A7A2&_2)4+7uIlyiC;l&cjeFh!lm++D>V{J6`+n1~}*MUYQhpGEE|Lm~EK`YAOB0!!v7=r|Pr;C-mRZ!I4P)b>Gj; z?EoMUA}ALcj!c%gH*rU>y_nj4q7({|%U!tfhuG!B7~GrU>OWo&Y7gxHy}?z)N!A;F zlc7wjw7&G zt9imCjx|#Uo8V!W@4t=HYW|vyX~G#0kst1$+yUCI?&qV@+a(s2y(LFjKN6Nr9{rF} z$+o1fGI~duY^lSBCL-7okB&_z*YncCJKg!JU94;0RFYBCEwq4A>vOxS=nW$}d7Jk9 zi9)!43NI0&L<^rivux+Gfv!y;WEmySXUeOv^DP-+{kiA3xlsEn#Md4@$#{P3c5|IA zZ$tGrBH;wy@wOO){Cb{zRu% zQJVUSq(&XDcTXkLJFD*{Y;V;})Ojm(j*sWh)nwVP7t-74*UA2>-I`bbk3mjZg(jQk zAPE^qyM$Nj-<3tnSCQA2ba?odS8NWya;#Pc)428ch{_; z@b%-Ztr8F34_g(sHkMSudc_*-nLJTy^k%v(_4k~>GK22)v771J?`cgg=}kt-?&W;F zU|gmG5PaQ-fyD055M*}=jI?~p2r5dj!a?6iy|sa1;?_G4Ww<*Ho%}CJm5~M84+b(I z;R<#r^hpw-N9(Z_SZH-y5NmgSq?RTA?^YQ9|2i)6))#xfOs+igb8Wt8H0KdGQyYAF zEsl}B3hHiwDyv+)9cVmoy8{rnR2XQZ@Zfqo!VMF^&HyaZzr!;~;*_N0dAe~hkWiLu zy%3~AX`7yIhGEEBEEWROfgURtIHrYJ+nO(61Ay&EQlc`LAdacDU#pufxww_I0}uSa zH{Sq>POaqq%K^(Hq3@}xTl6hwAYATFcz8P;c%cGp;Q%8)Ngd8K0LQjh_qOducT zhDNb>B7P<6IFwdRFNXiiYmSer07W>uZynV?MlI`GyY-q6tsv*Pm)tCnX~_P|9p_&P1eV zKsX`9q`_2*{&?4|+dYvE%h5BMq=ti(A9PNw^f+(`C-ye~xflOMigCVpMDAImp1k~F zW&zD!CYSCeBldvzfL%rXA*-=2F%cN(H$6#)JagNQLpo zh$KBp*kkU5HIWzZDL}}vW!hZV`ak;m?y#Es`0o>r zB5^k;8izDAq;VQrx?4h$wzkotDcaiWd7b&|t|DaYC}|_G{SpXhN?p8j^vePG16#AWNx4;X z+&0E_6f1W$0$=TSLFL83u-?D90dOzuKgyX7LNGKP4_HOEoYp=E?fickH#*I}v$Cl* zkKKKv^wjo(dq4gxYD~G#r2@WxMCydzdBIAzg~leaFj_-R=iDfV1vEF(q|t=u0Vik> zGczozo*Q!QEJwDo>b2K8Jg3?o%q26*-{7rRaw<3{@`%aps-afor~vYST3k1srWyxR zvKBWt6&eKS#RP1Ver^fn4+)L5`8Vah)jhk+%s2~5a`NgtcAiqbXtd+$u)y=V)xk0G{0G%HFH-flppj^db?cjxnQ9sJQ26Z= zKs?!J+i0|(ZJ5C~C(g+3vz<+cP@Sk{qY=rHC*JtjZa5={yZV|GH97 zS*?f@(|^dY6_Z)4d${+#C!Dsp!%J_;#xA9t>dDYDLp&cvugpZv#I`eZOLXplp}t_M zxSBYzw!pq}=cDd#_IlmrxE?H_U1oLP7lY`KWsz# zE@)3c^+_v$&ciN%Z*`7HlD#C?RDinp%83A z6CKa!iiLyW9}G>^VxJ#Y;o0-&b-f~$u&DO^z<8D*VMiLY(9&wwy&xY0BOyRmPDTIt z?(tUD5(f6P(?pf4)U6koDz;INGYa!dOJmqA2Ie-}@*L4#@@0EE!^Pc&s)rRd0u1kF z*W9T|ABd*$2&NyMn8=x2UxLOrg(7#j`;zHg%ezvs`(j;PUGHz(RaH;PJkmY36Vt=i z+Ysh4F*7GCI$f#iZSqc#JXQ2f_1VAf`sEpX^qL<`ic66UcLRFTPW?G%=mi)Gy??bgk8XqtHqrUs|>wMeeU9Yz}5@ zvl%$~j;C|!QKUxJX1)BKoDRi;mQmJQYt{v)qp!!Ab=YR8B@sRExn*8uy?^vtcBjx@ zWy7wypMrG-O+v=S#btrVChH;?m1&Z-%awD#Pk-6MtsE72A30^DO7|qQgY0hOYb3TS+5{esBA^H1xD|f15B|IW6k| zTZ9cQVcYhi>4i3JwWn6B_eC${cs_0m_nk+wM$pge*==;?-2ME#B(FbQNQs!lTx82zG@CoUpm$UGkjhSv z?{il%)(}1;T@H&eNzCb>^w9|KV3PH`WTjR|p@)EKOiT=5AgbFK!BY=nVMNt9mVkU~ zN8Ai1EMOpqWw)8ko^4Nl^=caCp#7@(85v`g*d-~)#=1HYwuc~7EP)H1$nkXFlf_|k z7*jH|#e&Ue)WX?g!AP^P+;4^|O*05;VsMA1Qz8Y~|C5IYb3jM(=^gH9%WQNo4QQBg zhe1oq#>dC^1^gufc^VoTwr<%17C{b9GE9ftBZ;co*7}Cr2>T-ppq@c30xOql%%DI+ zGo%tQFn9?&K+cX26LJ+~$;I_LMudb=aW#rSj{#oxYs`GQdkb5C5;2R^{~Z<=0@$&Ggii%M@Oy~zRX>0Z$HNM^31J#km%$U?tv?d|CSBGhrlxii zG8R74$jKcfaNhc>{daqyty4X8Q5iYIm`75j813t%EbHs*3CMJiY(DJ* z^9cMp*>g5PYYgH(BWTSj+uO&7N=aQkWbTwUQ>QE!;RHWFl@iJFFLR*a^2dj={rWmO zI@;Plq`#oNh8~2OjlD9c<3jJGRkVis(MS#EdpgBR`}dZc|Ad zNKTMFNWVR-ra*Du`U6SvWscVectHsz+`R-q!qeiG%5 zRA!BM?|M$uoH?m(&x($AZzZQm5)%#g5UDIM@70$ckxQ7=eMlo#SZ3;n#kKhy0{I%Y zDJ5(BrFG{1$TSv@(U)r}5Rb??M^3;dE$fqxI3VF$yYRxR&*TP{r9E(BL+I4rDkFxBv+d-lxgwb_avFytQ=3_F_}1AD;n*S)jb={Lc>jYJD!jERFY|kLUpcbdPAkgX75&G z=_h}w%!nPZ?r1KcM;VkztY}qYb|YCDN;#EE2B$0?V1Ou8rdej>4>|7x@6?x#!QF~~ z&S@sfdf3K9={;X%tBjAz`4}a2z|!r{jx$!gFsSvq*@5C%CgtaEtg+lRezsz z$b$!Kql%lf1gtW@@yv9HH?K;@F{>Wu=SN9`Cxk(`iHec2K4@e;dcU>9*8{Q^MLkfj0FPB;@G=P~Zye{0cax*WI3cjAM?Wy<$`XlNj7{cwRS1kma( zLV*DC4n&Z<($W%@V|*d8advL;^kzRNdit3l9B$}5?^u3CK}RH7%ZqTFSs&kl__%J= zhh&aw+Q<-!QTCnxYHvNVsOac&4gYvLtf15hpheriJm&-y~vXPx7mx zK*p4d7xm5ackX>iO*Z4pD{3`-biMT7Y@OuPjBI66rm6O2o5F9@Y&#{(t#gaY6wU~a z-QBS}cg93H`hA=0uxCENdw{?Ad7r4YxTYqr;8SozvQwREKd4DPdENAOs@wWxdAAV_ z4>_o66ciMi&tRdXca0(5|b7{jYs@nhAfLFHGBzqRW&b$18Os)hHMtB7@ zbAAZkhb(g%_REnx>TCS>c&)-Z7d{<{AiTvw%}ac3*DXY_hH1mMJBU$27sc_{QV!DY zAhDi=ccS=95M9_qMhbK^f9kHSSK0yy_XiK?_y78tBuklax0@9J?@WrU^TC??8kAd<)OB=R>ZS-ccqk&1cA4Lu4z{C> zvAQOr=NbfWG$&fJz68%6zB8TT!p5IGgtUO23p9Y?taJJ7Si&Egl4YjNWJKy@JW5SX zJx^ZnJs7n)Q_HnlHWX`gp%)=LkP{&C(Q~p#-RZ>1lTN^TVLC9*krWno{t&ze+SStz z$DYf2oRF0*!@G*)`H`gLP-NRV4xjWSlv8k-8uLH}OT!)Xh~i~CgF$%ScO9>)SJ!z& zpX>ovBI}xiq=5*>Yp4EQ1d96Yh%FK?uCrR9#}M*tHr(9sRn@j?NzA#-r>=AE99^|A z{@FdgS{R5bJ@-&yi-H?_hi!2{>@kb4sJ>g2kU6t;q685sGg9L^OqSqUAa_r|>Ydz2ev5>%^;% z*N2!*=jZ1oVl~FU*N3J+iASYmZEYPRhRL096;U~Q;d0}i>X8){6^5i@;~a(}$B2gy zJzkSfT!%O=ApGVZMQ5^I1iBQ2%CxZ98ysIb8g*PmWCjWi2&JHY)Oo%L3g07~^O(Ah zsc8?aea4XNL9TQ3ip&!d=?w-D@PF_>et=B(c+OY**I27n4&|QEkHF>a5|oDq&&CFp z35Igef9qWn^wl`%)X1GeCa)X!3>C^kns)bK+;!+HIU!+X9=NSmoQp9?e~Jg|^~%6y|7 zNsw*`oIL5}X#NHnVgczRs z8njR0*B;;uLT2S7BO_TYy37zVwkWLH1NNUc=_4eemxB_jpvfu@9xJ=z)ul_lHTn*6 z9T_^xpZ?*>-f^eaqpEbkPk zz5UT`v@oTyPPE8wD~DWPTm2e};pV{I-6+A*;kwkirlvP5$EFk0pEE{2dNloE--V%J zGs#$u{QP|UEG5($vb`u?e+bpkGGY)_TpGAr+{xSN_3hGBw_}Mx)pZ0dfd}MJxao}# z*yazTGBA_agoH{c(-*HOIsR)K5f&B}5rIsqhan-Yzvr>moa~DBRH%Vzf<7M^4u9LupG=T;Nm;QlORy(%ik|HqP5t=lFv2l~2*k~`o#LKMsv#yz zkl@b(N9*`xIiI(XQb6a`%r9xel(vh?o!4kP!7Z)RysGD#oX4y)B23Qyv#T!iN{LN7 z3jq|t-^?iJEEJZk2ZxU9+Lfpg4#7(>94BAtcaJP|kZbiUQh4u2D8~L>8v4!Pp}zgL zXgU}5?VcXf%c;x9=Pv&4Iwi^-aDDV6eHa|en?KSYBv$&C`^Z(X%eVrkc=gI}-FO>I z9RILwazUqagQ_KSt{ri~_OX24z}lS$zI7GzA#qhF`Q=O+N^B46L=TM{nN}{FT{7*- z(&HaJLSHR?a_Ca^RdS2Od@Cu|M|k}ouFd(p012m&-GrJEx<%bLH)}$Xv9Z0#k^gLg zS+uN2`QjV@^}fq**7`2r8Xw;#F_O*GU~7B6F@`NK>$o<7Mw{KARraveK+?O_fNv%C zHF77LW8qQaJ$76pPAE%8vTd0mWqy(lmIX_-IgUB+d- z;kEP2286e@Emif1G$n10-kq=XJ+pRW@R((crY;O8Ti#;DLTPdh5Ca!CUJ(v9u zKPbIy5(Io5w7nO9^Y4gTX6-jCe0if~I;LS`ey#s`W|KloK4H2; zw{T^CBK2du!-&OAitJ2y*@U-Yayk3YT_F;;kxqD=Wy(< zkdP2+pC|Wsv5o2b?5#-)+n;Gs+H^~kzFI#*hU{-YVo{;K+SR|`xKHzW0sW4GMuNK{SvL(+k+(HS_m3De+(E?rY~M z9?ksObImoLKv^q*2`4l@LG6_dzoTvqJht zdgI~W1SQ{fkEOA2Dn@zDM+*}K8l<^4udc6vlFaqJQImb_hOeJrT$5F8NrJ2=;dYqJ zXhKWLSNl>K8DfjqBx8!>)ZoD8trZahalNsBYG%;f&2r;idK1QddW}YXn(LyC^8p_3m-pVk1KT1qf%B&G zi^7EIX-;_4DTX$$$?V@>tQHrirtF1feOU>JsHIbK@z=O?VH8T3jw9m+;~SyN%TIbM z68`=79>xh2gcYa<%*ua`2-)u22E*Ck*%4{A^Q}|NyhhQMr@u>nPCetG=rf?U^L@hi zA!$db!<*0K;a9aA!Jw84+zIlr$_sL=U|?*{8KBlp{{S#U8h zFle4NtaKSv+g<C-FZyp7U~ zjnBzKoS8ruY0#xxQ(Afk3seZL5nK$0O%_VZ#KjzUMA) zecmK6rYKnAc0D$A5-j4V*eYc{t3Ym5niKe8|za6Ta~~P0AexAPSZ^- zkf>W;0Ac{VAam<;blu@U?xUd{cQ3mjb*$_7Fc1VwqXh&Rc*v>(iHGcFvEjNDl7DfwzIx9Bz1quUC_uxzp-6Jv35_Lhr$k=huhpYy5APXG= z&P)%csy0CvCnX(1k9h>T>`vQaI5}42e@DyqPl}W{y;*+=Z;f(rnNC5y!MMo|sfnYP z4$xY#eyo{(DW>=A@?;@^e$4CCJ9Y%jHA#i@ihCX0e%BmP3FykP==wXBuRm*Dg2)w` zXU(U=$twnsnIc8lXR311vE|nC(h?-^22(GD=?mR|p#cD}ga5pbi%ZdadH}wUOjr`2 zGRPApQ-XyE-aqc`w_OVX3k*jAdc+A(^k2piiHUy9u}9j7gaPb@f;c}vzlDVb^{MH_ z#Q>joYqVHRE0EdZhIn_HTm_vn0UK-Z zxk0RwEty9c_#4~qn=sjFa79lMExHUhxA|mGDd(cuZ*&C28KfR_N?-Ko?S>Fuab+wO z!e)S4`tqXIpOZd(P(j;tLTo3ZlVFp;0LVwqFsIW`ZGG|bWplg?_KO3SmhB*)flWDr=P#m5IOq!qkA{q}0j(@dMbYu@gEpPvs$ z!uA#d#x-$WqvFT0u`&=+N+sXkG|!`=Y@Z-P+;Uc z8^m~bqvgP@iC!&=1+m-dDU&(+{DbA+!tAs+wSxq5>u zw>qH_`BtVO4)qx3{_Q(k!SSMvAz^m{}he~Jq+W#nlQNt{c?docX#1!bJjB# zcAR1>`(_pqg_9Ry;w{$!OXEv_u%z>hwe6o*%PT8okIH^?9wIQs@sqi-3;sm!t-MT` zN`AY_A32ix;ziN>YhpfEt_;Gq#mvF+&=l+$&vrA78MO~1s8W~nVQM@K&e-+Og_#WJ8izS*HXL~FtW6uUo><;zM zK*utt{5qNE?=k*W%;G4$#rjZfv398QNi>W;FE^SB>>=5^k?hZ(vtTmwY-?NaDj1+Z z^QU;BENxoMmmokjxH=C4r)P+U(2DbGF*#1H@Yj5Rf`}!ZEJ(1P)@)0ojN|WJ)}5C{ z*`NU3spR09s>+_9`tA*MWV7l*`az$u4|HVB=wSW9<#Voahw4SO-_CJN zSSp{$_DoFQt8}lkIp02pFWO@w+m)TH_GzBJ{7}fO<~8E(5Y9gSShoeXH3-sgN?)6XNeELNwDV)`v~5X zqtWI$B>wK8rLuVZi?p44lYU4GwzM;yyc6YdS-gzNEN=hOM-pwX@T983t1X*2aT&4 z-rpl_z~U{%Wn(Ou*RGRkc5GHw@Pcj$f0DC6vd{L0ps^z2u&!ybQmUtRBrdJ7y&AMA zg+WVHoRelDNQZY%vs=qwD(7hsI6q8Bvh1)=)A5s!p#z<&%Iz-ozU~2EX~As@t7&)N z^)vPV?`bQKzn?pG>K!JnCMz+*)20!C1j!dD1SB4tL_t7cFh)~F^jpY2L<1^ijP#L4 ztx(Ak22$W+AmD-JtV0+I;$-q$Q%=6)nP<}5@4m}-GC)m0d`!I8an)D&OQzS2v_)`MP zbaS<8vm8TNjy@TT5gr?&t=$SHi(-skTSG$J?F}s0hXh(4!Xf9VUcZfv#VX{`K}5HV z(%)rUOt`46J%cB0C{DlKI(8ZiEsgNqQl@iMN?T@-Aeu2O9@n(caIy+8G=vDwJ@b58 zYN<28x6W|&Q5ApR)|xQ)C(wGI3aC%XQ`@cvD_aYk-J2Z3%D*qAkLF>+rJdp~zw84) z?IQ^>KpP~k{h0}zhKuS6fo#5xEr#39=U=+U^hZGV^tF0^!AKq(4_WP_DH^u!)C~np zHFPTKuW3`X27b*&e+)F{xemIImYcmM*E>=G7uGN5_m*1Jj=ruMNrUwhi_6x5dMr?} zmh_LNeSBTH)Z@iCKKO>cRD=*-ug}b(uIp;V^7v0Ghdc#uH)7A(HW(qBI4LO!o7<_X zSN`TwFq_#a!$;Dx1|7PIZH5=y-xBm@^l3UDo}JY+eRq&SwuI9^<+}Kob%z#HO1G`e zwdPqOzxs!!ZQU& zUd3!^lNFj=JD70Ed2fs_Uc9}l;s|i}-T6xga<{RDZh0`^I(M98X^?F=gRV6K+VJdb zduRj!ZBfL1xkVIGG71(IsCa=E+aWtxGHwE0nx=+^N(nIiqvz38AsQa;+}#AH%6S&b zIVkQj(wsnUwZ@|}b|Y7#k5UE>DAQC6qhpp$*j0%r)MqpROL>9w?SfiHn=uIWrgmI* zXyG>hjmIXR(BxC1AprrQsX`PJlIx(=!gIe+nE;NY1YjGsC*wc|U#D?_^5wq)$YMTvQ-rNgyYIVK&;|~yOKlIn<7|pR`v)<7rr?Nx(f%2J zV#OOVr5(3f2$D-Sa|+VC2DFV=)cT$j*p-;Q2vtT*H635H&$)f2?1aV`$@-`LkRmW0 zu20)}~3HtUYuVW0Y^ zg|DOAK=XUj==^2#=xe$zY4)A2&qiXJ#0!qO4of?JxSJ|`#PLcM zhnaJCO6M<__OvXLi+Zk!kNJd7XoAyh4F0|yc|!k}6y=lIZGi@-iWvZhD(>#?i0&p( z>_J=#L@BB6<)Q;(R%?q@o2p)jf>CRPXEAzf>_2raEzfua!6!U@ z3NF{neLv3L?BJAtVRm0yT0)fPvFA5k0XM@fal^{-S4eB{t#L6lmSKI=9lj7 z5{#eC-wPLicTb@U#ZFc^iO=Y0Af9*t!5o9bSrUrq$(0=@cqST!E6h~fQ2bWf5VK=` SV;#?rB&e%uspKkO4g5bVqLlUk literal 0 HcmV?d00001 diff --git a/ir_rx/__init__.py b/ir_rx/__init__.py index 4b96524..0e7ad7f 100644 --- a/ir_rx/__init__.py +++ b/ir_rx/__init__.py @@ -32,6 +32,7 @@ class IR_RX(): BADADDR = -7 def __init__(self, pin, nedges, tblock, callback, *args): # Optional args for callback + self._pin = pin self._nedges = nedges self._tblock = tblock self.callback = callback @@ -41,10 +42,9 @@ class IR_RX(): self._times = array('i', (0 for _ in range(nedges + 1))) # +1 for overrun if platform == 'esp32' or platform == 'esp32_LoBo': # ESP32 Doesn't support hard IRQ - ei = pin.irq(handler = self._cb_pin, trigger = (Pin.IRQ_FALLING | Pin.IRQ_RISING)) + pin.irq(handler = self._cb_pin, trigger = (Pin.IRQ_FALLING | Pin.IRQ_RISING)) else: - ei = pin.irq(handler = self._cb_pin, trigger = (Pin.IRQ_FALLING | Pin.IRQ_RISING), hard = True) - self._eint = ei # Keep reference?? + pin.irq(handler = self._cb_pin, trigger = (Pin.IRQ_FALLING | Pin.IRQ_RISING), hard = True) self.edge = 0 self.tim = Timer(-1) # Sofware timer self.cb = self.decode @@ -68,3 +68,7 @@ class IR_RX(): def error_function(self, func): self._errf = func + + def close(self): + self._pin.irq(handler = None) + self.tim.deinit() diff --git a/ir_rx/acquire.py b/ir_rx/acquire.py new file mode 100644 index 0000000..7b492e0 --- /dev/null +++ b/ir_rx/acquire.py @@ -0,0 +1,99 @@ +# acquire.py Acquire a pulse train from an IR remote +# Supports NEC protocol. +# For a remote using NEC see https://www.adafruit.com/products/389 + +# Author: Peter Hinch +# Copyright Peter Hinch 2020 Released under the MIT license + +from machine import Pin, freq +from sys import platform + +from utime import sleep_ms, ticks_us, ticks_diff +from ir_rx import IR_RX + + +class IR_GET(IR_RX): + def __init__(self, pin, nedges=100, twait=100, display=True): + self.display = display + super().__init__(pin, nedges, twait, lambda *_ : None) + self.data = None + + def decode(self, _): + def near(v, target): + return target * 0.8 < v < target * 1.2 + nedges = self.edge + if nedges < 4: + return # Noise + burst = [] + duration = ticks_diff(self._times[0], self._times[nedges]) # 24892 for RC-5 22205 for RC-6 + for x in range(nedges - 1): + dt = ticks_diff(self._times[x + 1], self._times[x]) + if x > 0 and dt > 10000: # Reached gap between repeats + break + burst.append(dt) + + if self.display: + detected = False + for x, e in enumerate(burst): + print('{:03d} {:5d}'.format(x, e)) + print() + if burst[0] > 5000: + print('NEC') + detected = True + elif burst[0] > 2000: # Sony or Philips RC-6 + if burst[1] > 750: # Probably Philips + if min(burst) < 600: + print('Philips RC-6 mode 0') + detected = True + else: + lb = len(burst) + try: + nbits = {25:12, 31:15, 41:20}[len(burst)] + except IndexError: + pass + else: + detected = True + if detected: + print('Sony {}bit'.format(nbits)) + + elif burst[0] < 1200: + print('Philips RC-5') + detected = True + if not detected: + print('Unknown protocol') + + print() + self.data = burst + # Set up for new data burst. Run null callback + self.do_callback(0, 0, 0) + + def acquire(self): + while self.data is None: + sleep_ms(5) + self.close() + return self.data + +def test(): + # Define pin according to platform + if platform == 'pyboard': + pin = Pin('X3', Pin.IN) + elif platform == 'esp8266': + freq(160000000) + pin = Pin(13, Pin.IN) + elif platform == 'esp32' or platform == 'esp32_LoBo': + pin = Pin(23, Pin.IN) + irg = IR_GET(pin) + print('Waiting for IR data...') + irg.acquire() + +# RC Python Calculated +# NEC 66 66 66 +# Sony 12: 24 24 26 (2 hdr + 2*(7 data + 5 addr) RC issues another: detect 26ms gap +# Sony 15: 75 30 +# Sony 20 n/a 40 + +# Yamaha NEC +# Pi/Vista MCE RC6 mode 0 Din't receive +# Panasonic TV recorder RC6 mode 0 Didn't receive +# Virgin RC-5 Receive OK +# Samsung TV RC6 mode 0 Didn't receive -- 2.47.3