{"id":9302,"date":"2013-09-09T00:17:12","date_gmt":"2013-09-08T22:17:12","guid":{"rendered":"http:\/\/www.pesadillo.com\/pesadillo\/?p=9302"},"modified":"2013-09-11T15:42:01","modified_gmt":"2013-09-11T13:42:01","slug":"control-de-8-servos-con-pic","status":"publish","type":"post","link":"https:\/\/www.pesadillo.com\/pesadillo\/?p=9302","title":{"rendered":"Control de 8 servos con PIC"},"content":{"rendered":"<p>Este proyecto consiste en el control de 8 servos por el puerto c del pic.<\/p>\n<p>Puedes ver un art\u00edculo del control de 4 servos en:\u00a0<a href=\"http:\/\/www.pesadillo.com\/pesadillo\/?p=9309\" target=\"_blank\">http:\/\/www.pesadillo.com\/pesadillo\/?p=9309<\/a><\/p>\n<p>En la interacci\u00f3n para el control de los servos se emplea un teclado num\u00e9rico y un lcd, ambos controlados por el puero b del PIC.<\/p>\n<p><a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/Esquema+control+8+servos+con+pic1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9303\" alt=\"Esquema+control+8+servos+con+pic[1]\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/Esquema+control+8+servos+con+pic1.png\" width=\"400\" height=\"266\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/Esquema+control+8+servos+con+pic1.png 400w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/Esquema+control+8+servos+con+pic1-300x199.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<div>En su funcionamiento, el pic pide introducir el n\u00famero del servo a controlar. Posteriormente solicita el \u00e1ngulo de orientaci\u00f3n deseado para ese servo ( de 0\u00ba a 180\u00ba). El valor se acepta con la tecla \u201c*\u201d\u009d y el programa vuelve a mostrar un mensaje de presentaci\u00f3n para un nuevo control. Si el \u00e1ngulo introducido es superior a 180\u00ba, el pic toma por defecto 180\u00ba.<\/div>\n<div><\/div>\n<div>Para la generaci\u00f3n de las se\u00f1ales moduladas de control de los servos (<strong>bit_pwmx<\/strong>), se emplea la subrutina de interrupci\u00f3n por rebose del timer 0. La orientaci\u00f3n de cada servo se establece con el valor que se carga en la variable\u00a0<b>pwmx<\/b>, donde x es el n\u00famero de servo correspondiente. Con cada llamada a la subrutina de generaci\u00f3n de la se\u00f1al por mediaci\u00f3n de la interrupci\u00f3n del timer 0, se incrementa la variable\u00a0<b>control_pwm\u00a0<\/b>que comparandose con el valor en\u00a0<b>pwmx<\/b>, decide si debe o no cortar alguno de los pulsos de modulaci\u00f3n de los servos.<\/div>\n<div>\n<div>\n<p>control_pwm++;<\/p>\n<p>if (control_pwm==0) bit_pwm0=1;<br \/>\nif (control_pwm==pwm0) bit_pwm0=0;<\/p>\n<\/div>\n<\/div>\n<div>Cuando la variable\u00a0<b>control_pwm<\/b>, incrementandose en cada rebose del timer0, llega a su m\u00e1ximo valor y pasa a ser 0, todas las se\u00f1ales moduladas comienzan un nuevo ciclo.<\/div>\n<div><\/div>\n<div><a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/servo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9305\" alt=\"servo\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/servo.png\" width=\"640\" height=\"263\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/servo.png 640w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2013\/09\/servo-300x123.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/div>\n<div>Para interpretar los valores num\u00e9ricos de varias cifras a partir de n\u00fameros simples introducidos por teclado, primero espera a que se pulse una tecla<\/p>\n<div><\/div>\n<div>x=kbd_getc();<\/div>\n<div><\/div>\n<div>el valor obtenido est\u00e1 en codificaci\u00f3n ASCII por lo que habr\u00e1 que pasarlo a su valor num\u00e9rico decimal<\/div>\n<div><\/div>\n<div>\n<div>tecla=x-48;<\/div>\n<\/div>\n<div><\/div>\n<div>si se ha pulsado una tecla se descartan las pulsaciones en # y * puesto que solo se necesitan n\u00fameros<\/div>\n<div><\/div>\n<div>\n<div>if (x!=0&amp;&amp;x!=&#8217;*&#8217;&amp;&amp;x!=&#8217;#&#8217;){<\/div>\n<\/div>\n<div><\/div>\n<div>y conforme se van pulsando n\u00fameros el \u00faltimo pulsado ser\u00e1 las unidades y los anteriores van pasando a decenas y centenas<\/div>\n<div><\/div>\n<div>\n<div>centenas=decenas;<\/div>\n<div>decenas=unidades;<\/div>\n<div>unidades=tecla;<\/div>\n<\/div>\n<div><\/div>\n<div>conforme se van introduciendo n\u00fameros simples se va mostrando el n\u00famero completo por pantalla lcd<\/div>\n<div><\/div>\n<div>\n<div>printf(lcd_putc,\u00bb\\f Angulo = %ld%d%d\\n\u00bb, centenas, decenas, unidades);<\/div>\n<\/div>\n<div><\/div>\n<div>y finalmente se guarda en una \u00fanica variable el n\u00famero completo resultante de todos los n\u00fameros simples<\/div>\n<div><\/div>\n<div>\n<div>angulo=(centenas*100)+(decenas*10)+unidades;<\/div>\n<\/div>\n<div style=\"text-align: -webkit-auto;\" align=\"justify\"><\/div>\n<\/div>\n<div>Codigo fuente:<\/div>\n<div>[php]<\/p>\n<p>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br \/>\n\/\/                                                                            \/\/<br \/>\n\/\/                    CONTROL DE 8 SERVOS CON PIC                             \/\/<br \/>\n\/\/                                                                            \/\/<br \/>\n\/\/                         (c) RobotyPic                                      \/\/<br \/>\n\/\/                                                                            \/\/<br \/>\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/p>\n<p>#include &lt;16f876a.h&gt;                   \/\/archivo para control del pic 16f876a<br \/>\n#fuses XT,NOWDT,NOPROTECT,NOLVP        \/\/protecciones<\/p>\n<p>#use delay(clock=4000000)              \/\/frecuencia de reloj 4 MHz<br \/>\n#byte trisb=0x86<br \/>\n#byte portb=0x06<br \/>\n#byte trisc=0x87<br \/>\n#byte portc=0x07<\/p>\n<p>#define use_portb_lcd TRUE             \/\/Configuraci\u00f3n puerto b control lcd<br \/>\n#define use_portb_kbd TRUE             \/\/Configuraci\u00f3n puerto b control teclado<br \/>\n#include &lt;lcd.c&gt;                       \/\/archivo para control del lcd<br \/>\n#include &lt;kbd.c&gt;                       \/\/archivo para control del teclado<\/p>\n<p>#bit  Bit_PWM0 =  PORTC.0              \/\/Bit 0 puerto C Salida modulaci\u00f3n 0<br \/>\n#bit  Bit_PWM1 =  PORTC.1              \/\/Bit 1 puerto C Salida modulaci\u00f3n 1<br \/>\n#bit  Bit_PWM2 =  PORTC.2              \/\/Bit 2 puerto C Salida modulaci\u00f3n 2<br \/>\n#bit  Bit_PWM3 =  PORTC.3              \/\/Bit 3 puerto C Salida modulaci\u00f3n 3<br \/>\n#bit  Bit_PWM4 =  PORTC.4              \/\/Bit 4 puerto C Salida modulaci\u00f3n 4<br \/>\n#bit  Bit_PWM5 =  PORTC.5              \/\/Bit 5 puerto C Salida modulaci\u00f3n 5<br \/>\n#bit  Bit_PWM6 =  PORTC.6              \/\/Bit 6 puerto C Salida modulaci\u00f3n 6<br \/>\n#bit  Bit_PWM7 =  PORTC.7              \/\/Bit 7 puerto C Salida modulaci\u00f3n 7<\/p>\n<p>\/********************** Prototipos de las funciones ***************************\/<\/p>\n<p>void main (void);             \/\/funci\u00f3n principal<br \/>\nvoid generacion_pwm (void);   \/\/genera se\u00f1ales moduladas para control de servos<br \/>\nvoid presentacion (void);     \/\/mensaje de presentaci\u00f3n<\/p>\n<p>\/********************** Variables para generaci\u00f3n PWM *************************\/<\/p>\n<p>int8 PWM0=0,PWM1=0,PWM2=0,PWM3=0,PWM4=0,PWM5=0,PWM6=0,PWM7=0; \/\/Valores de las se\u00f1ales PWM<br \/>\nint8 control_PWM=0;<\/p>\n<p>\/******************************************************************************\/<br \/>\n\/******************* FUNCI\u00d3N GENERACI\u00d3N MODULACIONES PWM **********************\/<\/p>\n<p>#int_Timer0<\/p>\n<p>void generacion_pwm(){<\/p>\n<p>   control_PWM++;                \/\/Incremento cada rebose del timer0<\/p>\n<p>   if (control_PWM==0){          \/\/inicio del ciclo con todos los pulsos pwm a 1<br \/>\n      Bit_PWM0=1;<br \/>\n      Bit_PWM1=1;<br \/>\n      Bit_PWM2=1;<br \/>\n      Bit_PWM3=1;<br \/>\n      Bit_PWM4=1;<br \/>\n      Bit_PWM5=1;<br \/>\n      Bit_PWM6=1;<br \/>\n      Bit_PWM7=1;<br \/>\n   }<br \/>\n   \/\/Finalizar\u00e1 el pulso de modulaci\u00f3n seg\u00fan el valor del correspondiente pwm<br \/>\n   if (control_PWM==PWM0) Bit_PWM0=0;<br \/>\n   if (control_PWM==PWM1) Bit_PWM1=0;<br \/>\n   if (control_PWM==PWM2) Bit_PWM2=0;<br \/>\n   if (control_PWM==PWM3) Bit_PWM3=0;<br \/>\n   if (control_PWM==PWM4) Bit_PWM4=0;<br \/>\n   if (control_PWM==PWM5) Bit_PWM5=0;<br \/>\n   if (control_PWM==PWM6) Bit_PWM6=0;<br \/>\n   if (control_PWM==PWM7) Bit_PWM7=0;<\/p>\n<p>   set_timer0(255);                    \/\/Carga del contador<br \/>\n}<\/p>\n<p>\/******************************************************************************\/<br \/>\n\/************************* PRESENTACI\u00d3N LCD ***********************************\/<\/p>\n<p>void presentacion (){<br \/>\n   lcd_putc(&quot;\\f   Introduce   \\n&quot;);<br \/>\n   lcd_putc(&quot; num. de servo &quot;);<br \/>\n}<\/p>\n<p>\/******************************************************************************\/<br \/>\n\/******************** FUNCI\u00d3N PRINCIPAL ***************************************\/<\/p>\n<p>void main(){<\/p>\n<p>   int x;                        \/\/Valor ASCII de la tecla pulsada<br \/>\n   int tecla;                    \/\/Valor num\u00e9rico de la tecla pulsada<br \/>\n   int servo;                    \/\/N\u00famero de servo<br \/>\n   int16 angulo;                 \/\/\u00c3\u0081ngulo del servo<br \/>\n   int16 centenas;               \/\/variable para las centenas del \u00e1ngulo<br \/>\n   int decenas,unidades;         \/\/Variable para las decenas y unidades del \u00e1ngulo<br \/>\n   int pwm;                      \/\/valor de la modulaci\u00f3n por teclado<\/p>\n<p>   trisc=0x00;                   \/\/Puerto C como salida de datos<\/p>\n<p>   pwm0=7;                      \/\/Impulso de 0,8 msg de pwm0 posici\u00f3n 0\u00ba<br \/>\n   pwm1=7;                      \/\/Impulso de 0,8 msg de pwm1 posici\u00f3n 0\u00ba<br \/>\n   pwm2=7;                      \/\/Impulso de 0,8 msg de pwm2 posici\u00f3n 0\u00ba<br \/>\n   pwm3=7;                      \/\/Impulso de 0,8 msg de pwm3 posici\u00f3n 0\u00ba<br \/>\n   pwm4=7;                      \/\/Impulso de 0,8 msg de pwm4 posici\u00f3n 0\u00ba<br \/>\n   pwm5=7;                      \/\/Impulso de 0,8 msg de pwm5 posici\u00f3n 0\u00ba<br \/>\n   pwm6=7;                      \/\/Impulso de 0,8 msg de pwm6 posici\u00f3n 0\u00ba<br \/>\n   pwm7=7;                      \/\/Impulso de 0,8 msg de pwm7 posici\u00f3n 0\u00ba<\/p>\n<p>   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);         \/\/Configuraci\u00f3n interrupci\u00f3n generaci\u00f3n PWM<br \/>\n   enable_interrupts(INT_TIMER0);    \/\/Habilitaci\u00f3n interrupci\u00f3n generaci\u00f3n pwm<br \/>\n   enable_interrupts(GLOBAL);        \/\/Habilitaci\u00f3n de las interrupciones<\/p>\n<p>   port_b_pullups(TRUE);   \/\/Habilitaci\u00f3n resistencias pullups puerto b<br \/>\n   lcd_init();             \/\/Inicializaci\u00f3n del lcd<br \/>\n   kbd_init();             \/\/Inicializaci\u00f3n del teclado<\/p>\n<p>   presentacion ();        \/\/Muestra mensaje de inicio en lcd<\/p>\n<p>   while (true){<\/p>\n<p>      x=kbd_getc();                    \/\/En &quot;x&quot; valor ASCII de la tecla pulsada<br \/>\n      if (x!=0&amp;&amp;x!=&#8217;9&#8217;&amp;&amp;x!=&#8217;8&#8217;&amp;&amp;x!=&#8217;*&#8217;&amp;&amp;x!=&#8217;#&#8217;){ \/\/Si se pulsa tecla num\u00e9rica 0 a 7 &#8230;<br \/>\n         servo=x-48;            \/\/Valor ASCII se pasa a valor numerico de servo<br \/>\n         printf(lcd_putc,&quot;\\fServo = %d\\n&quot;, servo); \/\/&#8230;muestra el valor pulsado<br \/>\n         lcd_putc(&quot;Introduce angulo&quot;);<\/p>\n<p>         while (x!=&#8217;*&#8217;){            \/\/Espera a introducir \u00e1ngulo y aceptar con *<br \/>\n            x=kbd_getc();<br \/>\n            tecla=x-48;<br \/>\n            if (x!=0&amp;&amp;x!=&#8217;*&#8217;&amp;&amp;x!=&#8217;#&#8217;){    \/\/Solo se toman los valores num\u00e9ricos<br \/>\n               \/\/A cada tecla pulsada se desplaza posici\u00f3n decimal y se muestra<br \/>\n               centenas=decenas;<br \/>\n               decenas=unidades;<br \/>\n               unidades=tecla;<br \/>\n               printf(lcd_putc,&quot;\\f Angulo = %ld%d%d\\n&quot;, centenas, decenas, unidades);<br \/>\n               lcd_putc(&quot; * para aceptar&quot;);<br \/>\n            }<br \/>\n         }<\/p>\n<p>       angulo=(centenas*100)+(decenas*10)+unidades;<br \/>\n       if (angulo&gt;180) angulo=180;    \/\/No acepta valores &gt;180\u00ba<br \/>\n       pwm=(angulo\/13)+7;             \/\/Ajuste modulaci\u00f3n en funci\u00f3n del valor introducido<br \/>\n       centenas=decenas=unidades=0;<\/p>\n<p>       \/\/Seg\u00fan n\u00famero de servo introducido se le aplica el \u00e1ngulo elegido<br \/>\n       switch(servo){<br \/>\n       case 0: pwm0=pwm; break;<br \/>\n       case 1: pwm1=pwm; break;<br \/>\n       case 2: pwm2=pwm; break;<br \/>\n       case 3: pwm3=pwm; break;<br \/>\n       case 4: pwm4=pwm; break;<br \/>\n       case 5: pwm5=pwm; break;<br \/>\n       case 6: pwm6=pwm; break;<br \/>\n       case 7: pwm7=pwm; break;<br \/>\n       }<br \/>\n       printf(lcd_putc,&quot;\\fServo  %d\\n&quot;, servo);<br \/>\n       printf(lcd_putc,&quot; Angulo  %ld&quot;, angulo);<br \/>\n       delay_ms(200);<br \/>\n       presentacion();<br \/>\n      }<br \/>\n   }<br \/>\n}<\/p>\n<p>[\/php]<\/p>\n<\/div>\n<div>Ficheros:\u00a0<a href=\"http:\/\/dfiles.eu\/files\/5wb4slfmx\" target=\"_blank\">http:\/\/dfiles.eu\/files\/5wb4slfmx<\/a><\/div>\n<div><\/div>\n<div>Fuente:\u00a0<a href=\"http:\/\/robotypic.blogspot.com.es\/2010\/11\/control-de-8-servos-con-pic-16f876a_13.html\" target=\"_blank\">http:\/\/robotypic.blogspot.com.es\/2010\/11\/control-de-8-servos-con-pic-16f876a_13.html<\/a><\/div>\n<div><\/div>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Este proyecto consiste en el control de 8 servos por el puerto c del pic. Puedes ver un art\u00edculo del control de 4 servos en:\u00a0http:\/\/www.pesadillo.com\/pesadillo\/?p=9309 En la interacci\u00f3n para el control de los servos se emplea un teclado num\u00e9rico y un lcd, ambos controlados por el puero b del PIC. En su funcionamiento, el pic pide introducir el n\u00famero del [&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":[58,69],"class_list":["post-9302","post","type-post","status-publish","format-standard","hentry","category-electronica","tag-circuitos-electronicos","tag-electronica"],"_links":{"self":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/9302","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=9302"}],"version-history":[{"count":5,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/9302\/revisions"}],"predecessor-version":[{"id":9314,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/9302\/revisions\/9314"}],"wp:attachment":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}