{"id":45,"date":"2019-04-08T12:06:00","date_gmt":"2019-04-08T12:06:00","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=45"},"modified":"2020-11-15T10:49:52","modified_gmt":"2020-11-15T10:49:52","slug":"rockerino","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/","title":{"rendered":"Rockerino"},"content":{"rendered":"<p>.accordion {<br \/>\n  background-color: #eee;<br \/>\n  color: #444;<br \/>\n  cursor: pointer;<br \/>\n  padding: 18px;<br \/>\n  width: 100%;<br \/>\n  border: none;<br \/>\n  text-align: left;<br \/>\n  outline: none;<br \/>\n  font-size: 15px;<br \/>\n  transition: 0.4s;<br \/>\n}<\/p>\n<p>.active, .accordion:hover {<br \/>\n  background-color: #ccc;<br \/>\n}<\/p>\n<p>.accordion:after {<br \/>\n  content: &#8216;\u000002B&#8217;;<br \/>\n  color: #777;<br \/>\n  font-weight: bold;<br \/>\n  float: right;<br \/>\n  margin-left: 5px;<br \/>\n}<\/p>\n<p>.active:after {<br \/>\n  content: \u00ab2212\u00bb;<br \/>\n}<\/p>\n<p>.panel {<br \/>\n  padding: 0 18px;<br \/>\n  background-color: white;<br \/>\n  max-height: 0;<br \/>\n  overflow: hidden;<br \/>\n  transition: max-height 0.2s ease-out;<br \/>\n}<\/p>\n<p><\/p>\n<div class=\"WordSection1\">\n<div class=\"Foto\">\n<span style=\"font-size: large;\"><br \/><\/span><\/div>\n<div class=\"MsoTitleCxSpLast\">\n<span style=\"color: windowtext;\"><span style=\"font-size: large;\">ROCKERINO:<br \/>\nROBOT BALANC\u00cdN<\/span><span style=\"font-size: 20pt;\"><\/span><\/span><\/div>\n<div class=\"MsoTitleCxSpLast\">\n<\/div>\n<h1>\n<span style=\"font-size: medium;\">INTEGRANTES<\/span><span style=\"color: windowtext; font-size: 11.0pt; mso-ascii-font-family: Constantia; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt; mso-hansi-font-family: Constantia; mso-hansi-theme-font: minor-latin;\"><\/span><\/h1>\n<div>\n<ul>\n<li>RUB\u00c9N CALVO MART\u00cdNEZ<\/li>\n<li>MIGUEL ANGEL MONREAL VELASCO<\/li>\n<li>RA\u00daL BERNARDINO IGLESIAS GONZ\u00c1LEZ<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"WordSection2\">\n<p><\/p>\n<h1>\n<span style=\"font-size: medium;\">CONTENIDO<\/span><\/h1>\n<div class=\"MsoToc1\" style=\"tab-stops: right dotted 433.2pt;\">\n<ol>\n<li><a href=\"#introduccion\"><span style=\"mso-no-proof: yes;\">INTRODUCCI\u00d3N<\/span><\/a><\/li>\n<li><a href=\"#presupuesto\"><span style=\"mso-bidi-language: ES; mso-no-proof: yes;\">MATERIALES Y <\/span><span style=\"mso-no-proof: yes;\">PRESUPUESTO<\/span><\/a><\/li>\n<li><a href=\"#implementacion\"><span style=\"mso-bidi-language: ES; mso-no-proof: yes;\">IMPLEMENTACI\u00d3N<\/span><\/a><\/li>\n<ol>\n<li><a href=\"#comofunciona\">\u00bfC\u00d3MO FUNCIONA EL<br \/>\n EQUILIBRIO?<\/a><\/li>\n<li><a href=\"#montaje\">MONTAJE<\/a><\/li>\n<li><a href=\"#codigo\">C\u00d3DIGO<\/a><\/li>\n<\/ol>\n<li><a href=\"#problemas\"><span style=\"mso-bidi-language: ES; mso-no-proof: yes;\">PROBLEMAS Y SOLUCIONES<br \/>\n ENCONTRADAS<\/span><\/a><\/li>\n<li><a href=\"#mejoras\"><span style=\"mso-bidi-language: ES; mso-no-proof: yes;\">POSIBLES MEJORAS<\/span><\/a><\/li>\n<li><a href=\"#conclusiones\"><span style=\"mso-bidi-language: ES; mso-no-proof: yes;\">CONCLUSIONES<\/span><\/a><\/li>\n<\/ol>\n<\/div>\n<\/div>\n<p><\/p>\n<h1 id=\"introduccion\">\n<span style=\"font-size: medium;\"><span style=\"mso-bookmark: _Toc5142948;\">INTRODUCCI\u00d3N<\/span><\/span><span style=\"mso-bookmark: _Toc5142948;\"><\/span><span style=\"mso-bookmark: _Toc500855037;\"><\/span><span style=\"mso-bidi-language: ES;\"><\/span><\/h1>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">La elecci\u00f3n de proyecto a<br \/>\ndesarrollar utilizando la placa Arduino, ha sido la de montar un robot auto<br \/>\nbalanceado para mantenerse en equilibrio. Tiene relaci\u00f3n con el sistema que<br \/>\nimplementan los Hoverboards o Seeways, ahora tan de moda y nos pareci\u00f3 una idea<br \/>\nbastante interesante, ya que puede estar enfocado a numerosas aplicaciones con<br \/>\nuna necesidad de recursos m\u00ednima, consiguiendo resultados fascinantes como el<br \/>\nrobot desarrollado por Google \u201cAtlas\u201d.<\/span><\/div>\n<h1 id=\"presupuesto\">\n<span style=\"font-size: medium;\"><span style=\"mso-bidi-language: ES;\">MATERIALES Y <\/span>PRESUPUESTO<\/span><span style=\"mso-bookmark: _Toc5142949;\"><\/span><span style=\"mso-bidi-language: ES;\"><\/span><\/h1>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Los materiales requeridos<br \/>\npara montar tanto la infraestructura como los componentes necesarios para<br \/>\ndesarrollar la funcionalidad son los siguientes:<\/span><\/div>\n<div class=\"MsoListParagraphCxSpFirst\" style=\"mso-list: l2 level1 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;symbol&quot;; mso-bidi-font-family: Symbol; mso-bidi-language: ES; mso-fareast-font-family: Symbol;\"><span style=\"mso-list: Ignore;\">\u00b7<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Infraestructura:<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">1 x Tira de<br \/>\nvelcro.<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">2 x palillos<br \/>\nde madera.<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">1 x tabl\u00f3n de<br \/>\npl\u00e1stico.<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Hilo para<br \/>\nsoldar FLUX SOLDER.<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Tuercas, varillas<br \/>\ny arandelas para sujeci\u00f3n.<\/span><\/div>\n<div class=\"MsoListParagraphCxSpLast\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Cinta<br \/>\naislante.<\/span><\/div>\n<div class=\"MsoNormal\">\n<\/div>\n<div class=\"MsoListParagraphCxSpFirst\" style=\"mso-list: l2 level1 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;symbol&quot;; mso-bidi-font-family: Symbol; mso-bidi-language: ES; mso-fareast-font-family: Symbol;\"><span style=\"mso-list: Ignore;\">\u00b7<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Componentes:<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">2 x Micro<br \/>\nmotor DC con reductora. (9.46$)<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">1 x M\u00f3dulo driver<br \/>\nL298N para motor DC. (7.59$)<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">1 x MPU650<br \/>\nAceler\u00f3metro y giroscopio. (5.45$)<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Placa Arduino<br \/>\nMEGA.<\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Porta pilas 6<br \/>\npilas AA con cable. (1.50 $).<span style=\"mso-tab-count: 1;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/div>\n<div class=\"MsoListParagraphCxSpMiddle\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">Pila de<br \/>\npetaca de 9v con conector de alimentaci\u00f3n. (2.30$).<span style=\"mso-tab-count: 1;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/div>\n<div class=\"MsoListParagraphCxSpLast\" style=\"margin-left: 72.0pt; mso-add-space: auto; mso-list: l2 level2 lfo2; text-indent: -18.0pt;\">\n<span style=\"font-family: &quot;courier new&quot;; mso-bidi-language: ES; mso-fareast-font-family: &quot;Courier New&quot;;\"><span style=\"mso-list: Ignore;\">o<span style=\"font: 7.0pt &quot;Times New Roman&quot;;\">&nbsp;&nbsp;<br \/>\n<\/span><\/span><\/span><span style=\"mso-bidi-language: ES;\">2 x<br \/>\nInterruptores simples.<\/span>&nbsp;<\/div>\n<div class=\"MsoNormal\">\n<\/div>\n<h1 id=\"implementacion\">\n<span style=\"mso-bidi-language: ES;\"><span style=\"font-size: medium;\">IMPLEMENTACI\u00d3N<\/span><\/span><\/h1>\n<h2 id=\"comofunciona\">\n<span style=\"mso-bidi-language: ES; text-transform: none;\"><span style=\"font-size: medium;\">1.- \u00bfC\u00d3MO FUNCIONA EL EQUILIBRIO?<\/span><\/span><\/h2>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\"><br \/>\nHay dos factores importantes que hacen que el robot se mantenga en equilibrio.<\/span><\/p>\n<ol>\n<li><span style=\"text-indent: -18pt;\">L298N: Es el<br \/>\nm\u00f3dulo encargado de dar la potencia necesaria, en nuestro caso, a dos micro<br \/>\nmotores con reductora, para poder contrarrestar la ca\u00edda del robot. Las<br \/>\ndirectrices de cuanta potencia y para donde tiene que girar una rueda, se las<br \/>\nda la placa arduino, que es el encargado de orquestar en armon\u00eda todos los<br \/>\nchips del robot.<\/span><\/li>\n<li><span style=\"mso-bidi-language: ES;\">MPU6050: Se<br \/>\nencarga de dictar a la placa arduino la posici\u00f3n en el plano del mundo, para<br \/>\npoder corregir de manera constante al robot. Va enviando informaci\u00f3n de la<br \/>\nposici\u00f3n \u201cx\u201d, \u201cy\u201d y \u201cz\u201d para saber si el robot est\u00e1 levantado, tumbado o<br \/>\ninclinado (puede caerse).<\/span><\/li>\n<\/ol>\n<\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">En cuanto a la colocaci\u00f3n<br \/>\nde los componentes, el robot de equilibrio autom\u00e1tico es esencialmente un<br \/>\np\u00e9ndulo invertido. Puede equilibrarse mejor si el centro de masa es m\u00e1s alto en<br \/>\nrelaci\u00f3n con los ejes de las ruedas. Por esta raz\u00f3n casi todos los componentes<br \/>\nest\u00e1n colocados en el centro de los diferentes niveles, buscando la mejor<br \/>\nrelaci\u00f3n de peso en los diferentes lados tanto izquierdo como derecho, para que<br \/>\nsea m\u00e1s manejable y regulable los par\u00e1metros de equilibrio. <\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Antes de poder usar el<br \/>\ncomponente MPU6050, hay que calibrarlo, para poder tener las variables de<br \/>\nequilibrio correctas. Para ello hemos usado un c\u00f3digo propio del fabricante<br \/>\n(anexo a esta descripci\u00f3n).<\/span><\/div>\n<div align=\"center\" class=\"MsoNormal\" style=\"text-align: center;\">\n<\/div>\n<h2 id=\"montaje\">\n<span style=\"mso-bidi-language: ES;\"><span style=\"font-size:medium;\">2.- MONTAJE<\/span><\/span><span style=\"mso-bidi-language: ES;\"><\/span><\/h2>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">El proceso de montaje se<br \/>\nresume en el siguiente video:<\/span><\/div>\n<div class=\"MsoNormal\">\n<div class=\"separator\" style=\"clear: both; text-align: center;\">\n<iframe loading=\"lazy\" allowfullscreen=\"\" class=\"YOUTUBE-iframe-video\" data-thumbnail-src=\"https:\/\/i9.ytimg.com\/vi\/QUGEcofl5xc\/default.jpg?sqp=COzGmeUF&amp;rs=AOn4CLDri-d6LnIN3HffNmrSzsSUYhqjxw\" frameborder=\"0\" height=\"266\" src=\"https:\/\/www.youtube.com\/embed\/QUGEcofl5xc?feature=player_embedded\" width=\"320\"><\/iframe><\/div>\n<\/div>\n<div class=\"MsoNormal\">\n<\/div>\n<h2 id=\"codigo\">\n<span class=\"Ttulo1Car\"><span style=\"line-height: 110%;\"><span style=\"font-size:medium;\">3.- C\u00d3DIGO<\/span><\/span><\/span><\/h2>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Para la implementaci\u00f3n<br \/>\ndel c\u00f3digo hemos usado las siguientes librerias:<\/span><\/p>\n<ol>\n<li><span style=\"text-indent: -18pt;\">PID<br \/>\n(Proportional Integral Directive): Utilizada para calcular la posici\u00f3n del<br \/>\nrobot.<\/span><\/li>\n<li><span style=\"mso-bidi-language: ES;\">LmotorController:<br \/>\nUtilizada para el control de los motores con el m\u00f3dulo LN298N.<\/span><\/li>\n<li><span style=\"text-indent: -18pt;\">I2Cdev y MPU6050_6Axis_MotionApps20:<br \/>\nUtilizadas para leer los datos de la inclinaci\u00f3n del robot con el m\u00f3dulo<br \/>\nMPU6050.<\/span><\/li>\n<\/ol>\n<\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Para el control del PID hemos<br \/>\nhecho uso de las variables Kp (Proportional), Ki (Integral) y Kd (Directive),<br \/>\najustadas a mano, adem\u00e1s<span style=\"mso-spacerun: yes;\">&nbsp; <\/span>de las<br \/>\nvariables \u201coriginalSetpoint\u201d, para configurar \u00e1ngulo de partida; \u201csetpoint\u201d,<br \/>\ndonde se almacena el \u00e1ngulo actual del robot; \u201cmovingAngleOffset\u201d, donde se<br \/>\nconfigura el \u00e1ngulo de desplazamiento; y las variables input y outpot, todas<br \/>\nellas de tipo double.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">La variable Kp necesita<br \/>\nser ajustada de forma manual para el correcto funcionamiento del robot, un<br \/>\nvalor demasiado alto provocar\u00eda que se balancease hacia delante y hacia detr\u00e1s<br \/>\nde forma violenta, un valor demasiado bajo acabar\u00eda con la caida del mismo, ya<br \/>\nque las correcciones de los motores no ser\u00edan lo suficientemente grandes.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">La variable Kd se refleja<br \/>\nen las oscilaciones que el robot da para alcanzar la estabilidad, si el valor<br \/>\nes el correcto el robot mantendr\u00e1 el equilibrio a pesar de ser empujado.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">A pesar de la correcta<br \/>\nconfiguraci\u00f3n de las variables kp y kd el robot se balancea al iniciarse, para<br \/>\nque tarde lo menos posible es importante la correcta configuraci\u00f3n de la<br \/>\nvariable ki.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Es posible que el \u00e1ngulo<br \/>\ny la velocidad de los motores necesiten ser re-configurados&nbsp;en funci\u00f3n de como<br \/>\nse coloquen los componentes en el robot o que un motor sea algo m\u00e1s r\u00e1pido que<br \/>\nel otro.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Hacemos uso de una variable<br \/>\nde control \u201cdmpReady\u201d para que, en caso de fallo, se pare la ejecuci\u00f3n<\/span><span lang=\"EN-GB\" style=\"mso-ansi-language: EN-GB; mso-bidi-language: ES;\"> del <\/span><span style=\"mso-bidi-language: ES;\">programa<\/span><span lang=\"EN-GB\" style=\"mso-ansi-language: EN-GB; mso-bidi-language: ES;\">, a<\/span><span style=\"mso-bidi-language: ES;\">dem\u00e1s<br \/>\nde la variable \u201cmpuInterrupt\u201d que toma valor \u201ctrue\u201d cuando hay una interrupci\u00f3n<br \/>\nde MPU.<\/span><\/div>\n<div class=\"MsoNormal\">\n<\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\"><br \/><\/span><\/div>\n<p>Calibraci\u00f3n MPU6050<\/p>\n<div class=\"panel\">\n<pre style=\"background: #f0f0f0; border: 1px dashed #cccccc; color: black; font-family: &quot;arial&quot;; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;\"> \/\/ I2Cdev and MPU6050 must be installed as libraries  \n   #include \"I2Cdev.h\"#  \n include \"MPU6050.h\"#  \n include \"Wire.h\"  \n \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  CONFIGURATION  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  \n \/\/Change this 3 variables if you want to fine tune the skecth to your needs.  \n int buffersize = 1000; \/\/Amount of readings used to average, make it higher to get more precision but sketch will be slower (default:1000)  \n int acel_deadzone = 8; \/\/Acelerometer error allowed, make it lower to get more precision, but sketch may not converge (default:8)  \n int giro_deadzone = 1; \/\/Giro error allowed, make it lower to get more precision, but sketch may not converge (default:1)  \n \/\/ default I2C address is 0x68  \n \/\/ specific I2C addresses may be passed as a parameter here  \n \/\/ AD0 low = 0x68 (default for InvenSense evaluation board)  \n \/\/ AD0 high = 0x69  \n \/\/MPU6050 accelgyro;  \n MPU6050 accelgyro(0x68); \/\/ &lt;-- use for AD0 high  \n int16_t ax, ay, az, gx, gy, gz;  \n int mean_ax, mean_ay, mean_az, mean_gx, mean_gy, mean_gz, state = 0;  \n int ax_offset, ay_offset, az_offset, gx_offset, gy_offset, gz_offset;  \n \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  SETUP  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  \n void setup() {  \n   \/\/ join I2C bus (I2Cdev library doesn't do this automatically)  \n   Wire.begin();  \n   \/\/ COMMENT NEXT LINE IF YOU ARE USING ARDUINO DUE  \n   TWBR = 24; \/\/ 400kHz I2C clock (200kHz if CPU is 8MHz). Leonardo measured 250kHz.  \n   \/\/ initialize serial communication  \n   Serial.begin(115200);  \n   \/\/ initialize device  \n   accelgyro.initialize();  \n   \/\/ wait for ready  \n   while (Serial.available() &amp;&amp; Serial.read()); \/\/ empty buffer  \n   while (!Serial.available()) {  \n     Serial.println(F(\"Send any character to start sketch.n\"));  \n     delay(1500);  \n   }  \n   while (Serial.available() &amp;&amp; Serial.read()); \/\/ empty buffer again  \n   \/\/ start message  \n   Serial.println(\"nMPU6050 Calibration Sketch\");  \n   delay(2000);  \n   Serial.println(\"nYour MPU6050 should be placed in horizontal position, with package letters facing up. nDon't touch it until you see a finish message.n\");  \n   delay(3000);  \n   \/\/ verify connection  \n   Serial.println(accelgyro.testConnection() ? \"MPU6050 connection successful\" : \"MPU6050 connection failed\");  \n   delay(1000);  \n   \/\/ reset offsets  \n   accelgyro.setXAccelOffset(0);  \n   accelgyro.setYAccelOffset(0);  \n   accelgyro.setZAccelOffset(0);  \n   accelgyro.setXGyroOffset(0);  \n   accelgyro.setYGyroOffset(0);  \n   accelgyro.setZGyroOffset(0);  \n }  \n \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  LOOP  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  \n void loop() {  \n   if (state == 0) {  \n     Serial.println(\"nReading sensors for first time...\");  \n     meansensors();  \n     state++;  \n     delay(1000);  \n   }  \n   if (state == 1) {  \n     Serial.println(\"nCalculating offsets...\");  \n     calibration();  \n     state++;  \n     delay(1000);  \n   }  \n   if (state == 2) {  \n     meansensors();  \n     Serial.println(\"nFINISHED!\");  \n     Serial.print(\"nSensor readings with offsets:t\");  \n     Serial.print(mean_ax);  \n     Serial.print(\"t\");  \n     Serial.print(mean_ay);  \n     Serial.print(\"t\");  \n     Serial.print(mean_az);  \n     Serial.print(\"t\");  \n     Serial.print(mean_gx);  \n     Serial.print(\"t\");  \n     Serial.print(mean_gy);  \n     Serial.print(\"t\");  \n     Serial.println(mean_gz);  \n     Serial.print(\"Your offsets:t\");  \n     Serial.print(ax_offset);  \n     Serial.print(\"t\");  \n     Serial.print(ay_offset);  \n     Serial.print(\"t\");  \n     Serial.print(az_offset);  \n     Serial.print(\"t\");  \n     Serial.print(gx_offset);  \n     Serial.print(\"t\");  \n     Serial.print(gy_offset);  \n     Serial.print(\"t\");  \n     Serial.println(gz_offset);  \n     Serial.println(\"nData is printed as: acelX acelY acelZ giroX giroY giroZ\");  \n     Serial.println(\"Check that your sensor readings are close to 0 0 16384 0 0 0\");  \n     Serial.println(\"If calibration was succesful write down your offsets so you can set them in your projects using something similar to mpu.setXAccelOffset(youroffset)\");  \n     while (1);  \n   }  \n }  \n \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  FUNCTIONS  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  \n void meansensors() {  \n   long i = 0, buff_ax = 0, buff_ay = 0, buff_az = 0, buff_gx = 0, buff_gy = 0, buff_gz = 0;  \n   while (i &lt; (buffersize + 101)) {  \n     \/\/ read raw accel\/gyro measurements from device  \n     accelgyro.getMotion6( &amp; ax, &amp; ay, &amp; az, &amp; gx, &amp; gy, &amp; gz);  \n     if (i &gt; 100 &amp;&amp; i &lt;= (buffersize + 100)) { \/\/First 100 measures are discarded  \n       buff_ax = buff_ax + ax;  \n       buff_ay = buff_ay + ay;  \n       buff_az = buff_az + az;  \n       buff_gx = buff_gx + gx;  \n       buff_gy = buff_gy + gy;  \n       buff_gz = buff_gz + gz;  \n     }  \n     if (i == (buffersize + 100)) {  \n       mean_ax = buff_ax \/ buffersize;  \n       mean_ay = buff_ay \/ buffersize;  \n       mean_az = buff_az \/ buffersize;  \n       mean_gx = buff_gx \/ buffersize;  \n       mean_gy = buff_gy \/ buffersize;  \n       mean_gz = buff_gz \/ buffersize;  \n     }  \n     i++;  \n     delay(2); \/\/Needed so we don't get repeated measures  \n   }  \n }  \n void calibration() {  \n   ax_offset = -mean_ax \/ 8;  \n   ay_offset = -mean_ay \/ 8;  \n   az_offset = (16384 - mean_az) \/ 8;  \n   gx_offset = -mean_gx \/ 4;  \n   gy_offset = -mean_gy \/ 4;  \n   gz_offset = -mean_gz \/ 4;  \n   while (1) {  \n     int ready = 0;  \n     accelgyro.setXAccelOffset(ax_offset);  \n     accelgyro.setYAccelOffset(ay_offset);  \n     accelgyro.setZAccelOffset(az_offset);  \n     accelgyro.setXGyroOffset(gx_offset);  \n     accelgyro.setYGyroOffset(gy_offset);  \n     accelgyro.setZGyroOffset(gz_offset);  \n     meansensors();  \n     Serial.println(\"...\");  \n     if (abs(mean_ax) &lt;= acel_deadzone) ready++;  \n     else ax_offset = ax_offset - mean_ax \/ acel_deadzone;  \n     if (abs(mean_ay) &lt;= acel_deadzone) ready++;  \n     else ay_offset = ay_offset - mean_ay \/ acel_deadzone;  \n     if (abs(16384 - mean_az) &lt;= acel_deadzone) ready++;  \n     else az_offset = az_offset + (16384 - mean_az) \/ acel_deadzone;  \n     if (abs(mean_gx) &lt;= giro_deadzone) ready++;  \n     else gx_offset = gx_offset - mean_gx \/ (giro_deadzone + 1);  \n     if (abs(mean_gy) &lt;= giro_deadzone) ready++;  \n     else gy_offset = gy_offset - mean_gy \/ (giro_deadzone + 1);  \n     if (abs(mean_gz) &lt;= giro_deadzone) ready++;  \n     else gz_offset = gz_offset - mean_gz \/ (giro_deadzone + 1);  \n     if (ready == 6) break;  \n   }  \n<\/pre>\n<\/div>\n<p>C\u00f3digo Rockerino<\/p>\n<div class=\"panel\">\n<pre style=\"background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;\"> #include &lt;PID_v1.h&gt; \/\/ Libreria para calcular los valores de la posicion del robot: P (proportional), I (integral) y D (derivative).  \n #include &lt;LMotorController.h&gt; \/\/ Libreria para el uso de los dos motores con el modulo LN298N.  \n #include \"I2Cdev.h\" \/\/ Libreria para leer datos de la inclinaci\u00f3n del robot con el MPU6050.  \n #include \"MPU6050_6Axis_MotionApps20.h\" \/\/ Libreria para leer datos de la inclinaci\u00f3n del robot con el MPU6050.  \n #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE  \n  #include \"Wire.h\"  \n #endif  \n #define MIN_ABS_SPEED 30 \/\/ Output a los motores.  \n MPU6050 mpu; \/\/ Variable del MPU.  \n \/\/ MPU6050 - variables de control y estado.  \n bool dmpReady = false; \/\/ Se inia a true si la inicializacion del DMP fue correcta.  \n uint8_t mpuIntStatus; \/\/ Byte de estado del MPU.  \n uint8_t devStatus; \/\/ Estado de retorno de cada operacion del robot (0 = correcto, !0 = error).  \n uint16_t packetSize; \/\/ Tamanio del paquete DMP (por defecto 42 bytes).  \n uint16_t fifoCount; \/\/ Conteo de los bytes actuales de la cola.  \n uint8_t fifoBuffer[64]; \/\/ Almacenamiento de buffer de cola.  \n \/\/ Variables de orientacion y movimiento.  \n Quaternion q; \/\/ [w, x, y, z] Contenedor cuaternio.  \n VectorFloat gravity; \/\/ [x, y, z] vector gravedad.  \n float ypr[3]; \/\/ [yaw, pitch, roll] Contenedor yaw\/pitch\/roll y vector de gravedad.  \n \/* PID - Proporciona la correcion entre el valor deseado (o entrada) y el valor real (salida).  \n  * La diferencia entre estas dos es el margen de error.  \n  * El controlador del PID reduce el error a lo minimo posible, ajustando constantemente el valor de salida.  \n  *\/  \n double originalSetpoint = 172.50; \/\/ Configuracion del punto de ajuste.  \n double setpoint = originalSetpoint;  \n double movingAngleOffset = 0.1; \/\/ Configuracion del angulo.  \n double input, output;  \n \/* KP, KD y KI  \n  * El input es la inclinacion deseada, en grados.  \n  * El MPU6050 lee la inclinacion actual del robot y pasa esa informacion al PID, el cual  \n  * hace calculos para controlar el motor y mantener al robot en equilibrio.  \n *\/  \n double Kp = 38; \/\/ &lt; kp = poca correcion (el robot se caera). &gt; kp = robot \"baile\" (hacia delante y hacia atras) .   \n double Kd = 1.95; \/\/ Un buen kd disminuye las oscilaciones hasta estabilizarlo.  \n double Ki = 270; \/\/ El valor ki correcto acortar\u00e1 el tiempo necesario para que el robot se estabilice.  \n PID pid(&amp;input, &amp;output, &amp;setpoint, Kp, Ki, Kd, DIRECT);  \n \/\/ VELOCIDAD MOTOR - Valores de velocidad de los dos motores.  \n double motorSpeedFactorLeft = 0.6; \/\/0.555  \n double motorSpeedFactorRight = 0.49; \/\/0.45  \n \/\/ L298N - Control de pines.  \n int ENA = 5;  \n int IN1 = 6;  \n int IN2 = 7;  \n int IN3 = 9;  \n int IN4 = 8;  \n int ENB = 10;  \n LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight);  \n \/* Indica si el pin de interrupci\u00f3n de la MPU se ha elevado.  \n  * Variable \"volatile\" para cambios en tiempo de ejecucion.  \n *\/  \n volatile bool mpuInterrupt = false;   \n void dmpDataReady(){ \/\/ Inicializacion en el setup de la variable mpuInterrupt a true.  \n  mpuInterrupt = true;  \n }  \n void setup(){  \n  \/\/ Union de I2C bus (la libreria I2Cdev no lo hace automaticamente).  \n  #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE  \n  Wire.begin();  \n  TWBR = 24; \/\/ 400kHz I2C de reloj (200kHz si la CPU es de 8MHz).  \n  #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE  \n  Fastwire::setup(400, true);  \n  #endif  \n  mpu.initialize(); \/\/ Inicializacion del MPU6050.  \n  devStatus = mpu.dmpInitialize(); \/\/ Inicializacion del DMP.  \n  \/\/ OFFSETS - Mis offsets en el test de calibracion son: 1327 -940 1316 82 36 -25, pero no tienen por que ser esos.  \n  mpu.setXGyroOffset(82);  \n  mpu.setYGyroOffset(304);  \n  mpu.setZGyroOffset(-25);  \n  mpu.setZAccelOffset(1316);  \n  \/\/ DMP - Devuleve 0 si esta listo, en caso contrario control de errores.  \n  if (devStatus == 0){  \n   mpu.setDMPEnabled(true); \/\/ Habilitamos el DMP.  \n   attachInterrupt(0, dmpDataReady, RISING); \/\/ Habilitar la detecion de interrupciones del arduino.  \n   mpuIntStatus = mpu.getIntStatus(); \/\/ Estado del MPU.  \n   dmpReady = true; \/\/ Control de errores mediante booleano en la funcion loop.  \n   packetSize = mpu.dmpGetFIFOPacketSize(); \/\/ Tamanio de paquete para una comparacion posterior en el loop.  \n   \/\/ Inicializacion de PID.  \n   pid.SetMode(AUTOMATIC);  \n   pid.SetSampleTime(10);  \n   pid.SetOutputLimits(-255, 255);   \n  } else {  \n   \/* ERROR!   \n   * 1 = Carga de memoria inicial fallo.  \n   * 2 = Las actualizaciones de configuraci\u00f3n de DMP fallaron.  \n   *\/  \n   Serial.print(F(\"DMP Inicializacion fallida (codigo \"));  \n   Serial.print(devStatus);  \n   Serial.println(F(\")\"));  \n   }  \n }  \n void loop()  \n {  \n  \/\/ Si el codigo falla, no hace nada.  \n  if (!dmpReady) return;  \n  \/\/ A la espera de interrupcion de MPU o paquete extra disponible.  \n  while (!mpuInterrupt &amp;&amp; fifoCount &lt; packetSize){ \/\/ Si hay interrupcion o si la cola es mayor, no entro al bucle.  \n  pid.Compute(); \/\/ Calculos del algoritmo del PID.  \n  motorController.move(output, MIN_ABS_SPEED); \/\/ Output a los motores.  \n  }  \n  mpuInterrupt = false; \/\/ Reseteo de la varibale de interrupcion.  \n  mpuIntStatus = mpu.getIntStatus(); \/\/ Seteo del estado del MPU.  \n  fifoCount = mpu.getFIFOCount(); \/\/ Contado de la cola.  \n  \/* Interrupcion de datos DMP -&gt; Lectura de paquete de la cola -&gt; Seteo de las variables de orientacion y movimiento.  \n  * En caso contrario, control de errores. Checkeo del desbordamiento (esto nunca deber\u00eda ocurrir a menos   \n  * que nuestro c\u00f3digo sea demasiado ineficiente).  \n  *\/  \n  if ((mpuIntStatus &amp; 0x10) || fifoCount == 1024){ \/\/ Seleccionamos el bit de interes y enmascaramos el resto.  \n  mpu.resetFIFO(); \/\/ Reseteamos la cola.  \n  Serial.println(F(\"FIFO overflow!\")); \/\/ Retroalimentacion.  \n  } else if (mpuIntStatus &amp; 0x02){ \/\/ Por el contrario, checkeamos la interrupci\u00f3n de datos DMP.  \n  while (fifoCount &lt; packetSize) fifoCount = mpu.getFIFOCount(); \/\/ Esperamos a un tamanio correcto de cola.  \n  mpu.getFIFOBytes(fifoBuffer, packetSize); \/\/ Leemos paquete de la cola.  \n  fifoCount -= packetSize; \/\/ Seguimiento del conteo de la cola si &gt; 1 paquete disponible.  \n  \/\/ Seteamos las variables de orientacion y movimiento globales pasadas por referencia.  \n  mpu.dmpGetQuaternion(&amp;q, fifoBuffer);  \n  mpu.dmpGetGravity(&amp;gravity, &amp;q);  \n  mpu.dmpGetYawPitchRoll(ypr, &amp;q, &amp;gravity);  \n  input = ypr[1] * 180\/M_PI + 180;  \n  }  \n }  \n<\/pre>\n<\/div>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2019\/04\/empotrados-1024x632.png\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" src=\"https:\/\/blogs.etsii.urjc.es\/wp-content\/uploads\/sites\/8\/2019\/04\/empotrados-1024x632.png\" width=\"400\" height=\"247\" data-original-width=\"1208\" data-original-height=\"746\" \/><\/a><\/div>\n<h1 id=\"problemas\">\n<span style=\"mso-bidi-language: ES;\"><span style=\"font-size: medium;\">PROBLEMAS Y<br \/>\nSOLUCIONES ENCONTRADAS<\/span><\/span><\/h1>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Al comienzo del<br \/>\ndesarrollo del proyecto, no sab\u00edaamos que Arduino Mega tiene los pines SDA y SCL<br \/>\npropios y exclusivos para esa funci\u00f3n, cosa que por ejemplo Arduino Uno no los<br \/>\ntiene de ese modo. Esto nos llev\u00f3 a equivocaci\u00f3n, hasta que los encontramos y<br \/>\nconseguimos solucionarlo.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Por otro lado, uno de los<br \/>\nproblemas m\u00e1s importantes fue que uno de los motores de una de las ruedas iba m\u00e1s<br \/>\nr\u00e1pido que el otro. Esto hacia que Rockerino se moviese dando vueltas, aunque<br \/>\ntambi\u00e9n se manten\u00eda en equilibrio, pero acababa cay\u00e9ndose. Al principio<br \/>\npensamos que era problema del MPU6050 (aceler\u00f3metro y giroscopio) que no nos<br \/>\nestaba dando los datos correctos. Pero despu\u00e9s de muchas pruebas nos dimos<br \/>\ncuenta que era problema del L298N (driver DC motores) que no le est\u00e1bamos dando<br \/>\nunas variables de configuraci\u00f3n iniciales correctas. Y tambi\u00e9n era problema de<br \/>\nlos dos motores que giran las ruedas y de las propias ruedas, que eran<br \/>\ndistintas.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Estas dos variables son<br \/>\nlas que tenemos que facilitar a la funci\u00f3n del constructor del m\u00f3dulo junto con<br \/>\nlos pines que hemos usado en nuestro Arduino, para que sepa a qu\u00e9 velocidades<br \/>\ntiene que ir cada motor independientemente.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">double<br \/>\nmotorSpeedFactorLeft = 0.6;<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">double<br \/>\nmotorSpeedFactorRight = 0.49;<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">LMotorController<br \/>\nmotorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft,<br \/>\nmotorSpeedFactorRight);<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Como puedes observar los<br \/>\nvalores son distintos, esto es debido a que los motores y las ruedas, por<br \/>\nalguna raz\u00f3n, ha sido fabricados por distintos fabricantes, y, por lo tanto, no<br \/>\nse mov\u00edan de la misma forma y velocidad. Cambiar estos valores fue nuestra<br \/>\nsoluci\u00f3n.<\/span><\/div>\n<div class=\"MsoNormal\">\n<\/div>\n<h1 id=\"mejoras\">\n<span style=\"mso-bidi-language: ES;\"><span style=\"font-size: medium;\">POSIBLES MEJORAS<\/span><\/span><\/h1>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Una de las mejoras que<br \/>\nnos hubiese gustado realizar, pero por falta de tiempo no la hemos contemplado,<br \/>\nes la de incorporar un control remoto del Rockerino. De este modo, no solo se<br \/>\nmantendr\u00eda levantado y no se caer\u00eda, sino que tambi\u00e9n podr\u00edamos manejarlo, como<br \/>\nsi fuera un coche teledirigido. La idea ser\u00eda que se mantuviese de pie,<br \/>\nmientras podemos manejarlo.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Otra mejora que tambi\u00e9n<br \/>\npensamos fue incorporar en el c\u00f3digo una forma de que Rockerino estando tumbado<br \/>\nse levantase solo, parece algo f\u00e1cil, quiz\u00e1 para la pr\u00f3xima.<\/span><\/div>\n<div class=\"MsoNormal\">\n<\/div>\n<h1 id=\"conclusiones\">\n<span style=\"font-size: medium;\"><span style=\"mso-bookmark: _Toc5142956;\"><span style=\"mso-bidi-language: ES;\">CONCLUSIONES<\/span><\/span><\/span><\/h1>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Gracias a esta pr\u00e1ctica<br \/>\nhemos profundizado m\u00e1s en el mundo de la rob\u00f3tica, ya que algunos miembros de<br \/>\nnuestro equipo ya sab\u00edamos hacer algunas cosas, pero con un proyecto un poco<br \/>\nm\u00e1s extenso, como es este, nos ayuda a mejorar y aprender cosas nuevas.<\/span><\/div>\n<div class=\"MsoNormal\">\n<span style=\"mso-bidi-language: ES;\">Adem\u00e1s, estamos agradecidos<br \/>\nde tener una asignatura como esta en nuestro grado, para poner en pr\u00e1ctica<br \/>\nnuestros conocimientos en Hw y Sw.<\/span><\/div>\n<div class=\"MsoNormal\">\n<\/div>\n<p><\/p>\n<p>var acc = document.getElementsByClassName(\u00abaccordion\u00bb);<br \/>\nvar i;<\/p>\n<p>for (i = 0; i < acc.length; i++) {\n  acc[i].addEventListener(\"click\", function() {\n    this.classList.toggle(\"active\");\n    var panel = this.nextElementSibling;\n    if (panel.style.maxHeight){\n      panel.style.maxHeight = null;\n    } else {\n      panel.style.maxHeight = panel.scrollHeight + \"px\";\n    } \n  });\n}\n\n\n\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>.accordion { background-color: #eee; color: #444; cursor: pointer; padding: 18px; width: 100%; border: none; text-align: left; outline: none; font-size: 15px; transition: 0.4s; } .active, .accordion:hover { background-color: #ccc; } .accordion:after { content: &#8216;02B&#8217;; color:&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":2024,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-45","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Rockerino - Proyectos con Arduino.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rockerino - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\".accordion { background-color: #eee; color: #444; cursor: pointer; padding: 18px; width: 100%; border: none; text-align: left; outline: none; font-size: 15px; transition: 0.4s; } .active, .accordion:hover { background-color: #ccc; } .accordion:after { content: &#8216;02B&#8217;; color:&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-08T12:06:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-15T10:49:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2019\/05\/0-3.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"480\" \/>\n\t<meta property=\"og:image:height\" content=\"360\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Administrador de la red\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Administrador de la red\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/\"},\"author\":{\"name\":\"Administrador de la red\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/bdc38fea664f13638d2a51f4d2fc7211\"},\"headline\":\"Rockerino\",\"datePublished\":\"2019-04-08T12:06:00+00:00\",\"dateModified\":\"2020-11-15T10:49:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/\"},\"wordCount\":1422,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2019\\\/05\\\/0-3.jpg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/\",\"name\":\"Rockerino - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2019\\\/05\\\/0-3.jpg\",\"datePublished\":\"2019-04-08T12:06:00+00:00\",\"dateModified\":\"2020-11-15T10:49:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2019\\\/05\\\/0-3.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2019\\\/05\\\/0-3.jpg\",\"width\":480,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/rockerino\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rockerino\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/bdc38fea664f13638d2a51f4d2fc7211\",\"name\":\"Administrador de la red\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g\",\"caption\":\"Administrador de la red\"},\"sameAs\":[\"https:\\\/\\\/blogs.etsii.urjc.es\"],\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/etsiiadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Rockerino - Proyectos con Arduino.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/","og_locale":"es_ES","og_type":"article","og_title":"Rockerino - Proyectos con Arduino.","og_description":".accordion { background-color: #eee; color: #444; cursor: pointer; padding: 18px; width: 100%; border: none; text-align: left; outline: none; font-size: 15px; transition: 0.4s; } .active, .accordion:hover { background-color: #ccc; } .accordion:after { content: &#8216;02B&#8217;; color:&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2019-04-08T12:06:00+00:00","article_modified_time":"2020-11-15T10:49:52+00:00","og_image":[{"width":480,"height":360,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2019\/05\/0-3.jpg","type":"image\/jpeg"}],"author":"Administrador de la red","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Administrador de la red","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/"},"author":{"name":"Administrador de la red","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/bdc38fea664f13638d2a51f4d2fc7211"},"headline":"Rockerino","datePublished":"2019-04-08T12:06:00+00:00","dateModified":"2020-11-15T10:49:52+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/"},"wordCount":1422,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2019\/05\/0-3.jpg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/","name":"Rockerino - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2019\/05\/0-3.jpg","datePublished":"2019-04-08T12:06:00+00:00","dateModified":"2020-11-15T10:49:52+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2019\/05\/0-3.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2019\/05\/0-3.jpg","width":480,"height":360},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/rockerino\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Rockerino"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/bdc38fea664f13638d2a51f4d2fc7211","name":"Administrador de la red","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e8e366128f81a82735b0b00fe6d280414b4bad087e380fa9fee9694454b8a6fa?s=96&d=mm&r=g","caption":"Administrador de la red"},"sameAs":["https:\/\/blogs.etsii.urjc.es"],"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/etsiiadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/45","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=45"}],"version-history":[{"count":2,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/45\/revisions"}],"predecessor-version":[{"id":2706,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/45\/revisions\/2706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/2024"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=45"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=45"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=45"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}