ãã®ãããªããŒãã£ã«å°çåãäœæããŸãïŒ
ãªã¢ã«ãªããŒã«ãå転ããããšãPCç»é¢ã®ããŒãã£ã«å°çãé£åããŠã¬ãã¬ãå転ããŸãã
ããŠã¹ãã¿ããããã«ãªã©æ®æ®µã®PCãã¹ããçã§ã¯å³ãããªãæäœäœéšãåŸãããŸãïŒ
ãã®äŸã§ã¯äžå€®ã«è¡šç€ºãããŠããåœã®Covid-19æ
å ±ã衚瀺ããŠããŸãããæ§ã
ã«ã«ã¹ã¿ãã€ãºå¯èœã§ãã
ã·ã¹ãã ãšããŠã¯ã9軞ã»ã³ãµãŒããã¯ã©ãŒã¿ããªã³æ
å ±ãååŸããmicro:bitãéããŠBLEéä¿¡ãè¡ãPCãžéä¿¡ãPCåŽã§three.jsã䜿ã£ã3Dããã°ã©ãã³ã°ãè¡ã£ãŠããŸãã
micro:bitã®MakeCodeã«ã¯å®è¡ã§ããã·ãã¥ã¬ãŒã¿ãŒããããŸãããBLEéä¿¡ã¯ã·ãã¥ã¬ãŒã·ã§ã³ã§ã¯åããŸããã®ã§micro:bitã®å®ç©ãå¿ èŠã§ãã
ãã¡ãã®ã¹ã¿ãŒã¿ãŒãããã®è³Œå ¥ããå§ãããŸã
â»ãã»ãã·ã§ã³ã®æå¹æéããããŸããããšè¡šç€ºãããå Žåã¯ããã®ãŸãŸãã©ãŠã¶ã®ããŒãžæŽæ°ãè¡ã£ãŠã¿ãŠãã ãã
â»åšåº«åãã®å Žåã¯ãã¡ãã®ä»£æ¿åããåç
§ãã ãã
micro:bitã¯2020幎11æã«æ°ããŒãžã§ã³ã§ããV2ãçºå£²ãããŸããã
ä»ã®ã·ã§ããã§è²·ãå Žåã¯V1ãV2ã確ãããŠãã賌å
¥ããŸããããV2ã®å€§ããªå€æŽç¹ãšããŠããã€ã¯ããã¹ããŒã«ãŒãã远å ã«ãªã£ãŠããŸãã
倿®µã¯åããªã®ã§V2ã賌å
¥ããŸãããã
ã¹ã¿ãŒã¿ãŒãããã®äžèº«ã§ãã
ãã®åã®éããã¹ã¿ãŒãããããã®éšåããã¹ãŠæã£ãŠããŸãã
å ããŠãä»åã®ããŒãã£ã«å°çåçšã«ä»¥äž8ç¹ã远å ã§å¿ èŠã§ãã
åºæ¿ã«ãã³ããããä»ããã ãã®ç°¡åãªãã³ãä»ãäœæ¥ãå¿
èŠã§ãã
æ¢ã«æã£ãŠããæ¹ã¯æ°ãã«è³Œå
¥ããå¿
èŠã¯ãããŸããã
ããŒãã£ã«å°çåå šäœã®ã·ã¹ãã ã«ã€ããŠèª¬æããŸãã
ãMPU-9250æèŒã¢ãžã¥ãŒã«ããSeeeduino XIAOããmicro:bitããããªãã§ã©ã«ã§ãPCãã»ã³ãã©ã«ã§ãã
BLEã䜿ã£ãŠããªãã§ã©ã«ããã»ã³ãã©ã«ãžããŒã¿éä¿¡ããŸããéä¿¡ããŒã¿ã¯ãã¯ã©ãŒã¿ããªã³ããšãã3次å
äžã§ã©ã®ãããªåãã«å転ããŠããããèšç®ã§ããæ
å ±ã§ãPCåŽã§ãã®æ
å ±ãå
ã«3次å
æç»ãè¡ããŸãã
ã3軞å é床ã»ã³ãµãŒãã3軞å°ç£æ°ã»ã³ãµãŒãã3軞ãžã£ã€ãã»ã³ãµãŒããå
èµãããŠããã»ã³ãµãŒããŒãã§ãã
ãããããIMUããšåŒã°ããããŒãã§ããããã®äžã§ãéåžžã«å®äŸ¡ãªã»ã³ãµãŒããŒãã§ããä»åã¯I2Céä¿¡ã䜿ã£ãŠã»ã³ãµãŒããŒã¿ãååŸããŸãã
ãããããArduinoãã«å±ãããã€ã³ã³ããŒãã§ãããã¯ã©ãŒã¿ããªã³ããååŸããããã«DMPãšãããœãããŠã§ã¢ã©ã€ãã©ãªã掻çšããŸãããã©ã®ãã€ã³ã³ã§ãè¯ãããã§ã¯ãªãããSAMDã¢ãŒããã¯ãã£ãŒãã§ããå¿ èŠãããããã®äžã§ãéåžžã«å®äŸ¡ãªãã€ã³ã³ããŒãã§ãããmicro:bitãåŽãžã¯UARTéä¿¡ã䜿ã£ãŠããŒã¿ãéä¿¡ããŸãã
è圹ãšããŠäœ¿çšããŸãã
ãmicro:bitãã®äžã«ãã3軞å é床ã»ã³ãµãŒãã3軞å°ç£æ°ã»ã³ãµãŒããå
èµãããŠããã6軞ã»ã³ãµãŒãšããŠå§¿å¢èšç®ãå¯èœã§ããã粟床äžè¶³ã®ããå€éšã«ã9軞ã»ã³ãµãŒããä»ããŠããŸãããªããmicro:bitããšã9軞ã»ã³ãµãŒãã®ã¿ã§ããªãã§ã©ã«ãæ§æããããšãå¯èœã§ãããæ§èœäžè¶³ã§BLEéä¿¡ãäžå®å®ã«ãªãããããSeeeduino XIAOããå€ä»ãã§è¿œå ããŠããŸãã
ä»åã®ãmicro:bitãã¯ããSeeeduinoãããæç·ã·ãªã¢ã«éä¿¡ïŒä»åã¯UARTïŒã§éä¿¡ãããããŒã¿ããäžèº«ã¯ãã®ãŸãŸã§ç¡ç·BLEã«ä¹ãæããŠéä¿¡ãããã²ãŒããŠã§ã€ããšããŠã®åœ¹å²ã«ãªããŸã
JavaScript/HTML/CSSã«ããBlueJellyãæŽ»çšããŠBLEããŒã¿ãååŸããŸãã
HTMLäžã§3Dæç»ãè¡ãããã«WebGLãšããä»çµã¿ã掻çšããŸããããããæ¯èŒçç°¡åã«å¶åŸ¡ã§ããthree.jsã䜿ããŸãã
Seeeduino XIAOã¯è¢ã®äžã«ãã€ã³ã³ããŒããš7pinã®ãã³ããã2ã€ãå
¥ã£ãŠããŸããã·ãŒã«ãå
¥ã£ãŠããŸãããç¹ã«äœ¿ããªããŠãåé¡ãããŸããã
ãã¬ããããŒãã«ãã³ãããïŒè¶³ãé·ãæ¹ïŒãæ¿ããŠããã€ã³ã³ããŒããèŒãã14pinå
šãŠãã¯ãã ä»ãããŠãããŸãããã¬ããããŒãã䜿ãã®ã¯ããã¬ããããŒãã«ã¯ãã ä»ãããèš³ã§ã¯ãªããã¯ãã ä»ãããããããã§ããã¯ãã ä»ãåŸã¯ãã¬ããããŒãããåãå€ããŸãã
ã¯ãã ä»ãã®ã³ãã¯ãããã³ãã«ãã¯ãã ããåœãŠãŠãããã¯ãã ããŠããè¿ã¥ããã®ã§ã¯ãªããããã³ãã«ãã¯ãã ããŠããåœãŠãŠãããã¯ãã ããè¿ã¥ããŠããããšã§ãã
æçµçãªã¯ãã éã¯å€éãããå°ãªéãããå¯å£«å±±ã®ãããªåœ¢ã«ãªãã®ããã¹ãã§ãã
åèïŒé»åå·¥äœã®ã³ã/ã¯ãã ä»ã
ä»åã¯ãã®ãããªæãã§äœ¿ããŸãã
Seeeduinoã«ããã°ã©ã ãæžã蟌ãããã®éçºç°å¢ãæŽããŸãã
ãã¡ãã®ãµã€ããããŒã¹ã«èª¬æããŸãã
Seeeduinoã«ããã°ã©ã ãæžã蟌ãããã«Arduino IDEãæºåããŸããæ¢ã«PCã«Arduino IDEãã€ã³ã¹ããŒã«ãããŠããæ¹ã¯æ¬¡ã«é²ãã§ãã ããã
Arduinoã«ãã¯ã©ãŠãäžã§éçºã§ãããšãã£ã¿ãååšããŸããããããããã¡ãã§ã¯åããªããšæããŸãã®ã§ãPCã«ã€ã³ã¹ããŒã«ãããŠãã ããã
ããŠã³ããŒãã®éã«äžèŠæéãããããããªæããåããŸãããããã¯å¯ä»ããå Žåã§ããJUST DOWNLOAD
ãéžã¹ã°ç¡æã§ããŠã³ããŒãå¯èœã§ãã
ã€ã³ã¹ããŒã«æ¹æ³ãªã©ã§äžæç¹ãããã°ãåèªã°ã°ã£ãŠãã ããã
æ¢åã®ãµã³ãã«ã³ãŒããéããŸãã
ãã¡ã€ã« > ã¹ã±ããäŸ > 01.Basics > Blink
SeeeduinoãArduino IDEã§äœ¿ããããã«ããŸãã
ãŸãã¯ç°å¢èšå®ã«ãŠJSONãã¡ã€ã«ãæå®ããŸãã
ãã¡ã€ã« > ç°å¢èšå® 远å ã®ããŒããããŒãžã£ã®URL: https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
â»Macã®å Žå㯠Arduino > Preferences
次ã«ããŒããããŒãžã£ã§ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸããSeeeduino XIAO
ãšæ€çŽ¢ãããšSeeed SAMD Boards
ãšããããã±ãŒãžã®ã¿ã衚瀺ãããã®ã§ã€ã³ã¹ããŒã«ããŸãã
æ¢ã«ã€ã³ã¹ããŒã«æžãªã®ã§ããã®ç»åãšå°ãç°ãªããšæããŸããããã€ã³ã¹ããŒã«ããã¿ã³ãã¯ãªãã¯ããŠäžããã
ããŒã« > ããŒã > ããŒããããŒãžã£... æ€çŽ¢ããã¯ã¹:Seeeduino XIAO
ã€ã³ã¹ããŒã«ãããããŒããéžæããŸãã
ããŒã« > ããŒã: "Seeeduino XIAO" > Seeed SAMD Boards > Seeeduino XIAO
Seeeduino XIAOãšPCãUSB type-Cã±ãŒãã«ã§æ¥ç¶ããŸãã
ãã®åŸãArduino IDEã«ãŠSeeeduino XIAOã®ã·ãªã¢ã«ããŒããéžæããŸãã ãã®ç»åã§ã¯ãWindowsã®ããCOM
ã«ãªã£ãŠããŸãããããŒãåç§°ã¯OSã«ãã£ãŠãç°ãªããŸãããŸãçªå·5
ã«ã€ããŠã¯åèªã®ç°å¢ã«ãã£ãŠç°ãªããŸãã®ã§ãé©å®èªã¿æ¿ããŠäžããã
ããã°ã©ã ããã€ã³ã³ããŒãã«æžã蟌ã¿ãŸãã
ç»åã®ãã¿ã³ãã¯ãªãã¯ããŠå°ãåŸ
ã¡ãŸããäžç¬ãã©ã«ãã衚瀺ãããŠããã«æ¶ãããšæããŸãã
æžã蟌ã¿ãæåãããšãArduino IDEã®å·Šäžã«ãã®æšã衚瀺ãããŸãã
ããããšã©ãŒã«ãªãå Žåã¯ããã®ããŒãžäžçªäžã«èšèŒããŠãããæžã蟌ã¿ãšã©ãŒã«ãªãå Žåãããã£ãŠã¿ãŠãããã§ããã¡ãªãå¥ã®åå ãããããªãã®ã§ã°ã°ã£ãŠäžããã
Seeeduino XIAOã®ãªã¬ã³ãžè²ã®LEDãçŽ1ç§ééã§ç¹æ» ããŠããã°æåã§ãïŒ ïŒé»è²ãLEDã¯åžžæç¹ç¯ïŒ
Seeeduino XIAOããUSBã·ãªã¢ã«ã§PCãžæåååºåãè¡ããŸãã
Arduino IDEã«ãŠæ°èŠãã¡ã€ã«ãäœæããŠäžããã
ãã¡ã€ã« > æ°èŠãã¡ã€ã«
ã³ãŒãã以äžã®ããã«ããŠãã ããã
int counter = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello, world");
Serial.println(counter);
delay(500);
counter++;
}
å çšãšåãèŠé ã§æžã蟌ã¿ãŸãã æžã蟌ã¿ãæåããããã·ãªã¢ã«ã¢ãã¿ããéããŸãã
ãã®ãããªæãã§ãHello, world
ãšã«ãŠã³ãã¢ããããæ°å€ããã£ãšè¡šç€ºãããã°æåã§ãã
èµ€æ éšã¯9600 bps
ã«ããŠäžããã
9600
ãšããæ°å€ã¯ãããŒã¬ãŒãããšããããŒã¿è»¢éæã«äœ¿ãå€ã§åäœã¯bps
ã§ããä»åã®ãããªUSBã·ãªã¢ã«éä¿¡ãåŸã«æ±ãUART
éä¿¡ãè¡ãéã¯ããã®ãããŒã¬ãŒãããå¿
èŠã§ãéä¿¡åŽãšåä¿¡åŽã§æ°å€ãäžèŽããŠããå¿
èŠããããŸããäžèŽããŠãªããšãããŒã¿ãå
šãåãåããªãã£ãããæååãããå ŽåããããŸãã
Arduinoã®APIã«é¢ããŠã¯è©³ããç¥ãããæ¹ã¯ãã¡ãã®ãµã€ããåãããããã§ãã®ã§ãåèã«ã©ããã
ãžã£ã³ããŒç·ã䜿ã£ãŠããŒããŠã§ã¢ã§ãªã»ããããããŠã¿ãŠãã ããã
ãªã¬ã³ãžè²ã®LEDãäžç¬å
ããŸãã
ç»ååŒçšå ïŒseeedstudio
ããã§ããã¡ãªå Žåã¯PCã®USBããŒããå€ããŠã¿ãŠäžããã
ãSeeeduino XIAOãã§ãMPU-9250æèŒã¢ãžã¥ãŒã«ãããã»ã³ãµãŒæ å ±ãååããDMP(Digital Motion Processing)ãè¡ãããšã«ãã£ãŠæçµçã«ãã¯ã©ãŒã¿ããªã³ããšããæ å ±ãUSBã·ãªã¢ã«ã§åºåãããŸãã
ãSeeeduino XIAOããšåæ§ã«ãMPU-9250æèŒã¢ãžã¥ãŒã«ãã«ãä»å±ãããŠãããã³ããããã¯ãã ä»ãããŸãã
å®éã«äœ¿ãã®ã¯4pinã ãã§ãããå špinã«ä»ããæ¹ãå®å®ãããããåèš10pinã®ã¯ãã ãè¡ããŸãã
ä»å䜿çšããéšåã¯ä»¥äžã®éãã§ãã
ãã¬ããããŒãã§ãžã£ã³ããŒã¯ã€ã€ãŒã®çµç·ãè¡ã£ãããšããªã人ã¯ãããã¬ããããŒããã«ã€ããŠå°ã調ã¹ãŠããçµç·ããããšããå§ãããŸãã
以äžã®ããã«çµç·ããŠãã ããã
å®éã®åçãèŒããŠãããŸãã
ãSeeeduino XIAOããšãMPU-9250æèŒã¢ãžã¥ãŒã«ãã®éä¿¡ã¯I2C
ã䜿ããŸãã
以äžããžã£ã³ããŒç·ã®è²ã«å¯Ÿããä¿¡å·ç·ã®åœ¹å²ã§ãã
ãžã£ã³ããŒç· | ä¿¡å·ç· |
é» | GND |
èµ€ | 3.3V |
ç· | I2C(SDA) |
é | I2C(SCL) |
I2Cä¿¡å·æ±ãéãããŒããŠã§ã¢ãšããŠããã«ã¢ããæµæããšãããã®ãå¿
èŠã«ãªããŸãã
ãããããMPU-9250æèŒã¢ãžã¥ãŒã«ãã®ããŒãã®äžã§ãSDA
ãšSCL
ã®ããããã®ä¿¡å·ã«å¯Ÿã10kΩã®ãã«ã¢ããæµæãå®è£
ãããŠããŸãã®ã§ãä»åã¯äžèŠãšãªããŸãã
I2Cã®SDA
ã¯ãããŒã¿ä¿¡å·ããSCL
ã¯ãã¯ããã¯ä¿¡å·ããæå³ããŸãããããŒã¿ä¿¡å·ãããååšããªãUARTãUSBã·ãªã¢ã«ä¿¡å·ãšç°ãªãç¹ã§ããäžæ¹ã§ããã°ã©ãã³ã°ãšããŠã¯ãã¯ããã¯ä¿¡å·ãããããããã§ãããŒã¬ãŒããã®ãããªèšå®ãäžèŠã«ãªããŸãã
ããäžã€ã®ç¹åŸŽãšããŠI2Cã®ãããŒã¿ä¿¡å·ãã¯äžæ¹éè¡ã§ã¯ãªãåæ¹åã§ããç¹ã§ããUARTãUSBã·ãªã¢ã«ä¿¡å·ã¯éä¿¡ã㌠ã¿ä¿¡å·ãšåä¿¡ããŒã¿ä¿¡å·ã§ç©ççã«å¥ã
ã§ããI2Cã®ããŒã¿ã®ãããšãã¯åæã«è¡ãããšãªãé çªã決ããŠãéä¿¡ãšåä¿¡ã亀äºã«è¡ã£ãŠããããä¿¡å·ïŒæ¬ã§éä¿¡ãå¯èœãšãªã£ãŠããŸãããã®èŸºã¯ãœãããŠã§ã¢ã©ã€ãã©ãªã§å¶åŸ¡ãè¡ã£ãŠããŸãã®ã§ãããã°ã©ãã³ã°ãè¡ãäžã§ã¯ãç¹ã«æ°ã«ããå¿
èŠã¯ãããŸããã
DMPã䜿ãããã«Arduinoã«ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã
ãŸãã¯ãã¡ãã®GitHubããzipãã¡ã€ã«ãããŠã³ããŒãããŠäžããã
zipãã¡ã€ã«ã¯å±éãããã®ãŸãŸã§å€§äžå€«ã§ãã
Arduino IDEã«ãŠä»¥äžã®ã¡ãã¥ãŒããããŠã³ããŒãããzipãã¡ã€ã«ãéžã³ãŸãã
ã¹ã±ãã > ã©ã€ãã©ãªãã€ã³ã¯ã«ãŒã > .ZIP圢åŒã®ã©ã€ãã©ãªãã€ã³ã¹ããŒã«...
Arduino IDEã«ã©ã€ãã©ãªãåæ ãããããã«ãäžæŠIDEãéããŠããåã³èµ·åããŠãã ããã
ãµã³ãã«ã³ãŒãããMPU9250_DMP_QuaternionãéžæããŸãã
ãã¡ã€ã« > ã¹ã±ããäŸ > SparkFun MPU-9250...çç¥ > MPU9250_DMP_Quaternion
ååãšåãæé ã§Seeeduino XIAO
ã«æžã蟌ã¿ãã·ãªã¢ã«ã¢ãã¿ã衚瀺ããŸãã ä»åã®ããŒã¬ãŒãã¯115200 bps
ã§ãã
ãã®ãããªè¡šç€ºçµæãåºãã°æåã§ãïŒ
ãã¬ããããŒããæã«æã£ãŠåŸããŠã¿ãŠäžãããæ°å€ãå€åãããšæããŸãã
ã·ãªã¢ã«ã¢ãã¿ã«çŸããæååã®ä»¥äžïŒè¡ã«çç®ãããšãïŒè¡ç®ãã¯ã©ãŒã¿ããªã³ã§ãïŒè¡ç®ã¯ãªã€ã©ãŒè§ã§ãã
Q: 0.9979, -0.0004, -0.0572, 0.0302 R/P/Y: 359.85, 13.11, 356.53
Qã¯4ã€ã®æ°å€ããããq0, q1, q2, q3 ãšå²ãæ¯ãããŠããŸãã Rã¯RollãPã¯PitchãYã¯Yawãæå³ããŸãã ç¹ã«ãªã€ã©ãŒè§ã¯ä»¥äžãã€ã¡ãŒãžããŠå転ããŠã¿ããšåããããããšæããŸãã
ç»ååŒçšå ïŒWikipedia
ã¯ã©ãŒã¿ããªã³ããªã€ã©ãŒè§ãã©ã¡ããïŒæ¬¡å äžã§ã®å転姿å¢ã衚ããã®ã§ããè¡šçŸæ¹æ³ãç°ãªãã ãã§ãçžäºã«å€æããããšãå¯èœã§ãã
ãªã€ã©ãŒè§ã®ãã¡ãªããã®ïŒã€ãšããŠãå転é çªã®èæ
®ããããŸãã
ïŒè»žã®å転ã ãçç®ããŠããåã«ã¯åé¡ãªãã§ãããïŒè»žã®å転ãç·åããå転ã«çç®ãããšåé¡ãçããŸãã äŸãã° Roll > Pitch > Yaw ã®é çªã§å転ãããã®ãšãRoll > Yaw > Pitch ã®é çªã§å転ãããå Žåãšã§çµæãç°ãªã£ãŠããŸããšããããšã§ãã
ã¯ã©ãŒã¿ããªã³ã¯çŽæçã«ã¯åããã«ããå€ã§ãããå転é çªãèããªããŠè¯ããªã©ãå¶åŸ¡ãè¡ãäžã§ã¯ãªã€ã©ãŒè§ã«å¯ŸããŠã¡ãªããããããŸããããã§ä»åã¯ããªã€ã©ãŒè§ã§ã¯ãªããã¯ã©ãŒã¿ããªã³ãPCåŽãžæž¡ããŠ3Dæç»ãè¡ããŸãã
ä»åã¯ãSeeeduino XIAOããããmicro:bitããžUARTéä¿¡ãè¡ããŸãã
ä»å䜿çšããéšåã¯ä»¥äžã®éãã§ãã
â»ã¿ã®è«ã¯ãªããÃãžã£ã³ããŒã¯ã€ã€ã¯é»1æ¬ãšèµ€2æ¬ãéžã³ãŸããã
ãŸãã以äžã®ç»åã®ããã«micro:bit 1
, 3V
, GND
ã®ç«¯åãã¿ã®è«ã¯ãªããã§æã¿ãŸãã
ããã«ä»¥äžã®ããã«çµç·ããŠãã ããã
ã€ã©ã¹ãã§ã¯ãã¿ã®è«ã¯ãªããÃãžã£ã³ããŒã¯ã€ã€ãã®ïŒæ¬ãçœè²ã§è¡šçŸããŠããŸãã
ãžã£ã³ããŒç· | ä¿¡å·ç· |
é» | GND |
èµ€ | 3.3V |
çœ | UART |
å®éã®åçãèŒããŠãããŸãã
ãã€ãªãŒãéšåãã¢ããããåçã§ãã
ãã€ãªãŒãã¯åãããããŸãã®ã§ã泚æãã ãããããèŠããšå€ªãç°è²ã®ç·ãæãããŠããŸãã 倪ãç°è²ã®ç·ãå
¥ã£ãŠããæ¹åããã«ãœãŒããã§ãã
ãŸãããã¬ããããŒãã®æ¿å
¥äœçœ®ã«ããæ³šæãã ãããã«ãœãŒãåŽã¯äžçªç«¯ã®ç«¯åã«æ¥ç¶ããå察åŽã¯èµ€ãç·ãšåã端ååã«æ¥ç¶ããŸããé»ãç·ãšã¯åã端ååã«ãªã£ãŠããªãããšã確èªããŠãã ããã
ãã€ãªãŒãã¯seeeduinoã®äžã®ICä¿è·ã®ç®çã§ä»ããŠããŸãã æ¬æ¥ãseeeduinoã®é»æºäŸçµŠã¯USB端åã®5Vããè¡ããŸãã5Vã¯Seeeduinoã®äžã«ããã¬ã®ã¥ã¬ãŒã¿ICã«ãã£ãŠ3.3Vã«éå§ãããŠããåè·¯å
šäœãžè¡ãæž¡ããŸãã
ããããä»åã®ããã«micro:bitãšäžç·ã«äœ¿ãå Žåã¯ãmicro:bitåŽãã3.3V端åãžçŽæ¥é»æºãäŸçµŠããŠããããšããäŸå€çãªåœ¢ãåã£ãŠããŸãã
ããã§å®å
šãèæ
®ããŠäžå³ã®ãã³ã¯è²ã®ããã«ä¿è·ãã€ãªãŒããä»ããŠããŸãããã®ãã€ãªãŒãã®æç¡ã§éåžžæã®åè·¯åäœçã«ã¯å
šã圱é¿ã¯ãããŸãããç¡ããŠãçŽã¡ã«å£ãããããªãã®ã§ããããŸãããã念ã®ãããèããŠä¿è·ããŠããŸãã
ç»ååŒçšå :Seeeduino-XIAO
ä¿è·ãã€ãªãŒãã€ããŠã®è©³çްãç¥ãããæ¹ã¯äžèšãªã³ã¯å
ãªã©ãåç
§ããŠãã ããã
ãªãã¢ã¬ã®ã¥ã¬ãŒã¿ã®éé»å§ä¿è·
USBã±ãŒãã«ã¯seeeduinoãããã¯micro:bitã®ã©ã¡ããã ãã«æ¥ç¶ãé¡ãããŸããçåŽã®æ¥ç¶ã ãã§ãäž¡æ¹ã«é»æºãäŸçµŠãããŸããäž¡æ¹ãã黿ºäŸçµŠãããšã黿ºåè·¯çã«è¯ããªãããã§ãã ä»ã¯seeeduinoã«æžã蟌ããããseeeduinoã ãã«USBã±ãŒãã«ãæ¥ç¶ããŠãã ããã
int counter = 0;
void setup() {
Serial1.begin(38400);
}
void loop() {
Serial1.println(counter);
delay(3000);
counter++;
if(counter >= 10){
counter = 0;
}
}
3ç§ééã§å€æ°counterã®å€ãéä¿¡ããŠããŸããcounterã¯0ããã€ã³ã¯ãªã¡ã³ãã9ãŸã§å°éãããåã³0ã«æ»ããŠããŸãã
åå㯠Serial
ã ã£ãã®ã«å¯Ÿããä»å㯠Serial1
ã«ãªã£ãŠããç¹ã«æ³šç®ããŠãã ããã Serial1
ãšæžããå Žåã¯UARTéä¿¡ã«ãªããŸãã
ã³ãŒã | åœ¹å² |
Serial | ã·ãªã¢ã«éä¿¡(USB) |
Serial1 | ã·ãªã¢ã«éä¿¡(UART) |
ä»åããŒã¬ãŒã㯠38400 bps
ãšããŠããŸãã
ä»åºŠã¯micro:bitã«æžã蟌ããããmicro:bitã ãã«USBã±ãŒãã«ãæ¥ç¶ããŠãã ããã MakeCodeã§ä»¥äžã®ã³ãŒããäœæããŠãã ããã ã·ãªã¢ã«éä¿¡ãæ±ãããã®ãããã¯ã¯ãé«åºŠãªãããã¯ãã®äžã«ãããŸãã
LED > ãã®ä» > æãããèšå®ãã > 5 åºæ¬ > ã¢ã€ã³ã³ã衚瀺 ã·ãªã¢ã«éä¿¡ > ã·ãªã¢ã«éä¿¡(éä¿¡å ã倿Žãã, é信端å, å信端å, éä¿¡é床) > éä¿¡é床 âŒ38400 åºæ¬ > æååã衚瀺 ã·ãªã¢ã«éä¿¡ > ã·ãªã¢ã«éä¿¡ 1è¡èªã¿åã
UARTéä¿¡åŽã¯äœ¿ã£ãŠããªãããããé信端åãã®P0
ã¯æ°ã«ãªããŠã倧äžå€«ã§ãã
ä»åã¯UARTåä¿¡åŽã䜿ã£ãŠããŸãããå信端åã㯠1
ã«åè·¯æ¥ç¶ããŠãããã P1
ã®ãŸãŸãšããŠäžããã ããŒã¬ãŒãã¯seeeduinoã«åãã㊠38400
ã«å€æŽããŸãã
æžã蟌ã¿ãçµãããšå®è¡ãããŸãã
micro:bitã®LEDã«ïŒç§ããã«æ°å€ãã«ãŠã³ãã¢ãã衚瀺ãããã°æåã§ãïŒ
â»ååãšç°ãªããä»åã¯USBã·ãªã¢ã«éä¿¡ã¯è¡ã£ãŠãããŸããã®ã§ãArduino IDEã®ã·ãªã¢ã«ã¢ãã¿ãŒã«ã¯äœã衚瀺ãããŸããã®ã泚æãã ããã
â»micro:bit V2ã®å Žåãæ°å€ãšæ°å€ã®éã«ãªããïŒç¹ã®ãããã衚瀺ãããŸããåå ã¯äžæã§ããããã®ããã°ã©ã ã¯ä»åéãã®åäœç¢ºèªã§ãã®ã§æ°ã«ããæ¬¡ã«é²ã¿ãŸãããã
ããã§ã¯äžæŠããŒããŠã§ã¢ããé¢ããŠãPCã®ããã°ã©ãã³ã°ã«å ¥ããŸãã
以äžã®HTMLãã¡ã€ã«ãäœæããŠå®è¡ããŠãã ããã
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/101/three.min.js"></script>
</head>
<body>
<canvas id="canvasMain"></canvas>
<script>
// ããŒãæã®åŠç
window.onload = function () {
threejs_run();
}
// three.js
const threejs_run = function () {
//Canvas
const canvas = document.querySelector('#canvasMain');
const CANVAS_WIDTH = 640;
const CANVAS_HEIGHT = 360;
//ã¬ã³ãã©ãŒ
const renderer = new THREE.WebGLRenderer({canvas});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(CANVAS_WIDTH, CANVAS_HEIGHT);
//ã·ãŒã³
const scene = new THREE.Scene();
//ã«ã¡ã©
const camera = new THREE.PerspectiveCamera(50, CANVAS_WIDTH / CANVAS_HEIGHT, 0.1, 2000);
camera.position.set(0, 0, 1200);
//ãªããžã§ã¯ãïŒç«æ¹äœïŒ
const geometry = new THREE.BoxGeometry(500, 500, 500);
const material = new THREE.MeshStandardMaterial({color: 0x00ff00});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
//å
æº
const light = new THREE.DirectionalLight(0xffffff, 1); //color, intensity
light.position.set(0, 0, 1);
scene.add(light);
//座æšè»ž
const axes = new THREE.AxesHelper(2000);
scene.add(axes);
//ã¬ã³ããªã³ã°
renderer.render(scene, camera);
}
</script>
</body>
</html>
ãã®ãããªè¡šç€ºçµæãåºãã°OKã§ãã
ç«æ¹äœãæç»ããŠããŸãããçæ£é¢ããèŠãŠããããïŒæ¬¡å
å³åœ¢ã£ãœãèŠããŠããŸãã
Webããã°ã©ãã³ã°ã§3Dæç»ãè¡ããšãã«äœ¿ãã®ãWebGLã§ããWebGLã¯åŠç¿ã³ã¹ããé«ããããç°¡åã«æ±ããããã«ããã®ãThree.jsãšããã©ã€ãã©ãªã«ãªããŸãã
Three.jsã¯ããŠã³ããŒãããŠäœ¿ãããšãã§ããŸãããCDNã§æäŸãããŠããURLã䜿ãããšãã§ããŸããä»åã¯ä»¥äžã®ã³ãŒãã§ç€ºãããã«CDNãæŽ»çšããŠããŸãã
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/101/three.min.js"></script>
HTMLã§å³åœ¢çãæç»ããéã«å¿ èŠã«ãªãã®ãCanvasã§ãä»åã¯640x360ã®Canvasãèšå®ããŠããŸãã
three.jsã§ã»ãŒå¿
é ãšèšã£ãŠãéèšã§ã¯ãªãèŠçŽ ã¯ä»¥äžïŒã€ã§ãã
ã¯ãããŠã®æ¹ã¯è¯ãåãããªããšæããŸãããthree.jsã«ã¯ããããå¿
ãå®è¡ããªããã°ãããªããäœæ³ããããšè»œãæããŠäžããã
1 : ã¬ã³ãã©ãŒã¯ã·ãŒã³ãšã«ã¡ã©ã®äžã«äœçœ®ããthree.jsã®ã¡ã€ã³éšåã§ããCanvasãèšå®ããŸãã
2 : ã·ãŒã³ã¯ããªããžã§ã¯ããå
æºã座æšè»žãªã©ã眮ãå Žæã§ãã
3 : ã«ã¡ã©ã¯èŠç¹ãšãªãéèŠãªèŠçŽ ã§ãçµæ§ããããã€ã³ããªã®ã§ãå¥é説æããŸãã
4 : ãªããžã§ã¯ãã¯äž»åœ¹ãšãªãç©äœã§ããä»åã¯ç·è²ã®ç«æ¹äœãäœæããŸããããªããžã§ã¯ãã¯ã·ãŒã³ã«è¿œå ããŸãã
5 : å
æºã¯ãªããžã§ã¯ãã«åœãŠãã©ã€ãã§ããå
ã®åãã匷ããªã©èšå®å¯èœã§ããå
æºãã·ãŒã³ã«è¿œå ããŸãã
ããã«ä»åã¯ã座æšè»žããã·ãŒã³ã«è¿œå ããŠããŸãããããã¯ãã£ãŠãç¡ããŠãOKã§ããã«ã¡ã©ã®äœçœ®ãè§åºŠã倿Žããå Žåã«ãããšäŸ¿å©ã§ãã èµ€ãX軞ãç·ãY軞ãéãZ軞ã§ããZ軞ãèŠããªãã®ã¯çæ£é¢ã«ããããã§ãã
ããã6åã®èšå®ãçµãã£ããæåŸã«renderer.render(scene, camera)
ã§ã¬ã³ããªã³ã°ããŠthree.jsã®æç»ã宿ããŸãã
ã«ã¡ã©ãïŒæ¬¡å
座æšã®ã©ãã«çœ®ãããã©ã®è§åºŠã«ãããã«ãã£ãŠèŠãæ¹ãå€ãããŸãã
ã«ã¡ã©ã®èšå®ã«ãã£ãŠã¯ãªããžã§ã¯ããå
šãèŠããªããªã£ããããŸãã
//ã«ã¡ã©
const camera = new THREE.PerspectiveCamera(50, CANVAS_WIDTH / CANVAS_HEIGHT, 0.1, 2000);
camera.position.set(0, 0, 1200);
PerspectiveCamera
ã®ç¬¬äžåŒæ°ã¯FOVïŒèŠéè§ïŒã®èšå®ã§ããçŸåšã¯50°ãšããæå³ã§ããå°ãå€ãå€ããŠã¿ãŠãã ããã
第äºåŒæ°ã¯ã¢ã¹ãã¯ãæ¯ã®èšå®ã§ããåºæ¬çã«ãã®ãŸãŸãè¯ãã§ãããã
第äžåŒæ°ãšç¬¬ååŒæ°ã¯ãã©ãããã©ããŸã§ãã«ã¡ã©ã«æ ããã®èšå®ã§ããçŸåšã¯ã«ã¡ã©ãã0.1ïœ2000ã®ç¯å²ã ãæç»ãããšããæå³ã§ããã®ç¯å²ããå€ãããªããžã§ã¯ãã¯èŠããªããªãã®ã§æ³šæããŠãã ãããããã¯ã«ã¡ã©ã®äœçœ®ãšãªããžã§ã¯ãã®å€§ããã«ãã£ãŠåœ±é¿ãåããŸãã
position.set
ã§ã«ã¡ã©ãã©ãã«çœ®ãããèšå®ããŠããŸããä»åã¯åç¹ããæ£ã®Z軞æ¹åã«1200ç§»åããäœçœ®ã§ãã 被åäœãã1200ã»ã©åŸãã«äžãã£ãäœçœ®ãšæãããšè¯ããšæããŸããã¡ãªã¿ã«ãªããžã§ã¯ãã®å
éšã«ã«ã¡ã©äœçœ®ãèšå®ãããšäœãèŠããªããªããŸãã
ã«ã¡ã©ã®ãããã©ãããšããŠãã«ã¡ã©ã®åº§æšäœçœ®ãå€ããã ãã§ã¯ã«ã¡ã©ã®åããå€ãããªãç¹ã§ããä»åã®ããã«æ£ã®Z軞æ¹åã®ã¿ç§»åã®å Žåã¯ãã«ã¡ã©ã®åããšäžèŽããŠãããããå€ã倧ããããŠãèŠå€±ãããšã¯ãããŸãããäŸãã°x軞æ¹åã«å€ãèšå®ãããšãã«ã¡ã©ãåããå€ããã«ç暪ã«ç§»åãããããå€ã倧ãããããšããã«èŠå€±ããŸããè²ã èšå®ã詊ããŠã¿ãŠãæèŠãæŽãã§ã¿ãã®ãè¯ãã§ãããã åç¹æ¹åã«ã«ã¡ã©ãåããã¡ãœããããããŸãããæåãã䜿ããšäœèšã«åããã«ãããªãã®ã§ããŸãã¯ç§»åã ãã§è©ŠããŠã¿ãŠäžããã
以äžã®HTMLãã¡ã€ã«ãäœæããŠå®è¡ããŠãã ããã
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/101/three.min.js"></script>
</head>
<body>
<canvas id="canvasMain"></canvas>
<script>
// ããŒãæã®åŠç
window.onload = function () {
threejs_run();
}
// three.js
const threejs_run = function () {
//Canvas
const canvas = document.querySelector('#canvasMain');
const CANVAS_WIDTH = 640;
const CANVAS_HEIGHT = 360;
//ã¬ã³ãã©ãŒ
const renderer = new THREE.WebGLRenderer({canvas});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(CANVAS_WIDTH, CANVAS_HEIGHT);
//ã·ãŒã³
const scene = new THREE.Scene();
//ã«ã¡ã©
const camera = new THREE.PerspectiveCamera(50, CANVAS_WIDTH / CANVAS_HEIGHT, 0.1, 2000);
camera.position.set(0, 0, 1200);
//ãªããžã§ã¯ãïŒç«æ¹äœïŒ
const geometry = new THREE.BoxGeometry(500, 500, 500);
const material = new THREE.MeshStandardMaterial({color: 0x00ff00});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
//å
æº
const light = new THREE.DirectionalLight(0xffffff, 1); //color, intensity
light.position.set(0, 0, 1);
scene.add(light);
//座æšè»ž
const axes = new THREE.AxesHelper(2000);
scene.add(axes);
//Animation
const animate = function () {
requestAnimationFrame(animate);
//ç«æ¹äœã®å転
cube.rotation.x += 0.005;
cube.rotation.y += 0.01;
//ã¬ã³ããªã³ã°
renderer.render(scene, camera);
}
animate();
}
</script>
</body>
</html>
ãã®ããã«ç«æ¹äœãã¢ãã¡ãŒã·ã§ã³ãããã°æåã§ãïŒ
å€åç¹ã¯æåŸã®éšåã®ã¿ã§ãã å
çšã¯1ãã¬ãŒã æç»ããŠçµäºã§ãããããã®ããã«requestAnimationFrame
ã䜿ãããšã«ãããæéããšã«å€åãããã¬ãŒã ãé£ç¶ã§æç»ãããããšãã§ããŸãã
ä»åã¯ãªããžã§ã¯ãã«rotation
ã§å°ããã€å転ãè¡ã£ãŠããŸãã
//Animation
const animate = function () {
requestAnimationFrame(animate);
//ç«æ¹äœã®å転
cube.rotation.x += 0.005;
cube.rotation.y += 0.01;
//ã¬ã³ããªã³ã°
renderer.render(scene, camera);
}
animate();
three.jsã§ã®ã¯ã©ãŒã¿ããªã³ã¯ä»¥äžã®ã³ãŒããªã©ã§ç°¡åã«é©çšããããšãã§ããŸãã
quaternion.set(x, y, z, w)
æ°ãä»ããç¹ãšããŠãq0
㯠w
ã q1
㯠x
ã q2
㯠y
ã q3
㯠z
ãªã®ã§ãSeeeduinoããåºåãããã¯ã©ãŒã¿ããªã³ (q0, q1, q2, q3)
㯠(q1, q2, q3, q0)
ã«äžŠã³æ¿ããå¿
èŠããããšããããšã§ãã
ãã®ä»ã®è©³çްã¯ãã¡ããåç
§ããŠãã ããã
threejs.org docs Quaternion
ã¯ã©ãŒã¿ããªã³ãèšé²ããããŒã¿ãJSON圢åŒã§ quaternion_data
ãšããŠçšæããäžå®æéæ¯ã«é ã«ã«ãŒãããŠèªã¿èŸŒãã³ãŒããäœããŸããã以äžã®HTMLãã¡ã€ã«ãäœæããŠå®è¡ããŠãã ããã
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/101/three.min.js"></script>
</head>
<body>
<canvas id="canvasMain"></canvas>
<script>
//quaternion
let data_q0 = 0;
let data_q1 = 0;
let data_q2 = 0;
let data_q3 = 0;
//ã¯ã©ãŒã¿ããªã³ããŒã¿
const quaternion_data = [
{"q0":0.996, "q1":0.007, "q2":-0.030, "q3":-0.080},
{"q0":0.996, "q1":0.007, "q2":-0.030, "q3":-0.081},
{"q0":0.996, "q1":0.005, "q2":-0.030, "q3":-0.082},
{"q0":0.996, "q1":0.010, "q2":-0.026, "q3":-0.084},
{"q0":0.996, "q1":0.037, "q2":-0.006, "q3":-0.085},
{"q0":0.991, "q1":0.079, "q2":0.043, "q3":-0.095},
{"q0":0.978, "q1":0.109, "q2":0.129, "q3":-0.124},
{"q0":0.953, "q1":0.142, "q2":0.226, "q3":-0.146},
{"q0":0.924, "q1":0.161, "q2":0.306, "q3":-0.163},
{"q0":0.894, "q1":0.178, "q2":0.373, "q3":-0.171},
{"q0":0.858, "q1":0.200, "q2":0.440, "q3":-0.176},
{"q0":0.821, "q1":0.219, "q2":0.496, "q3":-0.180},
{"q0":0.786, "q1":0.237, "q2":0.543, "q3":-0.179},
{"q0":0.753, "q1":0.249, "q2":0.582, "q3":-0.179},
{"q0":0.721, "q1":0.255, "q2":0.618, "q3":-0.183},
{"q0":0.691, "q1":0.259, "q2":0.649, "q3":-0.185},
{"q0":0.658, "q1":0.271, "q2":0.676, "q3":-0.191},
{"q0":0.633, "q1":0.286, "q2":0.692, "q3":-0.195},
{"q0":0.646, "q1":0.283, "q2":0.680, "q3":-0.200},
{"q0":0.699, "q1":0.267, "q2":0.632, "q3":-0.202},
{"q0":0.765, "q1":0.238, "q2":0.565, "q3":-0.197},
{"q0":0.836, "q1":0.208, "q2":0.473, "q3":-0.182},
{"q0":0.907, "q1":0.160, "q2":0.355, "q3":-0.159},
{"q0":0.961, "q1":0.096, "q2":0.226, "q3":-0.131},
{"q0":0.989, "q1":0.027, "q2":0.098, "q3":-0.108},
{"q0":0.994, "q1":-0.043, "q2":0.001, "q3":-0.099},
{"q0":0.985, "q1":-0.120, "q2":-0.086, "q3":-0.087},
{"q0":0.961, "q1":-0.201, "q2":-0.169, "q3":-0.080},
{"q0":0.937, "q1":-0.247, "q2":-0.235, "q3":-0.079},
{"q0":0.910, "q1":-0.282, "q2":-0.292, "q3":-0.078},
{"q0":0.880, "q1":-0.325, "q2":-0.338, "q3":-0.077},
{"q0":0.882, "q1":-0.321, "q2":-0.337, "q3":-0.078},
{"q0":0.912, "q1":-0.273, "q2":-0.297, "q3":-0.080},
{"q0":0.941, "q1":-0.212, "q2":-0.251, "q3":-0.078},
{"q0":0.971, "q1":-0.099, "q2":-0.203, "q3":-0.079},
{"q0":0.983, "q1":0.016, "q2":-0.168, "q3":-0.069},
{"q0":0.979, "q1":0.134, "q2":-0.137, "q3":-0.062},
{"q0":0.962, "q1":0.245, "q2":-0.104, "q3":-0.058},
{"q0":0.934, "q1":0.345, "q2":-0.074, "q3":-0.049},
{"q0":0.892, "q1":0.448, "q2":-0.044, "q3":-0.045},
{"q0":0.833, "q1":0.551, "q2":-0.015, "q3":-0.041},
{"q0":0.773, "q1":0.633, "q2":0.001, "q3":-0.045},
{"q0":0.712, "q1":0.700, "q2":0.013, "q3":-0.058},
{"q0":0.625, "q1":0.776, "q2":0.031, "q3":-0.075},
{"q0":0.548, "q1":0.831, "q2":0.043, "q3":-0.092},
{"q0":0.520, "q1":0.847, "q2":0.051, "q3":-0.096},
{"q0":0.564, "q1":0.819, "q2":0.056, "q3":-0.088},
{"q0":0.712, "q1":0.695, "q2":0.056, "q3":-0.077},
{"q0":0.875, "q1":0.475, "q2":0.064, "q3":-0.062},
{"q0":0.954, "q1":0.285, "q2":0.075, "q3":-0.058},
{"q0":0.986, "q1":0.128, "q2":0.090, "q3":-0.060},
{"q0":0.992, "q1":-0.011, "q2":0.107, "q3":-0.059},
{"q0":0.981, "q1":-0.140, "q2":0.119, "q3":-0.059},
{"q0":0.957, "q1":-0.259, "q2":0.118, "q3":-0.059},
{"q0":0.919, "q1":-0.372, "q2":0.118, "q3":-0.053},
{"q0":0.860, "q1":-0.494, "q2":0.122, "q3":-0.048},
{"q0":0.801, "q1":-0.583, "q2":0.129, "q3":-0.048},
{"q0":0.747, "q1":-0.649, "q2":0.134, "q3":-0.048},
{"q0":0.710, "q1":-0.688, "q2":0.140, "q3":-0.046},
{"q0":0.677, "q1":-0.720, "q2":0.146, "q3":-0.047},
{"q0":0.647, "q1":-0.745, "q2":0.154, "q3":-0.045},
{"q0":0.658, "q1":-0.736, "q2":0.151, "q3":-0.048},
{"q0":0.718, "q1":-0.678, "q2":0.152, "q3":-0.047},
{"q0":0.787, "q1":-0.596, "q2":0.150, "q3":-0.051},
{"q0":0.875, "q1":-0.456, "q2":0.150, "q3":-0.055},
{"q0":0.940, "q1":-0.299, "q2":0.154, "q3":-0.052},
{"q0":0.974, "q1":-0.156, "q2":0.156, "q3":-0.054},
{"q0":0.985, "q1":-0.027, "q2":0.161, "q3":-0.050},
{"q0":0.969, "q1":0.174, "q2":0.171, "q3":-0.050},
{"q0":0.899, "q1":0.402, "q2":0.167, "q3":-0.057},
{"q0":0.771, "q1":0.614, "q2":0.156, "q3":-0.072},
{"q0":0.684, "q1":0.710, "q2":0.153, "q3":-0.072},
{"q0":0.640, "q1":0.751, "q2":0.148, "q3":-0.076},
{"q0":0.622, "q1":0.766, "q2":0.143, "q3":-0.077},
{"q0":0.652, "q1":0.741, "q2":0.139, "q3":-0.078},
{"q0":0.706, "q1":0.689, "q2":0.143, "q3":-0.084},
{"q0":0.825, "q1":0.544, "q2":0.140, "q3":-0.070},
{"q0":0.958, "q1":0.241, "q2":0.144, "q3":-0.053},
{"q0":0.990, "q1":0.057, "q2":0.117, "q3":-0.048},
{"q0":0.993, "q1":0.061, "q2":0.083, "q3":-0.054},
{"q0":0.998, "q1":0.014, "q2":0.006, "q3":-0.065},
{"q0":0.997, "q1":0.013, "q2":0.006, "q3":-0.072},
{"q0":0.997, "q1":0.013, "q2":0.006, "q3":-0.072},
{"q0":0.997, "q1":0.013, "q2":0.006, "q3":-0.072},
{"q0":0.997, "q1":0.012, "q2":0.006, "q3":-0.072},
{"q0":0.997, "q1":0.012, "q2":0.006, "q3":-0.072},
{"q0":0.997, "q1":0.012, "q2":0.006, "q3":-0.072},
{"q0":0.997, "q1":0.011, "q2":0.006, "q3":-0.072},
{"q0":0.997, "q1":0.011, "q2":0.005, "q3":-0.072},
{"q0":0.997, "q1":0.011, "q2":0.005, "q3":-0.072},
{"q0":0.997, "q1":0.011, "q2":0.005, "q3":-0.072},
{"q0":0.997, "q1":0.011, "q2":0.005, "q3":-0.072},
{"q0":0.997, "q1":0.010, "q2":0.005, "q3":-0.072},
];
//ã¯ã©ãŒã¿ããªã³ããŒã¿ã®ã€ã³ããã¯ã¹
let quaternion_data_counter = 0;
//ã¯ã©ãŒã¿ããªã³ããŒã¿ãã¿ã€ããŒèªã¿èŸŒã¿
const change_quaternion_data = function () {
//ããŒã¿æŽæ°
data_q0 = quaternion_data[quaternion_data_counter].q0;
data_q1 = quaternion_data[quaternion_data_counter].q1;
data_q2 = quaternion_data[quaternion_data_counter].q2;
data_q3 = quaternion_data[quaternion_data_counter].q3;
//ã«ãŠã³ã¿ãŒã¢ãã
quaternion_data_counter++;
if(quaternion_data_counter >= quaternion_data.length){
quaternion_data_counter = 0;
}
setTimeout(change_quaternion_data, 100);
}
// ããŒãæã®åŠç
window.onload = function () {
threejs_run();
change_quaternion_data();
}
// three.js
const threejs_run = function () {
//Canvas
const canvas = document.querySelector('#canvasMain');
const CANVAS_WIDTH = 640;
const CANVAS_HEIGHT = 360;
//ã¬ã³ãã©ãŒ
const renderer = new THREE.WebGLRenderer({canvas});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(CANVAS_WIDTH, CANVAS_HEIGHT);
//ã·ãŒã³
const scene = new THREE.Scene();
//ã«ã¡ã©
const camera = new THREE.PerspectiveCamera(50, CANVAS_WIDTH / CANVAS_HEIGHT, 0.1, 2000);
camera.position.set(0, 0, 1200);
//ãªããžã§ã¯ãïŒç«æ¹äœïŒ
const geometry = new THREE.BoxGeometry(500, 500, 500);
const material = new THREE.MeshStandardMaterial({color: 0x00ff00});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
//å
æº
const light = new THREE.DirectionalLight(0xffffff, 1); //color, intensity
light.position.set(0, 0, 1);
scene.add(light);
//座æšè»ž
const axes = new THREE.AxesHelper(2000);
scene.add(axes);
//Animation
const animate = function () {
requestAnimationFrame(animate);
//ã¯ã©ãŒã¿ããªã³ã§å転
cube.quaternion.set(data_q1, data_q2, data_q3, data_q0);
//ã¬ã³ããªã³ã°
renderer.render(scene, camera);
}
animate();
}
</script>
</body>
</html>
ãã®ããã«ç«æ¹äœãã¢ãã¡ãŒã·ã§ã³ããããšæããŸãã
å çšã¯ãã¡ãã§çšæããããŒã¿ã§ããããçããã9軞ã»ã³ãµãŒãåãããŠããŒã¿ãäœæããŠã¿ãŸãããã
åè·¯ã¯ã以åè¡ã£ããI2Céä¿¡ã§DMPãã®æ¥ç¶ãå¿ èŠã§ããmicro:bitãšã®æ¥ç¶ããã£ãŠãåé¡ãããŸããããUSBã³ãã¯ã¿ãæ¿ãéã¯seeeduinoãããã¯micro:bitã®ã©ã¡ããã ãã«ããŠãã ããïŒé»æºãç«¶åããããïŒ
â»ãI2Céä¿¡ã§DMPãã®åè·¯ãšåãã§ãã
seeeduino XIAOã«ä»¥äžã®ã³ãŒããæžãããã§äžããã
ãI2Céä¿¡ã§DMPãã§ã®ã³ãŒããããŒã¹ã«ãSeeeduino XIAOãã®å
容ãé©çšããã¯ã©ãŒã¿ããªã³ããŒã¿ãUSBã·ãªã¢ã«ã§åºåããããã«æ¹é ããŸããã
/************************************************************
MPU9250_DMP_Quaternion
Quaternion example for MPU-9250 DMP Arduino Library
Jim Lindblom @ SparkFun Electronics
original creation date: November 23, 2016
https://github.com/sparkfun/SparkFun_MPU9250_DMP_Arduino_Library
The MPU-9250's digital motion processor (DMP) can calculate
four unit quaternions, which can be used to represent the
rotation of an object.
This exmaple demonstrates how to configure the DMP to
calculate quaternions, and prints them out to the serial
monitor. It also calculates pitch, roll, and yaw from those
values.
Development environment specifics:
Arduino IDE 1.6.12
SparkFun 9DoF Razor IMU M0
Supported Platforms:
- ATSAMD21 (Arduino Zero, SparkFun SAMD21 Breakouts)
*************************************************************/
#include <SparkFunMPU9250-DMP.h>
MPU9250_DMP imu;
void setup()
{
Serial.begin(9600);
// Call imu.begin() to verify communication and initialize
if (imu.begin() != INV_SUCCESS)
{
while (1)
{
Serial.println("Unable to communicate with MPU-9250");
Serial.println("Check connections, and try again.");
Serial.println();
delay(5000);
}
}
imu.dmpBegin(DMP_FEATURE_6X_LP_QUAT | // Enable 6-axis quat
DMP_FEATURE_GYRO_CAL, // Use gyro calibration
10); // Set DMP FIFO rate to 10 Hz
// DMP_FEATURE_LP_QUAT can also be used. It uses the
// accelerometer in low-power mode to estimate quat's.
// DMP_FEATURE_LP_QUAT and 6X_LP_QUAT are mutually exclusive
}
void loop()
{
// Check for new data in the FIFO
if ( imu.fifoAvailable() )
{
// Use dmpUpdateFifo to update the ax, gx, mx, etc. values
if ( imu.dmpUpdateFifo() == INV_SUCCESS)
{
// computeEulerAngles can be used -- after updating the
// quaternion values -- to estimate roll, pitch, and yaw
imu.computeEulerAngles();
printIMUData();
}
}
}
void printIMUData(void)
{
// After calling dmpUpdateFifo() the ax, gx, mx, etc. values
// are all updated.
// Quaternion values are, by default, stored in Q30 long
// format. calcQuat turns them into a float between -1 and 1
float q0 = imu.calcQuat(imu.qw);
float q1 = imu.calcQuat(imu.qx);
float q2 = imu.calcQuat(imu.qy);
float q3 = imu.calcQuat(imu.qz);
char format_str[100];
sprintf(format_str, "{\"q0\":%1.3f, \"q1\":%1.3f, \"q2\":%1.3f, \"q3\":%1.3f},", q0, q1, q2, q3);
Serial.println(format_str);
delay(50);
}
æžãèŸŒã¿æåãããã·ãªã¢ã«ã³ã³ãœãŒã«ãéããŠäžãããããŒã¬ãŒãã¯9600 bps
ã§ãã JSON圢åŒã§ã¯ã©ãŒã¿ããªã³ãåºåããŠããŸãã
ãã¬ããããŒããå転ãããŠå€ãå€åãããé©åœãªæã§ãèªåã¹ã¯ããŒã«ãã®ãã§ãã¯ãå€ããä»»æã®è€æ°ããŒã¿è¡ãã³ããŒããŠãå
çšã®HTMLãã¡ã€ã«ã® quaternion_data
ã® [ ]
ã®äžèº«ãäžæžãããŠå®è¡ããŠã¿ãŠäžããã åããéãã¯çœ®ããŠãããšããŠãåãããéãã«three.jsäžã§è¡šç€ºããããšæããŸãã
sprintf
ã䜿ã£ãŠæå®ã®åœ¢åŒã«ãã©ãŒãããããŠããç¹ã«æ³šç®ããŠãã ããã
char format_str[100];
sprintf(format_str, "{\"q0\":%1.3f, \"q1\":%1.3f, \"q2\":%1.3f, \"q3\":%1.3f},", q0, q1, q2, q3);
å°æ°ã®å Žåã¯%f
ã§ãããæŽæ°ã®å Žåã¯%d
ã䜿ããŸãããŸã %02d
çã䜿ããšãŒãåã衚çŸãå¯èœã§ãã
ã¡ãªã¿ã«äžèšã®ã³ãŒãã®\
ã¯ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã%1.3f
ã¯æŽæ°äžæ¡.å°æ°3æ¡ãšããæå³ã§ãã詳ããã¯åèªèª¿ã¹ãŠãã ããã
Webããã°ã©ãã³ã°ã®å Žåã¯JSON圢åŒãªã©ã§ãããšãããŸãããBLEãããŒããŠã§ã¢ã®ã·ãªã¢ã«éä¿¡ã«ãããŠãJSON圢åŒã®ãããªããã°ã©ãã³ã°ãããã圢ã«ããŠããŸããšãã€ãæ°ãå¢ããŠããŸããçé»åãããŒã¿è»¢éé床ã«å€§ãã圱é¿ãåºãŸããã§ããã ãäœèšãªæ å ±ã¯ä»å ããããã€å§çž®ãããå°ããããŒã¿ã§éä¿¡ããããšãç®æããŸãã
BLEã¯éåžžèšå®ã ãšãäžåºŠã«èšå®ã§ããããŒã¿æ°ã¯20Byteã§ãã
ã§ãããmicro:bitã«ãŠUARTåä¿¡ããŠãããBLE UARTéä¿¡ããå Žåã18Byteãè¶
ããŠãããšçµéšäžããŸãéä¿¡ã§ããŸããã§ããã ãããéã¿ãŠãã¯ã©ãŒã¿ããªã³ã®ããŒã¿ãseeeduinoããéä¿¡ããå Žåã18Byte以äžã«æããŠãæ¹ãè¯ãããã§ãã
ãã¡ãããå°åãã«éä¿¡ãåããŠéãããšãå¯èœã§ãããåŠçãè€éã«ãªãããã1床ã«1ã»ããã®ã¯ã©ãŒã¿ããªã³ããŒã¿ãéä¿¡ããããšãç®æšãšããŸãã
æ¹ããŠãI2Céä¿¡ã§DMPãã®ãµã³ãã«ã³ãŒãã§åºåããSeeeduinoã®ã¯ã©ãŒã¿ããªã³ããŒã¿ãèŠãŠã¿ããšã以äžã®ãããªå°æ°ã®å€ã§ãã
Q: 0.9979, -0.0004, -0.0572, 0.0302
ããããã®å€ã¯æå° -1.0000 ïœ æå€§ +1.0000 ãŸã§ã®ç¯å²ã§ãã ãããçµéšäžã§ãããå°æ°ç¹ä»¥äžã®æ¡æ°ãå°ãªããšãåãã®æ»ããããäžè¶³ããŠããŸããŸããä»åã¯å°æ°ç¹ä»¥äž3æ¡ä»¥äžãç®æšãšããŸãã
å
çšã®Seeeduinoã®ã¯ã©ãŒã¿ããªã³ããŒã¿ãããQ:
ã ,
ãã¹ããŒã¹ãåãé€ããå¿
ãæ°å€ã®åã«+
-
笊å·ãä»ããããã«ãããšä»¥äžã®ããã«ãªããŸãã
+0.9979-0.0004-0.0572+0.0302
ããã ãš28Byteã§å€§åãªãŒããŒããŠããŸãã å°æ°ç¹ä»¥äž3æ¡ã«ããŠã¿ãŸãã
+0.997-0.000-0.057+0.030
ããã§ãããã24Byteã§ããããŸã ãŸã ç®æšããªãŒããŒããŠããŸãã
ããŒã¿ããšã³ã³ãŒãããŠãµã€ãºãå°ããããæ¹æ³ã¯æ§ã æ¹æ³ããããŸãããããã§ã¯ç°¡åã«èšç®ã§ããæ¹æ³ãèããŠã¿ãŸãã
+
-
èšå·ãç¡ããåçŽã«èšå·ãåãé€ããŠããŸããšå
éãã«åŸ©å·åã§ããªãããNGã§ãã
ããäžåºŠå
çšã®ã¯ã©ãŒã¿ããªã³ããŒã¿ã®æå°å€ïœæå€§å€ãèããŠã¿ãŠãã ããã
1ãè¶³ãããšã§å¿
ãæ°å€ã¯æ£ã®æ°ãšãªããŸãã
+1.997+1.000+9.943+1.030
å¿
ã +
ãä»ãã®ã§ããã°éä¿¡æã¯åã£ãŠããŸã£ãŠãè¯ãããã§ãã
åçŽã«æååæäœããŠå°æ°ç¹ãæ¶ããšããããæ¹ã§ãè¯ãã§ããããã£ãšç°¡åãªæ¹æ³ããããŸãã ããã¯1000
ãæãããšããããšã§ãããã®æ¹ãããã°ã©ãã³ã°çã«ãç°¡åã«èšè¿°ã§ããŸãã
1997100099431030
ããã§å°æ°ç¹ä»¥äž3æ¡ãä¿ã¡ã€ã€ã16Byeã«ããããšãåºæ¥ãŸããïŒ
ãã³ãŒãããã®ã¯PCåŽã®HTML/JavaScriptã§ãã
ãšã³ã³ãŒããšéã®èšç®ãè¡ãããšã§ç°¡åã«ãã³ãŒãã§ããŸãããã ãããã³ãŒãããåã«substr
çã䜿ã£ãŠã16æåã4æåãã€åãåºããšè¯ãã§ãããã
ãããŸã§äžçŽã³ãŒã¹ã§åŠãã å šãŠã®å 容ãmicro:bitã®BLEéä¿¡ãçµ±åããŠã9軞ã»ã³ãµæèŒã®ãã¬ããããŒããå転ããããšãHTMLäžã®ç«æ¹äœããªã¢ã«ã¿ã€ã ã«å転ããã·ã¹ãã ãäœæããŠãã ããã
è£è¶³
ç°¡åãªã¢ã³ã±ãŒãã«çããŠè§£çäŸãå
¥æãããïŒ
è§£çãèŠãåã«èªåã§äœã£ãŠæ©ãããšãããã°ã©ãã³ã°åäžã«ç¹ãããŸãã
ååã®æŒç¿ã§å®ç©ãšç«æ¹äœã®å転æ¹åãäžèŽããŠããªã人ãå€ãã£ããšæããŸãã ããã¯ãäžããèŠãã®ããäžããèŠãã®ããªã©ãã©ã®èŠç¹ããèŠããã«ãã£ãŠèŠãæ¹ãå€ããããã§ãã
ä»åã¯ãªã¢ã«èŠç¹ãšthree.jsã®ã«ã¡ã©èŠç¹ãåãããŠãå転æ¹åãæ°æã¡ããäžèŽãããŸãïŒ
ä»åã¯ãªããžã§ã¯ããšããŠçãæããããã«å°çã®ãã¯ã¹ãã£ããããã³ã°ããŠå転衚瀺ããŸãã
ä»åã¯åæ±ã®æç»ããšãªããžã§ã¯ãã®ã°ã«ãŒãåã«ã€ããŠåŠã³ãŸãã
PCã ãã§å®è¡ã§ããŸãã
ïŒã€ã®ãªããžã§ã¯ãã ãéžæããŠé»è²ã«çè²ããŸãã
three.jsã§ããã¹ããæç»ããããšã¯ã§ããŸããå°ãè€éã§ãã
ä»åã¯ããç°¡åãªæ¹æ³ã§ããã¹ãæç»ãå®çŸãããŸãã
æçµçã«ç»é¢ã«è¡šç€ºãããã®ãšããŠå°çã®ç»åã ãã§ãªããåçš®æ
å ±ã衚瀺ãããŸãã
ãã®ãšãã«äœ¿ããããŒã¿ãçšæããŸããã
çé¢ãšã®èšç®ã®åèã«ãªãæ
å ±ãèŒããŠããŸãã
ç·åæŒç¿æã®ãã³ããšããŠäžããã
ããã§ã¯ããã¬ããããŒãïŒ9軞ã»ã³ãµ+SeeeduinoïŒããšãmicro:bitããçã®äžã«çŽããæé ã説æããŸãã
ãããŸã§åŠãã å
容ãçµåããŠãåç»ã®ããã«ãã©ã¹ããã¯ããŒã«ãå転ãããšåãããã«PCç»é¢äžã§ããŒãã£ã«å°çãå転ããå Žæã«å¿ããŠååœã®æ
å ±ã衚瀺ãããã·ã¹ãã ã宿ãããŠãã ããã
â»åç»ã§äœ¿ã£ãŠããããã€ã¹ãçµã¿ç«ãŠã¯å°ãå€ããããçã®äžã¯æ°ã«ããªãã§ãã ããã
ããã®ãã®ããã¯QAæ²ç€ºæ¿ããšãã³ã³ãã³ãã®å€æŽå±¥æŽãã§ãã