Get your magnifying glass out, it's time to solder very smol things.
Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.
698ohm resistors and V2 PCBs
Here are the PCB pin-out labels:
V2
LED labels:
The green markings and notched corners mark the positive sides of the LEDs pictured above.
If you have different LEDs, please consult their datasheet.
Some terminology related to them:
5V: 5-volt power in.
GND: Ground or power out.
AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.
SNG: Single resistor, use this as 5V in if you are using only 1~700ohm resistor on V3 boards (not recommended).
Negative: This marks the negative side of the LED.
Positive: This marks the positive side of the LED.
The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.
-
diff --git a/assets/about.md.fd49c172.js b/assets/about.md.a9b306c8.js
similarity index 72%
rename from assets/about.md.fd49c172.js
rename to assets/about.md.a9b306c8.js
index dac68ce..418d3ff 100644
--- a/assets/about.md.fd49c172.js
+++ b/assets/about.md.a9b306c8.js
@@ -1 +1 @@
-import{V as i,a as s,b as l,c as r}from"./chunks/theme.3144e18a.js";import{o as u,c,G as n,B as a,b as o,a as e,z as t}from"./chunks/framework.7384f92b.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),g=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),v=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),T=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),y=t("br",null,null,-1),P=t("br",null,null,-1),O=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},x=Object.assign(D,{setup(V){return(S,N)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),g,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),v,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),T,e("."),y,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{O as __pageData,x as default};
+import{V as i,a as s,b as l,c as r}from"./chunks/theme.16007baf.js";import{o as u,c,C as n,y as a,b as o,a as e,v as t}from"./chunks/framework.17985c0a.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),v=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),g=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),y=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),T=t("br",null,null,-1),P=t("br",null,null,-1),x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},z=Object.assign(D,{setup(V){return(S,N)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),v,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),g,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),y,e("."),T,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{x as __pageData,z as default};
diff --git a/assets/about.md.fd49c172.lean.js b/assets/about.md.a9b306c8.lean.js
similarity index 72%
rename from assets/about.md.fd49c172.lean.js
rename to assets/about.md.a9b306c8.lean.js
index dac68ce..418d3ff 100644
--- a/assets/about.md.fd49c172.lean.js
+++ b/assets/about.md.a9b306c8.lean.js
@@ -1 +1 @@
-import{V as i,a as s,b as l,c as r}from"./chunks/theme.3144e18a.js";import{o as u,c,G as n,B as a,b as o,a as e,z as t}from"./chunks/framework.7384f92b.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),g=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),v=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),T=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),y=t("br",null,null,-1),P=t("br",null,null,-1),O=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},x=Object.assign(D,{setup(V){return(S,N)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),g,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),v,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),T,e("."),y,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{O as __pageData,x as default};
+import{V as i,a as s,b as l,c as r}from"./chunks/theme.16007baf.js";import{o as u,c,C as n,y as a,b as o,a as e,v as t}from"./chunks/framework.17985c0a.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],m=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],d=t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1),p=t("br",null,null,-1),b=t("br",null,null,-1),_=t("br",null,null,-1),v=t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),g=t("br",null,null,-1),k=t("br",null,null,-1),f=t("br",null,null,-1),w=t("br",null,null,-1),y=t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),T=t("br",null,null,-1),P=t("br",null,null,-1),x=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1673640425000}'),D={name:"about.md"},z=Object.assign(D,{setup(V){return(S,N)=>(u(),c("div",null,[n(o(r),null,{default:a(()=>[n(o(i),null,{title:a(()=>[d]),lead:a(()=>[e(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),p,b,e(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")]),_:1}),n(o(s),{size:"medium",members:o(h)},null,8,["members"]),n(o(l),null,{title:a(()=>[e("Contributors")]),lead:a(()=>[e("Those who have actively contributed to development."),_,e(" Community Support")]),members:a(()=>[n(o(s),{size:"small",members:o(m)},null,8,["members"])]),_:1}),n(o(l),null,{title:a(()=>[e("Philosophy")]),lead:a(()=>[e(" The "),v,e(" on this website include some of our teams own notes (not all of them are polished) that we disclose for other people to use."),g,k,e(" Here, we hope you may find something useful to you."),f,w,e(" We advocate the "),y,e("."),T,P,e(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")]),_:1})]),_:1})]))}});export{x as __pageData,z as default};
diff --git a/assets/app.d49a10a3.js b/assets/app.d49a10a3.js
new file mode 100644
index 0000000..46d0b68
--- /dev/null
+++ b/assets/app.d49a10a3.js
@@ -0,0 +1 @@
+import{u as r,h as i,N as s,a5 as u,a6 as c,a7 as l,a8 as f,a9 as d,aa as m,ab as h,ac as g,ad as A,ae as v,D as C,d as P,k as y,af as _,ag as w,ah as T,ai as b}from"./chunks/framework.17985c0a.js";import{t as D}from"./chunks/theme.16007baf.js";const E={};const R={...D,setup(){const{lang:e}=r();i(()=>{s&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...E};function p(e){if(e.extends){const t=p(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const n=p(R),S=P({name:"VitePressApp",setup(){const{site:e}=r();return y(()=>{i(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),w(),T(),n.setup&&n.setup(),()=>b(n.Layout)}});async function x(){const e=$(),t=O();t.provide(c,e);const a=l(e.route);return t.provide(f,a),t.component("Content",d),t.component("ClientOnly",m),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:t,router:e,siteData:h}),{app:t,router:e,data:a}}function O(){return g(S)}function $(){let e=s,t;return A(a=>{let o=v(a);return e&&(t=o),(e||t===o)&&(o=o.replace(/\.js$/,".lean.js")),s&&(e=!1),C(()=>import(o),[])},n.NotFound)}s&&x().then(({app:e,router:t,data:a})=>{t.go().then(()=>{u(t.route,a.site),e.mount("#app")})});export{x as createApp};
diff --git a/assets/app.ea41a7a6.js b/assets/app.ea41a7a6.js
deleted file mode 100644
index 00886f0..0000000
--- a/assets/app.ea41a7a6.js
+++ /dev/null
@@ -1 +0,0 @@
-import{u as r,k as p,R as s,a7 as u,a8 as c,a9 as l,aa as f,ab as d,ac as m,ad as h,ae as g,af as A,ag as v,H as C,d as P,p as y,ah as _,ai as w,aj as R,ak as T}from"./chunks/framework.7384f92b.js";import{t as b}from"./chunks/theme.3144e18a.js";const E={};const D={...b,setup(){const{lang:e}=r();p(()=>{s&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...E};function i(e){if(e.extends){const t=i(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const n=i(D),S=P({name:"VitePressApp",setup(){const{site:e}=r();return y(()=>{p(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),w(),R(),n.setup&&n.setup(),()=>T(n.Layout)}});async function j(){const e=O(),t=x();t.provide(c,e);const a=l(e.route);return t.provide(f,a),t.component("Content",d),t.component("ClientOnly",m),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:t,router:e,siteData:h}),{app:t,router:e,data:a}}function x(){return g(S)}function O(){let e=s,t;return A(a=>{let o=v(a);return e&&(t=o),(e||t===o)&&(o=o.replace(/\.js$/,".lean.js")),s&&(e=!1),C(()=>import(o),[])},n.NotFound)}s&&j().then(({app:e,router:t,data:a})=>{t.go().then(()=>{u(t.route,a.site),e.mount("#app")})});export{j as createApp};
diff --git a/assets/archive_fox_ir_v2_build_instructions.md.4968d89f.js b/assets/archive_fox_ir_v2_build_instructions.md.c95da5f7.js
similarity index 95%
rename from assets/archive_fox_ir_v2_build_instructions.md.4968d89f.js
rename to assets/archive_fox_ir_v2_build_instructions.md.c95da5f7.js
index 6089aff..9de6c4c 100644
--- a/assets/archive_fox_ir_v2_build_instructions.md.4968d89f.js
+++ b/assets/archive_fox_ir_v2_build_instructions.md.c95da5f7.js
@@ -1 +1 @@
-import{_ as o,i as t}from"./chunks/index.9f7265df.js";import{o as r,c as l,G as s,b as i,z as e,a as n,V as a}from"./chunks/framework.7384f92b.js";const d=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[n("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"")],-1),_=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[n("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"")],-1),p=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1),c=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1),h=e("p",null,"Here are the PCB pin-out labels:",-1),u=e("p",null,"LED labels:",-1),f=a('
If you have different LEDs, please consult their datasheet.
Some terminology related to them:
5V: 5-volt power in.
GND: Ground or power out.
AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.
SNG: Single resistor, use this as 5V in if you are using only 1~700ohm resistor on V3 boards (not recommended).
Negative: This marks the negative side of the LED.
Positive: This marks the positive side of the LED.
',10),m=e("p",null,"Tin the resistor pads.",-1),b=e("p",null,"Hold the resistor in place.",-1),v=e("p",null,"Solder one end.",-1),x=e("p",null,"Flip to the other side of the resistor and solder it.",-1),P=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[n("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-label":'Permalink to "Solder LEDs on PCB V2"'},"")],-1),g=e("p",null,"Tin the pads",-1),B=e("p",null,"Place the resistor on the pads in the correct orientation.",-1),V=e("p",null,[n("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),n(".")],-1),C=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[n("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-label":'Permalink to "Wire up the PCBs V2"'},"")],-1),S=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1),w=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1),k=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),T={name:"archive/fox_ir_v2_build_instructions.md"},L=Object.assign(T,{setup(I){return(D,E)=>(r(),l("div",null,[d,_,p,c,s(o,{options:i(t).fox_ir_build_instructions_one},null,8,["options"]),h,s(o,{options:i(t).fox_ir_build_instructions_two},null,8,["options"]),u,s(o,{options:i(t).fox_ir_build_instructions_three},null,8,["options"]),f,s(o,{options:i(t).fox_ir_build_instructions_four},null,8,["options"]),m,s(o,{options:i(t).fox_ir_build_instructions_five},null,8,["options"]),b,s(o,{options:i(t).fox_ir_build_instructions_six},null,8,["options"]),v,s(o,{options:i(t).fox_ir_build_instructions_seven},null,8,["options"]),x,s(o,{options:i(t).fox_ir_build_instructions_eight},null,8,["options"]),P,s(o,{options:i(t).fox_ir_build_instructions_nine},null,8,["options"]),g,s(o,{options:i(t).fox_ir_build_instructions_ten},null,8,["options"]),B,s(o,{options:i(t).fox_ir_build_instructions_eleven},null,8,["options"]),V,s(o,{options:i(t).fox_ir_build_instructions_twelve},null,8,["options"]),C,S,s(o,{options:i(t).fox_ir_build_instructions_thirteen},null,8,["options"]),w]))}});export{k as __pageData,L as default};
+import{_ as o,i as t}from"./chunks/index.d657d51d.js";import{o as r,c as l,C as s,b as i,v as e,a as n,S as a}from"./chunks/framework.17985c0a.js";const d=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[n("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"")],-1),_=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[n("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"")],-1),p=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1),c=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1),h=e("p",null,"Here are the PCB pin-out labels:",-1),u=e("p",null,"LED labels:",-1),f=a('
If you have different LEDs, please consult their datasheet.
Some terminology related to them:
5V: 5-volt power in.
GND: Ground or power out.
AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.
SNG: Single resistor, use this as 5V in if you are using only 1~700ohm resistor on V3 boards (not recommended).
Negative: This marks the negative side of the LED.
Positive: This marks the positive side of the LED.
',12),n=[o];function l(i,c,d,p,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default};
+import{_ as e,o as a,c as t,S as s}from"./chunks/framework.17985c0a.js";const b=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),r={name:"development/docs/dev_docs.md"},o=s('
Development Documentation for the EyeTrackVR Docs Site
This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.
',12),n=[o];function l(i,c,d,p,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default};
diff --git a/assets/development_docs_dev_docs.md.129593e0.lean.js b/assets/development_docs_dev_docs.md.f32aa5d4.lean.js
similarity index 74%
rename from assets/development_docs_dev_docs.md.129593e0.lean.js
rename to assets/development_docs_dev_docs.md.f32aa5d4.lean.js
index ee35e10..2dac2ee 100644
--- a/assets/development_docs_dev_docs.md.129593e0.lean.js
+++ b/assets/development_docs_dev_docs.md.f32aa5d4.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as t,V as s}from"./chunks/framework.7384f92b.js";const b=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),r={name:"development/docs/dev_docs.md"},o=s("",12),n=[o];function l(i,c,d,p,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default};
+import{_ as e,o as a,c as t,S as s}from"./chunks/framework.17985c0a.js";const b=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),r={name:"development/docs/dev_docs.md"},o=s("",12),n=[o];function l(i,c,d,p,h,u){return a(),t("div",null,n)}const g=e(r,[["render",l]]);export{b as __pageData,g as default};
diff --git a/assets/development_docs_pages.md.a16f2e91.js b/assets/development_docs_pages.md.55174e30.js
similarity index 98%
rename from assets/development_docs_pages.md.a16f2e91.js
rename to assets/development_docs_pages.md.55174e30.js
index 6696ead..a86a7de 100644
--- a/assets/development_docs_pages.md.a16f2e91.js
+++ b/assets/development_docs_pages.md.55174e30.js
@@ -1,4 +1,4 @@
-import{_ as e,o as s,c as a,V as o}from"./chunks/framework.7384f92b.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o(`
To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev//my_page.
You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev//my_folder/my_page.
This is useful for organizing pages into categories.
To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.
To do this, you will need to add the page to the sidebar object.
For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:
js
{
+import{_ as e,o as s,c as a,S as o}from"./chunks/framework.17985c0a.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o(`
To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev//my_page.
You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev//my_folder/my_page.
This is useful for organizing pages into categories.
To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.
To do this, you will need to add the page to the sidebar object.
For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:
js
{text:"Getting Started",collapsible:true,items: [
diff --git a/assets/development_docs_pages.md.a16f2e91.lean.js b/assets/development_docs_pages.md.55174e30.lean.js
similarity index 70%
rename from assets/development_docs_pages.md.a16f2e91.lean.js
rename to assets/development_docs_pages.md.55174e30.lean.js
index 82ffed1..c219598 100644
--- a/assets/development_docs_pages.md.a16f2e91.lean.js
+++ b/assets/development_docs_pages.md.55174e30.lean.js
@@ -1 +1 @@
-import{_ as e,o as s,c as a,V as o}from"./chunks/framework.7384f92b.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o("",24),l=[t];function p(c,r,i,d,F,y){return s(),a("div",null,l)}const D=e(n,[["render",p]]);export{u as __pageData,D as default};
+import{_ as e,o as s,c as a,S as o}from"./chunks/framework.17985c0a.js";const u=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1677868200000}'),n={name:"development/docs/pages.md"},t=o("",24),l=[t];function p(c,r,i,d,F,y){return s(),a("div",null,l)}const D=e(n,[["render",p]]);export{u as __pageData,D as default};
diff --git a/assets/development_docs_standards.md.34f5cc0e.js b/assets/development_docs_standards.md.ded806e2.js
similarity index 98%
rename from assets/development_docs_standards.md.34f5cc0e.js
rename to assets/development_docs_standards.md.ded806e2.js
index ed4a750..cf8d08a 100644
--- a/assets/development_docs_standards.md.34f5cc0e.js
+++ b/assets/development_docs_standards.md.ded806e2.js
@@ -1,4 +1,4 @@
-import{_ as e,o as s,c as a,V as n}from"./chunks/framework.7384f92b.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n(`
Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.
It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.
We have only a few rules for the documentation site:
All code should be written in English.
All code should be written in a way that is easy to understand.
All code should be written in a way that is easy to maintain.
All code should be written in a way that is easy to extend.
Our git commit style is to be followed, in english only.
We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.
Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.
The following is a list of the customizations that we have made to the Conventional Commits standard:
We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.
Our git commit style is as follows:
bash
<type>[optional scope]: <description>
+import{_ as e,o as s,c as a,S as n}from"./chunks/framework.17985c0a.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n(`
Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.
It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.
We have only a few rules for the documentation site:
All code should be written in English.
All code should be written in a way that is easy to understand.
All code should be written in a way that is easy to maintain.
All code should be written in a way that is easy to extend.
Our git commit style is to be followed, in english only.
We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.
Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.
The following is a list of the customizations that we have made to the Conventional Commits standard:
We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.
Our git commit style is as follows:
bash
<type>[optional scope]: <description>[optional body]
diff --git a/assets/development_docs_standards.md.34f5cc0e.lean.js b/assets/development_docs_standards.md.ded806e2.lean.js
similarity index 72%
rename from assets/development_docs_standards.md.34f5cc0e.lean.js
rename to assets/development_docs_standards.md.ded806e2.lean.js
index bfc0481..31db69b 100644
--- a/assets/development_docs_standards.md.34f5cc0e.lean.js
+++ b/assets/development_docs_standards.md.ded806e2.lean.js
@@ -1 +1 @@
-import{_ as e,o as s,c as a,V as n}from"./chunks/framework.7384f92b.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n("",18),l=[o];function i(r,c,p,d,h,m){return s(),a("div",null,l)}const C=e(t,[["render",i]]);export{y as __pageData,C as default};
+import{_ as e,o as s,c as a,S as n}from"./chunks/framework.17985c0a.js";const y=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),t={name:"development/docs/standards.md"},o=n("",18),l=[o];function i(r,c,p,d,h,m){return s(),a("div",null,l)}const C=e(t,[["render",i]]);export{y as __pageData,C as default};
diff --git a/assets/firmware_guide_configure_firmware.md.1156a298.js b/assets/firmware_guide_configure_firmware.md.f3dbc3bf.js
similarity index 95%
rename from assets/firmware_guide_configure_firmware.md.1156a298.js
rename to assets/firmware_guide_configure_firmware.md.f3dbc3bf.js
index 6b8cab7..2123918 100644
--- a/assets/firmware_guide_configure_firmware.md.1156a298.js
+++ b/assets/firmware_guide_configure_firmware.md.f3dbc3bf.js
@@ -1 +1 @@
-import{_ as s,a as d}from"./chunks/index.3b745ef0.js";import{_ as n,i}from"./chunks/index.9f7265df.js";import{o as h,c,G as t,b as a,B as l,z as e,a as o,V as r}from"./chunks/framework.7384f92b.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"")],-1),m=r('
INFO
These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.
Replace the placeholder text with your correct SSID (WiFi access point name), and password respectfully.
INFO
Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.
Spaces are not supported either. If you have a space in either, you will need to change it.
The firmware supports AP mode, but it is not recommended. If you are using AP mode, you will need to set the enableadhoc to 1.
Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.
You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.
Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.
',3),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),_=r('
Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.
If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This will only work if you are connected to the same network as the ESPs, and if you have enabled mDNS on your computer. If you are using Windows, you can enable mDNS by following this guide.
The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.
You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.
The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.
This feature is used more for advanced users, and is not required for basic operation.
The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.
The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.
We are working on a new app that will allow you to configure the firmware, flash the boards, and connect to Social VR Games using a GUI. This will make it easier to configure the firmware, and will allow you to configure the firmware without having to use/download VSCode or our platformio project. We are hard at work on this, but do not currently have a release date. Please check back frequently.
',17),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1687799549000}'),g={name:"firmware_guide/configure_firmware.md"},E=Object.assign(g,{setup(y){return(b,P)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{k as __pageData,E as default};
+import{_ as s,a as d}from"./chunks/index.4ffa16ab.js";import{_ as n,i}from"./chunks/index.d657d51d.js";import{o as h,c,C as t,b as a,y as l,v as e,a as o,S as r}from"./chunks/framework.17985c0a.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"")],-1),m=r('
INFO
These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.
Replace the placeholder text with your correct SSID (WiFi access point name), and password respectfully.
INFO
Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.
Spaces are not supported either. If you have a space in either, you will need to change it.
The firmware supports AP mode, but it is not recommended. If you are using AP mode, you will need to set the enableadhoc to 1.
Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.
You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.
Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.
',3),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),_=r('
Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.
If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This will only work if you are connected to the same network as the ESPs, and if you have enabled mDNS on your computer. If you are using Windows, you can enable mDNS by following this guide.
The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.
You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.
The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.
This feature is used more for advanced users, and is not required for basic operation.
The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.
The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.
We are working on a new app that will allow you to configure the firmware, flash the boards, and connect to Social VR Games using a GUI. This will make it easier to configure the firmware, and will allow you to configure the firmware without having to use/download VSCode or our platformio project. We are hard at work on this, but do not currently have a release date. Please check back frequently.
',17),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1687799549000}'),y={name:"firmware_guide/configure_firmware.md"},E=Object.assign(y,{setup(g){return(b,P)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{k as __pageData,E as default};
diff --git a/assets/firmware_guide_configure_firmware.md.1156a298.lean.js b/assets/firmware_guide_configure_firmware.md.f3dbc3bf.lean.js
similarity index 81%
rename from assets/firmware_guide_configure_firmware.md.1156a298.lean.js
rename to assets/firmware_guide_configure_firmware.md.f3dbc3bf.lean.js
index ea70b2a..34f3c54 100644
--- a/assets/firmware_guide_configure_firmware.md.1156a298.lean.js
+++ b/assets/firmware_guide_configure_firmware.md.f3dbc3bf.lean.js
@@ -1 +1 @@
-import{_ as s,a as d}from"./chunks/index.3b745ef0.js";import{_ as n,i}from"./chunks/index.9f7265df.js";import{o as h,c,G as t,b as a,B as l,z as e,a as o,V as r}from"./chunks/framework.7384f92b.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"")],-1),m=r("",3),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),_=r("",17),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1687799549000}'),g={name:"firmware_guide/configure_firmware.md"},E=Object.assign(g,{setup(y){return(b,P)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{k as __pageData,E as default};
+import{_ as s,a as d}from"./chunks/index.4ffa16ab.js";import{_ as n,i}from"./chunks/index.d657d51d.js";import{o as h,c,C as t,b as a,y as l,v as e,a as o,S as r}from"./chunks/framework.17985c0a.js";const u=e("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[o("Configuring the firmware "),e("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"")],-1),p=e("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[o("Once you have opened the project, you should see something on the left side like this "),e("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"")],-1),f=e("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[o("Open the "),e("code",null,"ini/user_config.ini"),o(" file "),e("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"")],-1),m=r("",3),w=e("p",null," Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1),_=r("",17),k=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1687799549000}'),y={name:"firmware_guide/configure_firmware.md"},E=Object.assign(y,{setup(g){return(b,P)=>(h(),c("div",null,[u,p,t(n,{options:a(i).configure_firmware_one},null,8,["options"]),f,t(n,{options:a(i).configure_firmware_two},null,8,["options"]),m,t(s,{options:a(d).parts_list_one},{content:l(()=>[w]),_:1},8,["options"]),_]))}});export{k as __pageData,E as default};
diff --git a/assets/firmware_guide_environments.md.a939c975.js b/assets/firmware_guide_environments.md.8382e06e.js
similarity index 97%
rename from assets/firmware_guide_environments.md.a939c975.js
rename to assets/firmware_guide_environments.md.8382e06e.js
index 742fdcc..649c5ab 100644
--- a/assets/firmware_guide_environments.md.a939c975.js
+++ b/assets/firmware_guide_environments.md.8382e06e.js
@@ -1 +1 @@
-import{_ as e,i as o}from"./chunks/index.9f7265df.js";import{o as i,c as t,G as s,b as n,V as a}from"./chunks/framework.7384f92b.js";const r=a('
A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.
We use environments to store the firmware config for each device, so that you can easily switch between them.
Environments are broken up into two distinct parts:
We now have a couple of options letting us decide how we want to build the firmware.
Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.
_release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.
Examples: xiaosenses3 - This is the debug environment. xiaosenses3_release - This is the release environment for daily use.
Tip
We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.
We currently support for several different boards, and we are working on adding more.
Warning
It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.
Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.
Currently supported boards:
esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
esp32M5Stack - This is for ESP32M5Stack.
esp32WRover - This is for the ESP32WRover.
esp-eye - This is for the ESP-EYE (not the S3 variant).
wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)
You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:
',17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1687804210000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default};
+import{_ as e,i as o}from"./chunks/index.d657d51d.js";import{o as i,c as t,C as s,b as n,S as a}from"./chunks/framework.17985c0a.js";const r=a('
A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.
We use environments to store the firmware config for each device, so that you can easily switch between them.
Environments are broken up into two distinct parts:
We now have a couple of options letting us decide how we want to build the firmware.
Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.
_release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.
Examples: xiaosenses3 - This is the debug environment. xiaosenses3_release - This is the release environment for daily use.
Tip
We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.
We currently support for several different boards, and we are working on adding more.
Warning
It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.
Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.
Currently supported boards:
esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
esp32M5Stack - This is for ESP32M5Stack.
esp32WRover - This is for the ESP32WRover.
esp-eye - This is for the ESP-EYE (not the S3 variant).
wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)
You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:
',17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1687804210000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default};
diff --git a/assets/firmware_guide_environments.md.a939c975.lean.js b/assets/firmware_guide_environments.md.8382e06e.lean.js
similarity index 77%
rename from assets/firmware_guide_environments.md.a939c975.lean.js
rename to assets/firmware_guide_environments.md.8382e06e.lean.js
index 771dc37..383f392 100644
--- a/assets/firmware_guide_environments.md.a939c975.lean.js
+++ b/assets/firmware_guide_environments.md.8382e06e.lean.js
@@ -1 +1 @@
-import{_ as e,i as o}from"./chunks/index.9f7265df.js";import{o as i,c as t,G as s,b as n,V as a}from"./chunks/framework.7384f92b.js";const r=a("",17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1687804210000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default};
+import{_ as e,i as o}from"./chunks/index.d657d51d.js";import{o as i,c as t,C as s,b as n,S as a}from"./chunks/framework.17985c0a.js";const r=a("",17),u=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1687804210000}'),d={name:"firmware_guide/environments.md"},f=Object.assign(d,{setup(l){return(c,m)=>(i(),t("div",null,[r,s(e,{options:n(o).esp_board_env},null,8,["options"])]))}});export{u as __pageData,f as default};
diff --git a/assets/firmware_guide_firmware.md.2acb6454.js b/assets/firmware_guide_firmware.md.16809ca6.js
similarity index 92%
rename from assets/firmware_guide_firmware.md.2acb6454.js
rename to assets/firmware_guide_firmware.md.16809ca6.js
index 50d3ab7..0e9700e 100644
--- a/assets/firmware_guide_firmware.md.2acb6454.js
+++ b/assets/firmware_guide_firmware.md.16809ca6.js
@@ -1 +1 @@
-import{_ as e,o as a,c as t,V as o}from"./chunks/framework.7384f92b.js";const f=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),r={name:"firmware_guide/firmware.md"},s=o('
Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker.
',6),i=[s];function d(h,n,l,c,_,p){return a(),t("div",null,i)}const u=e(r,[["render",d]]);export{f as __pageData,u as default};
+import{_ as e,o as a,c as t,S as o}from"./chunks/framework.17985c0a.js";const f=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),r={name:"firmware_guide/firmware.md"},s=o('
Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker.
',6),i=[s];function d(h,n,l,c,_,p){return a(),t("div",null,i)}const u=e(r,[["render",d]]);export{f as __pageData,u as default};
diff --git a/assets/firmware_guide_firmware.md.2acb6454.lean.js b/assets/firmware_guide_firmware.md.16809ca6.lean.js
similarity index 71%
rename from assets/firmware_guide_firmware.md.2acb6454.lean.js
rename to assets/firmware_guide_firmware.md.16809ca6.lean.js
index 5802af3..c80c67e 100644
--- a/assets/firmware_guide_firmware.md.2acb6454.lean.js
+++ b/assets/firmware_guide_firmware.md.16809ca6.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as t,V as o}from"./chunks/framework.7384f92b.js";const f=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),r={name:"firmware_guide/firmware.md"},s=o("",6),i=[s];function d(h,n,l,c,_,p){return a(),t("div",null,i)}const u=e(r,[["render",d]]);export{f as __pageData,u as default};
+import{_ as e,o as a,c as t,S as o}from"./chunks/framework.17985c0a.js";const f=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1676590091000}'),r={name:"firmware_guide/firmware.md"},s=o("",6),i=[s];function d(h,n,l,c,_,p){return a(),t("div",null,i)}const u=e(r,[["render",d]]);export{f as __pageData,u as default};
diff --git a/assets/firmware_guide_mdns.md.6911a871.js b/assets/firmware_guide_mdns.md.88fe9005.js
similarity index 97%
rename from assets/firmware_guide_mdns.md.6911a871.js
rename to assets/firmware_guide_mdns.md.88fe9005.js
index 13fe0d2..6f61da7 100644
--- a/assets/firmware_guide_mdns.md.6911a871.js
+++ b/assets/firmware_guide_mdns.md.88fe9005.js
@@ -1 +1 @@
-import{_ as e,o as t,c as o,V as a}from"./chunks/framework.7384f92b.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a('
mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.
In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.
The mDNS is enabled by default on the new firmware, and can not be disabled.
To use it, all you need to do is set the name of the device in the firmware config file.
This setting can be located under the [wifi] section of the ini/user_config.ini file.
ini
mdnsname="openiristracker"# do not add .local
1
By default, the name of the device is openiristracker, however you can change it to whatever you want.
Change the name
Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.
To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.
Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.
You can also get the fully tested Bonjour package from us here (for Windows only).
If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.
If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.
',21),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default};
+import{_ as e,o as t,c as o,S as a}from"./chunks/framework.17985c0a.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a('
mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.
In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.
The mDNS is enabled by default on the new firmware, and can not be disabled.
To use it, all you need to do is set the name of the device in the firmware config file.
This setting can be located under the [wifi] section of the ini/user_config.ini file.
ini
mdnsname="openiristracker"# do not add .local
1
By default, the name of the device is openiristracker, however you can change it to whatever you want.
Change the name
Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.
To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.
Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.
You can also get the fully tested Bonjour package from us here (for Windows only).
If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.
If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.
',21),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default};
diff --git a/assets/firmware_guide_mdns.md.6911a871.lean.js b/assets/firmware_guide_mdns.md.88fe9005.lean.js
similarity index 70%
rename from assets/firmware_guide_mdns.md.6911a871.lean.js
rename to assets/firmware_guide_mdns.md.88fe9005.lean.js
index 932e732..08623f1 100644
--- a/assets/firmware_guide_mdns.md.6911a871.lean.js
+++ b/assets/firmware_guide_mdns.md.88fe9005.lean.js
@@ -1 +1 @@
-import{_ as e,o as t,c as o,V as a}from"./chunks/framework.7384f92b.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a("",21),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default};
+import{_ as e,o as t,c as o,S as a}from"./chunks/framework.17985c0a.js";const m=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),n={name:"firmware_guide/mdns.md"},s=a("",21),i=[s];function c(r,d,h,l,u,p){return t(),o("div",null,i)}const v=e(n,[["render",c]]);export{m as __pageData,v as default};
diff --git a/assets/firmware_guide_rest_api.md.ab0c274d.js b/assets/firmware_guide_rest_api.md.f771b252.js
similarity index 99%
rename from assets/firmware_guide_rest_api.md.ab0c274d.js
rename to assets/firmware_guide_rest_api.md.f771b252.js
index 02ddd16..ef53001 100644
--- a/assets/firmware_guide_rest_api.md.ab0c274d.js
+++ b/assets/firmware_guide_rest_api.md.f771b252.js
@@ -1,4 +1,4 @@
-import{_ as s,o as e,c as t,V as a}from"./chunks/framework.7384f92b.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a(`
A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.
We developed a REST API for this project so that we can control the devices more easily from our new app.
Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.
For basic GET requests, you can use your browser of choice.
Any endpoint marked with ** is currently not implemented, and will be implemented in the future.
If you would like to help us implement these endpoints, please contact us.
We are also open to suggestions for new endpoints.
Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.
The REST API has the following endpoints:
Endpoint
Method
Description
/ping
GET
Returns the status of the device.
/save
GET
Writes any changes to the flash.
/restartDevice
GET
Restarts the ESP itself.
/restartCamera
GET
Restarts the camera.
/resetConfig
GET
Clears the current config in memory and RAM
/getStoredConfig
GET
Returns a JSON object of the devices current config.
/setTxPower
POST
Sets the Transmission Power of the ESPs
/setDevice
POST
Sets the OTA and mDNS settings
/setCamera
POST
Sets all of the camera settings
/wifi
POST
Adds a new wifi network, or writes over an existing one
/wifi
DELETE
Deletes a wifi network **
Note
/wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.
We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.
Param
Description
ssid
The ssid of the network.
password
The password of the network.
networkName
The unique name (given by you) to refer to that network in memory.
channel
The channel for the wifi network to broadcast on only 1 - 14 are allowed.
power
The Transmittion power of the ESP for that network config.
adhoc
Whether to enable AP mode or not.
Note - Transmission Power
You must follow the following format for the power param:
Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.
cpp
typedefenum{
+import{_ as s,o as e,c as t,S as a}from"./chunks/framework.17985c0a.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a(`
A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.
We developed a REST API for this project so that we can control the devices more easily from our new app.
Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.
For basic GET requests, you can use your browser of choice.
Any endpoint marked with ** is currently not implemented, and will be implemented in the future.
If you would like to help us implement these endpoints, please contact us.
We are also open to suggestions for new endpoints.
Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.
The REST API has the following endpoints:
Endpoint
Method
Description
/ping
GET
Returns the status of the device.
/save
GET
Writes any changes to the flash.
/restartDevice
GET
Restarts the ESP itself.
/restartCamera
GET
Restarts the camera.
/resetConfig
GET
Clears the current config in memory and RAM
/getStoredConfig
GET
Returns a JSON object of the devices current config.
/setTxPower
POST
Sets the Transmission Power of the ESPs
/setDevice
POST
Sets the OTA and mDNS settings
/setCamera
POST
Sets all of the camera settings
/wifi
POST
Adds a new wifi network, or writes over an existing one
/wifi
DELETE
Deletes a wifi network **
Note
/wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.
We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.
Param
Description
ssid
The ssid of the network.
password
The password of the network.
networkName
The unique name (given by you) to refer to that network in memory.
channel
The channel for the wifi network to broadcast on only 1 - 14 are allowed.
power
The Transmittion power of the ESP for that network config.
adhoc
Whether to enable AP mode or not.
Note - Transmission Power
You must follow the following format for the power param:
Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.
cpp
typedefenum{WIFI_POWER_19_5dBm=78,// 19.5dBmWIFI_POWER_19dBm=76,// 19dBmWIFI_POWER_18_5dBm=74,// 18.5dBm
diff --git a/assets/firmware_guide_rest_api.md.ab0c274d.lean.js b/assets/firmware_guide_rest_api.md.f771b252.lean.js
similarity index 71%
rename from assets/firmware_guide_rest_api.md.ab0c274d.lean.js
rename to assets/firmware_guide_rest_api.md.f771b252.lean.js
index 323cbf1..5b12124 100644
--- a/assets/firmware_guide_rest_api.md.ab0c274d.lean.js
+++ b/assets/firmware_guide_rest_api.md.f771b252.lean.js
@@ -1 +1 @@
-import{_ as s,o as e,c as t,V as a}from"./chunks/framework.7384f92b.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a("",33),o=[l];function p(r,c,i,d,y,F){return e(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
+import{_ as s,o as e,c as t,S as a}from"./chunks/framework.17985c0a.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1676223729000}'),n={name:"firmware_guide/rest_api.md"},l=a("",33),o=[l];function p(r,c,i,d,y,F){return e(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
diff --git a/assets/firmware_guide_setup_vscode.md.5916e117.js b/assets/firmware_guide_setup_vscode.md.1e2f05f2.js
similarity index 93%
rename from assets/firmware_guide_setup_vscode.md.5916e117.js
rename to assets/firmware_guide_setup_vscode.md.1e2f05f2.js
index 8687868..c90fbbd 100644
--- a/assets/firmware_guide_setup_vscode.md.5916e117.js
+++ b/assets/firmware_guide_setup_vscode.md.1e2f05f2.js
@@ -1 +1 @@
-import{_ as o,i as a}from"./chunks/index.9f7265df.js";import{o as i,c as s,G as n,b as r,V as l,z as e,a as t}from"./chunks/framework.7384f92b.js";const d=l('
',6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"")],-1),c=e("br",null,null,-1),_=l('
Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.
If you do not have git installed please install it from here.
Open Git Bash.
',3),u=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:/")])],-1),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),g=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),w=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),v=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),V=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},P=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,n(o,{options:r(a).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:r(a).setup_vscode_image_two},null,8,["options"]),_,n(o,{options:r(a).setup_vscode_image_three},null,8,["options"]),p,n(o,{options:r(a).setup_vscode_image_four},null,8,["options"]),u,n(o,{options:r(a).setup_vscode_image_five},null,8,["options"]),m,n(o,{options:r(a).setup_vscode_image_six},null,8,["options"]),f,g,w,n(o,{options:r(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{V as __pageData,P as default};
+import{_ as o,i as a}from"./chunks/index.d657d51d.js";import{o as i,c as s,C as n,b as r,S as l,v as e,a as t}from"./chunks/framework.17985c0a.js";const d=l('
',6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"")],-1),c=e("br",null,null,-1),_=l('
Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.
If you do not have git installed please install it from here.
Open Git Bash.
',3),u=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:/")])],-1),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),g=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),w=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),v=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),P=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},V=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,n(o,{options:r(a).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:r(a).setup_vscode_image_two},null,8,["options"]),_,n(o,{options:r(a).setup_vscode_image_three},null,8,["options"]),p,n(o,{options:r(a).setup_vscode_image_four},null,8,["options"]),u,n(o,{options:r(a).setup_vscode_image_five},null,8,["options"]),m,n(o,{options:r(a).setup_vscode_image_six},null,8,["options"]),f,g,w,n(o,{options:r(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{P as __pageData,V as default};
diff --git a/assets/firmware_guide_setup_vscode.md.5916e117.lean.js b/assets/firmware_guide_setup_vscode.md.1e2f05f2.lean.js
similarity index 84%
rename from assets/firmware_guide_setup_vscode.md.5916e117.lean.js
rename to assets/firmware_guide_setup_vscode.md.1e2f05f2.lean.js
index 0c27c88..6813779 100644
--- a/assets/firmware_guide_setup_vscode.md.5916e117.lean.js
+++ b/assets/firmware_guide_setup_vscode.md.1e2f05f2.lean.js
@@ -1 +1 @@
-import{_ as o,i as a}from"./chunks/index.9f7265df.js";import{o as i,c as s,G as n,b as r,V as l,z as e,a as t}from"./chunks/framework.7384f92b.js";const d=l("",6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"")],-1),c=e("br",null,null,-1),_=l("",5),p=l("",3),u=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:/")])],-1),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),g=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),w=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),v=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),V=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},P=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,n(o,{options:r(a).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:r(a).setup_vscode_image_two},null,8,["options"]),_,n(o,{options:r(a).setup_vscode_image_three},null,8,["options"]),p,n(o,{options:r(a).setup_vscode_image_four},null,8,["options"]),u,n(o,{options:r(a).setup_vscode_image_five},null,8,["options"]),m,n(o,{options:r(a).setup_vscode_image_six},null,8,["options"]),f,g,w,n(o,{options:r(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{V as __pageData,P as default};
+import{_ as o,i as a}from"./chunks/index.d657d51d.js";import{o as i,c as s,C as n,b as r,S as l,v as e,a as t}from"./chunks/framework.17985c0a.js";const d=l("",6),h=e("h3",{id:"install",tabindex:"-1"},[t("Install "),e("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"")],-1),c=e("br",null,null,-1),_=l("",5),p=l("",3),u=e("ol",null,[e("li",null,[t("Change the directory to the directory that you want the firmware to be cloned. Ex: "),e("code",null,"cd C:/")])],-1),m=e("ol",null,[e("li",null,[t("Clone the repository by entering the command: "),e("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1),f=e("p",null,[t("For more info about cloning please refer to "),e("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1),g=e("p",null,[e("em",null,[e("strong",null,"Do not download as a zip")]),t(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1),w=e("ol",null,[e("li",null,[t("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),e("code",null,"OpenIris/ESP"),t(" folder and opening it.")])],-1),v=e("p",null,[e("em",null,[t("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),e("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1),P=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),b={name:"firmware_guide/setup_vscode.md"},V=Object.assign(b,{setup(I){return(k,S)=>(i(),s("div",null,[d,n(o,{options:r(a).setup_vscode_image_one},null,8,["options"]),h,c,n(o,{options:r(a).setup_vscode_image_two},null,8,["options"]),_,n(o,{options:r(a).setup_vscode_image_three},null,8,["options"]),p,n(o,{options:r(a).setup_vscode_image_four},null,8,["options"]),u,n(o,{options:r(a).setup_vscode_image_five},null,8,["options"]),m,n(o,{options:r(a).setup_vscode_image_six},null,8,["options"]),f,g,w,n(o,{options:r(a).setup_vscode_image_seven},null,8,["options"]),v]))}});export{P as __pageData,V as default};
diff --git a/assets/firmware_guide_update_platformio.md.9f4a42e7.js b/assets/firmware_guide_update_platformio.md.bd8c1a40.js
similarity index 93%
rename from assets/firmware_guide_update_platformio.md.9f4a42e7.js
rename to assets/firmware_guide_update_platformio.md.bd8c1a40.js
index a25735d..fb6cf6f 100644
--- a/assets/firmware_guide_update_platformio.md.9f4a42e7.js
+++ b/assets/firmware_guide_update_platformio.md.bd8c1a40.js
@@ -1 +1 @@
-import{_ as a,i as e}from"./chunks/index.9f7265df.js";import{o as s,c as r,G as i,b as l,V as n,z as o,a as t}from"./chunks/framework.7384f92b.js";const d=n('
Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.
It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.
You can also update it using the platformio tab in your Visual Studio Code.
Open VSC
Click on that little and icon on the sidebar
',4),p=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=n('
Follow the guide above up until clicking on the Quick Access section.
Instead, open the PIO Home and select Open
',5),m=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),v=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{v as __pageData,w as default};
+import{_ as a,i as e}from"./chunks/index.d657d51d.js";import{o as s,c as r,C as i,b as l,S as n,v as o,a as t}from"./chunks/framework.17985c0a.js";const d=n('
Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.
It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.
You can also update it using the platformio tab in your Visual Studio Code.
Open VSC
Click on that little and icon on the sidebar
',4),p=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=n('
Follow the guide above up until clicking on the Quick Access section.
Instead, open the PIO Home and select Open
',5),m=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),V=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{V as __pageData,w as default};
diff --git a/assets/firmware_guide_update_platformio.md.9f4a42e7.lean.js b/assets/firmware_guide_update_platformio.md.bd8c1a40.lean.js
similarity index 85%
rename from assets/firmware_guide_update_platformio.md.9f4a42e7.lean.js
rename to assets/firmware_guide_update_platformio.md.bd8c1a40.lean.js
index 62bf4b3..be66928 100644
--- a/assets/firmware_guide_update_platformio.md.9f4a42e7.lean.js
+++ b/assets/firmware_guide_update_platformio.md.bd8c1a40.lean.js
@@ -1 +1 @@
-import{_ as a,i as e}from"./chunks/index.9f7265df.js";import{o as s,c as r,G as i,b as l,V as n,z as o,a as t}from"./chunks/framework.7384f92b.js";const d=n("",7),c=n("",4),p=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=n("",5),m=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),v=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{v as __pageData,w as default};
+import{_ as a,i as e}from"./chunks/index.d657d51d.js";import{o as s,c as r,C as i,b as l,S as n,v as o,a as t}from"./chunks/framework.17985c0a.js";const d=n("",7),c=n("",4),p=o("ol",{start:"3"},[o("li",null,[t("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),t(", open it.")])],-1),u=o("ol",{start:"4"},[o("li",null,[t("In "),o("code",null,"Quick Access"),t(" section, click on the "),o("code",null,"Miscelleneous"),t(" tab")])],-1),_=o("ol",{start:"5"},[o("li",null,[t("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1),h=n("",5),m=o("ol",{start:"3"},[o("li",null,[t("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),t(" button on the sidebar")])],-1),f=o("ol",{start:"4"},[o("li",null,[t("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),t(" or "),o("code",null,"Embedded"),t(". Click on "),o("code",null,"Updates")])],-1),g=o("ol",{start:"5"},[o("li",null,[t("Locate a platform called "),o("code",null,"Espressif 32"),t(" and click on "),o("code",null,"Update to ")])],-1),b=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1),V=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),k={name:"firmware_guide/update_platformio.md"},w=Object.assign(k,{setup(P){return(S,T)=>(s(),r("div",null,[d,i(a,{options:l(e).pio_upgrade_command},null,8,["options"]),c,i(a,{options:l(e).ant_logo_platformio},null,8,["options"]),p,i(a,{options:l(e).platformio_quick_access},null,8,["options"]),u,i(a,{options:l(e).platformio_quick_access_miscellaneous},null,8,["options"]),_,i(a,{options:l(e).platformio_quick_access_upgrade_core},null,8,["options"]),h,i(a,{options:l(e).platformio_pio_home},null,8,["options"]),m,i(a,{options:l(e).platformio_pio_sidebar_platforms},null,8,["options"]),f,i(a,{options:l(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),g,i(a,{options:l(e).platformio_pio_espressif32},null,8,["options"]),b]))}});export{V as __pageData,w as default};
diff --git a/assets/firmware_guide_upload_and_update_firmware.md.72da2ad7.js b/assets/firmware_guide_upload_and_update_firmware.md.857677c5.js
similarity index 98%
rename from assets/firmware_guide_upload_and_update_firmware.md.72da2ad7.js
rename to assets/firmware_guide_upload_and_update_firmware.md.857677c5.js
index 1508b77..17c0adb 100644
--- a/assets/firmware_guide_upload_and_update_firmware.md.72da2ad7.js
+++ b/assets/firmware_guide_upload_and_update_firmware.md.857677c5.js
@@ -1,4 +1,4 @@
-import{_ as s,a as l}from"./chunks/index.3b745ef0.js";import{_ as a,i as r}from"./chunks/index.9f7265df.js";import{o as u,c as d,G as o,B as p,b as t,V as i,z as e,a as n}from"./chunks/framework.7384f92b.js";const h=i('
Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.
First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable.
In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your PC, once plugged in you can release the button.
In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.
To begin, connect your ESP32-S3 board directly to your PC.
On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.
Once the firmware has been built, press the upload button to upload the firmware.
This sends the firmware to the ESP.
',17),c=e("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),m=i('
If the upload is successful, you should get an output that looks like this:
Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!
If you have trouble with uploading your firmware over cable check the following:
Make sure your USB cable from the tracker is plugged firmly into your PC.
Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
Make sure that your drivers are up-to-date.
Some ports might not work, try other ones.
Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).
Once you have manually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.
Coming Soon
Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.
Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.
',14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i('
Turn on your trackers and wait for them to connect to Wi-Fi
',3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),C=i(`
Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
In the ini/user_config.ini file:
Put IP or hostname of device into config file
Like so:
ini
[ota]
+import{_ as s,a as l}from"./chunks/index.4ffa16ab.js";import{_ as a,i as r}from"./chunks/index.d657d51d.js";import{o as u,c as d,C as o,y as p,b as t,S as i,v as e,a as n}from"./chunks/framework.17985c0a.js";const h=i('
Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.
First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable.
In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your PC, once plugged in you can release the button.
In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.
To begin, connect your ESP32-S3 board directly to your PC.
On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.
Once the firmware has been built, press the upload button to upload the firmware.
This sends the firmware to the ESP.
',17),c=e("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),m=i('
If the upload is successful, you should get an output that looks like this:
Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!
If you have trouble with uploading your firmware over cable check the following:
Make sure your USB cable from the tracker is plugged firmly into your PC.
Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
Make sure that your drivers are up-to-date.
Some ports might not work, try other ones.
Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).
Once you have manually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.
Coming Soon
Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.
Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.
',14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i('
Turn on your trackers and wait for them to connect to Wi-Fi
',3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),C=i(`
Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
In the ini/user_config.ini file:
Put IP or hostname of device into config file
Like so:
ini
[ota]enableota= 1otaserverip="openiristrackerL.local"# here we use a custom mDNS nameotapassword="12345678"
diff --git a/assets/firmware_guide_upload_and_update_firmware.md.72da2ad7.lean.js b/assets/firmware_guide_upload_and_update_firmware.md.857677c5.lean.js
similarity index 92%
rename from assets/firmware_guide_upload_and_update_firmware.md.72da2ad7.lean.js
rename to assets/firmware_guide_upload_and_update_firmware.md.857677c5.lean.js
index c8e4f8a..3bb2ebf 100644
--- a/assets/firmware_guide_upload_and_update_firmware.md.72da2ad7.lean.js
+++ b/assets/firmware_guide_upload_and_update_firmware.md.857677c5.lean.js
@@ -1 +1 @@
-import{_ as s,a as l}from"./chunks/index.3b745ef0.js";import{_ as a,i as r}from"./chunks/index.9f7265df.js";import{o as u,c as d,G as o,B as p,b as t,V as i,z as e,a as n}from"./chunks/framework.7384f92b.js";const h=i("",17),c=e("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),m=i("",14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i("",3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),C=i("",8),S=e("p",null,"This will open a list of all available environments, select the one that matches your board and has a _OTA suffix",-1),A=i("",3),P=e("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),D=i("",5),I=e("p",null," Skip this step if the update message denotes that the config had changed. If it does so, retype your credentials in the updated files. ",-1),F=i("",6),U=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),O={name:"firmware_guide/upload_and_update_firmware.md"},R=Object.assign(O,{setup(q){return(E,x)=>(u(),d("div",null,[h,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[c]),_:1},8,["options"]),m,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[f]),_:1},8,["options"]),_,o(a,{options:t(r).upload_firmware_build_button},null,8,["options"]),g,o(a,{options:t(r).upload_firmware_webpage},null,8,["options"]),y,w,b,o(a,{options:t(r).upload_firmware_webpage_directory},null,8,["options"]),v,k,o(a,{options:t(r).upload_firmware_webpage_directory_file},null,8,["options"]),T,o(a,{options:t(r).upload_firmware_webpage_upload_finished},null,8,["options"]),C,o(a,{options:t(r).upload_firmware_select_env},null,8,["options"]),S,o(a,{options:t(r).upload_firmware_select_env_dropdown},null,8,["options"]),A,o(a,{options:t(r).upload_firmware_image_one},null,8,["options"]),P,o(a,{options:t(r).upload_firmware_image_two},null,8,["options"]),D,o(s,{options:t(l).user_warning},{content:p(()=>[I]),_:1},8,["options"]),F]))}});export{U as __pageData,R as default};
+import{_ as s,a as l}from"./chunks/index.4ffa16ab.js";import{_ as a,i as r}from"./chunks/index.d657d51d.js";import{o as u,c as d,C as o,y as p,b as t,S as i,v as e,a as n}from"./chunks/framework.17985c0a.js";const h=i("",17),c=e("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1),m=i("",14),f=e("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1),_=e("ol",null,[e("li",null,[n("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),e("code",null,"_OTA"),n(" suffix. Next, press the checkmark button to build it without uploading.")])],-1),g=i("",3),y=e("p",null,[n("Click on the select file button, and navigate to where you cloned the project and then to the "),e("code",null,"ESP/"),n(" directory.")],-1),w=e("p",null,[n("Once there, open "),e("code",null,".pio\\build\\your-environment"),n(" like so:")],-1),b=e("blockquote",null,[e("p",null,[n("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),e("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1),v=e("p",null,[n("You'll find a couple files in there, select the one named "),e("code",null,"your-environment-vVersion-feature"),n(".")],-1),k=e("p",null,"like this one:",-1),T=e("ol",{start:"5"},[e("li",null,"Press upload and wait for it to finish. Done!")],-1),C=i("",8),S=e("p",null,"This will open a list of all available environments, select the one that matches your board and has a _OTA suffix",-1),A=i("",3),P=e("p",null,"Now, press the restart button on the esp itself. watch the monitor for output like this:",-1),D=i("",5),I=e("p",null," Skip this step if the update message denotes that the config had changed. If it does so, retype your credentials in the updated files. ",-1),F=i("",6),U=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),O={name:"firmware_guide/upload_and_update_firmware.md"},R=Object.assign(O,{setup(q){return(E,x)=>(u(),d("div",null,[h,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[c]),_:1},8,["options"]),m,o(s,{options:t(l).upload_firmware_one},{content:p(()=>[f]),_:1},8,["options"]),_,o(a,{options:t(r).upload_firmware_build_button},null,8,["options"]),g,o(a,{options:t(r).upload_firmware_webpage},null,8,["options"]),y,w,b,o(a,{options:t(r).upload_firmware_webpage_directory},null,8,["options"]),v,k,o(a,{options:t(r).upload_firmware_webpage_directory_file},null,8,["options"]),T,o(a,{options:t(r).upload_firmware_webpage_upload_finished},null,8,["options"]),C,o(a,{options:t(r).upload_firmware_select_env},null,8,["options"]),S,o(a,{options:t(r).upload_firmware_select_env_dropdown},null,8,["options"]),A,o(a,{options:t(r).upload_firmware_image_one},null,8,["options"]),P,o(a,{options:t(r).upload_firmware_image_two},null,8,["options"]),D,o(s,{options:t(l).user_warning},{content:p(()=>[I]),_:1},8,["options"]),F]))}});export{U as __pageData,R as default};
diff --git a/assets/getting_started_intro.md.8a7af83f.js b/assets/getting_started_intro.md.8d6c94c1.js
similarity index 96%
rename from assets/getting_started_intro.md.8a7af83f.js
rename to assets/getting_started_intro.md.8d6c94c1.js
index 87e3545..468dd11 100644
--- a/assets/getting_started_intro.md.8a7af83f.js
+++ b/assets/getting_started_intro.md.8d6c94c1.js
@@ -1 +1 @@
-import{_ as s,a as i}from"./chunks/index.3b745ef0.js";import{_ as l,i as d}from"./chunks/index.9f7265df.js";import{o as c,c as h,G as a,B as n,b as r,V as t,z as e,a as o}from"./chunks/framework.7384f92b.js";const u=t('
Open source and affordable VR eye tracker platform for Social VR Games via OSC and UDP protocol.
Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.
Please exercise caution when messing around with IR emitters.
IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself, just do exactly what we do. Don't use different emitters, dont use differnt means of power, etc.
DANGER
It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.
The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.
',5),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=t('Want to see the safety data sheets?
In theory, we are compatible with every VR headset. However, mounts may not have been made yet. Please take a look at our list of 3d printable mounts and see if your headset is on the list. If it is not listed, It is recommended that you try to make a mount, or wait for a skilled community member to create one.
All software is under the MIT License. All documentation, including the Wiki, is under the Creative Commons CC-BY-SA-4.0 license.
',3),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1689709860000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default};
+import{_ as s,a as i}from"./chunks/index.4ffa16ab.js";import{_ as l,i as d}from"./chunks/index.d657d51d.js";import{o as c,c as h,C as a,y as n,b as r,S as t,v as e,a as o}from"./chunks/framework.17985c0a.js";const u=t('
Open source and affordable VR eye tracker platform for Social VR Games via OSC and UDP protocol.
Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.
Please exercise caution when messing around with IR emitters.
IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself, just do exactly what we do. Don't use different emitters, dont use differnt means of power, etc.
DANGER
It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.
The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.
',5),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=t('Want to see the safety data sheets?
In theory, we are compatible with every VR headset. However, mounts may not have been made yet. Please take a look at our list of 3d printable mounts and see if your headset is on the list. If it is not listed, It is recommended that you try to make a mount, or wait for a skilled community member to create one.
All software is under the MIT License. All documentation, including the Wiki, is under the Creative Commons CC-BY-SA-4.0 license.
',3),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1689709860000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default};
diff --git a/assets/getting_started_intro.md.8a7af83f.lean.js b/assets/getting_started_intro.md.8d6c94c1.lean.js
similarity index 76%
rename from assets/getting_started_intro.md.8a7af83f.lean.js
rename to assets/getting_started_intro.md.8d6c94c1.lean.js
index d280a09..c18d60c 100644
--- a/assets/getting_started_intro.md.8a7af83f.lean.js
+++ b/assets/getting_started_intro.md.8d6c94c1.lean.js
@@ -1 +1 @@
-import{_ as s,a as i}from"./chunks/index.3b745ef0.js";import{_ as l,i as d}from"./chunks/index.9f7265df.js";import{o as c,c as h,G as a,B as n,b as r,V as t,z as e,a as o}from"./chunks/framework.7384f92b.js";const u=t("",4),_=e("p",null," This project is in active development. However, it is working for most users. ",-1),p=t("",5),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=t("",9),b=t("",3),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1689709860000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default};
+import{_ as s,a as i}from"./chunks/index.4ffa16ab.js";import{_ as l,i as d}from"./chunks/index.d657d51d.js";import{o as c,c as h,C as a,y as n,b as r,S as t,v as e,a as o}from"./chunks/framework.17985c0a.js";const u=t("",4),_=e("p",null," This project is in active development. However, it is working for most users. ",-1),p=t("",5),f=e("p",null,[o(" Make sure you are using "),e("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),o(" emitters and no more than "),e("ins",{class:"font-bold"},"5 mW/sr"),o(" total power. ")],-1),m=t("",9),b=t("",3),R=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1689709860000}'),y={name:"getting_started/intro.md"},I=Object.assign(y,{setup(g){return(k,w)=>(c(),h("div",null,[u,a(s,{options:r(i).user_warning},{content:n(()=>[_]),_:1},8,["options"]),p,a(s,{options:r(i).led_power_warning},{content:n(()=>[f]),_:1},8,["options"]),m,a(l,{options:r(d).discord_content},null,8,["options"]),b]))}});export{R as __pageData,I as default};
diff --git a/assets/getting_started_led_safety.md.d76c624b.js b/assets/getting_started_led_safety.md.50db11e5.js
similarity index 97%
rename from assets/getting_started_led_safety.md.d76c624b.js
rename to assets/getting_started_led_safety.md.50db11e5.js
index 2bbba68..809c218 100644
--- a/assets/getting_started_led_safety.md.d76c624b.js
+++ b/assets/getting_started_led_safety.md.50db11e5.js
@@ -1 +1 @@
-import{_ as t,a}from"./chunks/index.3b745ef0.js";import{o,c as s,G as r,B as i,b as n,V as e,z as l}from"./chunks/framework.7384f92b.js";const u=e('
Please exercise caution when messing around with IR emitters.
IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself or are not understand something, just do exactly what we do. Don't use different emitters, don't use different means of power, etc.
DANGER
It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.
The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth, excessive eye-strain or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.
We care about power exposure "W" to the cornea, which we can normalize over the exposed area to Irradiance "mW/cm^2" This number gives us the amount of IR radiation being released into the normalized area. We don't really care about "mA", or "V" alone, as by themselves these do not give us the exposure levels which we need to ensure safety.
Irradiance also needs to take in to account distance of the light source (LED) as the further away you get from a source the weaker the intensity gets. (You can test this by looking at a light source from far away, and as you move closer, the brighter and more painful it is to look at) We do this by using Radiance "mW/cm2/sr" to normalize for the distance. The "sr" is a steradian. Think of it like a cone shape, getting bigger and broader as we move away from the source object.
"To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780nm < > λ < > 3μm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s)"
So 10 mW/cm2 is the max recommended limit given by this source. In my opinion this is still quite high, you will definitely feel some warmth and likely eyestrain after a while.
It is known that when outside and not directly looking at the sun, your eyes get exposed to about 1 mW/cm2 or IR radiation. This is the target I set for hardware generally.
',12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e('
V3 Hardware Safety Outline and Exposure Numbers:
For all of this math we will assume the "worst" to ensure we are well within safety.
if powered with 5V, using 700 ohms of resistance, V3 Hardware will draw 0.00314... Amps. We will round up and convert this to 3.2mA.
(5V - 1.4V - 1.4V) / 700 ohm = 0.00314 ≈ 3.2mA
The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.
5 mW/sr * (3.2mA / 20mA) = 0.8 mW/sr
Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr
0.8 mW/sr / 1cm2/sr = 0.8 mW/cm2
Now, this is only for 1 LED, in the case of V3 we have 2 so we can:
0.8 mW/cm2 * 2 = 1.6 mW/cm2
This value is well below the limit, and close to normal sun exposure outside. If the LEDs were further than 1cm (which they typically are) the exposure would be even less.
V4 Hardware Safety Outline and Exposure Numbers:
For all of this math we will assume the "worst" to ensure we are well within safety.
V4 hardware is actively limited to ~2.4 mA
The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.
5 mW/sr * (2.4mA / 20mA) = 0.6 mW/sr
Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr
0.6 mW/sr / 1cm2/sr = 0.6 mW/cm2
Now, this is only for 1 LED, in the case of V4 we have 4 so we can:
0.6 mW/cm2 * 4 = 2.4 mW/cm2
This value is well below the limit, and not far from sun exposure. If the LEDs were further than 1cm (which they typically are) the exposure would be even less. And with typical eye movement they are less.
',21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default};
+import{_ as t,a}from"./chunks/index.4ffa16ab.js";import{o,c as s,C as r,y as i,b as n,S as e,v as l}from"./chunks/framework.17985c0a.js";const u=e('
Please exercise caution when messing around with IR emitters.
IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself or are not understand something, just do exactly what we do. Don't use different emitters, don't use different means of power, etc.
DANGER
It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.
The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth, excessive eye-strain or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.
We care about power exposure "W" to the cornea, which we can normalize over the exposed area to Irradiance "mW/cm^2" This number gives us the amount of IR radiation being released into the normalized area. We don't really care about "mA", or "V" alone, as by themselves these do not give us the exposure levels which we need to ensure safety.
Irradiance also needs to take in to account distance of the light source (LED) as the further away you get from a source the weaker the intensity gets. (You can test this by looking at a light source from far away, and as you move closer, the brighter and more painful it is to look at) We do this by using Radiance "mW/cm2/sr" to normalize for the distance. The "sr" is a steradian. Think of it like a cone shape, getting bigger and broader as we move away from the source object.
"To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780nm < > λ < > 3μm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s)"
So 10 mW/cm2 is the max recommended limit given by this source. In my opinion this is still quite high, you will definitely feel some warmth and likely eyestrain after a while.
It is known that when outside and not directly looking at the sun, your eyes get exposed to about 1 mW/cm2 or IR radiation. This is the target I set for hardware generally.
',12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e('
V3 Hardware Safety Outline and Exposure Numbers:
For all of this math we will assume the "worst" to ensure we are well within safety.
if powered with 5V, using 700 ohms of resistance, V3 Hardware will draw 0.00314... Amps. We will round up and convert this to 3.2mA.
(5V - 1.4V - 1.4V) / 700 ohm = 0.00314 ≈ 3.2mA
The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.
5 mW/sr * (3.2mA / 20mA) = 0.8 mW/sr
Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr
0.8 mW/sr / 1cm2/sr = 0.8 mW/cm2
Now, this is only for 1 LED, in the case of V3 we have 2 so we can:
0.8 mW/cm2 * 2 = 1.6 mW/cm2
This value is well below the limit, and close to normal sun exposure outside. If the LEDs were further than 1cm (which they typically are) the exposure would be even less.
V4 Hardware Safety Outline and Exposure Numbers:
For all of this math we will assume the "worst" to ensure we are well within safety.
V4 hardware is actively limited to ~2.4 mA
The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.
5 mW/sr * (2.4mA / 20mA) = 0.6 mW/sr
Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr
0.6 mW/sr / 1cm2/sr = 0.6 mW/cm2
Now, this is only for 1 LED, in the case of V4 we have 4 so we can:
0.6 mW/cm2 * 4 = 2.4 mW/cm2
This value is well below the limit, and not far from sun exposure. If the LEDs were further than 1cm (which they typically are) the exposure would be even less. And with typical eye movement they are less.
',21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default};
diff --git a/assets/getting_started_led_safety.md.d76c624b.lean.js b/assets/getting_started_led_safety.md.50db11e5.lean.js
similarity index 82%
rename from assets/getting_started_led_safety.md.d76c624b.lean.js
rename to assets/getting_started_led_safety.md.50db11e5.lean.js
index 2af4194..146a4b7 100644
--- a/assets/getting_started_led_safety.md.d76c624b.lean.js
+++ b/assets/getting_started_led_safety.md.50db11e5.lean.js
@@ -1 +1 @@
-import{_ as t,a}from"./chunks/index.3b745ef0.js";import{o,c as s,G as r,B as i,b as n,V as e,z as l}from"./chunks/framework.7384f92b.js";const u=e("",12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e("",21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default};
+import{_ as t,a}from"./chunks/index.4ffa16ab.js";import{o,c as s,C as r,y as i,b as n,S as e,v as l}from"./chunks/framework.17985c0a.js";const u=e("",12),h=l("p",null,' This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins. ',-1),c=e("",21),b=JSON.parse('{"title":"V3 Hardware Safety Outline and Exposure Numbers:","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1689792906000}'),d={name:"getting_started/led_safety.md"},g=Object.assign(d,{setup(m){return(p,f)=>(o(),s("div",null,[u,r(t,{options:n(a).build_software_one},{content:i(()=>[h]),_:1},8,["options"]),c]))}});export{b as __pageData,g as default};
diff --git a/assets/getting_started_things_to_know.md.ecc362de.js b/assets/getting_started_things_to_know.md.89b13253.js
similarity index 96%
rename from assets/getting_started_things_to_know.md.ecc362de.js
rename to assets/getting_started_things_to_know.md.89b13253.js
index 1fde711..869bd18 100644
--- a/assets/getting_started_things_to_know.md.ecc362de.js
+++ b/assets/getting_started_things_to_know.md.89b13253.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a,V as o}from"./chunks/framework.7384f92b.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=o('
Bugs can and will occur which may hinder the experience or useability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.
If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked ones or ones with specs that match exactly. We will not be responsible for damaged caused if you go your own route.
This will require some basic Unity knowledge and owning your own avatar. Note: 2.0 beta app uses VRC's Native eye tracking which does NOT require a special avatar
Once you have acknowledged the items above, move on to the Full Build Guide
',13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default};
+import{_ as e,o as t,c as a,S as o}from"./chunks/framework.17985c0a.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=o('
Bugs can and will occur which may hinder the experience or useability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.
If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked ones or ones with specs that match exactly. We will not be responsible for damaged caused if you go your own route.
This will require some basic Unity knowledge and owning your own avatar. Note: 2.0 beta app uses VRC's Native eye tracking which does NOT require a special avatar
Once you have acknowledged the items above, move on to the Full Build Guide
',13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default};
diff --git a/assets/getting_started_things_to_know.md.ecc362de.lean.js b/assets/getting_started_things_to_know.md.89b13253.lean.js
similarity index 73%
rename from assets/getting_started_things_to_know.md.ecc362de.lean.js
rename to assets/getting_started_things_to_know.md.89b13253.lean.js
index 41588cf..8fa1b1c 100644
--- a/assets/getting_started_things_to_know.md.ecc362de.lean.js
+++ b/assets/getting_started_things_to_know.md.89b13253.lean.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a,V as o}from"./chunks/framework.7384f92b.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=o("",13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default};
+import{_ as e,o as t,c as a,S as o}from"./chunks/framework.17985c0a.js";const p=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1689711036000}'),r={name:"getting_started/things_to_know.md"},i=o("",13),n=[i];function s(l,d,u,h,c,f){return t(),a("div",null,n)}const w=e(r,[["render",s]]);export{p as __pageData,w as default};
diff --git a/assets/how_to_build_creating_your_own_mount.md.a0eff1b7.js b/assets/how_to_build_creating_your_own_mount.md.610d1805.js
similarity index 97%
rename from assets/how_to_build_creating_your_own_mount.md.a0eff1b7.js
rename to assets/how_to_build_creating_your_own_mount.md.610d1805.js
index f812025..c968ab6 100644
--- a/assets/how_to_build_creating_your_own_mount.md.a0eff1b7.js
+++ b/assets/how_to_build_creating_your_own_mount.md.610d1805.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a,V as o}from"./chunks/framework.7384f92b.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=o('
This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts
So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.
Step 1: Find a way to mount to your headsets lens
The easiest way to get started is to find a lens protector for your headset. Either go to a website like Thingiverse or just do a search for "3d printed lens protector for {your headset here}"
Now, you need a way to attach the camera. We have a basic design that qdot created (taken from his mount) on the hardware GitHub here
Alternatively, you can create your own mount if you have the skills.
Step 3: Place the camera mount where it will give a good camera angle
The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.
You want to put the camera as close to the headset's lens as possible to achieve the biggest view of the eye. I recommend looking at other headset mounts for inspiration.
Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)
',18),i=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default};
+import{_ as e,o as t,c as a,S as o}from"./chunks/framework.17985c0a.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=o('
This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts
So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.
Step 1: Find a way to mount to your headsets lens
The easiest way to get started is to find a lens protector for your headset. Either go to a website like Thingiverse or just do a search for "3d printed lens protector for {your headset here}"
Now, you need a way to attach the camera. We have a basic design that qdot created (taken from his mount) on the hardware GitHub here
Alternatively, you can create your own mount if you have the skills.
Step 3: Place the camera mount where it will give a good camera angle
The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.
You want to put the camera as close to the headset's lens as possible to achieve the biggest view of the eye. I recommend looking at other headset mounts for inspiration.
Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)
',18),i=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default};
diff --git a/assets/how_to_build_creating_your_own_mount.md.a0eff1b7.lean.js b/assets/how_to_build_creating_your_own_mount.md.610d1805.lean.js
similarity index 74%
rename from assets/how_to_build_creating_your_own_mount.md.a0eff1b7.lean.js
rename to assets/how_to_build_creating_your_own_mount.md.610d1805.lean.js
index d43b381..442676d 100644
--- a/assets/how_to_build_creating_your_own_mount.md.a0eff1b7.lean.js
+++ b/assets/how_to_build_creating_your_own_mount.md.610d1805.lean.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a,V as o}from"./chunks/framework.7384f92b.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=o("",18),i=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default};
+import{_ as e,o as t,c as a,S as o}from"./chunks/framework.17985c0a.js";const w=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1689147044000}'),r={name:"how_to_build/creating_your_own_mount.md"},n=o("",18),i=[n];function s(h,u,l,d,c,m){return t(),a("div",null,i)}const y=e(r,[["render",s]]);export{w as __pageData,y as default};
diff --git a/assets/how_to_build_full_build.md.f2c25978.js b/assets/how_to_build_full_build.md.92660a15.js
similarity index 97%
rename from assets/how_to_build_full_build.md.f2c25978.js
rename to assets/how_to_build_full_build.md.92660a15.js
index 3474bf5..996822c 100644
--- a/assets/how_to_build_full_build.md.f2c25978.js
+++ b/assets/how_to_build_full_build.md.92660a15.js
@@ -1 +1 @@
-import{_ as r,a as l}from"./chunks/index.3b745ef0.js";import{_ as h}from"./chunks/CheckBoxList.78ea8d78.js";import{_ as a,i as s}from"./chunks/index.9f7265df.js";import{o as d,c as p,G as t,b as o,z as e,B as c,V as i,a as n}from"./chunks/framework.7384f92b.js";const u={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=i('
This will give you a basic overview of the project's status and what to expect currently.
Step 2: Order all the parts listed on our Parts list
Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.
',12),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"")],-1),f=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),g=e("p",null,"The first option is to use an external antenna.",-1),w=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"")],-1),P=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),T=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),B=i('
Step 8: Configure Visual Studio Code and prepare to flash the firmware
Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.
Step 10: Connect your power wires to a USB Type-A board
WARNING
Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely mess up tracking.
Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.
',8),A=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),q=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),L=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),R=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"")],-1),G=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),O=i('
Get your magnifying glass out, it's time to solder very smol things.
Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.
',5),W=e("p",null,"Here are the PCB pin-out labels:",-1),H=e("p",null,"LED labels:",-1),M=i('
If you have different LEDs, please consult their datasheet.
Some terminology related to them:
5V: 5-volt power in.
GND: Ground or power out.
AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.
SNG: Single resistor, use this as 5V in if you are using only 1~700ohm resistor on V3 boards (not recommended).
Negative: This marks the negative side of the LED.
Positive: This marks the positive side of the LED.
Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.
',11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),F=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),z=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),Y=e("p",null,"Flip the PCB and solder the other end.",-1),$=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"")],-1),Q=e("p",null,"Tin the LED pads.",-1),Z=e("p",null,"Orientate the LED and hold it in place.",-1),K=e("p",null,"Solder one end.",-1),X=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),ae=e("p",null,"Use the following diagram:",-1),se=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ie=i('
Head to the 3D printed parts section of the parts list here.
Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.
Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.
There are 2 different types of mounts, how to secure the camera to each type will be documented below.
',6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ce=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"")],-1),ue=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),fe=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"")],-1),ge=e("p",null,"This again differs from mount to mount.",-1),we=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1682366995000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Pe)=>(d(),p("div",null,[_,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),m,f,g,w,t(a,{options:o(s).external_antenna},null,8,["options"]),b,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),y,v,S,k,P,t(a,{options:o(s).camera_socket},null,8,["options"]),T,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),E,t(a,{options:o(s).camera_cable},null,8,["options"]),x,t(a,{options:o(s).camera_clip_close},null,8,["options"]),C,I,D,t(a,{options:o(s)._7_12_one},null,8,["options"]),B,t(a,{options:o(s)._7_12_two},null,8,["options"]),A,V,q,L,N,t(a,{options:o(s)._7_12_three},null,8,["options"]),R,G,t(a,{options:o(s)._13_18_one},null,8,["options"]),O,t(a,{options:o(s)._13_18_two},null,8,["options"]),U,t(a,{options:o(s)._13_18_three},null,8,["options"]),W,t(a,{options:o(s)._13_18_four},null,8,["options"]),H,t(a,{options:o(s)._13_18_five},null,8,["options"]),M,t(a,{options:o(s)._13_18_six},null,8,["options"]),j,t(a,{options:o(s)._13_18_seven},null,8,["options"]),F,z,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Y,t(a,{options:o(s)._13_18_nine},null,8,["options"]),$,t(a,{options:o(s)._13_18_ten},null,8,["options"]),J,Q,t(a,{options:o(s).end_one},null,8,["options"]),Z,t(a,{options:o(s).end_two},null,8,["options"]),K,t(a,{options:o(s).end_three},null,8,["options"]),X,t(a,{options:o(s).end_four},null,8,["options"]),ee,te,oe,t(a,{options:o(s).end_five},null,8,["options"]),ae,t(a,{options:o(s).end_six},null,8,["options"]),se,t(a,{options:o(s).end_seven},null,8,["options"]),ne,t(a,{options:o(s).end_eight},null,8,["options"]),ie,t(a,{options:o(s).end_nine},null,8,["options"]),re,le,t(a,{options:o(s).end_ten},null,8,["options"]),he,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:c(()=>[pe]),_:1},8,["options"])]),ce,t(a,{options:o(s).end_twelve},null,8,["options"]),ue,_e,t(a,{options:o(s).end_thirteen},null,8,["options"]),me,t(a,{options:o(s).end_fourteen},null,8,["options"]),fe,ge,we,t(a,{options:o(s).end_fifteen},null,8,["options"]),be,t(a,{options:o(s).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default};
+import{_ as r,a as l}from"./chunks/index.4ffa16ab.js";import{_ as h}from"./chunks/CheckBoxList.4e2280d2.js";import{_ as a,i as s}from"./chunks/index.d657d51d.js";import{o as d,c as p,C as t,b as o,v as e,y as c,S as i,a as n}from"./chunks/framework.17985c0a.js";const u={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=i('
This will give you a basic overview of the project's status and what to expect currently.
Step 2: Order all the parts listed on our Parts list
Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.
',12),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"")],-1),f=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),g=e("p",null,"The first option is to use an external antenna.",-1),w=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"")],-1),P=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),T=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),A=i('
Step 8: Configure Visual Studio Code and prepare to flash the firmware
Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.
Step 10: Connect your power wires to a USB Type-A board
WARNING
Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely mess up tracking.
Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.
',8),B=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),q=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),L=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),R=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"")],-1),G=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),O=i('
Get your magnifying glass out, it's time to solder very smol things.
Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.
',5),W=e("p",null,"Here are the PCB pin-out labels:",-1),H=e("p",null,"LED labels:",-1),M=i('
If you have different LEDs, please consult their datasheet.
Some terminology related to them:
5V: 5-volt power in.
GND: Ground or power out.
AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.
SNG: Single resistor, use this as 5V in if you are using only 1~700ohm resistor on V3 boards (not recommended).
Negative: This marks the negative side of the LED.
Positive: This marks the positive side of the LED.
Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.
',11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),F=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),z=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),Y=e("p",null,"Flip the PCB and solder the other end.",-1),$=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"")],-1),Q=e("p",null,"Tin the LED pads.",-1),Z=e("p",null,"Orientate the LED and hold it in place.",-1),K=e("p",null,"Solder one end.",-1),X=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),ae=e("p",null,"Use the following diagram:",-1),se=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ie=i('
Head to the 3D printed parts section of the parts list here.
Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.
Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.
There are 2 different types of mounts, how to secure the camera to each type will be documented below.
',6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ce=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"")],-1),ue=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),fe=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"")],-1),ge=e("p",null,"This again differs from mount to mount.",-1),we=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1682366995000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Pe)=>(d(),p("div",null,[_,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),m,f,g,w,t(a,{options:o(s).external_antenna},null,8,["options"]),b,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),y,v,S,k,P,t(a,{options:o(s).camera_socket},null,8,["options"]),T,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),E,t(a,{options:o(s).camera_cable},null,8,["options"]),x,t(a,{options:o(s).camera_clip_close},null,8,["options"]),C,I,D,t(a,{options:o(s)._7_12_one},null,8,["options"]),A,t(a,{options:o(s)._7_12_two},null,8,["options"]),B,V,q,L,N,t(a,{options:o(s)._7_12_three},null,8,["options"]),R,G,t(a,{options:o(s)._13_18_one},null,8,["options"]),O,t(a,{options:o(s)._13_18_two},null,8,["options"]),U,t(a,{options:o(s)._13_18_three},null,8,["options"]),W,t(a,{options:o(s)._13_18_four},null,8,["options"]),H,t(a,{options:o(s)._13_18_five},null,8,["options"]),M,t(a,{options:o(s)._13_18_six},null,8,["options"]),j,t(a,{options:o(s)._13_18_seven},null,8,["options"]),F,z,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Y,t(a,{options:o(s)._13_18_nine},null,8,["options"]),$,t(a,{options:o(s)._13_18_ten},null,8,["options"]),J,Q,t(a,{options:o(s).end_one},null,8,["options"]),Z,t(a,{options:o(s).end_two},null,8,["options"]),K,t(a,{options:o(s).end_three},null,8,["options"]),X,t(a,{options:o(s).end_four},null,8,["options"]),ee,te,oe,t(a,{options:o(s).end_five},null,8,["options"]),ae,t(a,{options:o(s).end_six},null,8,["options"]),se,t(a,{options:o(s).end_seven},null,8,["options"]),ne,t(a,{options:o(s).end_eight},null,8,["options"]),ie,t(a,{options:o(s).end_nine},null,8,["options"]),re,le,t(a,{options:o(s).end_ten},null,8,["options"]),he,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:c(()=>[pe]),_:1},8,["options"])]),ce,t(a,{options:o(s).end_twelve},null,8,["options"]),ue,_e,t(a,{options:o(s).end_thirteen},null,8,["options"]),me,t(a,{options:o(s).end_fourteen},null,8,["options"]),fe,ge,we,t(a,{options:o(s).end_fifteen},null,8,["options"]),be,t(a,{options:o(s).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default};
diff --git a/assets/how_to_build_full_build.md.f2c25978.lean.js b/assets/how_to_build_full_build.md.92660a15.lean.js
similarity index 95%
rename from assets/how_to_build_full_build.md.f2c25978.lean.js
rename to assets/how_to_build_full_build.md.92660a15.lean.js
index 37c3716..b049a03 100644
--- a/assets/how_to_build_full_build.md.f2c25978.lean.js
+++ b/assets/how_to_build_full_build.md.92660a15.lean.js
@@ -1 +1 @@
-import{_ as r,a as l}from"./chunks/index.3b745ef0.js";import{_ as h}from"./chunks/CheckBoxList.78ea8d78.js";import{_ as a,i as s}from"./chunks/index.9f7265df.js";import{o as d,c as p,G as t,b as o,z as e,B as c,V as i,a as n}from"./chunks/framework.7384f92b.js";const u={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=i("",12),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"")],-1),f=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),g=e("p",null,"The first option is to use an external antenna.",-1),w=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"")],-1),P=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),T=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),B=i("",8),A=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),q=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),L=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),R=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"")],-1),G=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),O=i("",4),U=i("",5),W=e("p",null,"Here are the PCB pin-out labels:",-1),H=e("p",null,"LED labels:",-1),M=i("",11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),F=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),z=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),Y=e("p",null,"Flip the PCB and solder the other end.",-1),$=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"")],-1),Q=e("p",null,"Tin the LED pads.",-1),Z=e("p",null,"Orientate the LED and hold it in place.",-1),K=e("p",null,"Solder one end.",-1),X=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),ae=e("p",null,"Use the following diagram:",-1),se=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ie=i("",6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ce=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"")],-1),ue=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),fe=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"")],-1),ge=e("p",null,"This again differs from mount to mount.",-1),we=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1682366995000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Pe)=>(d(),p("div",null,[_,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),m,f,g,w,t(a,{options:o(s).external_antenna},null,8,["options"]),b,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),y,v,S,k,P,t(a,{options:o(s).camera_socket},null,8,["options"]),T,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),E,t(a,{options:o(s).camera_cable},null,8,["options"]),x,t(a,{options:o(s).camera_clip_close},null,8,["options"]),C,I,D,t(a,{options:o(s)._7_12_one},null,8,["options"]),B,t(a,{options:o(s)._7_12_two},null,8,["options"]),A,V,q,L,N,t(a,{options:o(s)._7_12_three},null,8,["options"]),R,G,t(a,{options:o(s)._13_18_one},null,8,["options"]),O,t(a,{options:o(s)._13_18_two},null,8,["options"]),U,t(a,{options:o(s)._13_18_three},null,8,["options"]),W,t(a,{options:o(s)._13_18_four},null,8,["options"]),H,t(a,{options:o(s)._13_18_five},null,8,["options"]),M,t(a,{options:o(s)._13_18_six},null,8,["options"]),j,t(a,{options:o(s)._13_18_seven},null,8,["options"]),F,z,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Y,t(a,{options:o(s)._13_18_nine},null,8,["options"]),$,t(a,{options:o(s)._13_18_ten},null,8,["options"]),J,Q,t(a,{options:o(s).end_one},null,8,["options"]),Z,t(a,{options:o(s).end_two},null,8,["options"]),K,t(a,{options:o(s).end_three},null,8,["options"]),X,t(a,{options:o(s).end_four},null,8,["options"]),ee,te,oe,t(a,{options:o(s).end_five},null,8,["options"]),ae,t(a,{options:o(s).end_six},null,8,["options"]),se,t(a,{options:o(s).end_seven},null,8,["options"]),ne,t(a,{options:o(s).end_eight},null,8,["options"]),ie,t(a,{options:o(s).end_nine},null,8,["options"]),re,le,t(a,{options:o(s).end_ten},null,8,["options"]),he,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:c(()=>[pe]),_:1},8,["options"])]),ce,t(a,{options:o(s).end_twelve},null,8,["options"]),ue,_e,t(a,{options:o(s).end_thirteen},null,8,["options"]),me,t(a,{options:o(s).end_fourteen},null,8,["options"]),fe,ge,we,t(a,{options:o(s).end_fifteen},null,8,["options"]),be,t(a,{options:o(s).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default};
+import{_ as r,a as l}from"./chunks/index.4ffa16ab.js";import{_ as h}from"./chunks/CheckBoxList.4e2280d2.js";import{_ as a,i as s}from"./chunks/index.d657d51d.js";import{o as d,c as p,C as t,b as o,v as e,y as c,S as i,a as n}from"./chunks/framework.17985c0a.js";const u={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},_=i("",12),m=e("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[n("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),e("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"")],-1),f=e("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1),g=e("p",null,"The first option is to use an external antenna.",-1),w=e("p",null,[n("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),e("strong",null,"REQUIRED"),n(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1),b=e("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1),y=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1),v=e("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1),S=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1),k=e("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[n("Step 6: Attach cameras to ESPs "),e("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"")],-1),P=e("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1),T=e("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1),E=e("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1),x=e("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1),C=e("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[n("Step 7: Connect ESP to the programmer to flash "),e("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"")],-1),I=e("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1),D=e("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1),A=i("",8),B=e("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[n("Step 11: Cut wires for IR LEDs "),e("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"")],-1),V=e("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1),q=e("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1),L=e("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[n("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),e("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"")],-1),N=e("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1),R=e("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[n("Step 13: Solder the positive wire to ESP "),e("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"")],-1),G=e("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1),O=i("",4),U=i("",5),W=e("p",null,"Here are the PCB pin-out labels:",-1),H=e("p",null,"LED labels:",-1),M=i("",11),j=e("p",null,"Next, grab a resistor and hold it on the pads.",-1),F=e("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1),z=e("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1),Y=e("p",null,"Flip the PCB and solder the other end.",-1),$=e("p",null,"Now repeat for the other one.",-1),J=e("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[n("Solder LEDs on PCB V3 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"")],-1),Q=e("p",null,"Tin the LED pads.",-1),Z=e("p",null,"Orientate the LED and hold it in place.",-1),K=e("p",null,"Solder one end.",-1),X=e("p",null,"Flip around and solder the other end.",-1),ee=e("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[n("Wire up the PCBs V3 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"")],-1),te=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1),oe=e("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1),ae=e("p",null,"Use the following diagram:",-1),se=e("p",null,"If the green dot is facing away from the text like the picture below:",-1),ne=e("p",null,"Use the following diagram:",-1),ie=i("",6),re=e("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1),le=e("p",null,"Place the camera into the mount",-1),he=e("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1),de={align:"center"},pe=e("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1),ce=e("h3",{id:"type-2",tabindex:"-1"},[n("Type 2 "),e("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"")],-1),ue=e("p",null,"This uses the method of gluing the camera.",-1),_e=e("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1),me=e("p",null,"Place the camera on the mount.",-1),fe=e("h2",{id:"ir-led-mounting",tabindex:"-1"},[n("IR LED mounting "),e("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"")],-1),ge=e("p",null,"This again differs from mount to mount.",-1),we=e("p",null,"In some cases, there are designated spots for the LEDs to go.",-1),be=e("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1),ye=e("div",{class:"tip custom-block"},[e("p",{class:"custom-block-title"},"TIP"),e("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1),Ie=JSON.parse('{"title":"Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1682366995000}'),ve={name:"how_to_build/full_build.md"},De=Object.assign(ve,{setup(Se){return(ke,Pe)=>(d(),p("div",null,[_,t(h,{options:{...o(u)}},null,8,["options"]),t(a,{options:o(s).image_one},null,8,["options"]),m,f,g,w,t(a,{options:o(s).external_antenna},null,8,["options"]),b,t(a,{options:o(s).external_antenna_resistors},null,8,["options"]),y,v,S,k,P,t(a,{options:o(s).camera_socket},null,8,["options"]),T,t(a,{options:o(s).camera_socket_clip},null,8,["options"]),E,t(a,{options:o(s).camera_cable},null,8,["options"]),x,t(a,{options:o(s).camera_clip_close},null,8,["options"]),C,I,D,t(a,{options:o(s)._7_12_one},null,8,["options"]),A,t(a,{options:o(s)._7_12_two},null,8,["options"]),B,V,q,L,N,t(a,{options:o(s)._7_12_three},null,8,["options"]),R,G,t(a,{options:o(s)._13_18_one},null,8,["options"]),O,t(a,{options:o(s)._13_18_two},null,8,["options"]),U,t(a,{options:o(s)._13_18_three},null,8,["options"]),W,t(a,{options:o(s)._13_18_four},null,8,["options"]),H,t(a,{options:o(s)._13_18_five},null,8,["options"]),M,t(a,{options:o(s)._13_18_six},null,8,["options"]),j,t(a,{options:o(s)._13_18_seven},null,8,["options"]),F,z,t(a,{options:o(s)._13_18_eight},null,8,["options"]),Y,t(a,{options:o(s)._13_18_nine},null,8,["options"]),$,t(a,{options:o(s)._13_18_ten},null,8,["options"]),J,Q,t(a,{options:o(s).end_one},null,8,["options"]),Z,t(a,{options:o(s).end_two},null,8,["options"]),K,t(a,{options:o(s).end_three},null,8,["options"]),X,t(a,{options:o(s).end_four},null,8,["options"]),ee,te,oe,t(a,{options:o(s).end_five},null,8,["options"]),ae,t(a,{options:o(s).end_six},null,8,["options"]),se,t(a,{options:o(s).end_seven},null,8,["options"]),ne,t(a,{options:o(s).end_eight},null,8,["options"]),ie,t(a,{options:o(s).end_nine},null,8,["options"]),re,le,t(a,{options:o(s).end_ten},null,8,["options"]),he,t(a,{options:o(s).end_eleven},null,8,["options"]),e("div",de,[t(r,{options:o(l).end_one},{content:c(()=>[pe]),_:1},8,["options"])]),ce,t(a,{options:o(s).end_twelve},null,8,["options"]),ue,_e,t(a,{options:o(s).end_thirteen},null,8,["options"]),me,t(a,{options:o(s).end_fourteen},null,8,["options"]),fe,ge,we,t(a,{options:o(s).end_fifteen},null,8,["options"]),be,t(a,{options:o(s).end_sixteen},null,8,["options"]),ye]))}});export{Ie as __pageData,De as default};
diff --git a/assets/how_to_build_parts_list.md.954cc6fc.js b/assets/how_to_build_parts_list.md.3921b9c0.js
similarity index 97%
rename from assets/how_to_build_parts_list.md.954cc6fc.js
rename to assets/how_to_build_parts_list.md.3921b9c0.js
index 0f1123c..eb568cf 100644
--- a/assets/how_to_build_parts_list.md.954cc6fc.js
+++ b/assets/how_to_build_parts_list.md.3921b9c0.js
@@ -1 +1 @@
-import{_ as h,a as d}from"./chunks/index.3b745ef0.js";import{A as w}from"./chunks/Accordion.db4d26c2.js";import{o as t,c as a,F as u,M as c,A as y,B as o,z as e,t as m,C as g,b as i,G as s,a as r,V as _}from"./chunks/framework.7384f92b.js";const k={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"ESP mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},P={class:"font-semibold text-xl"},E={class:""},S={style:{"list-style":"none"}},x=["href"],v={__name:"PartsList",setup(b){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(k).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",S,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,x)]))),256)):g("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},R=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"")],-1),T=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),A=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),V=_('
There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.
This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.
Pros:
Wider user adoption and greater support
Low weight, less cables, easier to manage
Cons:
Requires two external antennas for optimal streaming quality
Requires WiFi 2.4 GHz router or access point in reasonable proximity
Risk of radio interference with FBT and other WiFi 2.4 GHz devices
ESP32-CAM uses more power and heats up due to radio module power needs
2x XIAO ESP32-S3 Sense Modules Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio
alternatively:
2x Freenove ESP 32-S3 WROOM Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras
2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.
There is an experimental option to purchase OV2640 120° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye, but it's not a default recommendation.
If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards though, they do require extension cables.
Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.
Extensions (select 0.5mm pitch type A) AliExpress (200mm for MUTE's)
USB Hubs - for if you are building the wired version
1x USB 3.0+ hub Ensure that it is of good quality, lightweight, compact in size, and I suggest including three ports - one for the face tracker and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required, such as for the Valve Index which has only one USB-A port.
2x USB C cables (as short as possible) to connect both ESPs As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well.
Solder wires V4 kit - requires you to solder your own wires to the LED boards.
Alternatively you can source the parts for V3 yourself:
DANGER
If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.
DO NOT BUY FOCUSED ONES!
',41),q=e("p",null,"4x Unfocused SMD IR emitters",-1),C=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),I=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1),B=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),M=e("li",null,[e("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),W=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),N=_('
If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.
Check out our basic guide on making your own mount here.
',7),U=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),Z=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},J=Object.assign(G,{setup(b){return(p,f)=>(t(),a("div",null,[R,s(h,{options:i(d).parts_list_one},{content:o(()=>[T]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[A]),_:1},8,["options"]),V,e("ul",null,[e("li",null,[q,s(h,{options:i(d).parts_list_four},{content:o(()=>[C]),_:1},8,["options"]),I]),B,M,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[W]),_:1},8,["options"]),s(v),N,s(h,{options:i(d).parts_list_six},{content:o(()=>[U]),_:1},8,["options"])]))}});export{Z as __pageData,J as default};
+import{_ as h,a as d}from"./chunks/index.4ffa16ab.js";import{A as w}from"./chunks/Accordion.a318d504.js";import{o as t,c as a,F as u,J as c,x as y,y as o,v as e,t as m,z as g,b as i,C as s,a as r,S as _}from"./chunks/framework.17985c0a.js";const k={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"ESP mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},P={class:"font-semibold text-xl"},E={class:""},S={style:{"list-style":"none"}},x=["href"],v={__name:"PartsList",setup(b){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(k).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",S,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,x)]))),256)):g("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},R=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"")],-1),T=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),A=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),V=_('
There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.
This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.
Pros:
Wider user adoption and greater support
Low weight, less cables, easier to manage
Cons:
Requires two external antennas for optimal streaming quality
Requires WiFi 2.4 GHz router or access point in reasonable proximity
Risk of radio interference with FBT and other WiFi 2.4 GHz devices
ESP32-CAM uses more power and heats up due to radio module power needs
2x XIAO ESP32-S3 Sense Modules Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio
alternatively:
2x Freenove ESP 32-S3 WROOM Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras
2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.
There is an experimental option to purchase OV2640 120° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye, but it's not a default recommendation.
If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards though, they do require extension cables.
Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.
Extensions (select 0.5mm pitch type A) AliExpress (200mm for MUTE's)
USB Hubs - for if you are building the wired version
1x USB 3.0+ hub Ensure that it is of good quality, lightweight, compact in size, and I suggest including three ports - one for the face tracker and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required, such as for the Valve Index which has only one USB-A port.
2x USB C cables (as short as possible) to connect both ESPs As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well.
Solder wires V4 kit - requires you to solder your own wires to the LED boards.
Alternatively you can source the parts for V3 yourself:
DANGER
If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.
DO NOT BUY FOCUSED ONES!
',41),q=e("p",null,"4x Unfocused SMD IR emitters",-1),C=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),I=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1),B=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),M=e("li",null,[e("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),W=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),N=_('
If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.
Check out our basic guide on making your own mount here.
',7),U=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),J=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},Z=Object.assign(G,{setup(b){return(p,f)=>(t(),a("div",null,[R,s(h,{options:i(d).parts_list_one},{content:o(()=>[T]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[A]),_:1},8,["options"]),V,e("ul",null,[e("li",null,[q,s(h,{options:i(d).parts_list_four},{content:o(()=>[C]),_:1},8,["options"]),I]),B,M,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[W]),_:1},8,["options"]),s(v),N,s(h,{options:i(d).parts_list_six},{content:o(()=>[U]),_:1},8,["options"])]))}});export{J as __pageData,Z as default};
diff --git a/assets/how_to_build_parts_list.md.954cc6fc.lean.js b/assets/how_to_build_parts_list.md.3921b9c0.lean.js
similarity index 93%
rename from assets/how_to_build_parts_list.md.954cc6fc.lean.js
rename to assets/how_to_build_parts_list.md.3921b9c0.lean.js
index b184d15..785dae8 100644
--- a/assets/how_to_build_parts_list.md.954cc6fc.lean.js
+++ b/assets/how_to_build_parts_list.md.3921b9c0.lean.js
@@ -1 +1 @@
-import{_ as h,a as d}from"./chunks/index.3b745ef0.js";import{A as w}from"./chunks/Accordion.db4d26c2.js";import{o as t,c as a,F as u,M as c,A as y,B as o,z as e,t as m,C as g,b as i,G as s,a as r,V as _}from"./chunks/framework.7384f92b.js";const k={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"ESP mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},P={class:"font-semibold text-xl"},E={class:""},S={style:{"list-style":"none"}},x=["href"],v={__name:"PartsList",setup(b){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(k).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",S,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,x)]))),256)):g("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},R=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"")],-1),T=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),A=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),V=_("",41),q=e("p",null,"4x Unfocused SMD IR emitters",-1),C=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),I=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1),B=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),M=e("li",null,[e("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),W=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),N=_("",7),U=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),Z=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},J=Object.assign(G,{setup(b){return(p,f)=>(t(),a("div",null,[R,s(h,{options:i(d).parts_list_one},{content:o(()=>[T]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[A]),_:1},8,["options"]),V,e("ul",null,[e("li",null,[q,s(h,{options:i(d).parts_list_four},{content:o(()=>[C]),_:1},8,["options"]),I]),B,M,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[W]),_:1},8,["options"]),s(v),N,s(h,{options:i(d).parts_list_six},{content:o(()=>[U]),_:1},8,["options"])]))}});export{Z as __pageData,J as default};
+import{_ as h,a as d}from"./chunks/index.4ffa16ab.js";import{A as w}from"./chunks/Accordion.a318d504.js";import{o as t,c as a,F as u,J as c,x as y,y as o,v as e,t as m,z as g,b as i,C as s,a as r,S as _}from"./chunks/framework.17985c0a.js";const k={hmds:[{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"★ Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"ESP mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:1},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/Seaweed",desc:"★ High IPD compatible 160 and 120 degree camera and IR emitter mounts by Seaweed"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:"★ ESP frunk mod by MUTE the Cyberwolf"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Valve_Index/qdot",desc:"Camera and IR emitter mount by Qdot"},{url:"https://github.com/rrazgriz/IndexEyeTrackVR/tree/main/hardware",desc:"Camera mount by Razgriz"}],link_id:2},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ Camera and IR emitter mount by Breakdown"}],link_id:3},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ Camera and IR emitter mount by G0LDJAY"}],link_id:4},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:5},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:6}]},P={class:"font-semibold text-xl"},E={class:""},S={style:{"list-style":"none"}},x=["href"],v={__name:"PartsList",setup(b){return(p,f)=>(t(),a("div",null,[(t(!0),a(u,null,c(i(k).hmds,n=>(t(),y(w,{class:"mb-4"},{title:o(()=>[e("span",P,m(n.hmd),1)]),content:o(()=>[e("div",null,[e("span",E,[e("blockquote",null,[e("ul",S,[n.hyper_links!=p.NULL&&n.hyper_links!=""?(t(!0),a(u,{key:0},c(n.hyper_links,l=>(t(),a("p",null,[e("a",{href:l.url,target:"_blank"},m(l.desc),9,x)]))),256)):g("",!0),(t(!0),a(u,null,c(n.parts,l=>(t(),a("li",{key:l},m(l),1))),128))])])])])]),_:2},1024))),256))]))}},R=e("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[r("Parts List "),e("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"")],-1),T=e("p",null," Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes. ",-1),A=e("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1),V=_("",41),q=e("p",null,"4x Unfocused SMD IR emitters",-1),C=e("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1),I=e("ul",null,[e("li",null,[e("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),r(".")]),e("li",null,[e("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),r("."),e("br"),r(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1),B=e("li",null,[e("p",null,[r("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),e("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1),M=e("li",null,[e("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1),D=e("li",null,[e("p",null,[e("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1),O=e("li",null,[e("p",null,[e("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1),z=e("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1),H=e("ul",null,[e("li",null,[r("1x Wire to power IR emitters"),e("br"),e("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1),L=e("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[r("3D Printed Mounts "),e("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"")],-1),F=e("p",null,[r("Mounts with a "),e("code",null,"★"),r(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1),W=e("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1),N=_("",7),U=e("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1),J=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1689604501000}'),G={name:"how_to_build/parts_list.md"},Z=Object.assign(G,{setup(b){return(p,f)=>(t(),a("div",null,[R,s(h,{options:i(d).parts_list_one},{content:o(()=>[T]),_:1},8,["options"]),s(h,{options:i(d).parts_list_three},{content:o(()=>[A]),_:1},8,["options"]),V,e("ul",null,[e("li",null,[q,s(h,{options:i(d).parts_list_four},{content:o(()=>[C]),_:1},8,["options"]),I]),B,M,D,O]),z,H,L,F,s(h,{options:i(d).parts_list_three},{content:o(()=>[W]),_:1},8,["options"]),s(v),N,s(h,{options:i(d).parts_list_six},{content:o(()=>[U]),_:1},8,["options"])]))}});export{J as __pageData,Z as default};
diff --git a/assets/index.md.8a593e29.js b/assets/index.md.e2859d78.js
similarity index 95%
rename from assets/index.md.8a593e29.js
rename to assets/index.md.e2859d78.js
index edc5ed7..caf6428 100644
--- a/assets/index.md.8a593e29.js
+++ b/assets/index.md.e2859d78.js
@@ -1 +1 @@
-import{_ as e,o as t,c as o}from"./chunks/framework.7384f92b.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1689147044000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default};
+import{_ as e,o as t,c as o}from"./chunks/framework.17985c0a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1689147044000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default};
diff --git a/assets/index.md.8a593e29.lean.js b/assets/index.md.e2859d78.lean.js
similarity index 95%
rename from assets/index.md.8a593e29.lean.js
rename to assets/index.md.e2859d78.lean.js
index edc5ed7..caf6428 100644
--- a/assets/index.md.8a593e29.lean.js
+++ b/assets/index.md.e2859d78.lean.js
@@ -1 +1 @@
-import{_ as e,o as t,c as o}from"./chunks/framework.7384f92b.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1689147044000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default};
+import{_ as e,o as t,c as o}from"./chunks/framework.17985c0a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"EyeTrackVR Docs","text":"Opensource and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETRVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Open Source","details":"fully open source and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1689147044000}'),a={name:"index.md"};function n(i,l,r,s,c,d){return t(),o("div")}const m=e(a,[["render",n]]);export{u as __pageData,m as default};
diff --git a/assets/misc_faq.md.bc5df512.js b/assets/misc_faq.md.87cf6239.js
similarity index 89%
rename from assets/misc_faq.md.bc5df512.js
rename to assets/misc_faq.md.87cf6239.js
index bda9f66..fe4ae4b 100644
--- a/assets/misc_faq.md.bc5df512.js
+++ b/assets/misc_faq.md.87cf6239.js
@@ -1 +1 @@
-import{A as c}from"./chunks/Accordion.db4d26c2.js";import{o as s,c as a,F as d,M as h,A as u,B as o,z as e,t as n,C as p,b as f,G as _,a as m}from"./chunks/framework.7384f92b.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{R as __pageData,F as default};
+import{A as c}from"./chunks/Accordion.a318d504.js";import{o as s,c as a,F as d,J as h,x as u,y as o,v as e,t as n,z as p,b as f,C as _,a as m}from"./chunks/framework.17985c0a.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"")],-1),C=e("br",null,null,-1),A=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,C,A,_(v)]))}});export{R as __pageData,F as default};
diff --git a/assets/misc_faq.md.bc5df512.lean.js b/assets/misc_faq.md.87cf6239.lean.js
similarity index 89%
rename from assets/misc_faq.md.bc5df512.lean.js
rename to assets/misc_faq.md.87cf6239.lean.js
index bda9f66..fe4ae4b 100644
--- a/assets/misc_faq.md.bc5df512.lean.js
+++ b/assets/misc_faq.md.87cf6239.lean.js
@@ -1 +1 @@
-import{A as c}from"./chunks/Accordion.db4d26c2.js";import{o as s,c as a,F as d,M as h,A as u,B as o,z as e,t as n,C as p,b as f,G as _,a as m}from"./chunks/framework.7384f92b.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"")],-1),A=e("br",null,null,-1),C=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,A,C,_(v)]))}});export{R as __pageData,F as default};
+import{A as c}from"./chunks/Accordion.a318d504.js";import{o as s,c as a,F as d,J as h,x as u,y as o,v as e,t as n,z as p,b as f,C as _,a as m}from"./chunks/framework.17985c0a.js";const y={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://dammedia.osram.info/media/bin/osram-dam-2496608/AN002_Details%20on%20photobiological%20safety%20of%20LED%20light%20sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},k={class:"font-semibold text-xl"},w={class:""},q={style:{"list-style":"none"}},g={key:0},b=["href"],v={__name:"FAQ",setup(r){return(i,l)=>(s(),a("div",null,[(s(!0),a(d,null,h(f(y).faq,t=>(s(),u(c,{class:"mb-4"},{title:o(()=>[e("span",k,n(t.question),1)]),content:o(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",q,[e("li",null,n(t.answer),1),t.hyper_link!=i.NULL&&t.hyper_link!=""?(s(),a("p",g,[e("a",{href:t.hyper_link,target:"_blank"},n(t.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},x=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"")],-1),C=e("br",null,null,-1),A=e("hr",null,null,-1),R=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),V={name:"misc/faq.md"},F=Object.assign(V,{setup(r){return(i,l)=>(s(),a("div",null,[x,C,A,_(v)]))}});export{R as __pageData,F as default};
diff --git a/assets/misc_vrc_avatar_setup.md.fb8562d6.js b/assets/misc_vrc_avatar_setup.md.5da944e1.js
similarity index 91%
rename from assets/misc_vrc_avatar_setup.md.fb8562d6.js
rename to assets/misc_vrc_avatar_setup.md.5da944e1.js
index 8e01279..7adf05f 100644
--- a/assets/misc_vrc_avatar_setup.md.fb8562d6.js
+++ b/assets/misc_vrc_avatar_setup.md.5da944e1.js
@@ -1 +1 @@
-import{_ as t,a}from"./chunks/index.3b745ef0.js";import{o as r,c as o,z as e,G as s,B as c,b as n,a as i,V as d}from"./chunks/framework.7384f92b.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),_=d('
',7),h={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default};
+import{_ as t,a}from"./chunks/index.4ffa16ab.js";import{o as r,c as o,v as e,C as s,y as c,b as n,a as i,S as d}from"./chunks/framework.17985c0a.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),_=d('
',7),h={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default};
diff --git a/assets/misc_vrc_avatar_setup.md.fb8562d6.lean.js b/assets/misc_vrc_avatar_setup.md.5da944e1.lean.js
similarity index 86%
rename from assets/misc_vrc_avatar_setup.md.fb8562d6.lean.js
rename to assets/misc_vrc_avatar_setup.md.5da944e1.lean.js
index 0e30418..0c2ff35 100644
--- a/assets/misc_vrc_avatar_setup.md.fb8562d6.lean.js
+++ b/assets/misc_vrc_avatar_setup.md.5da944e1.lean.js
@@ -1 +1 @@
-import{_ as t,a}from"./chunks/index.3b745ef0.js";import{o as r,c as o,z as e,G as s,B as c,b as n,a as i,V as d}from"./chunks/framework.7384f92b.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),_=d("",7),h={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default};
+import{_ as t,a}from"./chunks/index.4ffa16ab.js";import{o as r,c as o,v as e,C as s,y as c,b as n,a as i,S as d}from"./chunks/framework.17985c0a.js";const l=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[i("How to set up your avatar for eye tracking: "),e("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"")],-1),p=e("p",null,"Here is an avatar setup video created by a contributor:",-1),u=e("div",{align:"center"},[e("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1),_=d("",7),h={align:"center"},f=e("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1),b=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),m={name:"misc/vrc_avatar_setup.md"},x=Object.assign(m,{setup(y){return(g,v)=>(r(),o("div",null,[l,p,u,_,e("div",h,[s(t,{options:n(a).vrc_avatar_setup},{content:c(()=>[f]),_:1},8,["options"])])]))}});export{b as __pageData,x as default};
diff --git a/assets/software_guide_build_software.md.df6914a0.js b/assets/software_guide_build_software.md.7fd62689.js
similarity index 93%
rename from assets/software_guide_build_software.md.df6914a0.js
rename to assets/software_guide_build_software.md.7fd62689.js
index c2c1cf8..c281fd5 100644
--- a/assets/software_guide_build_software.md.df6914a0.js
+++ b/assets/software_guide_build_software.md.7fd62689.js
@@ -1 +1 @@
-import{_ as r,a as n}from"./chunks/index.3b745ef0.js";import{_ as i}from"./chunks/CheckBoxList.78ea8d78.js";import{o as l,c as s,G as o,B as d,b as a,z as e,a as t,V as h}from"./chunks/framework.7384f92b.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"")],-1),f=h('
Since version 0.1.7 of EyeTrackVR, we have been using Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.
To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec
Give it time to build the app. Once done, the app should be under dist/eyetrackapp
',12),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default};
+import{_ as r,a as n}from"./chunks/index.4ffa16ab.js";import{_ as i}from"./chunks/CheckBoxList.4e2280d2.js";import{o as l,c as s,C as o,y as d,b as a,v as e,a as t,S as h}from"./chunks/framework.17985c0a.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"")],-1),f=h('
Since version 0.1.7 of EyeTrackVR, we have been using Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.
To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec
Give it time to build the app. Once done, the app should be under dist/eyetrackapp
',12),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default};
diff --git a/assets/software_guide_build_software.md.df6914a0.lean.js b/assets/software_guide_build_software.md.7fd62689.lean.js
similarity index 85%
rename from assets/software_guide_build_software.md.df6914a0.lean.js
rename to assets/software_guide_build_software.md.7fd62689.lean.js
index 253677b..1698599 100644
--- a/assets/software_guide_build_software.md.df6914a0.lean.js
+++ b/assets/software_guide_build_software.md.7fd62689.lean.js
@@ -1 +1 @@
-import{_ as r,a as n}from"./chunks/index.3b745ef0.js";import{_ as i}from"./chunks/CheckBoxList.78ea8d78.js";import{o as l,c as s,G as o,B as d,b as a,z as e,a as t,V as h}from"./chunks/framework.7384f92b.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"")],-1),f=h("",12),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default};
+import{_ as r,a as n}from"./chunks/index.4ffa16ab.js";import{_ as i}from"./chunks/CheckBoxList.4e2280d2.js";import{o as l,c as s,C as o,y as d,b as a,v as e,a as t,S as h}from"./chunks/framework.17985c0a.js";const p={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},u=e("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[t("Build the app from source "),e("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"")],-1),c=e("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[t("This guide will show how to build the app from source "),e("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"")],-1),m=e("p",null," This is NOT a required step, you do not need to build the app from source. ",-1),_=e("h2",{id:"requirements",tabindex:"-1"},[t("Requirements "),e("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"")],-1),f=h("",12),T=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1689710614000}'),y={name:"software_guide/build_software.md"},x=Object.assign(y,{setup(b){return(w,P)=>(l(),s("div",null,[u,c,o(r,{options:a(n).build_software_one},{content:d(()=>[m]),_:1},8,["options"]),_,o(i,{options:{...a(p)}},null,8,["options"]),f]))}});export{T as __pageData,x as default};
diff --git a/assets/software_guide_eyetrackvr_app_guide.md.dfcbc709.js b/assets/software_guide_eyetrackvr_app_guide.md.aeb3e08b.js
similarity index 95%
rename from assets/software_guide_eyetrackvr_app_guide.md.dfcbc709.js
rename to assets/software_guide_eyetrackvr_app_guide.md.aeb3e08b.js
index f6d1e44..fb6314c 100644
--- a/assets/software_guide_eyetrackvr_app_guide.md.dfcbc709.js
+++ b/assets/software_guide_eyetrackvr_app_guide.md.aeb3e08b.js
@@ -1 +1 @@
-import{_ as s,a as l}from"./chunks/index.3b745ef0.js";import{_ as o,i as r}from"./chunks/index.9f7265df.js";import{o as d,c as h,G as t,b as a,B as c,V as n,z as e,a as i}from"./chunks/framework.7384f92b.js";const p=n('
How to install, run and adjust the EyeTrackVR app.
Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app
Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.
Copy that IP address and then close the browser tab with it open.
Enter that IP address into the app's Camera Address field.
Don't see your camera feed? That's because we haven't set an ROI.
',36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n('
Once your eye is trackable by the software we need to calibrate it.
Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking
The next step is to center your eye.
Look straight forward and press the Recenter Eye button.
Your eye is now fully calibrated.
Repeat for your other eye.
',8),C=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"")],-1),M=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},j=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{M as __pageData,j as default};
+import{_ as s,a as l}from"./chunks/index.4ffa16ab.js";import{_ as o,i as r}from"./chunks/index.d657d51d.js";import{o as d,c as h,C as t,b as a,y as c,S as n,v as e,a as i}from"./chunks/framework.17985c0a.js";const p=n('
How to install, run and adjust the EyeTrackVR app.
Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app
Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.
Copy that IP address and then close the browser tab with it open.
Enter that IP address into the app's Camera Address field.
Don't see your camera feed? That's because we haven't set an ROI.
',36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n('
Once your eye is trackable by the software we need to calibrate it.
Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking
The next step is to center your eye.
Look straight forward and press the Recenter Eye button.
Your eye is now fully calibrated.
Repeat for your other eye.
',8),C=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"")],-1),j=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},B=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{j as __pageData,B as default};
diff --git a/assets/software_guide_eyetrackvr_app_guide.md.dfcbc709.lean.js b/assets/software_guide_eyetrackvr_app_guide.md.aeb3e08b.lean.js
similarity index 85%
rename from assets/software_guide_eyetrackvr_app_guide.md.dfcbc709.lean.js
rename to assets/software_guide_eyetrackvr_app_guide.md.aeb3e08b.lean.js
index 42bec3a..d71f46b 100644
--- a/assets/software_guide_eyetrackvr_app_guide.md.dfcbc709.lean.js
+++ b/assets/software_guide_eyetrackvr_app_guide.md.aeb3e08b.lean.js
@@ -1 +1 @@
-import{_ as s,a as l}from"./chunks/index.3b745ef0.js";import{_ as o,i as r}from"./chunks/index.9f7265df.js";import{o as d,c as h,G as t,b as a,B as c,V as n,z as e,a as i}from"./chunks/framework.7384f92b.js";const p=n("",7),u=n("",36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n("",8),C=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"")],-1),M=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},j=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{M as __pageData,j as default};
+import{_ as s,a as l}from"./chunks/index.4ffa16ab.js";import{_ as o,i as r}from"./chunks/index.d657d51d.js";import{o as d,c as h,C as t,b as a,y as c,S as n,v as e,a as i}from"./chunks/framework.17985c0a.js";const p=n("",7),u=n("",36),y=e("p",null,[i("Now press the "),e("code",null,"Cropping Mode"),i(" button. You should see a feed of your camera.")],-1),_=e("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1),g=e("p",null,"You should see something like this:",-1),f=e("p",null,"Now, Draw a rectangle that selects your eye.",-1),m=e("p",null,"A good example of an ROI",-1),b=e("p",null,[i("Head back over to the "),e("code",null,"Tracking mode"),i(".")],-1),k=e("p",null,[i("We will now adjust our rotation by moving the "),e("code",null,"Rotation"),i(" slider.")],-1),w=e("p",null,"From this:",-1),T=e("p",null,"To this:",-1),v=e("p",null,"Now we will adjust our threshold.",-1),P=e("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1),q=e("p",null,"Example of a threshold being too low:",-1),x=e("p",null,"Example of too high of a threshold:",-1),R=e("p",null,"Example of a good threshold:",-1),S=n("",8),C=e("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1),E=e("h2",{id:"see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001",tabindex:"-1"},[i("See anything outdated on this guide? Let me know! "),e("code",null,"Prohurtz#0001"),i(),e("a",{class:"header-anchor",href:"#see-anything-outdated-on-this-guide-let-me-know-prohurtz-0001","aria-label":'Permalink to "See anything outdated on this guide? Let me know! `Prohurtz#0001`"'},"")],-1),j=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1689147044000}'),V={name:"software_guide/eyetrackvr_app_guide.md"},B=Object.assign(V,{setup(I){return(A,N)=>(d(),h("div",null,[p,t(o,{options:a(r).eyetrack_vr_guide_three},null,8,["options"]),u,t(o,{options:a(r).eyetrack_vr_guide_four},null,8,["options"]),y,_,g,t(o,{options:a(r).eyetrack_vr_guide_five},null,8,["options"]),f,m,t(o,{options:a(r).eyetrack_vr_guide_six},null,8,["options"]),b,k,w,t(o,{options:a(r).eyetrack_vr_guide_seven},null,8,["options"]),T,t(o,{options:a(r).eyetrack_vr_guide_eight},null,8,["options"]),v,P,q,t(o,{options:a(r).eyetrack_vr_guide_nine},null,8,["options"]),x,t(o,{options:a(r).eyetrack_vr_guide_ten},null,8,["options"]),R,t(o,{options:a(r).eyetrack_vr_guide_eleven},null,8,["options"]),S,t(s,{options:a(l).eyetrack_vr_guide_two},{content:c(()=>[C]),_:1},8,["options"]),E]))}});export{j as __pageData,B as default};
diff --git a/assets/software_guide_osc_setup.md.a5e43cc8.js b/assets/software_guide_osc_setup.md.0ed7cc47.js
similarity index 92%
rename from assets/software_guide_osc_setup.md.a5e43cc8.js
rename to assets/software_guide_osc_setup.md.0ed7cc47.js
index 1f72c68..3d6e8c7 100644
--- a/assets/software_guide_osc_setup.md.a5e43cc8.js
+++ b/assets/software_guide_osc_setup.md.0ed7cc47.js
@@ -1 +1 @@
-import{_ as r,a as l}from"./chunks/index.3b745ef0.js";import{_ as a,i as n}from"./chunks/index.9f7265df.js";import{o as c,c as d,G as t,B as h,b as o,z as e,a as i,V as s}from"./chunks/framework.7384f92b.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s('
You'll need to add two parameters to your Parameters config, those being:
etvr_recalibrate: Bool
etvr_recenter: Bool
Both of them do not have to be synced, meaning they won't increase your total memory count.
To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.
',6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),V=s('
Repeat the steps for the other one.
Once done simply build and upload the updated version of your avatar.
And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!
Reseting the OSC config in case the parameters don't work
Sometimes VRChat won't regenerate the config files that it to communicate the changes to anyone that's listening, to fix this it's enough to simply delete the auto generated configuration files and let VRC remake them.
They are stored under
C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\
Deleting the contents of the Avatars directory will resolve the issue.
Like mentioned in the note, this functionality is not limited to VRC.
The app itself listens to OSC messages sent on port 9001 to two addresses:
/avatar/parameters/etvr_recenter
/avatar/parameters/etvr_recalibrate
It only needs to receive a Bool value of True to trigger the recenter and calibration.
The port and the adresses can be changed in the app settings, if need be.
',14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),x={name:"software_guide/osc_setup.md"},B=Object.assign(x,{setup(S){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),V]))}});export{O as __pageData,B as default};
+import{_ as r,a as l}from"./chunks/index.4ffa16ab.js";import{_ as a,i as n}from"./chunks/index.d657d51d.js";import{o as c,c as d,C as t,y as h,b as o,v as e,a as i,S as s}from"./chunks/framework.17985c0a.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s('
You'll need to add two parameters to your Parameters config, those being:
etvr_recalibrate: Bool
etvr_recenter: Bool
Both of them do not have to be synced, meaning they won't increase your total memory count.
To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.
',6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),S=s('
Repeat the steps for the other one.
Once done simply build and upload the updated version of your avatar.
And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!
Reseting the OSC config in case the parameters don't work
Sometimes VRChat won't regenerate the config files that it to communicate the changes to anyone that's listening, to fix this it's enough to simply delete the auto generated configuration files and let VRC remake them.
They are stored under
C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\
Deleting the contents of the Avatars directory will resolve the issue.
Like mentioned in the note, this functionality is not limited to VRC.
The app itself listens to OSC messages sent on port 9001 to two addresses:
/avatar/parameters/etvr_recenter
/avatar/parameters/etvr_recalibrate
It only needs to receive a Bool value of True to trigger the recenter and calibration.
The port and the adresses can be changed in the app settings, if need be.
',14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),x={name:"software_guide/osc_setup.md"},B=Object.assign(x,{setup(V){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),S]))}});export{O as __pageData,B as default};
diff --git a/assets/software_guide_osc_setup.md.a5e43cc8.lean.js b/assets/software_guide_osc_setup.md.0ed7cc47.lean.js
similarity index 87%
rename from assets/software_guide_osc_setup.md.a5e43cc8.lean.js
rename to assets/software_guide_osc_setup.md.0ed7cc47.lean.js
index ef6fe1c..491a089 100644
--- a/assets/software_guide_osc_setup.md.a5e43cc8.lean.js
+++ b/assets/software_guide_osc_setup.md.0ed7cc47.lean.js
@@ -1 +1 @@
-import{_ as r,a as l}from"./chunks/index.3b745ef0.js";import{_ as a,i as n}from"./chunks/index.9f7265df.js";import{o as c,c as d,G as t,B as h,b as o,z as e,a as i,V as s}from"./chunks/framework.7384f92b.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s("",6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),V=s("",14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),x={name:"software_guide/osc_setup.md"},B=Object.assign(x,{setup(S){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),V]))}});export{O as __pageData,B as default};
+import{_ as r,a as l}from"./chunks/index.4ffa16ab.js";import{_ as a,i as n}from"./chunks/index.d657d51d.js";import{o as c,c as d,C as t,y as h,b as o,v as e,a as i,S as s}from"./chunks/framework.17985c0a.js";const p=e("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[i("Setting up recalibration and recentering from VRChat. "),e("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"")],-1),u=e("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.",-1),_=e("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages. ",-1),m=s("",6),f=e("p",null,[i("Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the "),e("code",null,"Add"),i(" button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.")],-1),g=e("p",null,"That's it for the parameters.",-1),b=e("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[i("Adding buttons to the menu "),e("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"")],-1),y=e("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1),v=e("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1),w=e("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1),k=e("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1),C=e("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1),T=e("p",null,[i("Now, in the parameter section, click on the "),e("code",null,"[None]"),i(" and select one of the parameters you have created in the previous section.")],-1),S=s("",14),O=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1682887355000}'),x={name:"software_guide/osc_setup.md"},B=Object.assign(x,{setup(V){return(R,A)=>(c(),d("div",null,[p,u,t(r,{options:o(l).parts_list_two},{content:h(()=>[_]),_:1},8,["options"]),m,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),f,t(a,{options:o(n).unity_vrc_expressions_add_fields},null,8,["options"]),t(a,{options:o(n).unity_vrc_expressions_fields},null,8,["options"]),g,b,y,v,t(a,{options:o(n).unity_vrc_expressions},null,8,["options"]),w,t(a,{options:o(n).unity_vrc_empty_control},null,8,["options"]),k,C,T,t(a,{options:o(n).unity_vrc_control_setup},null,8,["options"]),S]))}});export{O as __pageData,B as default};
diff --git a/contact.html b/contact.html
index b93d99a..a643dd5 100644
--- a/contact.html
+++ b/contact.html
@@ -6,16 +6,16 @@
EyeTrackVR Docs | EyeTrackVR Docs
-
+
-
-
-
+
+
+
The title style is the style of the title that appears at the top of the page.
We like to keep this cohesive, so please use the following style:
md
# My Page {.text-[var(--font-accent)]}
1
This will give the title a nice orange colour.
The {} are required, and the .text-[#e67e22] is the colour using TailWindCSS classes. You can also use our built in CSS variables {.text-[var(--font-accent)]}. You will find these in the src/styles/theme.css file. You can change this to any colour you like, but please keep it consistent with the rest of the site.
Tip
This entire site supports TailWindCSS classes. You can find the documentation here.
All classes you wish to add, must be prefaced with a . when inside of the {}.
When using classes on HTML elements, you can use the class attribute. For example:
To edit a page, you will need to edit the Markdown file in the vitepress/docs/src/pages folder.
-
diff --git a/development/docs/standards.html b/development/docs/standards.html
index abab072..0710612 100644
--- a/development/docs/standards.html
+++ b/development/docs/standards.html
@@ -6,11 +6,11 @@
Standards Guide | EyeTrackVR Docs
-
+
-
-
-
+
+
+
@@ -23,7 +23,7 @@
-addednewthing# some detail about the new thingBREAKINGCHANGE:thisisabreakingchange#this line is optionaland only used if needed
These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.
Replace the placeholder text with your correct SSID (WiFi access point name), and password respectfully.
INFO
Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.
Spaces are not supported either. If you have a space in either, you will need to change it.
The firmware supports AP mode, but it is not recommended. If you are using AP mode, you will need to set the enableadhoc to 1.
Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.
You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.
Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.
CAUTION
Make sure your wifi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required.
Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.
If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This will only work if you are connected to the same network as the ESPs, and if you have enabled mDNS on your computer. If you are using Windows, you can enable mDNS by following this guide.
The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.
You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.
The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.
This feature is used more for advanced users, and is not required for basic operation.
The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.
The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.
We are working on a new app that will allow you to configure the firmware, flash the boards, and connect to Social VR Games using a GUI. This will make it easier to configure the firmware, and will allow you to configure the firmware without having to use/download VSCode or our platformio project. We are hard at work on this, but do not currently have a release date. Please check back frequently.
A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.
We use environments to store the firmware config for each device, so that you can easily switch between them.
Environments are broken up into two distinct parts:
We now have a couple of options letting us decide how we want to build the firmware.
Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.
_release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.
Examples: xiaosenses3 - This is the debug environment. xiaosenses3_release - This is the release environment for daily use.
Tip
We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.
We currently support for several different boards, and we are working on adding more.
Warning
It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.
Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.
Currently supported boards:
esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
esp32M5Stack - This is for ESP32M5Stack.
esp32WRover - This is for the ESP32WRover.
esp-eye - This is for the ESP-EYE (not the S3 variant).
wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)
You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:
-
diff --git a/firmware_guide/firmware.html b/firmware_guide/firmware.html
index 9cb3b60..8e6abfa 100644
--- a/firmware_guide/firmware.html
+++ b/firmware_guide/firmware.html
@@ -6,16 +6,16 @@
What is this? | EyeTrackVR Docs
-
+
-
-
-
+
+
+
Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker.
mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.
In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.
The mDNS is enabled by default on the new firmware, and can not be disabled.
To use it, all you need to do is set the name of the device in the firmware config file.
This setting can be located under the [wifi] section of the ini/user_config.ini file.
ini
mdnsname="openiristracker"# do not add .local
1
By default, the name of the device is openiristracker, however you can change it to whatever you want.
Change the name
Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.
To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.
Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.
You can also get the fully tested Bonjour package from us here (for Windows only).
If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.
If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.
Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.
Do not download as a zip - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.
Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to OpenIris/ESP folder and opening it.
This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team adapted from here
Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.
It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.
Connect your tracker to your PC and then open a serial monitor in VSC by pressing the plug icon.
Now, press the restart button on the esp itself. watch the monitor for output like this:
The text, highlighted in green for demonstration, is the stream address of the camera. Take note of this for input into the software.
Keep in mind while testing and getting set up, the ESP can only have one client, to use the camera in the app, make sure you close the browser tab you tested it in.
Open source and affordable VR eye tracker platform for Social VR Games via OSC and UDP protocol.
Welcome to the EyetrackVR documentation website. Here you will find all avalable documentation regauding building, development, and other resources related to this project.
Please exercise caution when messing around with IR emitters.
IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself, just do exactly what we do. Don't use different emitters, dont use differnt means of power, etc.
DANGER
It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.
The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.
WARNING
Please pay attention
Make sure you are using non-focused emitters and no more than 5 mW/sr total power.
In theory, we are compatible with every VR headset. However, mounts may not have been made yet. Please take a look at our list of 3d printable mounts and see if your headset is on the list. If it is not listed, It is recommended that you try to make a mount, or wait for a skilled community member to create one.
Please exercise caution when messing around with IR emitters.
IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself or are not understand something, just do exactly what we do. Don't use different emitters, don't use different means of power, etc.
DANGER
It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.
The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth, excessive eye-strain or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we strive to make EyeTrackVR as safe as possible, we do not hold any responsibility for damage done.
We care about power exposure "W" to the cornea, which we can normalize over the exposed area to Irradiance "mW/cm^2" This number gives us the amount of IR radiation being released into the normalized area. We don't really care about "mA", or "V" alone, as by themselves these do not give us the exposure levels which we need to ensure safety.
Irradiance also needs to take in to account distance of the light source (LED) as the further away you get from a source the weaker the intensity gets. (You can test this by looking at a light source from far away, and as you move closer, the brighter and more painful it is to look at) We do this by using Radiance "mW/cm2/sr" to normalize for the distance. The "sr" is a steradian. Think of it like a cone shape, getting bigger and broader as we move away from the source object.
"To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780nm < > λ < > 3μm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s)"
So 10 mW/cm2 is the max recommended limit given by this source. In my opinion this is still quite high, you will definitely feel some warmth and likely eyestrain after a while.
It is known that when outside and not directly looking at the sun, your eyes get exposed to about 1 mW/cm2 or IR radiation. This is the target I set for hardware generally.
NOTE
This math is assuming the LED is directly in front of your pupil, and your pupil is not moving. In real world this is not the case. We have multiple LEDs around your eye, and your eye moves. When you look to the side, your pupil is not receiving all of the light from all LEDs and the distance grows as well. Properly calculating for this is hard and not worth the time. I chose to show that the "worst case scenario" is still well withing safety margins.
V3 Hardware Safety Outline and Exposure Numbers:
For all of this math we will assume the "worst" to ensure we are well within safety.
if powered with 5V, using 700 ohms of resistance, V3 Hardware will draw 0.00314... Amps. We will round up and convert this to 3.2mA.
(5V - 1.4V - 1.4V) / 700 ohm = 0.00314 ≈ 3.2mA
The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.
5 mW/sr * (3.2mA / 20mA) = 0.8 mW/sr
Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr
0.8 mW/sr / 1cm2/sr = 0.8 mW/cm2
Now, this is only for 1 LED, in the case of V3 we have 2 so we can:
0.8 mW/cm2 * 2 = 1.6 mW/cm2
This value is well below the limit, and close to normal sun exposure outside. If the LEDs were further than 1cm (which they typically are) the exposure would be even less.
V4 Hardware Safety Outline and Exposure Numbers:
For all of this math we will assume the "worst" to ensure we are well within safety.
V4 hardware is actively limited to ~2.4 mA
The LED datasheet lists the intensity at 20mA to be a minimum of 2 and max of 5. We will assume the worst and use 5mW/sr.
5 mW/sr * (2.4mA / 20mA) = 0.6 mW/sr
Now, we need to account for distance. My number is based on a worst case scenario of 1cm of distance. (typically is is higher on average.) We convert 1cm to 1cm2/sr
0.6 mW/sr / 1cm2/sr = 0.6 mW/cm2
Now, this is only for 1 LED, in the case of V4 we have 4 so we can:
0.6 mW/cm2 * 4 = 2.4 mW/cm2
This value is well below the limit, and not far from sun exposure. If the LEDs were further than 1cm (which they typically are) the exposure would be even less. And with typical eye movement they are less.
-
diff --git a/getting_started/things_to_know.html b/getting_started/things_to_know.html
index e5d8dfa..2395d25 100644
--- a/getting_started/things_to_know.html
+++ b/getting_started/things_to_know.html
@@ -6,16 +6,16 @@
Things To Know Before You Start | EyeTrackVR Docs
-
+
-
-
-
+
+
+
Bugs can and will occur which may hinder the experience or useability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.
If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked ones or ones with specs that match exactly. We will not be responsible for damaged caused if you go your own route.
This will require some basic Unity knowledge and owning your own avatar. Note: 2.0 beta app uses VRC's Native eye tracking which does NOT require a special avatar
Once you have acknowledged the items above, move on to the Full Build Guide
-
diff --git a/hashmap.json b/hashmap.json
index c33b754..a2b9a9b 100644
--- a/hashmap.json
+++ b/hashmap.json
@@ -1 +1 @@
-{"how_to_build_creating_your_own_mount.md":"a0eff1b7","contact.md":"8b34e956","development_docs_dev_docs.md":"129593e0","development_docs_pages.md":"a16f2e91","development_docs_standards.md":"34f5cc0e","firmware_guide_configure_firmware.md":"1156a298","firmware_guide_environments.md":"a939c975","firmware_guide_firmware.md":"2acb6454","index.md":"8a593e29","dev_roadmap.md":"1d67b1f2","misc_faq.md":"bc5df512","misc_vrc_avatar_setup.md":"fb8562d6","getting_started_things_to_know.md":"ecc362de","software_guide_build_software.md":"df6914a0","software_guide_osc_setup.md":"a5e43cc8","about.md":"fd49c172","firmware_guide_update_platformio.md":"9f4a42e7","archive_fox_ir_v2_build_instructions.md":"4968d89f","how_to_build_full_build.md":"f2c25978","firmware_guide_setup_vscode.md":"5916e117","firmware_guide_upload_and_update_firmware.md":"72da2ad7","firmware_guide_rest_api.md":"ab0c274d","firmware_guide_mdns.md":"6911a871","getting_started_led_safety.md":"d76c624b","how_to_build_parts_list.md":"954cc6fc","software_guide_eyetrackvr_app_guide.md":"dfcbc709","getting_started_intro.md":"8a7af83f"}
+{"dev_roadmap.md":"f3dd7c17","development_docs_dev_docs.md":"f32aa5d4","contact.md":"05016461","development_docs_pages.md":"55174e30","development_docs_standards.md":"ded806e2","how_to_build_full_build.md":"92660a15","how_to_build_parts_list.md":"3921b9c0","index.md":"e2859d78","misc_vrc_avatar_setup.md":"5da944e1","software_guide_build_software.md":"7fd62689","firmware_guide_configure_firmware.md":"f3dbc3bf","software_guide_eyetrackvr_app_guide.md":"aeb3e08b","firmware_guide_environments.md":"8382e06e","firmware_guide_rest_api.md":"f771b252","firmware_guide_setup_vscode.md":"1e2f05f2","firmware_guide_upload_and_update_firmware.md":"857677c5","getting_started_intro.md":"8d6c94c1","how_to_build_creating_your_own_mount.md":"610d1805","firmware_guide_mdns.md":"88fe9005","archive_fox_ir_v2_build_instructions.md":"c95da5f7","software_guide_osc_setup.md":"0ed7cc47","firmware_guide_update_platformio.md":"bd8c1a40","misc_faq.md":"87cf6239","firmware_guide_firmware.md":"16809ca6","getting_started_things_to_know.md":"89b13253","getting_started_led_safety.md":"50db11e5","about.md":"a9b306c8"}
diff --git a/how_to_build/creating_your_own_mount.html b/how_to_build/creating_your_own_mount.html
index 1c4c0e2..1ec917a 100644
--- a/how_to_build/creating_your_own_mount.html
+++ b/how_to_build/creating_your_own_mount.html
@@ -6,16 +6,16 @@
Creating Your Own Mount | EyeTrackVR Docs
-
+
-
-
-
+
+
+
This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts
So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.
Step 1: Find a way to mount to your headsets lens
The easiest way to get started is to find a lens protector for your headset. Either go to a website like Thingiverse or just do a search for "3d printed lens protector for {your headset here}"
Now, you need a way to attach the camera. We have a basic design that qdot created (taken from his mount) on the hardware GitHub here
Alternatively, you can create your own mount if you have the skills.
Step 3: Place the camera mount where it will give a good camera angle
The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.
You want to put the camera as close to the headset's lens as possible to achieve the biggest view of the eye. I recommend looking at other headset mounts for inspiration.
Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)
This will give you a basic overview of the project's status and what to expect currently.
Step 2: Order all the parts listed on our Parts list
Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.
Step 5: Install external antennas or shield ESP antenna with an antistatic bag
Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.
The first option is to use an external antenna.
This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a REQUIRED step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The image attached below shows the orientation of the pads that need to be connected for which mode. You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.
Below is an example of bridging the connections and attaching an antenna.
The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.
Look at your ESP and locate the camera ribbon cable connector as circled below.
Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.
Now slide in a camera, please note that the pins are facing down, you should only see the black part.
Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.
Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.
Step 10: Connect your power wires to a USB Type-A board
WARNING
Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely mess up tracking.
Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.
To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.
Once cut, strip them to around 4mm of exposed wire.
Step 12: Twist the positive USB wire and positive IR LED wires together and tin them
Once twisted together add solder to keep them together. This makes the connection much easier.
Get your magnifying glass out, it's time to solder very smol things.
Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.
357ohm resistors and V3 PCBs
Here are the PCB pin-out labels:
V3
LED labels:
The green markings and notched corners mark the positive sides of the LEDs pictured above.
If you have different LEDs, please consult their datasheet.
Some terminology related to them:
5V: 5-volt power in.
GND: Ground or power out.
AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.
SNG: Single resistor, use this as 5V in if you are using only 1~700ohm resistor on V3 boards (not recommended).
Negative: This marks the negative side of the LED.
Positive: This marks the positive side of the LED.
Head to the 3D printed parts section of the parts list here.
Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.
Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.
There are 2 different types of mounts, how to secure the camera to each type will be documented below.
This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.
Place the camera into the mount
Slowly apply pressure inwards until the camera snaps into place.
NOTE
There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed.
In some cases, there are designated spots for the LEDs to go.
In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.
Please note that no hardware has been fully set in stone, all purchases are at your loss if hardware changes.
NOTE
It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay.
There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.
This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.
Pros:
Wider user adoption and greater support
Low weight, less cables, easier to manage
Cons:
Requires two external antennas for optimal streaming quality
Requires WiFi 2.4 GHz router or access point in reasonable proximity
Risk of radio interference with FBT and other WiFi 2.4 GHz devices
ESP32-CAM uses more power and heats up due to radio module power needs
2x XIAO ESP32-S3 Sense Modules Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio
alternatively:
2x Freenove ESP 32-S3 WROOM Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras
2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.
There is an experimental option to purchase OV2640 120° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye, but it's not a default recommendation.
If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards though, they do require extension cables.
Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.
Extensions (select 0.5mm pitch type A) AliExpress (200mm for MUTE's)
USB Hubs - for if you are building the wired version
1x USB 3.0+ hub Ensure that it is of good quality, lightweight, compact in size, and I suggest including three ports - one for the face tracker and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required, such as for the Valve Index which has only one USB-A port.
2x USB C cables (as short as possible) to connect both ESPs As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well.
Solder wires V4 kit - requires you to solder your own wires to the LED boards.
Alternatively you can source the parts for V3 yourself:
DANGER
If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.
DO NOT BUY FOCUSED ONES!
4x Unfocused SMD IR emitters
NOTE
The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended.
(Alternative) from Digikey here. The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.
4x IR emitter PCBs (highly recommended) Gerber files and schematics located here.
4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)
This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.
If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.
Check out our basic guide on making your own mount here.
TIP
If you have a headset mount that is not listed above, please let us know in the discord so it can be added here.
To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.
Any headset that the hardware can fit in with community mounts or a mount you design.
Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.
The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.
When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.
This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.
Since version 0.1.7 of EyeTrackVR, we have been using Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.
To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec
Give it time to build the app. Once done, the app should be under dist/eyetrackapp
-
diff --git a/software_guide/eyetrackvr_app_guide.html b/software_guide/eyetrackvr_app_guide.html
index 66b94e9..772899e 100644
--- a/software_guide/eyetrackvr_app_guide.html
+++ b/software_guide/eyetrackvr_app_guide.html
@@ -6,18 +6,18 @@
How to install, run and adjust the EyeTrackVR app. | EyeTrackVR Docs
-
+
-
-
-
-
-
+
+
+
+
+
Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.
Copy that IP address and then close the browser tab with it open.
Enter that IP address into the app's Camera Address field.
Don't see your camera feed? That's because we haven't set an ROI.
See the Awating Eye Cropping Settings text?
Now press the Cropping Mode button. You should see a feed of your camera.
Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)
You should see something like this:
:O It's my eye!
Now, Draw a rectangle that selects your eye.
A good example of an ROI
Head back over to the Tracking mode.
We will now adjust our rotation by moving the Rotation slider.
From this:
It's crooked!
To this:
Much better!
Now we will adjust our threshold.
Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.
Once your eye is trackable by the software we need to calibrate it.
Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking
The next step is to center your eye.
Look straight forward and press the Recenter Eye button.
Your eye is now fully calibrated.
Repeat for your other eye.
NOTE
To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes.
See anything outdated on this guide? Let me know! Prohurtz#0001
-
diff --git a/software_guide/osc_setup.html b/software_guide/osc_setup.html
index a754d23..b6df1e3 100644
--- a/software_guide/osc_setup.html
+++ b/software_guide/osc_setup.html
@@ -6,18 +6,18 @@
Setting up recalibration and recentering from VRChat. | EyeTrackVR Docs
-
+
-
-
-
-
-
+
+
+
+
+
Setting up recalibration and recentering from VRChat.
ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to setup your avatar to make use of OSC to trigger this from within VRC itself.
NOTE
Note, while this page explains how to do it from the point of view of vrchat, it can be done in Neos and CVR too, all the app listens to are two OSC messages.
You'll need to add two parameters to your Parameters config, those being:
etvr_recalibrate: Bool
etvr_recenter: Bool
Both of them do not have to be synced, meaning they won't increase your total memory count.
To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.
Clicking on it will highligh the associated asset in the asset browser, click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector click on the Add button to add the parameters mentioned above, both of them need to be of type Bool, they don't need to be synced nor saved.
Now, you will need to add actual buttons for them in your gesture menu.
The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.
Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.
You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.
Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.
Now, in the parameter section, click on the [None] and select one of the parameters you have created in the previous section.
Repeat the steps for the other one.
Once done simply build and upload the updated version of your avatar.
And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!
Reseting the OSC config in case the parameters don't work
Sometimes VRChat won't regenerate the config files that it to communicate the changes to anyone that's listening, to fix this it's enough to simply delete the auto generated configuration files and let VRC remake them.
They are stored under
C:\Users\<user>\AppData\LocalLow\VRChat\VRChat\OSC\<your user uuid>\Avatars\
Deleting the contents of the Avatars directory will resolve the issue.