{"id":488,"date":"2022-01-05T19:35:28","date_gmt":"2022-01-05T18:35:28","guid":{"rendered":"https:\/\/spotonfun.pl\/?p=488"},"modified":"2022-01-13T16:53:19","modified_gmt":"2022-01-13T15:53:19","slug":"projekt-arduino-urzadzenie-do-biofeedbacku-nauka-medytacji-czesc-2-podlaczenie-zyroskopu","status":"publish","type":"post","link":"https:\/\/spotonfun.pl\/index.php\/2022\/01\/05\/projekt-arduino-urzadzenie-do-biofeedbacku-nauka-medytacji-czesc-2-podlaczenie-zyroskopu\/","title":{"rendered":"Projekt Arduino &#8211; urz\u0105dzenie do biofeedbacku &#8211; nauka medytacji &#8211; cz\u0119\u015b\u0107 2 &#8211; pod\u0142\u0105czenie \u017cyroskopu"},"content":{"rendered":"<p>Je\u015bli jeste\u015b tu po raz pierwszy, zach\u0119cam do zapoznania si\u0119 z <a href=\"https:\/\/spotonfun.pl\/index.php\/2021\/12\/28\/projekt-arduino-urzadzenie-do-biofeedbacku-nauka-medytacji-czesc-1\/\" data-type=\"URL\" data-id=\"https:\/\/spotonfun.pl\/index.php\/2021\/12\/28\/projekt-arduino-urzadzenie-do-biofeedbacku-nauka-medytacji-czesc-1\/\" target=\"_blank\" rel=\"noreferrer noopener\">poprzedni\u0105 cz\u0119\u015bci\u0105<\/a> &#8211; kt\u00f3ra jest swego rodzaju wprowadzeniem &#8211; takim opisem projektu i jego genezy.<\/p><p>Poniewa\u017c na moje Arduino nano musz\u0119 poczeka\u0107, postanowi\u0142am zacz\u0105\u0107 od Arduino Uno, kt\u00f3re to &#8222;mam na stanie&#8221;. Poza tym, jest ono wi\u0119ksze i \u0142atwiej na nim prototypowa\u0107 i pod\u0142\u0105cza\u0107 te wszystkie magiczne kabelki \ud83d\ude42<\/p><style>.wp-block-kadence-advancedheading.kt-adv-heading_203cce-c1, .wp-block-kadence-advancedheading.kt-adv-heading_203cce-c1[data-kb-block=\"kb-adv-heading_203cce-c1\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading_203cce-c1 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading_203cce-c1[data-kb-block=\"kb-adv-heading_203cce-c1\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading_203cce-c1 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading_203cce-c1[data-kb-block=\"kb-adv-heading_203cce-c1\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading_203cce-c1 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading_203cce-c1\">Pocz\u0105tek &#8211; w poszukiwaniu &#8222;jak to zrobi\u0107&#8221; \ud83d\ude42<\/h2><p>Dokumentacja do modu\u0142u GY-521 jest dost\u0119pna <a rel=\"noreferrer noopener\" href=\"https:\/\/idoc.pub\/documents\/mpu-6050-gy-521-datasheet-6nq800owrpnw\" target=\"_blank\">tutaj<\/a>. <\/p><p>Poniewa\u017c ju\u017c baaardzo dawno nie mia\u0142am styczno\u015bci z dokumentacj\u0105 elektroniczn\u0105 postanowi\u0142am poszuka\u0107 bardziej &#8222;\u0142opatologicznych&#8221; opis\u00f3w. Na szcz\u0119\u015bcie internet przyszed\u0142 z pomoc\u0105 i szybko znalaz\u0142am jak wszystko ze sob\u0105 po\u0142\u0105czy\u0107. Google mocno w u\u017cyciu :). Co ciekawe, znajdowa\u0142am opr\u00f3cz schematu r\u00f3wnie\u017c programy do obs\u0142ugi modu\u0142u &#8211; ale o tym za chwil\u0119.<\/p><style>.wp-block-kadence-advancedheading.kt-adv-heading_bb827f-70, .wp-block-kadence-advancedheading.kt-adv-heading_bb827f-70[data-kb-block=\"kb-adv-heading_bb827f-70\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading_bb827f-70 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading_bb827f-70[data-kb-block=\"kb-adv-heading_bb827f-70\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading_bb827f-70 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading_bb827f-70[data-kb-block=\"kb-adv-heading_bb827f-70\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading_bb827f-70 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading_bb827f-70\">\u0141\u0105czymy kabelki<\/h2><p>Tak wygl\u0105da schemat po\u0142\u0105czenia modu\u0142u GY-521 z Arduino:<\/p><figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/spotonfun.pl\/wp-content\/uploads\/2021\/12\/GY-521-arduino-polaczenie-1024x1024.png\" alt=\"\" class=\"wp-image-508\"\/><figcaption>Schemat pod\u0142\u0105czenia \u017cyroskopu GY-521 (MPU6050) do Arduino Uno<\/figcaption><\/figure><p>A tak wygl\u0105da to u mnie z wykorzystaniem p\u0142ytki prototypowej:<\/p><figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/spotonfun.pl\/wp-content\/uploads\/2021\/12\/20211228_183547-1024x768.jpg\" alt=\"\" class=\"wp-image-510\"\/><\/figure><style>.wp-block-kadence-column.kb-section-dir-horizontal > .kt-inside-inner-col > #kt-info-box_40afc9-39 .kt-blocks-info-box-link-wrap{max-width:unset;}#kt-info-box_40afc9-39 .kt-blocks-info-box-link-wrap{border-color:rgba(43, 108, 176, 0.17);border-radius:21px;border-top-width:5px;border-right-width:5px;border-bottom-width:5px;border-left-width:5px;background:#ffffff;padding-top:24px;padding-right:24px;padding-bottom:24px;padding-left:24px;margin-top:50px;}#kt-info-box_40afc9-39 .kt-blocks-info-box-link-wrap:hover{background:#ffffff;}#kt-info-box_40afc9-39.wp-block-kadence-infobox{max-width:100%;}#kt-info-box_40afc9-39 .kadence-info-box-image-inner-intrisic-container{max-width:100px;}#kt-info-box_40afc9-39 .kadence-info-box-image-inner-intrisic-container .kadence-info-box-image-intrisic{padding-bottom:100%;width:45px;height:0px;max-width:100%;}#kt-info-box_40afc9-39 .kadence-info-box-icon-container .kt-info-svg-icon, #kt-info-box_40afc9-39 .kt-info-svg-icon-flip, #kt-info-box_40afc9-39 .kt-blocks-info-box-number{font-size:50px;}#kt-info-box_40afc9-39 .kt-blocks-info-box-media{color:#444444;background:#ffffff;border-color:#eeeeee;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}#kt-info-box_40afc9-39 .kt-blocks-info-box-media-container{margin-top:-45px;margin-right:0px;margin-bottom:20px;margin-left:0px;}#kt-info-box_40afc9-39 .kt-blocks-info-box-link-wrap:hover .kt-blocks-info-box-media{color:#444444;background:#ffffff;border-color:#eeeeee;}#kt-info-box_40afc9-39 .kt-infobox-textcontent h4.kt-blocks-info-box-title{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:5px;margin-right:0px;margin-bottom:10px;margin-left:0px;}#kt-info-box_40afc9-39 .kt-blocks-info-box-learnmore{background:transparent;border-width:0px 0px 0px 0px;padding-top:4px;padding-right:8px;padding-bottom:4px;padding-left:8px;margin-top:10px;margin-right:0px;margin-bottom:10px;margin-left:0px;}<\/style>\n<div id=\"kt-info-box_40afc9-39\" class=\"wp-block-kadence-infobox\"><div class=\"kt-blocks-info-box-link-wrap kt-blocks-info-box-media-align-top kt-info-halign-left\"><div class=\"kt-blocks-info-box-media-container\"><div class=\"kt-blocks-info-box-media kt-info-media-animate-none\"><div class=\"kadence-info-box-image-inner-intrisic-container\"><div class=\"kadence-info-box-image-intrisic kt-info-animate-none\"><div class=\"kadence-info-box-image-inner-intrisic\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/spotonfun.pl\/wp-content\/uploads\/2021\/12\/info_icon.png\" alt=\"\" width=\"45\" height=\"45\" class=\"kt-info-box-image wp-image-481\"\/><\/div><\/div><\/div><\/div><\/div><div class=\"kt-infobox-textcontent\"><h4 class=\"kt-blocks-info-box-title\">Notka nt. p\u0142ytki prototypowej<\/h4><p class=\"kt-blocks-info-box-text\">Poniewa\u017c wcze\u015bniej nie robi\u0142am nic z Arduino, nie bardzo wiedzia\u0142am jak dzia\u0142a p\u0142ytka prototypowa. Mniej-wi\u0119cej si\u0119 domy\u015bla\u0142am tak na ch\u0142opski rozum, ale sprawdzi\u0142am miernikiem, kt\u00f3re elementy s\u0105 ze sob\u0105 pozwierane i to potwierdzi\u0142o moje domys\u0142y &#8211; zwarte s\u0105 ze sob\u0105 rz\u0119dy, np. u mnie &#8222;f-g-h-i-j&#8221; jest w ka\u017cdym rz\u0119dzie zwarte, wi\u0119c jak w\u0142o\u017cy\u0142am m\u00f3j modu\u0142 \u017cyroskopu do kolumny &#8222;j&#8221;, to kabelki mog\u0142am wpi\u0105\u0107 w odpowiednie rz\u0119dy wyprowadze\u0144 w kolumnie &#8222;g&#8221;. Dodatkowo ca\u0142a kolumna + jest zwarta (u\u017cy\u0142am jej jako \u017ar\u00f3d\u0142a zasilania &#8222;+V&#8221;) i analogicznie kolumna &#8222;-&#8221; (u\u017cy\u0142am jej jako masy &#8222;GND&#8221;)<\/p><\/div><\/div><\/div><style>.wp-block-kadence-advancedheading.kt-adv-heading_af6869-8a, .wp-block-kadence-advancedheading.kt-adv-heading_af6869-8a[data-kb-block=\"kb-adv-heading_af6869-8a\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading_af6869-8a mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading_af6869-8a[data-kb-block=\"kb-adv-heading_af6869-8a\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading_af6869-8a img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading_af6869-8a[data-kb-block=\"kb-adv-heading_af6869-8a\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading_af6869-8a wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading_af6869-8a\">Pora na program do zbierania danych przez USB<\/h2><p>Tutaj nie \u015bciemniam. Nie mia\u0142am poj\u0119cia jak si\u0119 zabra\u0107 za programowanie Arduino (mimo, \u017ce jako-tako programowa\u0107 potrafi\u0119). Dlatego skorzysta\u0142am z gotowca, po czym go przeanalizowa\u0142am ze zrozumieniem \ud83d\ude42 i troszk\u0119 pozmienia\u0142am to co wypisuje.<\/p><p>Ale zanim program, to trzeba zainstalowa\u0107 na komputerze \u015brodowisko Arduino IDE &#8211; jest ono darmowe i mo\u017cna je pobra\u0107 <a rel=\"noreferrer noopener\" href=\"https:\/\/www.arduino.cc\/en\/software\" target=\"_blank\">tutaj<\/a>. Po uruchomieniu wygl\u0105da ono mniej wi\u0119cej tak jak na poni\u017cszym zrzucie ekranu. Zaznaczy\u0142am tam dwa punkty &#8211; prawy g\u00f3rny r\u00f3g to przycisk do otworzenia &#8222;Monitora portu szeregowego&#8221;, natomiast w prawym dolnym rogu wida\u0107 pod\u0142\u0105czone urz\u0105dzenie (i port na kt\u00f3rym si\u0119 pod\u0142\u0105czy\u0142o).<\/p><figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/spotonfun.pl\/wp-content\/uploads\/2021\/12\/ArduinoIDE.png\" alt=\"\" class=\"wp-image-518\"\/><figcaption>ArduinoIDE po instalacji<\/figcaption><\/figure><p>Teraz wystarczy program. M\u00f3j, po przer\u00f3bkach <a rel=\"noreferrer noopener\" href=\"https:\/\/howtomechatronics.com\/tutorials\/arduino\/arduino-and-mpu6050-accelerometer-and-gyroscope-tutorial\/\" target=\"_blank\">oryginalu <\/a>wyglada tak:<\/p><pre title=\"Obs\u0142uga \u017cyroskopu\" class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp line-numbers\">#include &lt;Wire.h&gt;\nconst int MPU_ADDR=0x68;\nint16_t AcX, AcY, AcZ; \/\/ acc raw data\nint16_t GyX, GyY, GyZ; \/\/ gyro raw data\nint16_t Tmp; \/\/ temperature data\n\n\/\/for calc. roll, pitch and yaw\nfloat accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ;\nfloat elapsedTime, currentTime, previousTime;\n\/\/float rollZ, pitchX, yawY; \/\/ Z- looking direction, Y- up\/down, X-horizontal through ears\nfloat rotZ, rotX, rotY; \/\/ Z- looking direction, Y- up\/down, X-horizontal through ears\n\n\/\/ varables for calc. error\nfloat AcXerr, AcYerr, AcZerr; \/\/ acc error\nfloat GyXerr, GyYerr, GyZerr; \/\/ gyro error\nint c;\n\nchar tmp_str[7]; \/\/ temporary variable used in convert function\nchar* convert_int16_to_str(int16_t i) { \/\/ convert int16 to string - for debug window\n  sprintf(tmp_str, \"%6d\", i);\n  return tmp_str;  \n}\n\nvoid setup() {\n\n  \/\/ start transmission\n  Serial.begin(9600);\n  Serial.println(\"setup..\");\n  \n  \/\/ put your setup code here, to run once:\n  Wire.begin();\n  Wire.beginTransmission(MPU_ADDR); \/\/ Begins a transmission to the I2C slave (GY-521 board)\n  Wire.write(0x6B); \/\/PWR_MGMT_1 register\n  Wire.write(0); \/\/ set to zero (wakes up the MPU-6050)\n  Wire.endTransmission(true);\n\n  \/\/ do below at the beginning to check the errors that need to go to loop() equations\n  \/\/ comment everything from the loop to have clear output\n  \/\/calculate_IMU_error(); \/\/zero!! GyXerr = 0.12, GyYerr=1.30, GyZerr=0.32;\n  \/\/delay(500);  \n}\n\nvoid loop() {\n  \/\/ put your main code here, to run repeatedly:\n  Wire.beginTransmission(MPU_ADDR);\n  Wire.write(0x3B); \/\/ starting with reg. 0x38 (ACCEL_XOUT_H) [MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.2, p.40]\n  Wire.endTransmission(false); \/\/ the parameter indicates that the Arduino will send a restart. As a result, the connection is kept active.\n  Wire.requestFrom(MPU_ADDR, 7*2, true); \/\/ request a total of 7*2=14 registers\n  \/\/ \"Wire.read()&lt;&lt;8 | Wire.read();\" means two registers are read and stored in the same variable\n  AcX = Wire.read()&lt;&lt;8 | Wire.read(); \/\/ reading registers: 0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)\n  AcY = Wire.read()&lt;&lt;8 | Wire.read(); \/\/ reading registers: 0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)\n  AcZ = Wire.read()&lt;&lt;8 | Wire.read(); \/\/ reading registers: 0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)\n  Tmp = Wire.read()&lt;&lt;8 | Wire.read(); \/\/ reading registers: 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)\n  GyX = Wire.read()&lt;&lt;8 | Wire.read(); \/\/ reading registers: 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)\n  GyY = Wire.read()&lt;&lt;8 | Wire.read(); \/\/ reading registers: 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)\n  GyZ = Wire.read()&lt;&lt;8 | Wire.read(); \/\/ reading registers: 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)\n\n\n  \/\/clclulate useful data\n  previousTime = currentTime;        \/\/ Previous time is stored before the actual time read\n  currentTime = millis();            \/\/ Current time actual time read\n  elapsedTime = (currentTime - previousTime) \/ 1000; \/\/ Divide by 1000 to get seconds\n\n  \/\/ Correct the outputs with the calculated error values\n  GyX = GyX + 0.1; \/\/ GyroErrorX ~(0.12)\n  GyY = GyY + 1.35; \/\/ GyroErrorY ~(1.30)\n  GyZ = GyZ + 0.32; \/\/ GyroErrorZ ~ (0.32)\n  \n  accAngleX = (atan(AcY \/ sqrt(pow(AcX, 2) + pow(AcZ, 2))) * 180 \/ PI) - 0.0; \/\/ AccErrorX ~(0.0) See the calculate_IMU_error()custom function for more details\n  accAngleY = (atan(-1 * AcX \/ sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 \/ PI) + 0.0; \/\/ AccErrorY ~(0.0)\n  gyroAngleX = gyroAngleX + GyX * elapsedTime; \/\/ deg\/s * s = deg\n  gyroAngleY = gyroAngleY + GyY * elapsedTime;\n  \n  \/\/float rotZ, rotX, rotY; \/\/ Z- looking direction, Y- up\/down, X-horizontal through ears\n  rotY =  (rotY + GyZ * elapsedTime);\n  \/\/ Complementary filter - combine acceleromter and gyro angle values\n  rotZ = (0.96 * gyroAngleX + 0.04 * accAngleX) ;\n  rotX = (0.96 * gyroAngleY + 0.04 * accAngleY) ;\n\n\n\n  \n  \/\/ print data\n  \n  Serial.print(\"   AcX |    AcY |    AcZ | \\n\"); \n  Serial.print(convert_int16_to_str(AcX)); Serial.print(\" | \");\n  Serial.print(convert_int16_to_str(AcY)); Serial.print(\" | \");\n  Serial.print(convert_int16_to_str(AcZ)); Serial.print(\" | \\n\");\n  \/\/ the following equation was taken from the documentation [MPU-6000\/MPU-6050 Register Map and Description, p.30]\n  Serial.print(\"---------------------------\\n\");\n  Serial.print(\"   GyX |    GyY |    GyZ | \\n\"); \n  Serial.print(convert_int16_to_str(GyX)); Serial.print(\" | \");\n  Serial.print(convert_int16_to_str(GyY)); Serial.print(\" | \");\n  Serial.print(convert_int16_to_str(GyZ)); Serial.print(\" | \\n\");\n  Serial.print(\"---------------------------\\n\");\n  Serial.print(\"Tmp = \");Serial.print(Tmp\/340.00+36.53); Serial.print(\"\\n\");\n  Serial.print(\"---------------------------\\n\");\n  Serial.print(\"  RotX |   RotY |   RotZ | \\n\"); \n  Serial.print(rotX); Serial.print(\" | \");\n  Serial.print(rotY); Serial.print(\" | \");\n  Serial.print(rotZ); Serial.print(\" | \\n\");\n  Serial.print(\"---------------------------\\n\");\n\n  Serial.print(\"\\n\");\n \n  \/\/delay\n  delay(20); \n}\n\nvoid calculate_IMU_error() {\n  \/\/ We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.\n  \/\/ Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values\n  \/\/ Read accelerometer values 200 times\n  const int NUM_TRIES = 200;\n  while (c &lt; NUM_TRIES) {\n    Wire.beginTransmission(MPU_ADDR);\n    Wire.write(0x3B);\n    Wire.endTransmission(false);\n    Wire.requestFrom(MPU_ADDR, 3*2, true);\n    AcX = (Wire.read() &lt;&lt; 8 | Wire.read()) \/ 16384.0 ;\n    AcY = (Wire.read() &lt;&lt; 8 | Wire.read()) \/ 16384.0 ;\n    AcZ = (Wire.read() &lt;&lt; 8 | Wire.read()) \/ 16384.0 ;\n    \/\/ Sum all readings\n    AcXerr = AcXerr + ((atan((AcY) \/ sqrt(pow((AcX), 2) + pow((AcZ), 2))) * 180 \/ PI));\n    AcYerr = AcYerr + ((atan(-1 * (AcX) \/ sqrt(pow((AcY), 2) + pow((AcZ), 2))) * 180 \/ PI));\n    c++;\n  }\n  \/\/Divide the sum by 200 to get the error value\n  AcXerr = AcXerr \/ NUM_TRIES;\n  AcYerr = AcYerr \/ NUM_TRIES;\n  c = 0;\n  \/\/ Read gyro values 200 times\n  while (c &lt; NUM_TRIES) {\n    Wire.beginTransmission(MPU_ADDR);\n    Wire.write(0x43);\n    Wire.endTransmission(false);\n    Wire.requestFrom(MPU_ADDR, 3*2, true);\n    GyX = Wire.read() &lt;&lt; 8 | Wire.read();\n    GyY = Wire.read() &lt;&lt; 8 | Wire.read();\n    GyZ = Wire.read() &lt;&lt; 8 | Wire.read();\n    \/\/ Sum all readings\n    GyXerr = GyXerr + (GyX \/ 131.0);\n    GyYerr = GyYerr + (GyY \/ 131.0);\n    GyZerr = GyZerr + (GyZ \/ 131.0);\n    c++;\n  }\n  \/\/Divide the sum by 200 to get the error value\n  GyXerr = GyXerr \/ NUM_TRIES;\n  GyYerr = GyYerr \/ NUM_TRIES;\n  GyZerr = GyZerr \/ NUM_TRIES;\n  \/\/ Print the error values on the Serial Monitor\n  Serial.print(\"AcXerr: \");\n  Serial.println(AcXerr);\n  Serial.print(\"AcYerr: \");\n  Serial.println(AcYerr);\n  Serial.print(\"GyXerr: \");\n  Serial.println(GyXerr);\n  Serial.print(\"GyYerr: \");\n  Serial.println(GyYerr);\n  Serial.print(\"GyZerr: \");\n  Serial.println(GyZerr);\n}<\/code><\/pre><p>No i voual&#8217;a! Mam odczyty!<\/p><p><strong>Uwaga do odczyt\u00f3w<\/strong>: zanim uruchomi\u0142am g\u0142\u00f3wny program, po\u0142o\u017cy\u0142am sensor nieruchomo oraz odpali\u0142am tylko funkcj\u0119 calculate_IMU_error(). Ona zbiera 200 odczyt\u00f3w (mo\u017cna to zmieni\u0107 ustawiaj\u0105c warto\u015b\u0107 NUM_TRIES), u\u015brednia je i pokazuje wynik &#8211; jest to tak naprawd\u0119 b\u0142\u0105d sensora (czyli taka kalibracja). Nale\u017cy ten b\u0142\u0105d uwzgl\u0119dni\u0107 w programie w obliczeniach:<\/p><pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp line-numbers\">GyX = GyX + 0.1; \/\/ GyroErrorX ~(0.12)\nGyY = GyY + 1.35; \/\/ GyroErrorY ~(1.30)\nGyZ = GyZ + 0.32; \/\/ GyroErrorZ ~ (0.32)\n\naccAngleX = (atan(AcY \/ sqrt(pow(AcX, 2) + pow(AcZ, 2))) * 180 \/ PI) - 0.0; \/\/ AccErrorX ~(0.0) See the calculate_IMU_error()custom function for more details\n\naccAngleY = (atan(-1 * AcX \/ sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 \/ PI) + 0.0; \/\/ AccErrorY ~(0.0)\n\n<\/code><\/pre><p><\/p><figure class=\"wp-block-video\"><video controls src=\"https:\/\/spotonfun.pl\/wp-content\/uploads\/2021\/12\/20211228_183621.mp4\"><\/video><figcaption>Odczyty z GY-251 (MPU6050)<\/figcaption><\/figure><style>.wp-block-kadence-column.kb-section-dir-horizontal > .kt-inside-inner-col > #kt-info-box_9e536f-31 .kt-blocks-info-box-link-wrap{max-width:unset;}#kt-info-box_9e536f-31 .kt-blocks-info-box-link-wrap{border-color:rgba(43, 108, 176, 0.17);border-radius:21px;border-top-width:5px;border-right-width:5px;border-bottom-width:5px;border-left-width:5px;background:#ffffff;padding-top:24px;padding-right:24px;padding-bottom:24px;padding-left:24px;margin-top:50px;}#kt-info-box_9e536f-31 .kt-blocks-info-box-link-wrap:hover{background:#ffffff;}#kt-info-box_9e536f-31.wp-block-kadence-infobox{max-width:100%;}#kt-info-box_9e536f-31 .kadence-info-box-image-inner-intrisic-container{max-width:100px;}#kt-info-box_9e536f-31 .kadence-info-box-image-inner-intrisic-container .kadence-info-box-image-intrisic{padding-bottom:100%;width:45px;height:0px;max-width:100%;}#kt-info-box_9e536f-31 .kadence-info-box-icon-container .kt-info-svg-icon, #kt-info-box_9e536f-31 .kt-info-svg-icon-flip, #kt-info-box_9e536f-31 .kt-blocks-info-box-number{font-size:50px;}#kt-info-box_9e536f-31 .kt-blocks-info-box-media{color:#444444;background:#ffffff;border-color:#eeeeee;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}#kt-info-box_9e536f-31 .kt-blocks-info-box-media-container{margin-top:-45px;margin-right:0px;margin-bottom:20px;margin-left:0px;}#kt-info-box_9e536f-31 .kt-blocks-info-box-link-wrap:hover .kt-blocks-info-box-media{color:#444444;background:#ffffff;border-color:#eeeeee;}#kt-info-box_9e536f-31 .kt-infobox-textcontent h4.kt-blocks-info-box-title{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;margin-top:5px;margin-right:0px;margin-bottom:10px;margin-left:0px;}#kt-info-box_9e536f-31 .kt-blocks-info-box-learnmore{background:transparent;border-width:0px 0px 0px 0px;padding-top:4px;padding-right:8px;padding-bottom:4px;padding-left:8px;margin-top:10px;margin-right:0px;margin-bottom:10px;margin-left:0px;}<\/style>\n<div id=\"kt-info-box_9e536f-31\" class=\"wp-block-kadence-infobox\"><div class=\"kt-blocks-info-box-link-wrap kt-blocks-info-box-media-align-top kt-info-halign-left\"><div class=\"kt-blocks-info-box-media-container\"><div class=\"kt-blocks-info-box-media kt-info-media-animate-none\"><div class=\"kadence-info-box-image-inner-intrisic-container\"><div class=\"kadence-info-box-image-intrisic kt-info-animate-none\"><div class=\"kadence-info-box-image-inner-intrisic\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/spotonfun.pl\/wp-content\/uploads\/2021\/12\/info_icon.png\" alt=\"\" width=\"45\" height=\"45\" class=\"kt-info-box-image wp-image-481\"\/><\/div><\/div><\/div><\/div><\/div><div class=\"kt-infobox-textcontent\"><h4 class=\"kt-blocks-info-box-title\">Notka nt. Arduino IDE i VS Code<\/h4><p class=\"kt-blocks-info-box-text\">Ostatnio wi\u0119kszo\u015b\u0107 program\u00f3w pisa\u0142am w Visual Studio Code i bardzo lubi\u0119 to IDE. Dlatego szuka\u0142am jak u\u017cy\u0107 mojego ulubionego \u015brodowiska do Arduino &#8211; no i jak si\u0119 domy\u015blacie znalaz\u0142am instrukcje <a rel=\"noreferrer noopener\" href=\"https:\/\/maker.pro\/arduino\/tutorial\/how-to-use-visual-studio-code-for-arduino\" target=\"_blank\">tutaj<\/a> (wersja po angielsku). Ale uwaga! To nie zadzia\u0142a je\u015bli macie zainstalowane Arduino IDE ze sklepu Microsoft (pod Windowsem oczywi\u015bcie). Ja tak mia\u0142am i musia\u0142am odinstalowa\u0107 to ze sklepu, \u015bci\u0105gn\u0105\u0107 wersj\u0119 dla Win7+, zainstalowa\u0107 i wtedy zadzia\u0142a\u0142o (trzeba jeszcze w konfiguracji p\u0142ytki poda\u0107 \u015bcie\u017ck\u0119 do instalacji Arduino IDE &#8211; to w\u0142a\u015bnie by\u0142 problem przy aplikacji ze sklepu &#8211; a mo\u017ce wiecie jak odnale\u017a\u0107 \u015bcie\u017ck\u0119 do apek ze sklepu Microsoftu? Napiszcie w komentarzach!<br\/><br\/><strong>UPDATE<\/strong>: Niestety okaza\u0142o si\u0119, \u017ce nie mog\u0119 zmusi\u0107 &#8222;Serial monitora&#8221; do pokazywania danych na bie\u017c\u0105co i ostatecznie zrezygnowa\u0142am z VSCode na rzecz Arduino IDE 2.0.0-rec3, kt\u00f3re oferuje uzupe\u0142nianie sk\u0142adni i jest do\u015b\u0107 podobne do VSCode.<\/p><\/div><\/div><\/div><style>.wp-block-kadence-advancedheading.kt-adv-heading_6ce522-bd, .wp-block-kadence-advancedheading.kt-adv-heading_6ce522-bd[data-kb-block=\"kb-adv-heading_6ce522-bd\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading_6ce522-bd mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading_6ce522-bd[data-kb-block=\"kb-adv-heading_6ce522-bd\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading_6ce522-bd img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading_6ce522-bd[data-kb-block=\"kb-adv-heading_6ce522-bd\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading_6ce522-bd wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading_6ce522-bd\">\u0179r\u00f3d\u0142a:<\/h2><ol class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/idoc.pub\/documents\/mpu-6050-gy-521-datasheet-6nq800owrpnw\" target=\"_blank\">Dokumentacja modu\u0142u GY-521<\/a><\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/www.arduino.cc\/en\/software\" target=\"_blank\">Arduino IDE<\/a><\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/howtomechatronics.com\/tutorials\/arduino\/arduino-and-mpu6050-accelerometer-and-gyroscope-tutorial\/\" target=\"_blank\">Program do zbierania danych z modu\u0142u z korekcj\u0105 b\u0142\u0119d\u00f3w<\/a><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>W tej cz\u0119\u015bci zajmuj\u0119 si\u0119 pod\u0142\u0105czeniem \u017cyroskopu oraz napisaniem prostego programu, kt\u00f3ry to ten \u017cyroskop obs\u0142uguje.<\/p>\n","protected":false},"author":1,"featured_media":500,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":""},"categories":[69],"tags":[],"class_list":["post-488","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projekt-arduino"],"_links":{"self":[{"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/posts\/488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/comments?post=488"}],"version-history":[{"count":16,"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/posts\/488\/revisions"}],"predecessor-version":[{"id":557,"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/posts\/488\/revisions\/557"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/media\/500"}],"wp:attachment":[{"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/media?parent=488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/categories?post=488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spotonfun.pl\/index.php\/wp-json\/wp\/v2\/tags?post=488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}