From 76456b778b61bec6c54d7b82a858228495b6ecc2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 11 Aug 2026 06:02:55 +0300 Subject: [PATCH] Publish official pre-built binaries Add qspi and opi psram binaries. Build binary for Flix2 board. Add config.h file for defining parameter defaults. Set appropriate pwm frequency for c3/s3 automatically using config.h. Remove pid parameters definitions, the may be set is config.h now. --- .github/workflows/build.yml | 6 +++++ .github/workflows/docs.yml | 33 +++++++++++++++++++++++++ Makefile | 2 +- docs/img/web-flasher.png | Bin 0 -> 66740 bytes docs/usage.md | 48 +++++++++++++++++++++++++++--------- flix/config.h | 27 ++++++++++++++++++++ flix/control.ino | 41 ++++++------------------------ flix/parameters.ino | 3 +++ flix/pid.h | 2 +- 9 files changed, 116 insertions(+), 46 deletions(-) create mode 100644 docs/img/web-flasher.png create mode 100644 flix/config.h diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 303e73c..4043a31 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,6 +22,12 @@ jobs: run: make BOARD=esp32:esp32:esp32c3 - name: Build firmware for ESP32-S3 run: make BOARD=esp32:esp32:esp32s3:CDCOnBoot=cdc + - name: Build firmware for ESP32-S3 with QSPI PSRAM + run: make BOARD=esp32:esp32:esp32s3:CDCOnBoot=cdc,PSRAM=enabled EXTRA=--output-dir=flix/build/esp32.esp32.esp32s3.qspi + - name: Build firmware for ESP32-S3 with OPI PSRAM + run: make BOARD=esp32:esp32:esp32s3:CDCOnBoot=cdc,PSRAM=opi EXTRA=--output-dir=flix/build/esp32.esp32.esp32s3.opi + - name: Build firmware for Flix2 + run: make BOARD=esp32:esp32:esp32s3:FlashSize=4M,CDCOnBoot=cdc,PSRAM=opi EXTRA='--build-property "compiler.cpp.extra_flags=-DFLIX2" --output-dir=flix/build/esp32.esp32.flix2' - name: Upload binaries uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 038e4ef..5d7fa59 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,6 +8,7 @@ on: permissions: contents: read + actions: read pages: write id-token: write @@ -30,6 +31,38 @@ jobs: run: cargo install mdbook --vers 0.4.43 --locked - name: Build book run: cd docs && mdbook build + - name: Wait for Build to complete + uses: lewagon/wait-on-check-action@v1.9.1 + with: + ref: ${{ github.sha }} + check-name: build_linux + repo-token: ${{ secrets.GITHUB_TOKEN }} + wait-interval: 30 + - name: Find firmware binaries + id: build_run + run: | + RUN_ID=$(gh api "repos/${{ github.repository }}/actions/workflows/build.yml/runs?head_sha=${{ github.sha }}&per_page=1" --jq '.workflow_runs[0].id') + echo "id=$RUN_ID" >> $GITHUB_OUTPUT + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Download firmware binaries + uses: actions/download-artifact@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.repository }} + run-id: ${{ steps.build_run.outputs.id }} + name: firmware-binary + path: docs/build + - name: Create shortcuts for firmware binaries + working-directory: docs/build + run: | + for FQBN in esp32.esp32.*; do + zip -r $FQBN.zip $FQBN + BOARD="${FQBN#esp32.esp32.}" + ln -s "$FQBN/flix.ino.merged.bin" "flix.$BOARD.merged.bin" + ln -s "$FQBN/flix.ino.bin" "flix.$BOARD.bin" + ln -s "$FQBN/flix.ino.bootloader.bin" "flix.$BOARD.bootloader.bin" + done - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: diff --git a/Makefile b/Makefile index 105d2f1..448ba1f 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ PORT := $(strip $(wildcard /dev/serial/by-id/usb-Silicon_Labs_CP21* /dev/serial/ export ARDUINO_NETWORK_CONNECTION_TIMEOUT := 1h build: .core .libs - arduino-cli compile --fqbn $(BOARD) --build-property "build.core_debug_level=1" flix + arduino-cli compile --fqbn $(BOARD) --build-property "build.core_debug_level=1" flix $(EXTRA) upload: build arduino-cli upload --fqbn $(BOARD) -p "$(PORT)" flix diff --git a/docs/img/web-flasher.png b/docs/img/web-flasher.png new file mode 100644 index 0000000000000000000000000000000000000000..56dbaca75451196fc7a9ab4984e50a78f0d657d8 GIT binary patch literal 66740 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 yhNe~ zjN!`(fDs?x@bDSRfq}vqDg zvqbU=O}3YBJ+SOXlPP*cn7lZ zZ8hHgf_u&)&!Bx4_NbbOzM6Fr?=L^?Ao@7XCGf@>g%KL3in)$wFCUZ{mHjEgvzTzq z5M%P~-FeIcQmj+`P~Oc*nwu!LA9fw(so>8shA&XEEQ-{9$O#jZ)k_$%?IB7Olf$cR?IR}#Wl<=D@pnztPQf(A%^bw2K{JT9UC?{HRb--CqQxl~D5zS9 z6IuY;s4I0Z79Dt{bx)kdpTT?h^_v^_&=hq`aTf=h*E~GP1Q4saXMWORg31!x7|!s$ z;~dz)oq46C7lo4A35T|AOn5N_v^xGeow^OR66%JzAbKR!!(wQ}OP{kI7*87=wk`YtwSF^c5Fygms5`I~yyx3yJlx~t;AQ8j< zu0wQgR`>65LMCn=QuKGuENg3M?t^Dd6JOTpf;ywe{QKWI;cpAjU^)_X@lKKt7Lbrd zXe8^sAr0Y;(+){isUHm5{fre4hwRM>5RFi=u7MwjtB+IY`_TYH9JHyJEvVCtJW5l% zEAZ~&+Ls`X-*w4i-ftogTr0FVV|hw8KLAr1@lULZuH8S2hVgEmh=Rm!4HNj#yK#8) zmeN}=hrQ8~VLKB-ymgcO2)Dh=eL$ErisE9~`k=AE}YfVgEI``xmPdv3PM8x$fKiiUvLILl0HtoNZCSIoD z-t=HgXgh^QlQh@0eZ2=a@47W7k$t>wE8#O;7ESDFIVPux_ljbBl`3hp5|n*-nm`H5 z1fGIv9Hw2S4-&|B>NI&i!@!v#q`+jQx$O)d(RulAvtR9bDzHRBCcIlHZ~ADyTW@dI zmD-Y@ss~BQzsC0>7)q*4O%eV>|DksxiMpjGWAbU_P2D51Sc;n6A;jxc(IHWZnda{k zk8R|xC(un0F<8I0xXZnfjnWd=cC5j|x+qsNV_y6J^#U{3rK7 zBLig--4iw}i9p-$di&B^$2G@>wF~tp9xnjX&Q&d;Z9WkVv7MJ+o{vuyZL>WB^LW{V zf+~`V`z$CGA5zAgrQI{(wTGM^v^lnTGSnOQloNYX`ub*NdtqwoKBun(4{Vp!KsAEU z+FbURqy*jqgEZc8sx0VM%um#xwu1izt?2Xp0zU#~Q$A5PHGdp*bT6mbdeY9fb(4k4 znQ@h=C4vp64aCI6b_SR7d;m5XHoO!#o+V{`-zG40SO)tCDhAqbH}Z9L3E_uuyi)gF zUO_IWmkgMZaThm^Y=mGf(zmkXm(si&6e73yX?_YmFIPkp!^?DkY|6P&&m(iKm!MER&F#z~>!euaL6HeqlR%)+2;h_66!O-07 z24vLm{RS6&{-hMJ+u7MWd>M{(e2!wk)M|BfU&0V%o)0i~oX6#5lGP(y0X==1T|my3 z@1%SEd_el9V+L6!ON^FFH|ZQknpKVyBP=i2I~(A;pxDqcIYkPD>D-ln*ipO2G@c|{ zi%e<7InedQu{)FSJ6HOMbG`;$Tr3wF{1-KKU0{H}zZdBWYxx+M74FIF2I78H6E>{> zpeE*a5X=64Y^@lO_z4F==`#GXvaqo5GVdGty+qU!VjVOp#b48c!=X!nG@s9p_zQ@Z zdv}VXRnBCe>Vo7qF~T}!dj$NDjO#ox`_9vpKeDIxXN7uIw7skB1IYZXd=J$u{p_8EN&DKIXs4=$SS$MvV)NI!E03m$5Il z+blqU+2x#VxL`K!Rl&aD7C-|0M-`CL>gJ8ZWLVi25itP!>?^aTq@R{d3LSkIi%TlS zxnirM9UZSZG?Ztfyfkq23iraoif?`c4GUH1@wdXF30vKQUlz+p@~*EM{`85-**aQD z0WvGwgv3DLxjG+T!F|oRZio(9e&b^^f$F25M$k__UwGzTdk~S9FeD0;$*d^-3D1#X zNk^FH@G2`H1~#Ql3_C=aZ`YOj+E&iHvsxtovyImK{M{Nnj`fV+UTCjgw_ab$%`m2J z8cd)*^Z;Sb&TnU>cv*MJ$8Iq@u~wu+U@7=XVrs?&G1 zIoAibim_eUaO0IvSNbbA>g6^#Rv7|S{8xoL!b;09yk-7~(^qHyXK6A;m_*%F1`r)q zVMr!@6#wtm^DV$C{&Mt7Te(Un&dXKejm%%xz;W(lgWWBEmkRm4Nh{j`9V!OJXS(Um z6_9_`qvGG^yc+34eo{IV*F=e#a5n+M#f|Aty|D z#Zg%G?BEA*c0c!!D6yM0@ArP&qHw2!Qs>l9sUp~QAEVGoAodB`656R}6o0CD$tH^d z#3S;Utv#YeSlfnGXAQLcG*bYX;Y#gD_OFx{ydSjyXtIt_#jLLE$x;P&d!cn*@HM5o zu5DZA(wDv$P!c?sdhjSR0DAK$cTk#VZy)A4y?;nttaHOlmSs#8s6Oh<_!GYeZJRlH z_$v2X#}&ZKJUPb$Wt3CeEwnrBb#jM>&M;oBwLk{`2>X^0k}Z@jb~e>qJ}x{kuXjAQ ze+N?wuPNSWwgJ0JA}uAvmTh$_V;)FB<02Fu|ZqFxl;0MKGn)t zz>8Fv1GR3)Cdo#le-D3G1NTTZz*`CZRgKBxD<@VoO|& zU5`Pu&aayhwRaLLe&Tt6k~_nwyS+PpwwJ@TYO?h=vyW>SYtcj+UBqprw6Vn}y6KJm z1vMhMgr(xOHd;3C>xmjmo85Hw{pe}Jn4vZ{$d;r&-^@we}VyOH0DHR&H<>pe=J0`MS zB`EwP-{!SABaNDbC=-|LOy0;f-}L#njiTRu!ewZxioI8Cely)15BjTisfn-Cr9()- zn}`{w!p66I)GMj}OJOD2EktfrgR29Q7jbvmueBNR)*9|;7}g5>htA4q{2Y6%K27iTpcwr zz$`~ypL}^EWH@E$#D&Jr)bahZtMP}@)lJe|;-I^nnRdc%i-xdqvNghnUza2KA6QYj z`jx>!(+Yh)LBiiN5i$CwqUxQIO=Ky-Z(Bvr-`(3Y6ZsM`rOX^=TPr1)QK(LfpffHJ z>OYm-O|{>|`@iCtBc+m~lTTJ|U{@;{#!AK8HPCLTD*%21qo3JWuPLMI6~EKBz+1uU z?PH53Kwfp*lvWBH=miN=HH8ZkGq<8X|npUxnmQ3U($J$!ZlI;oHa&9)E)FA(< zVWP9YS`A*QlPQNy>A{WqRimT}Kzf*%mw>Ec*02jk84I?t zllDtJPLNx3!LLsOf_`zbM+B-oGduZ=l7-!3Y}LrjS+?ZH$qi%1t=drRKF@w+i{{nH zQa%fU2vnlij(s@t5`Un~<_;v9g{Rm1Jl~`{q#uex{gv>xtkzm<1$W(}E2eGG zP)mVDK^rsdQiVJ8az)zZ7NgH&1mo&MyR>QDXP%FEv~5ua%pq89&CX$nCLM z*B<|#)6{I7bK5Lv3^{a-REfBplWi87%Cout8O87r)M-VNjB}{^`62mrID;ii5~mt| z<^9DBPZ?_)nA3hEursnPK-z=VaK&XD*?HaHdC(6@=vjQjYh>_D4L?=;ULw_84L5?b zSWI>-J0EZUAR1J3X>+hBq-ju3b6&R~?f})xcHeN8wN0k>G41VY`ptXvr)GoS3p_=8 zXaDoi)Kll1gF@}eik?PvCtH?GE9%Qv)d#5^ciWnAeUO_&)Zshy? zS?9_*rqyVZ9edlEe=&i>W%60bvUvMD$KMs|#!EhpD^`$>FT9?_^9&ac)#PRP%{TB5|k6zixde%+92fuUAw;Df6smck1}$U(Cn`H=e=aU(}!)HNjP8V89o z9xOWRzJrn?XlJA$R$_OFE&i7J;9V9C|*63xaccm|hPGpT#pL3nr4<`gp z??+rT>7x>|@pNf*5Z8>2ne&obx$)o9Hb$nXIMY4OiHnPUPqjt{NqVa+1A#%=`kusJ zDsXug4ZkSXS&$5Il_DNC-l)b$hHX_?%QP2Coz7e*_f|NZS{3oza*&DPSDKMG#HPW# z2A(R%#z>nYFqPogZ@+i!kbs|-@rL!yMT=?$B13Gk(s0&hy1tkPSKO3#WyTE2^~Z(*!)bX$L$ME^(!)1mgJ!4-zM4qKgApYf z?e(cXzV62TN<>3jDOMv(Ns{ceO;?yqHk0dAu}rhrOu(4lfFeCX`GbC3#ez^bo`Y!o zOYIk33v$zUi?drYZ_^Su2)Z~L+U(=@s?EUwwKi|Q+xnkBbu zb*d5>!-4}=w{OR3D7QlmzcdywpYO+c3#RFse*gIurl~iiyBeLAIiRce&Om42Qa0fW zHU4_%T;h$FH{8~ovug3#>>cPl%|jSLs3zyZQ*H2UNbgxn4u)d{&FCt4$~-G|H8(Sk zAHzl8;Q*eu_`Iy8b71e#Cc~OH20-JgDU5H8mhkxLf16Flm`?coh!}`bFCsZnLaI07ejAZcd+?PU zH5s;;fWX@PR_@Y2%*T}Ib4unX26ik=yhyLz-h`sJv>Qy8bW$fCn2j1 zNr=6yd)7@hK2QXoK*e6@YkJ%f^{+gQ~ znaMK$D2QUGx{LRx$Bv=lnBEu3B`TF*8?Gx7JqcYn zb`UQ~%slb4ivfXdwCuX~5VtQ>synqdaY`d%ZQIH8#YUQMLm*2^szOfrK%StjEk$pB6{viC=u_`f_5DW;q-SC!9 z=YD<)=rT&2t&-YZuMHQ{sHftc%o8!P{(NbsLmdkDu`DRl7fkU_jr>Vt(nDph8`xWE z<5R}L&ci}b7Z&6`pNugZvS5&FJz240C63Hn{o`%uitN;7(;NmBJDu5e^o;Jdy6SJV za?OM$i8JQJ4mwPTxloB^u`-&kJoAcb8gS=VMu39VP-)_Jsodb>9g7zRtaNDYXVF_EKteSTw!`ZmQkFU9Lc7)1?5qnSN-^<8|eor8;xuG7)aLfmwIVCd`vt+v}5?bl5dy_S`UWf?k`->K%2L^^B3 zUY%T?JNSLpV=%M_IlxZ7KuT=!qrC?gFEKFV7YkH{#_>Dvm(b zbL0c^{-{FQ@o$0U#?6wKjvT5Gj$#PEno(l(ZIfloVH$&dHAy^5f?dS8+Ge3Wv}ls*6S@c_Vdo zbsyTMkJU?-Ra<2uRlO{%n+z7qUv&Ubn%sN`9;&Vr%Gs@pm!{amTXmaak&ur=&lWHrPT9-i%BCF`5M>qA6wP|W$=!?q_-*_zA3`1OJ=l^W zaI47#8@yykPKD^N8BGAM9t_UKHa|$9dwc27Y`}qn2j_Rh`5Dz4HwXvL{Kxw@AH4C| zg9>JM_soYx!L0#-9UIR}i&TmlnRT=z#Cf05*D#;n8Wqv^lFZ{xlTzYUtZV2cCwN`= z`2=h?Fak+GGJK;fN46i2_QSMotYc>;wx%bH57Lf0SehQFZsUm7FMZ3h=jVRR_q4D= zc^0Z@Th^KAtRTLuK2_mwBjDBObrCjzBB#G(uk7nGG^&ot;t&~6u4Meup`+e7Jhr&V zLZjK&Djj~_<3{0KF1h;0c&e@lQ-c5X0_tUm5NanmF}Xn#>?p~NMG^DmyV@Drt9#3? z5gEm38Z+tRS7IMa--wV>7|H~ga;j08>cLqHV#}-1!rCiR=sP?Jd?CAy`J+vmXnm z>4x;2iKgpvc{^`Sj(*@XpUkv-edAHmFJ!^H2?}m7%AaG<52<%N6567_1?zj{;o2A< zGUF-mr*N|zuCw^ebH1TZhbJX(1&It}SwyDam4x?xH&F*hF@E|GQNj|xYjkF?nz74( zx`*}mg-i&?t?F~#xAC8<^QStTg1H#qL`1#}h<}lDlmLt`#HZ$&daIl{+xQ;NS?E~~ zVK$?~4pufSpgCaQY*5#M2CvHn9sxrG-@#kA#q}SBU+Q~$CFdjB6~rVD z&+5MJF|V|Zf5@NnFDNwJei_$q^O_rge)0^qw!e3*E0oUmRAGCUbbP|McoTBX-s|Dd zX^8uYNyUBU>wK4a&5kQ_5%k-jHxpDoNkdF-AiC|9RC{^oiX9$NoovIDf|U)?xKlbBbN#HOxPp)vSYgtx$@;f5ooZ zrw;-g2^R<4xm6MTrOE8sZIZ}=F!7?O#G@!-cn|Zm;lmrm2UPL5wLEB%|P`wBr-u!}xiJH!ZOIthEh- z=cCUC%|B9vt12Lay(B2CyqW%fNrAu3{P)}*nrN@i5)aP5mOj%ut*<^ZYo>n`bgJU? zjE-gZB)ny5?wk*{t{%0wJL`Lx|0zw`k&2?&CcI?Ot3uVXgHyqT<(L#L=XgNodM^Vq zTv(r68P2uOAFk9Nxy;l}$>lzMIr9IwY6Q-Q?jNoi-Qe15uII8ohz=fuZPl}JjUu3G zHFtXp0U$rtq2VqAceeVke{4{IWR3o+)6iJ$I#G^e5;c{Obdc1S+>2jBU{ce~@KSsrr( zv;iC)@3jw*!uxD7oe!aWo?QBeo_Mhg=l*t&F3~sN#uD^G!rT~;r(PFu&!3WNeMTNk zA==^s@M0C~4IS;eVX6pxZ~r=Iy8NfBK3?Xy+_^Oiupf`qx1fVhW`|=TZRfWVZ?)H2 zIIa@gDG9*HFkiiOj4?!4L!(1K>Qx;X**5m2tG_!& z@~;gnAVONM9#7w57Z*95-?mEobNwR$rAJ?G?2;N8Sg?d16>~6`mvQl_bKSp`F}0HF zA;_uHn`MfPdt1m}V~pO`o;;Pj9QO-;I;IPIPQ6SWM2vGK_IEAXH>rLah2CYLdB{Wq z?U=K#YyMsTA=CbA5b;^xBRN9bOUqJ#TW?;#P-ve5TCc>HD$ZjThGM1?VKQ(Di;Eeu z*NV8g``E0e34wmK6n*b$nMVJ4OGI8s_8;#e$xXqnvnVxyt^p+tN%Cc=8qg9rofMc# zB0WU^iH%0d)Ln1k%Mxa{zbQB>UKw_0$e5FS_e=;pj|ldOBu|#tdFQOW$$V@Qk=?zDOwYH1wEXt_Sae}x)-2A4?|7|g<1cR# zV)n&}sfTQw^a>n$f$i6CCW%|SM5Ep3K7Ub~K@zk(6BIQqb8*IUViX87k?^eR+`0VHa|UQ z*>B_az5w#_rA5MA7To89E!dAIv|)a2;$ichX_aULAGlaAE&FzGk{MpIKlV4rsZ{v} zEldBq#t&TIM1`z~U^VFyy1!l;z)PdTZ)S3YT%iOV2lwu(`0Y-R$DuFhTNvS@TUI7_ zc0T8vo1SOBVMbDVF&=8wxq7r0NAseE%J=^H5W_8Q-um^XCl$z=1NEKkkp^xjE4xec zSNJ;lE?_YE#HiBioX@MdvUM5d>e`3DI8zg}5fE`hn$c=*_EmN0l?L5A^hw4>=dP&! zd(IhPn^E6H;??m^?)q6aX`@{I<2RwX2WycZR1$`|(qWq^0kNE7>JnP}>?%gV+j$}) z>SPV4CsJ!NX?M6>cq36WS%>s1Ih3tRfF!zQr=q7KnK2B$lqui}Ogr+89>76|?gu|$ z<5rh&XI--6vP~}1P^Yn$$L8nZUJAKebL^fBj;nrjWV{M4|Jw12R_&`R>Y}`4T$Qil z!|KalRII%^EGlR`QCMk42viiK2+{tC`^ewCJNt=iFiT1`68BZ2Lj$mw)8AfThL&5~ z!O!<4CHiL`bUhYK_Vh@f%IYLgyDsGY+r}=8$hFRpQzqcn+*$M~(YfHfnc^-p32V+= z;nf>oskD%-%;8O9mDMv5Y!QmrNxa|1=1{aH=HiRw_Y*Aeh#pE;awuB00BPvipNrf< zGUh901sxWt1@$s-0jVwG0B$d9q$ix1fv7W&dL!+jwcg&uuBtB&E;OG>0+;x_A+cPL zbtn!^^P?Iy@e@vS4JmU&IfR4}A}cA<#o`-gA}J_?)%4vTGm3D!{nKf5)x#~fictKa zCku5phHo(4b^1!q?hX3cw<5nvnG4u$5B1p*Yo&oXUZ(Z=K6d=$`pcr{9&X1-BqH}yyPDX<=%{uCm z4!3?+;A7bQt=9UHbC^9@vY&FB({d48|MksXVe;@FLYm1*#UkJ1rMG)YbbH@_`Q!(4 z-iZO3-tOg!FK4bN;B}}0+{5p{t8`YVkFKfrNq3#)VyQZ55N>C4T2*USBV|3KyK8?f zj$eqEleOpEfRiwk>6l!^c&4R&@t%tv@gjjT_KaaH@$%P#5;xop+!ob|Q|lmctwyLI z3E@ybpFRQta+HktH+BBf=ih__K%n*%uh6sNOTv1d1(}Wpqrd95C_}MU=~(7-yHBt~ zv<*0&LZwtzSgBn)%^+g%UHnbM`(Rp|(1yki`XY+1Jb%_%=_xyLlMOyOzyOuKrEk++ zQt5t(P)WxS6-@&Q1A1G76rd5RL9&90E}vn$kmAf1bRQl^k|4FDVF1obSi?CH2mey$ z7T$`{J0|PeA{@lvTa!nD*xQM(WzD!8o0S}mOg~bU1}koTT|CPpQTEsrKUexJO-t!_K=DXxwL2>Rh8Jy$N*=X1^TceV9> zRpg#TgEP!}z^qQ^8!K*nX_p#ciRzRmc*owU>#louIqi-qUFU4NwSd=fvq=g7gONI; z;G9j}GxfOzj^>idUi+*wC&^W~lfL4EF{y-zm;1lRLH<52VLJLcfuX^HhMOaXnYC$3 zn@wIOD32UH6n{r_Jm5@%CU{|z7`|$tJMdzXnVqp;QA7utFwNF6d34HLB+Uj3d+SCT zGN`|!*+ml8=$(Dj=d<3+7_F9dN5v~%M{Lg&G1h)Fid&edK;o-Bnm@it2kEC!X-mB& z7c-b&Z^x0zoijWut-_3kERb4+Or#F`)38fei2|IdZhv5p(`A*On|zp2*&j;LlocxE z-E{pl37s9v>~0#H-VHv&`Ly?1<=pzIRo$sG%T%OutdQxv+RRKhrg!M!M$X}TDYebDh{tpOnSY`kK literal 0 HcmV?d00001 diff --git a/docs/usage.md b/docs/usage.md index c6914c3..1b8b13f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,20 +1,48 @@ # Usage: build, setup and flight -To fly Flix quadcopter, you need to build the firmware, upload it to the ESP32 board, and set up the drone for flight. +To fly Flix quadcopter, you need to upload the firmware to the ESP32 board, and set up the drone for flight. -To get the firmware sources, clone the repository using git: +## Uploading the firmware + +You can either use the **prebuilt binaries** or **build the firmware** from sources — this will let you modify the firmware and add new features. + +### Prebuilt binaries (the easiest way) + +1. Download the latest firmware file using the following links: + + + |Type|Boards|Link| + |-|-|-| + |ESP32|DevKit, D1 Mini|[`quadcopter.dev/flix.esp32.merged.bin`](https://quadcopter.dev/flix.esp32.merged.bin)| + |ESP32-S3|Most S3 based|[`quadcopter.dev/flix.esp32s3.merged.bin`](https://quadcopter.dev/flix.esp32s3.merged.bin)| + |ESP32-S3 (2MB PSRAM)|S3 Super Mini, S3 Zero (2MB PSRAM)|[`quadcopter.dev/flix.esp32s3.qspi.merged.bin`](https://quadcopter.dev/flix.esp32s3.qspi.merged.bin)| + |ESP32-S3 (8/16MB PSRAM)|S3 Zero (8MB PSRAM)|[`quadcopter.dev/flix.esp32s3.opi.merged.bin`](https://quadcopter.dev/flix.esp32s3.opi.merged.bin)| + |ESP32-C3|C3 Super Mini|[`quadcopter.dev/flix.esp32c3.merged.bin`](https://quadcopter.dev/flix.esp32c3.merged.bin)| + |Flix2|Flix2 board|[`quadcopter.dev/flix.flix2.merged.bin`](https://quadcopter.dev/flix.flix2.merged.bin)| + + +2. Flash your ESP32 board using [ESP32 Web Flasher](https://www.espboards.dev/tools/program/): + + + + * Connect the board to your computer, press *Connect to ESP*, choose the serial port. + * Go to the *Flash* tab. + * Choose the downloaded firmware file, set *Flash address* to *0* (important). + * Click *Program* button and wait until the process is finished. + +### Building from sources (flexible) + +You can build and upload the firmware using either **Arduino IDE** (easier for beginners) or **command line**. + +Get the sources using git: ```bash git clone https://github.com/okalachev/flix.git && cd flix ``` -Beginners can [download the source code as a ZIP archive](https://github.com/okalachev/flix/archive/refs/heads/master.zip). +Beginners can [download the sources as a ZIP archive](https://github.com/okalachev/flix/archive/refs/heads/master.zip). -## Building the firmware - -You can build and upload the firmware using either **Arduino IDE** (easier for beginners) or **command line**. - -### Arduino IDE (Windows, Linux, macOS) +#### Arduino IDE (Windows, Linux, macOS) Flix firmware open in Arduino IDE @@ -29,7 +57,7 @@ You can build and upload the firmware using either **Arduino IDE** (easier for b 7. Set *Tools* ⇒ *Core Debug Level* to *Error* to see the errors in the serial console. Set *Tools* ⇒ *USB CDC on Boot* to *Enabled* for ESP32-S3/ESP32-C3 boards. 8. [Build and upload](https://docs.arduino.cc/software/ide-v2/tutorials/getting-started/ide-v2-uploading-a-sketch) the firmware using Arduino IDE. -### Command line (Windows, Linux, macOS) +#### Command line (Windows, Linux, macOS) 1. [Install Arduino CLI](https://arduino.github.io/arduino-cli/installation/). @@ -150,8 +178,6 @@ Before flight you need to calibrate the accelerometer: If using non-default motor pins, set the pin numbers using the parameters: `MOTOR_PIN_FL`, `MOTOR_PIN_FR`, `MOTOR_PIN_RL`, `MOTOR_PIN_RR` (front-left, front-right, rear-left, rear-right respectively). -Certain ESP32 models (such as ESP32-S3 and ESP32-C3) support a lower maximum PWM frequency; on these boards the parameter `MOT_PWM_FREQ` should be set to 38000 Hz. - #### Brushless motors If using brushless motors with ESCs: diff --git a/flix/config.h b/flix/config.h new file mode 100644 index 0000000..badea19 --- /dev/null +++ b/flix/config.h @@ -0,0 +1,27 @@ +// Copyright (c) 2026 Oleg Kalachev +// Repository: https://github.com/okalachev/flix + +// Parameter defaults + +#pragma once + +void setDefaults() { + // Set defaults here + + #if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) + pwmFrequency = 38000; + #endif + + #ifdef FLIX2 + imuModel = 4; // ICM-40609-D + imuIntPin = 10; + imuCsPin = 14; + + motorPins[MOTOR_REAR_LEFT] = 41; + motorPins[MOTOR_REAR_RIGHT] = 7; + motorPins[MOTOR_FRONT_RIGHT] = 18; + motorPins[MOTOR_FRONT_LEFT] = 38; + + voltagePin = 3; + #endif +} diff --git a/flix/control.ino b/flix/control.ino index 2b7e3ca..dfa3661 100644 --- a/flix/control.ino +++ b/flix/control.ino @@ -9,31 +9,6 @@ #include "lpf.h" #include "util.h" -#define PITCHRATE_P 0.05 -#define PITCHRATE_I 0.2 -#define PITCHRATE_D 0.001 -#define PITCHRATE_I_LIM 0.3 -#define ROLLRATE_P PITCHRATE_P -#define ROLLRATE_I PITCHRATE_I -#define ROLLRATE_D PITCHRATE_D -#define ROLLRATE_I_LIM PITCHRATE_I_LIM -#define YAWRATE_P 0.3 -#define YAWRATE_I 0.0 -#define YAWRATE_D 0.0 -#define YAWRATE_I_LIM 0.3 -#define ROLL_P 6 -#define ROLL_I 0 -#define ROLL_D 0 -#define PITCH_P ROLL_P -#define PITCH_I ROLL_I -#define PITCH_D ROLL_D -#define YAW_P 3 -#define PITCHRATE_MAX radians(360) -#define ROLLRATE_MAX radians(360) -#define YAWRATE_MAX radians(300) -#define TILT_MAX radians(30) -#define RATES_D_LPF_ALPHA 0.2 // cutoff frequency ~ 40 Hz - const int RAW = 0, ACRO = 1, STAB = 2, AUTO = 3; // flight modes int mode = STAB; bool armed = false; @@ -44,14 +19,14 @@ Vector ratesExtra; // feedforward rates Vector torqueTarget; float thrustTarget; -PID rollRatePID(ROLLRATE_P, ROLLRATE_I, ROLLRATE_D, ROLLRATE_I_LIM, RATES_D_LPF_ALPHA); -PID pitchRatePID(PITCHRATE_P, PITCHRATE_I, PITCHRATE_D, PITCHRATE_I_LIM, RATES_D_LPF_ALPHA); -PID yawRatePID(YAWRATE_P, YAWRATE_I, YAWRATE_D); -PID rollPID(ROLL_P, ROLL_I, ROLL_D); -PID pitchPID(PITCH_P, PITCH_I, PITCH_D); -PID yawPID(YAW_P, 0, 0); -Vector maxRate(ROLLRATE_MAX, PITCHRATE_MAX, YAWRATE_MAX); -float tiltMax = TILT_MAX; +PID rollRatePID(0.05, 0.2, 0.001, 0.3, 0.2); +PID pitchRatePID(0.05, 0.2, 0.001, 0.3, 0.2); +PID yawRatePID(0.3, 0, 0, 0.3); +PID rollPID(6); +PID pitchPID(6); +PID yawPID(3); +Vector maxRate(radians(360), radians(360), radians(360)); +float tiltMax = radians(30); int flightModes[] = {STAB, STAB, STAB}; // map for rc mode switch extern const int MOTOR_REAR_LEFT, MOTOR_REAR_RIGHT, MOTOR_FRONT_RIGHT, MOTOR_FRONT_LEFT; diff --git a/flix/parameters.ino b/flix/parameters.ino index daed501..4594c3e 100644 --- a/flix/parameters.ino +++ b/flix/parameters.ino @@ -14,6 +14,8 @@ extern float rcLossTimeout, descendTime, disarmTilt; extern float voltageScale; extern LowPassFilter voltageFilter; +#include "config.h" + Preferences storage; struct Parameter { @@ -144,6 +146,7 @@ Parameter parameters[] = { void setupParameters() { print("Setup parameters\n"); + setDefaults(); storage.begin("flix"); // Read parameters from storage for (auto ¶meter : parameters) { diff --git a/flix/pid.h b/flix/pid.h index ac7a66b..c82e009 100644 --- a/flix/pid.h +++ b/flix/pid.h @@ -18,7 +18,7 @@ public: LowPassFilter lpf; // low pass filter for derivative term - PID(float p, float i, float d, float windup = 0, float dAlpha = 1, float dtMax = 0.1) : + PID(float p, float i = 0, float d = 0, float windup = 0, float dAlpha = 1, float dtMax = 0.1) : p(p), i(i), d(d), windup(windup), lpf(dAlpha), dtMax(dtMax) {} float update(float error) {