{"id":7668,"date":"2012-01-30T15:15:42","date_gmt":"2012-01-30T14:15:42","guid":{"rendered":"http:\/\/www.pesadillo.com\/pesadillo\/?p=7668"},"modified":"2012-10-15T15:23:10","modified_gmt":"2012-10-15T14:23:10","slug":"seguidor-solar-con-arduino","status":"publish","type":"post","link":"https:\/\/www.pesadillo.com\/pesadillo\/?p=7668","title":{"rendered":"SEGUIDOR SOLAR CON ARDUINO"},"content":{"rendered":"<pre><a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2012\/01\/seguidor1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-7672\" title=\"seguidor1\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2012\/01\/seguidor1.jpg\" alt=\"\" width=\"500\" height=\"266\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2012\/01\/seguidor1.jpg 833w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2012\/01\/seguidor1-300x159.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a>\r\nAhora con tiempo he decidido rescatar del caj\u00f3n los arduinos (un diecimila y un mini) que tenia desde hace dos a\u00f1os largos y con los que hab\u00eda trasteado un poco para probar, pero con los que no llegue a hacer nada medianamente interesante.<section>Mini central solar La finalidad de esta central es la de tener una fuente de alimentaci\u00f3n de 5V para cargar los aparatos electr\u00f3nicos (principalmente m\u00f3viles) usando energ\u00eda solar, aunque despu\u00e9s de todo el motivo principal es el de empezar un poco mas en serio con la electr\u00f3nica y todo el mundo de\u00a0<a href=\"http:\/\/arduino.cc\/\">arduino<\/a>, programar en C incluido.<\/section><section>Materiales Los materiales necesarios son un par de\u00a0<a href=\"http:\/\/www.cooking-hacks.com\/index.php\/shop\/accessories\/1w-solar-panel-75x100.html\">placas solares<\/a>\u00a0guiados mediante un\u00a0<a href=\"http:\/\/www.cooking-hacks.com\/index.php\/shop\/robotics\/pan-tilt-bracket.html\">soporte articulado<\/a>\u00a0que hara de seguidor con movimiento de gui\u00f1ada (pan) y cabeceo (tilt) accionado mediante sus respectivos\u00a0<a href=\"http:\/\/www.cooking-hacks.com\/index.php\/shop\/robotics\/mini-servo-mystery-9g-1-3-kg-torque.html\">servos<\/a>\u00a0y controlados por un\u00a0<a href=\"http:\/\/arduino.cc\/en\/Main\/ArduinoBoardMini\" hreflang=\"en\">arduino mini<\/a>. La energ\u00eda entregada por las placas es almacenada en una\u00a0<a href=\"http:\/\/www.cooking-hacks.com\/index.php\/shop\/arduino\/5v-regulator-module-for-arduino.html\">bater\u00eda de litio<\/a>\u00a0cuya carga as\u00ed como la gesti\u00f3n de la alimentaci\u00f3n la realiza un\u00a0<a href=\"http:\/\/www.cooking-hacks.com\/index.php\/shop\/arduino\/5v-regulator-module-for-arduino.html\">regulador<\/a>\u00a0(ligeramente modificado). Tambi\u00e9n para el sensor de luz son necesarias tres fotorresistencias (<abbr xml:lang=\"en\">LDR<\/abbr>) y otras tres resistencias de 1K\u00ce\u00a9, conectores, placa virgen y unas laminas de pvc. Aparte de estos elementos para montar el conjunto tambi\u00e9n necesite una caja donde meter la electr\u00f3nica (arduino mini, bater\u00eda, regulador, cableado, conexiones, etc), un perfil de aluminio en U (en mi caso de 15x10x1.5mm), cableado, conectores, fundas termoretractiles, tornilleria y un conector jack de alimentaci\u00f3n de 5.5 para la salida de 5V.<\/section><section>Herramientas Para montar esto aparte de las herramientas t\u00edpicas como alicates, destornilladores, llave inglesa, limas, c\u00fater, pinzas, etc, tambi\u00e9n emplee las siguientes herramientas:<dl><dt>Soldador<\/dt><dd>Este es necesario para fabricar la placa de sensores de luz asi como desoldar un componente y puentearlo.<\/dd><dt>Soplador de aire caliente<\/dt><dd>Para realizar algunos empalmes de cables con cables y cables con conectores y ahorrar soldaduras, aislar la uni\u00f3n el\u00e9ctricamente as\u00ed como para reforzar la uni\u00f3n es necesario un soplador de aire caliente (en mi caso la\u00a0<a href=\"http:\/\/vac2.net\/bitacora\/dremel_versatip.\">Dremel VersaTip<\/a>) para utilizar las fundas termoretractiles o camisas.<\/dd><dt>Minitaladro o tambi\u00e9n normalmente llamado simplemente: Dremel<\/dt><dd>Aunque no es estrictamente necesario, si que viene muy bien tanto para realizar entre otras cosas cortes, hendiduras, taladros y pulido de los perfiles y tornillo de fijaci\u00f3n.<\/dd><dt>Polimetro<\/dt><dd>Pr\u00e1cticamente imprescindible para realizar las comprobaciones el\u00e9ctricas de continuidad y voltaje para cercionarse de que todo este correcto.<\/dd><dt>Pistola de cola termofusible<\/dt><dd>Para pegar las laminas en cruz que gu\u00edan la luz hacia los sensores.<\/dd><dt>Cloruro f\u00e9rrico<\/dt><dd>Para realizar la placa de sensores y dibujar las pistas use un rotulador permanente para despu\u00e9s con el \u00e1cido (el cloruro f\u00e9rrico) atacar el cobre de la placa.<\/dd><\/dl>\u00a0<\/section><section>Programaci\u00f3n La programaci\u00f3n ha sido bastante sencilla ya que que solo hab\u00eda que realizar el control del seguidor y este era bastante facil por lo que no ha habido complicaciones con el\u00a0<a href=\"http:\/\/vac2.net\/bitacora\/seguidor_solar\/seguidor.pde\">c\u00f3digo fuente<\/a>. Lo dif\u00edcil, el control de los servos, se resuelve empleando una librer\u00eda que incluye el entorno de arduino.<\/section><section>Electr\u00f3nica Empezando por el regulador que gestiona la energ\u00eda de la central hay que destacar que el componente TS1117BCP50 que es un regulador de voltaje que baja los 12V hasta los 5V lo quite de la placa para a continuaci\u00f3n puentear la entrada de 12V directamente hasta donde este tenia la salida de 5V. Esto es debido a que en mi caso las placas que uso tienen un valor de pico de 5.5V y el controlador de carga de la bater\u00eda, un MAX1555, acepta dos entradas de 3.7 a 7.0V y 3.7 a 6.0V. Cada placa va a una de las entradas y dado que este controlador solo selecciona una al mismo tiempo un panel siempre esta de respaldo por si el otro falla o no le llega luz con la intensidad necesaria. La bater\u00eda esta conectada a sus terminales correspondientes. La placa dispone de un convertidor DC\/DC, el MAX1674, que es el que finalmente nos proporciona la alimentaci\u00f3n de 5V a partir de la energ\u00eda de la bater\u00eda. Respecto al sensor de luz para el guiado este no es mas que tres divisores de tensi\u00f3n formados por una fotorresistencia y una resistencia de 1K. Las resistencias de 1K est\u00e1n conectadas a tierra mientras que las fotorresistencias no estan conectadas a la alimentaci\u00f3n de 5V directamente sino a una salida digital del arduino mini que permanece en alto \u00fanicamente para realizar las lecturas de los sensores para ahorrar algo de energ\u00eda. Por ultimo las conexiones del arduino son las siguientes tal y como se ha programado:<dl><dt>D9<\/dt><dt>D10<\/dt><dd>Se\u00f1al de control de los servos que controlan los eje vertical y horizontal respectivamente.<\/dd><dt>D12<\/dt><dd>Alimentaci\u00f3n para los divisores de tensi\u00f3n.<\/dd><dt>A0<\/dt><dt>A1<\/dt><dt>A2<\/dt><dd>Conectado al punto medio de los divisores de tensi\u00f3n. El primero es el sensor de referencia mientras que el segundo y tercero son para los sensores vertical y horizontal situados a la derecha y debajo del de referencia respectivamente.<\/dd><dt>5V<\/dt><dd>La alimentaci\u00f3n conectada al regulador.<\/dd><dt>GND<\/dt><dd>Tierra, masa, com\u00fan o como lo quieras llamar.<\/dd><\/dl>\u00a0<\/section>Construcci\u00f3n<\/pre>\n<p>El primer paso es\u00a0<a href=\"http:\/\/www.sparkfun.com\/datasheets\/Robotics\/Other\/sensor%20pan%20tilt%20manual.jpg\" target=\"_blank\">montar el mecanismo<\/a>\u00a0del seguidor junto con los servos para hacernos una idea del radio que abarcara al realizar los movimientos en ambos ejes y visualizar como deber\u00e1n colocarse los paneles y como sera el brazo de soporte.<\/p>\n<p>Montaremos el soporte para los dos paneles solares y el sensor con un trozo del perfil de aluminio al que le hemos realizado cuatro taladros y dos cortes para poder introducirlo en el seguidor. Estos primeros se fijaran con tornillos de cabeza plana y ancha con los que atraparlos y retenerlos. A su vez el perfil se fija al seguidor con un tornillo con tuerca.<\/p>\n<p>Lo siguiente es unir el seguidor al brazo de soporte. Este es otro trozo del mismo tipo de perfil al que se le ha practicado un rebaje para dejar un hueco donde acomodar el cuerpo del servo que soporta el seguidor. Para fijar este se hace mediante dos peque\u00f1os tacos de madera que presionan a las pesta\u00f1as del servo contra el perfil.<\/p>\n<p>Por ultimo, en el otro extremo del brazo soporte sera donde se introduzca la cabeza de un tornillo rebajada con la Dremel hasta hacer que esta tenga el mismo grosor que la medida interior del perfil. Por seguridad y para evitar que el perfil no se da de si con el movimiento provocado por el viento he pasado un par de tornillos con tuerca a cada lado del tornillo de sujeci\u00f3n con la que aprisionarlo.<\/p>\n<p>La caja que alberga toda la electr\u00f3nica la he mecanizado un poco realizando unos rebajes en la parte baja poder albergar el perfil del soporte. Una vez cerrada la tapa de la caja esta quedara fijada al brazo.<\/p>\n<section>Para el sensor, mediante unas laminas de PVC he fabricado una cruceta larga para separar los sensores en sectores diferentes y asi poder determinar de donde procede la luz. Esta va unida a la placa de sensores con unos cuantos puntos de cola termofusible.<\/section>\n<p>Montaje<\/p>\n<p>Una vez que tenemos preparado todos los materiales pasamos al montaje. Este consistir\u00e1 en ir ensamblando las piezas que hemos ido creando y sobre todo en realizar el cableado.<\/p>\n<p>Respecto al cableado tuve un peque\u00f1o problema con los cables que utilice para el sensor ya que el grosor de estos hacia que el seguidor no se quedara quieto tras orientarse ya que los cables tiraban.<\/p>\n<p>Para resolverlo corte por lo sano y sustitu\u00ed un tramo por hilo de cobre esmaltado sacado de un trasformador con lo que el problema se resolvi\u00f3.<\/p>\n<p>Tras el cableado solo realizar las conexiones dentro de la caja donde afortunadamente pude meter todo sin quedar espacio para meter nada mas y gracias. Despu\u00e9s prob\u00e9 que todo funcionara y de nuevo a dar gracias.<\/p>\n<p>Por ultimo solo quedaba ponerlo en su lugar definitivo, en la terraza. Dado que donde vivo tiene la barandilla de cristal ligeramente tintado pr\u00e1cticamente trasparente puse la central solar tras el cristal para protegerlo del viento y cerca del suelo para que no le tape el sol al bajar el toldo.<\/p>\n<p>La barandilla es met\u00e1lica y por suerte tenia un agujero para un tornillo que quite (tranquilos, no es estructuralmente esencial para la barandilla) y lo sustitu\u00ed por el mio ya mecanizado. Lo siguiente era introducir a presi\u00f3n el tornillo en el perfil de soporte y asegurarlo pasando los tornillos con su tuerca en los agujeros de ambos lados con lo que el invento estaba terminado.<\/p>\n<section>PruebasDespu\u00e9s de esto hab\u00eda que esperar a que el aparato siguiera al sol y as\u00ed lo hizo. El movimiento que realiza tras ver un ciclo completo (una rotaci\u00f3n de la tierra, de d\u00eda a noche y de nuevo al d\u00eda) es de vaiv\u00e9n. Es decir, teniendo en cuenta que el arco que gira es de unos 135 grados siendo 0 pr\u00e1cticamente el sur y 135 el noreste el\u00a0<a href=\"http:\/\/vac2.net\/galeria\/seguidor_solar\/\">movimiento<\/a>\u00a0es de 0 \u00e2\u2020\u2019 135, 135 \u00e2\u2020\u2019 0 en vez de lo que se puede esperar de 0 \u00e2\u2020\u2019 135, 0. Esto es debido a que al amanecer el cielo que es donde quedo apuntando al atardecer del d\u00eda anterior sigue siendo lo mas brillante pero al ir subiendo el sol la luz va incidiendo mas y mas sobre el edificio de enfrente que esta un poco a la izquierda y refleja parcialmente la luz y por eso vuelve poco a poco hacia donde sale el sol en vez de golpe.Las pruebas que me quedan son las de esperar a que llueva, ver si sigue funcionando y si es necesario impermeabilizarlo mejor. La prueba del viento ya la ha superado y por suerte (o mala suerte) en Zaragoza los d\u00edas de viento fuerte no se hacen esperar.<\/p>\n<\/section>\n<section>ConclusionesBueno, un proyecto sencillito para empezar a trastear mas en serio con el arduino. En cuanto a los paneles solares, haciendo pruebas, me parece que el esfuerzo de montar un seguidor no compensa demasiado frente a orientarlo y fijarlo convenientemente e invertir si es necesario en paneles mas eficientes. Aun as\u00ed, desde luego verlo moverse mola mas.En cuanto a posibles ampliaciones el siguiente paso quiz\u00e1s sea poner alg\u00fan suced\u00e1neo de estaci\u00f3n meteorol\u00f3gica, y sobre todo que se comunique con el resto del mundo inalambricamente para probar XBee, pero desde luego cambiando la caja porque no cabe nada mas ahora.<\/p>\n<\/section>\n<section>\u00a0<\/section>\n<pre>\n<section>\u00a0<\/section>\n<p>[php]<br \/>\n&lt;pre&gt;#include &lt;avr\/power.h&gt;<br \/>\n#include &lt;avr\/sleep.h&gt;<br \/>\n#include &lt;avr\/wdt.h&gt;<br \/>\n#include &lt;Servo.h&gt;<\/p>\n<p>\/\/ Depuracion.<br \/>\nboolean depuracion = false;<\/p>\n<p>\/\/ Seguidor.<br \/>\nServo seguidor_servo_vertical_controlador;<br \/>\nint seguidor_servo_vertical_pin = 9;<br \/>\nint seguidor_servo_vertical_angulo_valor = 90;<br \/>\nint seguidor_servo_vertical_angulo_min = 5;<br \/>\nint seguidor_servo_vertical_angulo_max = 175;<br \/>\nServo seguidor_servo_horizontal_controlador;<br \/>\nint seguidor_servo_horizontal_pin = 10;<br \/>\nint seguidor_servo_horizontal_angulo_valor = 90;<br \/>\nint seguidor_servo_horizontal_angulo_min = 5;<br \/>\nint seguidor_servo_horizontal_angulo_max = 175;<br \/>\nint seguidor_servo_alimentacion_pin = 2;<br \/>\nint seguidor_orientacion_alimentacion_pin = 12;<br \/>\nint seguidor_orientacion_referencia_valor;<br \/>\nint seguidor_orientacion_referencia_pin = 0;<br \/>\nint seguidor_orientacion_vertical_valor;<br \/>\nint seguidor_orientacion_vertical_pin = 1;<br \/>\nint seguidor_orientacion_horizontal_valor;<br \/>\nint seguidor_orientacion_horizontal_pin = 2;<br \/>\nint seguidor_orientacion_desviacion_max = 50;<br \/>\nboolean seguidor_actualizacion_activo = false;<\/p>\n<p>\/\/ Inicializacion.<br \/>\nvoid setup(){<br \/>\n  if(depuracion) Serial.begin(9600);<\/p>\n<p>  seguidor_inicializar();<br \/>\n}<\/p>\n<p>\/\/ Marcha.<br \/>\nvoid loop(){<br \/>\n  \/\/ Actualizamos el estado de los servos.<br \/>\n  seguidor_actualizar_estado();<\/p>\n<p>  \/\/ Dormimos el arduino.<br \/>\n  reposar();<br \/>\n}<\/p>\n<p>\/\/ Control del seguidor.<\/p>\n<p>void seguidor_inicializar(){<br \/>\n  pinMode(seguidor_orientacion_alimentacion_pin, OUTPUT);<br \/>\n  pinMode(seguidor_servo_alimentacion_pin, OUTPUT);<\/p>\n<p>  digitalWrite(seguidor_orientacion_alimentacion_pin, LOW);<br \/>\n  digitalWrite(seguidor_servo_alimentacion_pin, LOW);<\/p>\n<p>  seguidor_actualizar_estado();<br \/>\n}<\/p>\n<p>void seguidor_actualizar_estado(){<br \/>\n  \/\/ Comprobamos si ya se esta actualizando la orientacion.<br \/>\n  if(seguidor_actualizacion_activo){<br \/>\n    return;<br \/>\n  }<\/p>\n<p>  \/\/ Ajustamos la orientacion.<\/p>\n<p>  \/\/ Marcamos que estamos realizando el proceso.<br \/>\n  seguidor_actualizacion_activo = true;<\/p>\n<p>  \/\/ Alimentamos el sensor.<br \/>\n  digitalWrite(seguidor_orientacion_alimentacion_pin, HIGH);<\/p>\n<p>  \/\/ Realizamos una lectura para despertar el ADC.<\/p>\n<p>  \/\/ Mientras sea necesario orientamos el seguidor.<br \/>\n  do{<br \/>\n    delay(50);<br \/>\n  }while(seguidor_actualizar_estado_orientacion());<\/p>\n<p>  \/\/ Quitamos la alimentacion al sensor.<br \/>\n  digitalWrite(seguidor_orientacion_alimentacion_pin, LOW);<\/p>\n<p>  \/\/ Marcamos el fin de la actualizacion de la orientacion.<br \/>\n  seguidor_actualizacion_activo = false;<br \/>\n}<\/p>\n<p>boolean seguidor_actualizar_estado_orientacion(){<br \/>\n  \/\/ Referencia.<br \/>\n  seguidor_orientacion_referencia_valor = analogRead(seguidor_orientacion_referencia_pin);<\/p>\n<p>  \/\/ Vertical.<\/p>\n<p>  seguidor_orientacion_vertical_valor = analogRead(seguidor_orientacion_vertical_pin);<\/p>\n<p>  int seguidor_orientacion_vertical_desviacion_valor = seguidor_orientacion_referencia_valor - seguidor_orientacion_vertical_valor;<\/p>\n<p>  int seguidor_orientacion_vertical_desviacion_abs = abs(seguidor_orientacion_vertical_desviacion_valor);<\/p>\n<p>  if(seguidor_orientacion_vertical_desviacion_abs &gt; seguidor_orientacion_desviacion_max){<br \/>\n    if(seguidor_orientacion_vertical_desviacion_valor &gt; 0){<br \/>\n      seguidor_servo_vertical_angulo_valor--;<\/p>\n<p>    }else{<br \/>\n      seguidor_servo_vertical_angulo_valor++;<br \/>\n    }<\/p>\n<p>    seguidor_servo_vertical_angulo_valor = constrain(seguidor_servo_vertical_angulo_valor, seguidor_servo_vertical_angulo_min, seguidor_servo_vertical_angulo_max);<br \/>\n  }<\/p>\n<p>  \/\/ Horizontal.<\/p>\n<p>  seguidor_orientacion_horizontal_valor = analogRead(seguidor_orientacion_horizontal_pin);<\/p>\n<p>  int seguidor_orientacion_horizontal_desviacion_valor = seguidor_orientacion_referencia_valor - seguidor_orientacion_horizontal_valor;<\/p>\n<p>  int seguidor_orientacion_horizontal_desviacion_abs = abs(seguidor_orientacion_horizontal_desviacion_valor);<\/p>\n<p>  if(seguidor_orientacion_horizontal_desviacion_abs &gt; seguidor_orientacion_desviacion_max){<br \/>\n    if(seguidor_orientacion_horizontal_desviacion_valor &gt; 0){<br \/>\n      seguidor_servo_horizontal_angulo_valor--;<\/p>\n<p>    }else{<br \/>\n      seguidor_servo_horizontal_angulo_valor++;<br \/>\n    }<\/p>\n<p>    seguidor_servo_horizontal_angulo_valor = constrain(seguidor_servo_horizontal_angulo_valor, seguidor_servo_horizontal_angulo_min, seguidor_servo_horizontal_angulo_max);<br \/>\n  }<\/p>\n<p>  if(depuracion) Serial.print(&quot;R: &quot;);<br \/>\n  if(depuracion) Serial.println(seguidor_orientacion_referencia_valor);<br \/>\n  if(depuracion) Serial.print(&quot;V: &quot;);<br \/>\n  if(depuracion) Serial.println(seguidor_orientacion_vertical_valor);<br \/>\n  if(depuracion) Serial.println(seguidor_servo_vertical_angulo_valor);<br \/>\n  if(depuracion) Serial.println(seguidor_orientacion_vertical_desviacion_valor);<br \/>\n  if(depuracion) Serial.print(&quot;H: &quot;);<br \/>\n  if(depuracion) Serial.println(seguidor_orientacion_horizontal_valor);<br \/>\n  if(depuracion) Serial.println(seguidor_servo_horizontal_angulo_valor);<br \/>\n  if(depuracion) Serial.println(seguidor_orientacion_horizontal_desviacion_valor);<br \/>\n  if(depuracion) Serial.println(&quot;----&quot;);<br \/>\n  if(depuracion) delay(500);<\/p>\n<p>  boolean continuar_orientacion=false;<\/p>\n<p>  if(<br \/>\n     seguidor_orientacion_vertical_desviacion_abs &lt; seguidor_orientacion_desviacion_max<br \/>\n  &amp;&amp; seguidor_orientacion_horizontal_desviacion_abs &lt; seguidor_orientacion_desviacion_max<br \/>\n  ){<br \/>\n    continuar_orientacion = false;<\/p>\n<p>  }else if(<br \/>\n     seguidor_servo_vertical_angulo_min &lt; seguidor_servo_vertical_angulo_valor &amp;&amp; seguidor_servo_vertical_angulo_valor &lt; seguidor_servo_vertical_angulo_max<br \/>\n  || seguidor_servo_horizontal_angulo_min &lt; seguidor_servo_horizontal_angulo_valor &amp;&amp; seguidor_servo_horizontal_angulo_valor &lt; seguidor_servo_horizontal_angulo_max<br \/>\n  ){<br \/>\n    continuar_orientacion = true;<\/p>\n<p>  }else{<br \/>\n    continuar_orientacion = false;<br \/>\n  }<\/p>\n<p>  if(!continuar_orientacion){<br \/>\n    seguidor_servo_vertical_controlador.detach();<br \/>\n    seguidor_servo_horizontal_controlador.detach();<\/p>\n<p>    digitalWrite(seguidor_servo_alimentacion_pin, LOW);<\/p>\n<p>    return continuar_orientacion;<br \/>\n  }<\/p>\n<p>  digitalWrite(seguidor_servo_alimentacion_pin, HIGH);<\/p>\n<p>  seguidor_servo_vertical_controlador.attach(seguidor_servo_vertical_pin);<br \/>\n  seguidor_servo_vertical_controlador.write(seguidor_servo_vertical_angulo_valor);<\/p>\n<p>  seguidor_servo_horizontal_controlador.attach(seguidor_servo_horizontal_pin);<br \/>\n  seguidor_servo_horizontal_controlador.write(seguidor_servo_horizontal_angulo_valor);<\/p>\n<p>  return continuar_orientacion;<br \/>\n}<\/p>\n<p>\/\/ Pone a dormir el micro y activa el watchdog para despertarlo pasado un periodo de tiempo.<br \/>\nvoid reposar(){<br \/>\n  \/\/ Habilitamos el watchdog.<br \/>\n  watchdog_interrupcion_activar();<\/p>\n<p>  \/\/ Sleep mode control register<br \/>\n  \/\/ SMCR: \u201d\u201c \u201d\u201c \u201d\u201c \u201d\u201c SM2 SM1 SM0 SE<br \/>\n  \/\/ SM2<br \/>\n  \/\/   SM1<br \/>\n  \/\/     SM0<br \/>\n  \/\/       Sleep mode<br \/>\n  \/\/ 0 0 0 Idle<br \/>\n  \/\/ 0 0 1 ADC noise reduction<br \/>\n  \/\/ 0 1 0 Power-down<br \/>\n  \/\/ 0 1 1 Power-save<br \/>\n  \/\/ 1 0 0 Reserved<br \/>\n  \/\/ 1 0 1 Reserved<br \/>\n  \/\/ 1 1 0 Standby<br \/>\n  \/\/ 1 1 1 Reserved<br \/>\n  \/\/<br \/>\n  \/\/ SLEEP_MODE_IDLE &lt; SLEEP_MODE_ADC &lt; SLEEP_MODE_PWR_SAVE &lt; SLEEP_MODE_STANDBY &lt; SLEEP_MODE_PWR_DOWN<\/p>\n<p>  \/\/ Establecemos el modo de dormir.<br \/>\n  set_sleep_mode(SLEEP_MODE_PWR_DOWN);<\/p>\n<p>  \/\/ Desconexion de perifericos.<\/p>\n<p>  \/\/ En los modos IDLE y ADC el comparador analogico hay que deshabilitarlo, pero si usamos la referencia interna hay que deshabillitarlo en todos los modos.<br \/>\n  ACSR |= 1&lt;&lt;ACD;<\/p>\n<p>  \/\/ El conversor A\/D siempre esta activo en todos los modos de dormir.<br \/>\n  power_adc_disable();<\/p>\n<p>  \/\/ Desconectamos el resto.<br \/>\n  power_spi_disable();<br \/>\n  power_timer0_disable();<br \/>\n  power_timer1_disable();<br \/>\n  power_timer2_disable();<br \/>\n  power_twi_disable();<br \/>\n  power_usart0_disable();<\/p>\n<p>  \/\/ Permitimos dormir al micro.<br \/>\n  sleep_enable();<\/p>\n<p>  \/\/ Ponemos a dormir al micro.<br \/>\n  sleep_cpu();<\/p>\n<p>  \/\/ ZZZ. ZZZ.<\/p>\n<p>  \/\/ Tras ejecutar la rutina ISR de la interrupcion que ha despertado el micro continua la ejecucion.<\/p>\n<p>  \/\/ Permitimos dormir al micro.<br \/>\n  sleep_disable();<\/p>\n<p>  \/\/ Habilitamos todo.<br \/>\n  power_all_enable();<br \/>\n}<\/p>\n<p>ISR(WDT_vect) {<br \/>\n  \/\/ Deshabilitamos el watchdog.<br \/>\n  watchdog_interrupcion_desactivar();<br \/>\n}<br \/>\nvoid watchdog_interrupcion_activar(){<br \/>\n  \/\/ MCUSR: \u201d\u201c \u201d\u201c \u201d\u201c \u201d\u201c WDRF BORF EXTRF PORF<br \/>\n  \/\/                Flag que indica la ocurrencia del reset del watchdog. Se debe borrar para poder borrar WDTCSR:WDE ya que sobreescribe a este ultimo cuando esta habilitado.<\/p>\n<p>  \/\/ WDTCSR: WDIF WDIE WDP3 WDCE WDE WDP2 WDP1 WDP0<br \/>\n  \/\/         Indica la interrupcion del watchdog. Se borra automaticamente tras salir de la rutina de interrupcion del watchdog.<br \/>\n  \/\/                   &gt;             &gt;    &gt;    &gt;     Periodo de espera del watchdog antes de saltar.<br \/>\n  \/\/              Bandera para habilitar la interrupcion del watchdog.<br \/>\n  \/\/                        Fusible para permitir (durante 4 ciclos) cambiar las propiedades del registro del watchdog.<br \/>\n  \/\/                             Bandera para habilitar provocar la ejecucion de la rutina de reset del watchdog.<br \/>\n  \/\/<br \/>\n  \/\/ 0 0 0 0 2K     16ms   | 2048       16ms<br \/>\n  \/\/ 0 0 0 1 4K     32ms   | 4096       32ms<br \/>\n  \/\/ 0 0 1 0 8K     64ms   | 8192       64ms<br \/>\n  \/\/ 0 0 1 1 16K    0.125s | 16384     128ms<br \/>\n  \/\/ 0 1 0 0 32K    0.25s  | 32768     256ms<br \/>\n  \/\/ 0 1 0 1 64K    0.5s   | 65536     512ms<br \/>\n  \/\/ 0 1 1 0 128K   1.0s   | 131072   1024ms<br \/>\n  \/\/ 0 1 1 1 256K   2.0s   | 262144   2048ms<br \/>\n  \/\/ 1 0 0 0 512K   4.0s   | 524288   4096ms<br \/>\n  \/\/ 1 0 0 1 1024K  8.0s   | 1048576  8192ms<br \/>\n  \/\/ WDP3    Number of Typical time-out at<br \/>\n  \/\/   WDP2         WDT oscillator cycles VCC = 5.0V<br \/>\n  \/\/     WDP1<br \/>\n  \/\/       WDP0<\/p>\n<p>  \/\/ Deshabilitamos las interrupciones temporalmente para que no se activen mientras editamos las propiedades del watchgdog.<br \/>\n  cli(); \/\/ SREG &amp;= B01111111;<\/p>\n<p>  \/\/ Reiniciamos el reloj del watchdog.<br \/>\n  wdt_reset();<\/p>\n<p>  \/\/ Borramos la bandera que indica el reset del watchdog (para asegurarnos de poder deshabilitar WDTCSR:WDE).<br \/>\n  MCUSR &amp;= ~(1&lt;&lt;WDRF);<\/p>\n<p>  \/\/ Mandamos la orden para activar la posibilidad de cambiar las propiedades del watchdog y borrar el reset del watchdog. Debemos cambiarlas antes de 4 ciclos.<br \/>\n  WDTCSR |= (1&lt;&lt;WDCE) | (1&lt;&lt;WDE);<\/p>\n<p>  \/\/ Establecemos la nueva configuracion del registro de control del watchdog.<br \/>\n  WDTCSR = ((1&lt;&lt;WDP3) | (0&lt;&lt;WDP2) | (0&lt;&lt;WDP1) | (1&lt;&lt;WDP0) | (1&lt;&lt;WDIE)) &amp; ~(1&lt;&lt;WDE);<\/p>\n<p>  \/\/ Rehabilitamos las interrupciones.<br \/>\n  sei(); \/\/ SREG |= B10000000;<br \/>\n}<br \/>\nvoid watchdog_interrupcion_desactivar() {<br \/>\n  \/\/ Deshabilitamos las interrupciones temporalmente para que no se activen mientras editamos las propiedades del watchgdog.<br \/>\n  cli(); \/\/ SREG &amp;= B01111111;<\/p>\n<p>  \/\/ Reiniciamos el reloj del watchdog.<br \/>\n  wdt_reset();<\/p>\n<p>  \/\/ Borramos la bandera que indica el reset del watchdog (para asegurarnos de poder deshabilitar WDTCSR:WDE).<br \/>\n  MCUSR &amp;= ~(1&lt;&lt;WDRF);<\/p>\n<p>  \/\/ Mandamos la orden para activar la posibilidad de cambiar las propiedades del watchdog y borrar el reset del watchdog. Debemos cambiarlas antes de 4 ciclos.<br \/>\n  WDTCSR |= (1&lt;&lt;WDCE) | (1&lt;&lt;WDE);<\/p>\n<p>  \/\/ Deshabilitamos todo el watchdog.<br \/>\n  WDTCSR = B00000000;<\/p>\n<p>  \/\/ Rehabilitamos las interrupciones.<br \/>\n  sei(); \/\/ SREG |= B10000000;<br \/>\n}&lt;\/pre&gt;<br \/>\n[\/php]<\/p>\n<p>Fuente:\u00a0<a href=\"http:\/\/vac2.net\/bitacora\/actualizacion_seguidor.\" target=\"_blank\">http:\/\/vac2.net\/bitacora\/actualizacion_seguidor.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ahora con tiempo he decidido rescatar del caj\u00f3n los arduinos (un diecimila y un mini) que tenia desde hace dos a\u00f1os largos y con los que hab\u00eda trasteado un poco para probar, pero con los que no llegue a hacer nada medianamente interesante.Mini central solar La finalidad de esta central es la de tener una fuente de alimentaci\u00f3n de 5V [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[48,73,58,69],"class_list":["post-7668","post","type-post","status-publish","format-standard","hentry","category-electronica","tag-arduino","tag-autosuficiencia","tag-circuitos-electronicos","tag-electronica"],"_links":{"self":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/7668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7668"}],"version-history":[{"count":4,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/7668\/revisions"}],"predecessor-version":[{"id":7671,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/7668\/revisions\/7671"}],"wp:attachment":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}