sábado, 10 de septiembre de 2016

Crea tu propio arreglo de sensores Pololu QTR XA

Crea tu propio arreglo de sensores Pololu QTR XA  


En este post vamos a aprender a diseñar nuestros propios sensores para robots seguidores de lineas,  velocistas,  robots maze  etc.
Muchos de nosotros  que nos apasiona la robotica de competición, específicamente los que tenga que ver con los del tipo seguidores de lineas, los sensores son la parte esencial del diseño del robot. El 99.9%  de robots de este tipo  utilizan sensores del tipo IR fotorreflexivos activos (infrarojos), el cual consta  de un led emisor IR, el cual emite la luz infrarroja, y el fototransistor NPN que es muy sensible y capta  a las luz IR.

Este sensor lo podemos utilizar  para poder identificar superficies de color blanco o oscuras. Bien sabemos por fisica cuantica que un cuerpo negro absorve la luz y energia, caso contrario con un cuerpo blanco que refleja la luz. Este principio se utiliza poder captar las variaciones de tonos, y bingo! se puede identificar el color negro y blanco.



Ahora que ya sabemos un poco de teoria, lo que sigue es diseñar nuestro arreglo de sensores, para esto necesitamos usar sensores que de este tipo que esten disponibles en el mercado, uno de estos sensores son los "QRE 1113GR de Fairchild Semiconductor". estos sensores son ideales para usarlos en robotica ya que son de tamaño pequeño (SMD) de  buena estabilidad y  calidad, ademas de que las regletas pololu QTR8A usan estos sensores.

Uno de los puntos débiles de las regletas pololu es que solamente dispone a lo maximo de 8 sensores IR, y muchas veces se nos queda corto, ademas de que el tamaño es muy pequeño como para hacer robots mucho mas rapidos y que no se salgan de la linea con facilidad. Otro punto débil también es que la dispocicion de los sensores es de forma recta, y muchas veces lo mas ideal es que sean de forma de media luna.
Si quisiéramos diseña nuestro propio arreglo de sensores, pues nos podemos guiar del diagrama que nos muestra pololu. No es complicado de implementarlo, tan solo consta de resistencias unos cuantos condensadores filtro y un transistor mosfet como un switch que enciende y apaga los leds IR del los sensores 



Yo hice mi propio diseño en proteus, solamente me haria falta el diseño en ares para el pcb y darle una forma ovalada, y listo!! Inclusive puedo hacer uso de mas de 8 sensores y no habria problemas de  seguir usando la libreria. Nota, El transistor mosfet puede ser remplazado por cualquier transistor NPN BJT  siempre y cuando tolere corrientes mayores a 100 ma , por ejemplo el famosos 2n22222a


En un Siguiente post explicare como usar 16 sensores, pero en este caso haciendo uso de un multiplexor analogico.

jueves, 19 de mayo de 2016

Taller "Robot Velocista de Competencia"


Tallere de Robot Velocista de Competencia 


El día sábado 14 de mayo dicte una conferencia acerca de como elaborar un robot velocista de competencias, les comparto la presentación espero sus comentarios amigos roboteros ;)

Materiales:
-Sensores analogicos Qtr8a
-Micrmotores motores pololu HP 30:1
-Driver drv tb6612fng
-Arduino Nano
-Par de brackets
-Call caster plastico pololu
-Baterias de Lipo 7.4 v 500 mA

https://drive.google.com/file/d/0B2Y4LRrUn7QJWFAxM1ZWYkM3Y2c/view?usp=sharing

martes, 26 de abril de 2016

Proyecto Robot Sumo de Competencia


En este proyecto se hace uso de sensores ultrasonidos para que el robot sea capaz de detectar al oponentes, de esta forma podrá atacarlo y sacarlo de la competencia.







miércoles, 2 de marzo de 2016

Robot Velocista QTR8A (Parte I - Materiales)

MATERIALES




Esta sera una serie de post relacionados a la construcción de un robot velocista de competencias basado en los sensores QTR8A. sera una continuacion con la serie de post:
http://aprendiendofacilelectronica.blogspot.pe/2014/12/robot-velocista-de-competencia.html
http://aprendiendofacilelectronica.blogspot.pe/2014/12/robot-velocista-de-competencia_3.html
http://aprendiendofacilelectronica.blogspot.pe/2014/12/robot-velocista-de-competencia_4.html
http://aprendiendofacilelectronica.blogspot.pe/2015/04/modificacion-libreria-qtr-sensors-para.html
http://aprendiendofacilelectronica.blogspot.pe/2015/04/modificacion-libreria-qtr-sensors-para_18.html
en donde  el robot velocista se basaba en los sensores QTR8RC.
La construcción es de forma similar, por lo que ya no entrare en detalles, entonces empezemos!



  1. Modulo de sensores QTR8A

Estos sensores funciona de manera analógica, es decir que dependiendo de lo opaco que sea la superficie obtendremos valores de voltaje, para  obtener estos valores, ya que son 8, sera necesario hacer uso de un microcontrolador  que disponga de 8 pines de entradas analógicas (ADC) , el llamado para serlo es el popular arduino. Adicionalmente de 3 pines , "alimentacion de 5 V", "GND" y "Led on", este ultimo sirve para controlar el encendido y apagado de los sensores. Ademas dispone de estas características:
  • Dimensiones: 749,3 x 12,7 mm (pines sin cabecera instalada)
  • Tensión de funcionamiento: 5,0 V
  • Corriente de alimentación: 100 mA
  • Formato de salida: 8 analogicos
  • Rango de tensión de salida: 0 V a 5V
  • Óptima distancia de detección: 3 mm
  • Alcance máximo recomendado: 6 mm
  • Peso sin pines del cabezal: 3,09 g
Cuando el sensor detecta una superficie negra, la tensión de salida de los sensores aumentara en un rango cercano a los 5 volts, y cuando detecta una superficie blanca, la tensión de salida del los senores sera cercana a los 0 volts. Pololu nos facilita una libreria en arduino con el cual facilita el uso de este arreglo de sensores puedes descargarlo de este link:

    2. Arduino Nano

El infaltable y omnipresente arduino que todo lo puede, amen. En su versión reducida llamada "Nano" sera el cerebro principal que comandara al robot pues su facil y sintaxis de programación y hardware ya montado para su funcionamiento  nos permitira realizarlo en un menor tiempo, ademas de que contamos con un sin numero de librerias y uno de esas es justamente la de los sensores qtr8a. Se pueden usar otro  tipo de microntroladores, siempre y cuando se disponga de las 8 entradas analógicas necesarias para el uso de los sensores.

     5. Micromotores 10:1 HP Pololu (micrometal gear motor)


Estos motores funcionan a 6 V y tienen 3000 rpm de velocidad a ese voltaje, incluyen tmabien una caja de engranajes reductores de 10:1 con el cual obtenemos un torque final de 0.3 Kg-cm, suficientes para hacer correr como un rayo a nuestro robot. Al ser un motor de tipo HP (High Power), el consumo de estos es de 1.6 A en Pico, 120 ma libre sin cargaalguna ,y  con carga consumen alrededor de 500 mA.
Es importante tener en cuenta que si el voltaje del motor es aumentado, corre el riesgo de que se pueda quemar ya que  sus escobillas internas son muy finas, si quieres usar algo mas robusto en cuanto a duracion puedes elegir el de tipo (HPCB), que dispone de escobillas de carbon, la cual garantiza su durabilidad en competiciones. link: https://www.pololu.com/product/999

    4. Driver TB6612FNG


La función del driver de motor es la de suministrar la suficiente energía a los motores  para que entreguen toda su potencia sin ningun inconveniente, la capacidad de entregar corriente es un parametro importante en los drivers, ya que si por ejemplo nuestro micromotor exige una corriente de 1 Amp, y el driver es de solo 500 ma, pues al que le ira mal es al driver, corriendo el riesgo que se queme mas no el motor. en este este post explico mas a profundidad sobre el uso de este driver :http://aprendiendofacilelectronica.blogspot.pe/2016/11/control-de-motores-dc-con-modulo-driver.html

    

    5. Brackets 

Usaremos estos brackets de pololu en su version pequeña, la funcion de los brackets sera la de unir el los micromotores con el chasis del motor.

    6. Ball Caster 3/8 " de plastico  Pololu

 
Usaremos 2 de estas ball caster, que  seran en tercer punto de apoyo del robot, la ventaja de estas ballcaster es que son muy pequeñas y livianas por lo que el robot se puede desplazar con suma facilidad sobre la superficie sin mucho rozamiento.

    7. Bateria de Lipo de 7.4 Volts

Existen variedad de vaterias de lipo como tambien las hay de diversas marcas, lo que nos intereza aca es saber su capacidad de corriente y volaje, para el robot velocista es necesario que el voltaje de la bateria se de 7.4 volts, ya que nuestro motor funciona a ese voltaje, conviene usar una bateria que su capacidad de corriente este alrededor de los 500 mA a 1000 mA, oviamente que la bateria al almacenar mas cargas, es mas costosa y pesada, mucho ojo con esto, ya que no nos conviene que el robot sea muy pesado y que tampoco se agoten rapidamente las baterias.

    7. Llantas de Goma



Este tipo de llanatas no son muy comerciales, y solo las venden en algunas tiendas especializadas, la ventaja de estas llantas con otras convencionales, es que estas estan hechas de caucho liquido silicon, es por ello que presentan un mejor agarre, permitiendo ir  a velocidades mayores sin correr riesgo de derrape. Si deseas este tipo de llantas puedes comunicarte conmigo, (Lima-Provincias) a mi correo electronico. Tambien puedes empezar con las llantas convencionales de pololu como esta https://www.pololu.com/category/41/solarbotics-wheels, 

    8 . PCB Chasis



Si lo que quieres es hacer algo mas profesional y competitivo, pues puedes fabricarte con tu propio diseño y forma este tipo de chasis, en donde es a la misma vez el circuito electrónico donde se montan las partes electrónicas y mecánicas del robot. es importante que la pcb sea de doble cara para que el circuiro sea pequeño y de fibra, para que sea resistente.
Si deseas adquirir este tipo de placas o obtener los planos de diseño puede comunicarte conmigo a mi correo electronico: marko.antonio.1.16.92@gmail.com.
El diseño puede ser realizado en Ares de proteus o eagle ambos software disponen de las herramientas necesarias para el diseño del PCB unir pistas y trabajar en doble capa asi tambien como dar forma a la pcb etc.

   9 . Componentes electronicos varios

  • Switch de encendido apagado
  • Pulsadores
  • resistencias smd de 330 Ohms
  • Leds smd
  • diodo rectificador de 2 Amp
  • Capacitores filtro de 1000uf 
  • Capacitoresfiltro  ceramicos de codigo 104 - 0.1 uf, 103 - 0.01uf
  • Espadines machos.


Consideraciones a tener en cuenta para diseño de robot

Consideraciones para realizar un robot velocista:
  • Tiempo de realización del robot 
  • Disponibilidad de materiales en el mercado local.
  • Importación (caso que no hayan piezas en mercado local).
  • Complejidad del diseño (hardware y software) 
  • Mayor complejidad , mayor tiempo , menor complejidad, menor tiempo 
Consideraciones:
  • Peso
  • Centro de masa
  • Baterias
  • Tamaño
  • Filtrado de ruido
  • Llantas 
Diseño de Placa PCB
  • software Proteus (isis ares) o Eagle
  • Componentes superficiles (smd)
  • Recomendado usar doble capa
  • Peso debe centarce en el eje de  motores, 
  • No debe exeder los 20 x 25cm
  • Reacomendable usar  PCB fibra 
Reglas en competencias 
  • Solo tracción tipo diferencial.
  • Dimensiones máximas de robot: 20 cm ancho x 25 cm de largo.
  • Solo se permite accionamiento manual del robot.
  • Pista de Competencia contendrá 2 colores: blanco y negro.
  • Grosor de la línea de la pista: 2cm máximo.
  • Radio de Curvas Mínimo: 10 Cm
  • La pista generalmente es impresa sobre banner publicitario o sobre tabla de madera melamine.


sábado, 6 de febrero de 2016

Robot controlado por Bluetooth + aplicacion android (apk)


Materiales:

  • Kit motores reductores + llantas (esos chinos amarillos que venden en las tiendas de electrónica).
  • Modulo  driver de motor L298N.
  • Arduino (Uno, Nano, Mega, etc). (recomiendo el  nano por el tamaño reducido)
  • Modulo bluetooth hc05 0 hc06  (solo recibira datos desde el android para manejar el carrito).
  • Cables machos para protoboard ( para unir el circuito en el protoboard).
  • 1 switch, 1 led, 1 resistencia de 1K.
  • Un mini Protoboar. 
  • Ball Caster o rueda loca
  • Tornillos largos (para unir el ball caster o rueda loca al chasis)
  • Baterias de litio, lipo o kit de pilas con voltajes de 7.4v  a 9 v ( mayor a 5 V si no el arduino no  arrancara). 
  • Portapilas AA (si utilizas pilas, compra una que venga de 6 ,  o sino una de 4 y la otra de 2)
  • Celular o tablet android con conectividad bluetooth.
  • El chasis puede ser de acrilico, triplay (darle forma ).

La Forma del Chasis:

Hay que hacer un cuadrado y dentro de el hacer una circunferencia en la plataforma (acrilico, triplay, etc) .
 Luego cortar dos esquinas del cudrado, esto para colocar los motores y las llantas, hacerlo con mucho cuidado de no quebrar.
Los agujeros serviran para colocar tornillos que sujeten alos motores y ball caster o rueda loca.
Las baterias para ahorrar espacio se pueden colocar debajo.


El circuito electrónico:



Programa en Arduino:

En escencia lo que hace el el programa del arduino es recibir un caracter  y adicionalmente una bandera para indicar si es un dato de dirección("d") o de la velocidad("#") y los concatena. De esa manera se podra manejar mejor la comunicación.
Adicionalmente el control del robot tebnra una función para  aumentar o disminuir la velocidad.

////////
#include <SoftwareSerial.h>
#define motor_1_a    7
#define motor_1_r    8
#define motor_2_a    5
#define motor_2_r    6
#define pin_pwm1     9
#define pin_pwm2     10
#define led1         13
#define led2         11
int numero=0;
int direccion=0;
SoftwareSerial bluetooth(2, 3); // RX, TX
String readString="";
void motores(float pwm1,  float pwm2)
{
   int v1, v2;
   if(pwm1 >= 0) //para el motor 1
   {
     digitalWrite(motor_1_a, HIGH);
     digitalWrite(motor_1_r, LOW);
     v1 = pwm1;
   }
   else if(pwm1 < 0)
   {
     digitalWrite(motor_1_a, LOW);
     digitalWrite(motor_1_r, HIGH);
     v1 = pwm1 * (-1);
   }

   //para el motor 2
   if(pwm2 >= 0)
   {
     digitalWrite(motor_2_a, HIGH);
     digitalWrite(motor_2_r, LOW);
     v2 = pwm2;
   }
   else if(pwm2<0)
   {
     digitalWrite(motor_2_a, LOW);
     digitalWrite(motor_2_r, HIGH);
     v2 = pwm2 * (-1);
   }
analogWrite(pin_pwm1, v1);
analogWrite(pin_pwm2, v2);
}

void setup()
{
  delay(500);
  pinMode(led1,  OUTPUT);
  pinMode(led2,  OUTPUT);
  pinMode(motor_1_a,  OUTPUT);
  pinMode(motor_1_r,  OUTPUT);
  pinMode(motor_2_a,  OUTPUT);
  pinMode(motor_2_r,  OUTPUT);
  pinMode(pin_pwm1,  OUTPUT);
  pinMode(pin_pwm2,  OUTPUT);

  digitalWrite(led1,HIGH);
  delay(500);
  digitalWrite(led1,LOW);
  delay(500);
  digitalWrite(led1,HIGH);
  delay(500);
  digitalWrite(led1,LOW);
  delay(500);
  digitalWrite(led1,HIGH);
   delay(500);
   Serial.begin(9600);
 bluetooth.begin(9600);
}

void loop()
{

readString="";
while( bluetooth.available())
  {
    delay(2);
    char c=bluetooth.read();
    if(c=='#')//bandera velocidad
    {
       numero=readString.toInt(); //convierte cadena a entero numero
        numero=numero*2.54;
       Serial.println(numero);
     }
    if(c=='d')//bandera direccion
    {
      direccion=readString.toInt();
      Serial.print("dato direccion ");
       Serial.println(direccion);
    }  
 
    readString+=c; //concatena datos que llegan
  }
        if(direccion==0)   {digitalWrite(led2,LOW); motores(0,0);}
        if(direccion==1)   {digitalWrite(led2,HIGH);motores(numero,numero-5);}
        if(direccion==2)   {digitalWrite(led2,HIGH);motores(-numero,-numero);}
        if(direccion==3)   {digitalWrite(led2,HIGH);motores(0,numero-3);}
        if(direccion==4)   {digitalWrite(led2,HIGH);motores(numero,0);}      
}





Aplicacion Android ".apk":

Lo que hace la aplicación es enviar caracteres numéricos  seguido de una bandera para identificar que tipo de dato es. Si es de dirección (avanzar=1, retroceder=2, izquierda=3, derecha=4) adicionando la bandera "d" que indicara que es justamente de direccion. Si no se preciona nada, entonces enviara "0" (detenido). De esta forma el robot funcionara si solamente es presionado algún boton de direccion.
Ln el slider de velocidad la logica es similar, pero en este caso enviara datos numerico que van desde 0 hasta 255, que justamente es el pwm con el cual variaremos la velocidad en el arduino, seguido de la bandera "#" que justamente identifica que es un dato de direccion.
Todo esos datos son enviados mediante la rutina  call bluetoothClient como se nota en la imagen.

Puedes descargarlo desde aqui : apk carrito bluetooth
clave de cifrado: !H2nwlNrYYt_EaM-xcvGrmQKe1VcPZl8lv_xcqZQKjkI

Imagen de la aplicacion desde dispositivo android:


Nota: antes de presionar los botones, primero hay que conectarse con el modulo bluetooth desde el botón correspondiente, sino dara un mensaje de error.





viernes, 22 de enero de 2016

Variador de velocidad AC con Triac y PIC - Parte II : Programacion, simulacion y pruebas reales


 Programacion, simulacion y pruebas reales


Programación en el  PIC 16f876a


  •   El microcontrolador PIC se  encargara de recibir las señales del circuito de cruce por cero, para esto se hara uso del módulo  de “interrupción por el pin  RB0”  ya que  cada vez que reciba la señal del fototransistor, automáticamente saltara de todo lo que esté haciendo el PIC en ese momento para atender a esa señal y sincronizar el disparo hacia el triac.
  •   Para controlar la velocidad, se hará uso de la “lectura analógica por el pin A0” de un potenciómetro. Ya que la lectura analógica toma algún tiempo para la conversión a digital, no sería viable usarlo en el bucle del programa principal, pues esto retrasaría las demás funciones que realizara el pic . Se optó por hacer una lectura del potenciómetro  usando un temporizado de cada  200 ms, configurando el “Timer 1” del Pic a ese periodo.
  •  El pin que dispara al moc 3020 sera el “Pin Rb7” cuya duración del ancho de pulso será de 200 uS.
  •   Existen 2 leds indicadores: señal del cruce por 0 “Pin Rb1”, Señal de de cruce por 0 dividida entre 60 (0.5 seg) “Pin RB2” 
e
Entradas al pic :
#define   potenciometro        pin_a0  //entrada analogica para control 
#define   cruze_x_cero         pin_b0  //entrada digital para el sincronismo del disparo

Salidas del Pic:
#define   disparo                  pin_b7    //disparo hacia la etapa de potencia
#define   frec_1                    pin_b1    //indicador de cruce por cero 60 hz
#define   frec_2                    pin_b2    //indicador cruce por cero 1 hz

Variables del Pic:
long  delay=7000;
short  bandera1=0;
int      contador=0;

long    adc=0;
Programa en Pic C (CCS C compiler):

#include <16f876a.h>
#device adc = 10
#fuses hs,nowdt,put,nobrownout,nolvp,
#use delay(clock=20M)
#use standard_io(a)
#use standard_io(b)
#use standard_io(c)
#priority  INT_RB   //prioridad interrupcion por rb0

#define potenciometro pin_a0
#define cruze_x_cero  pin_b0
#define frec_1        pin_b1
#define frec_2        pin_b2
#define disparo       pin_b7

long delay=7000;
short bandera1=0;
int contador=0;
long adc=0;

#INT_timer1
void timer1()
{
      adc=read_adc(); //lectura de potenciometro externo para temporizar disparo
      delay_us(20);   //tiempo de conversion adc
      delay=adc*7.7;        //escalamiento hasta maximo periodo  adc 0 a 1024
      //                  //120Hz -> T:8mS = 8333uS max
     set_timer1 (65526);
}
#int_ext
void ext_isr()
{
   bandera1=1;     //si entro pulso, poner en 1 bandera de sincronizacion
   output_toggle(frec_1); //indicador de interrupcion
   //si todo esta correcto frec de interrupcion = 60Hz
   //=>120hz/60=1hz ==>T=0.5seg
   contador++;
   if(contador==60)
   {
       output_toggle(frec_2);
       contador=0;
   }
}

void main()
{
   delay_ms(100);
   output_high(frec_1);
   output_high(frec_2);
   delay_ms(500);
   output_low(frec_1);
   output_low(frec_2);
   delay_ms(500);
 
   enable_interrupts(int_ext);
   ext_int_edge(L_TO_H);

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 8
   enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER1
   set_timer1(65526);//Carga del TMR1 para 20 mhz q 200 ms

   setup_adc_ports(an0);
   setup_adc(adc_clock_internal);
   set_adc_channel(0);
 
   enable_interrupts(GLOBAL);//Habilito interrupciones globales


   while (true)
   {
      if(bandera1==1) //espera bandera de sincronizacion
      {
         delay_us(delay+440);
         output_high(disparo);
         delay_us(200);
         output_low(disparo);
         bandera1=0;
      }
   }  
}


Simulación


Pruebas en físico:


Link de descarga: https://mega.nz/#F!CxVHlLbZ!7-ff8bQFLlMAXJCPWJ0adA
clave de cifrado: !7-ff8bQFLlMAXJCPWJ0adA



Mejoras:
-Es Ovbio que  este proyecto realiza el mismo trabajo que un simple  Dimer analogico. Pero la gran potencialidad que este proyecto presenta no esta en solo controlar velocidad por medio de un potenciometro, si no que al ser diseñado para ser controlado por medio de un   microcontrolador, este es mucho mas inteligente y se pueden programar mas cosas. Puede añadirse sensores  de velocidad, temperatura, etc. Para hacer un control con un algoritmo PID de velocidad, temperatura pero en AC. Este es solo la parte básica,lo demás dependerá de  la imaginacion e ingenio para aplicarlo en algo util.

<< Primera parte del proyecto


Variador de velocidad AC con Triac y PIC - Parte I : Funcionamiento

Funcionamiento






     Resumen
En la electrónica una de las más importantes e interesantes áreas con una amplia difusión hoy día es la automatización y el control no sólo porque en el presente tiene una aplicación en casi todos los campos sino porque permite crear una cantidad ilimitada de modelos al igual que una inmensa variedad de aplicaciones prácticas.
Este Proyecto consiste el diseño de un sistema de control  de velocidad de motores monofásicos para utilizarlos en pequeñas maquinas y motores electricos monofasicos de hasta 2 Hp. Constara  de un micro controlador PIC 16f876a para el  control y sincronismo,  también  de un Triac y optotriac para la parte de potencia.

Descripción de la solución
La solución que plantea este Proyecto es el de diseñar un sistema  electrónico eficaz y a la vez económica que sea capaz de  controlar cargas que funciones con corriente alterna como motores, haciendo uso de uno triacs, que son dispositivos electrónicos semiconductores, que pueden conducir corrientes alternas y además soportar cargas de gran corriente (10A a 20 A) suficientes para controlar un motor AC, El Encargado de controlar al triac será el PIC que sincronizara los pulsos de disparo hacia el triac para asi lograr  controlar el valor  eficaz del voltaje AC que ira hacia la carga (motor), logrando variar la velocidad.  

Materiales del Proyecto
-Pic 16f876a
-Triac bt136-6Amps, bt138-12 Amps, bt139-16Amps. (Puede elegirse cualquiera de ellas)
-Moc 3020
-Opto acoplador 4n25                     
-Módulo Bluetooth hc-05
-Resistencia de 100k 1watt
-Resistencias de 180 Ohms 330 Ohms, 2.2k Ohms, 1K Ohms, 47K Ohms
-Puente diodos
-Potenciómetro 10k Ohms
-Condensador de 0.1 uF 400V (poliester)
-Cristal oscilador de 20Mhz, capacitor de 22pf, 0.1uf y 470 uF
-Pulsadores Switch

Marco Teórico

1.    Triac
El Triac es un dispositivo semiconductor que pertenece a la familia de los dispositivos de control: los tiristores. El triac es en esencia la conexión de dos tiristores en paralelo pero conectados en sentido opuesto y compartiendo la misma compuerta.


 

A1: Anodo 1, A2: Anodo 2, G: Compuerta

El triac  se utiliza en corriente alterna y al igual que el tiristor, se dispara por la compuerta. Como el triac funciona en corriente alterna, habrá una parte de la onda que será positiva y otra negativa.
Al disparar al triac  este conducirá y autosotendra esa conducción hasta que el voltaje caiga hasta cero. Y lo mismo ocurrirá para el semiciclo negativo, hasta que nuevamente caiga el voltaje a cero.

Funcionamiento: 

La parte positiva de la onda (semiciclo positivo) pasará por el triac siempre y cuando haya habido una señal de disparo en la compuerta, de esta manera la corriente circulará de arriba hacia abajo (pasará por el tiristor que apunta hacia abajo), de igual manera:



La parte negativa de la onda (semiciclo negativo) pasará por el triac siempre y cuando haya habido una señal de disparo en la compuerta, de esta manera la corriente circulará de abajo hacia arriba (pasará por el tiristor que apunta hacia arriba)

Para ambos semiciclos la señal de disparo se obtiene de la misma patilla (la puerta o compuerta). Lo interesante es, que se puede controlar el momento de disparo de esta patilla y así, controlar el tiempo que cada tiristor estará en conducción. Recordar que un tiristor sólo conduce cuando ha sido disparada (activada) la compuerta y entre sus terminales hay un voltaje positivo de un valor mínimo para cada tiristor)
Entonces, si se controla el tiempo que cada tiristor está en conducción, se puede controlar la corriente que se entrega a una carga y por consiguiente la potencia que consume.

Video Explicativo 1:


Video Explicativo 2:


           
     Detector Cruce por Cero
Para este proyecto se hará un control totalmente digital de triac haciendo uso de un microcontrolador pic, para lograr esto  debemos tener un circuito de sincronismo para asi poder disparar al triac adecuadamente.
El detector de cruce por cero 'sensa' cuando se produce el cambio de polaridad . el la red eléctrica, como se sabe es una señal senoidal que que cambia de polaridad a razón de 60 ciclos por segundo
El Gran inconveniente que se presenta, es que el pic solo puede funcionar con voltajes de una sola polaridad. Es por esta razón que el circuito detector de cruce por cero contendrá un rectificador de onda completa, por lo que de esta menera podrá obtenerse solamente ciclso positivos, pero para proteger al  pic de la red eléctrica , se hara uso de un optoacoplador






Etapa de Potencia
La  etapa de Potencia esta conformada por un optotriac moc 3020 y el Triac
Además consta  de un circuito RC para proteger los auto disparos hacia el triac que pueden generar las cargas inductivas
El bt13x puede autosostenerse con un pulso que se envía desde el  pic, que tendrá la duración de 200us, la corriente necesaria para el auto sostenimiento del triac es de aproximadamente 100mA, la cual la suministra el moc.



Para manejar Cargas de mas Potencia, solamente se tendrá que cambiar por un triac de mas  corriente, y un moc  que pueda disparar al gate con la adecuada corriente.


       Circuito Completo



Segunda Parte del Proyecto:
Variador de velocidad AC con Triac y PIC (Parte II) : Programacion, simulacion y pruebas en fisico
s

domingo, 19 de abril de 2015

MODIFICACION LIBRERIA "QTR SENSORS" PARA MEJOR SENSADO - Parte II

Modificacion de código del Robot Velocista (Mejorado para cualquier pista de competencia)



Para esta ocasión  vamos a modificar el algoritmo de un velocista para que funcione en cualquier linea, pista, terreno, etc.  Ya que hemos visto en el post anterior la utilizacion de la libreria que modifique para los sensores qtr y si  llegaron a probarlos, supongo que ya habrán sacado sus propias conclusiones acerca de como afectan los valores de los parámetros que agregue a la función. Entonces ahora si estamos listos para lo bueno!

En este post esplique el funcionamiento de un "algoritmo pid para un robot velocista", y ademas puese un ejemplo de la utilizacion del programa de un velocista de competencia:
Robot Velocista de competencia: Algoritmo Pid - Programacion Robot velocista

Con las modificaciones respectivas el velocista esta listo para competir en cualquier pista y ya nunca mas tendremos el problema de que no sense bien el robot, este codio es robusto  y  lo he probado con el robot en anbientes donde hay mucha luz de sol , y  el robot anda de maravilla, claro nunca esta de mas tratar de cubrir los sensores para que la interferencia de la luz no afecte.

El codigo final es este:


#include <QTRSensors.h>
/////////////////////////////////////////////////////////////////////////////////////
//*************  Programa realizado por MARKO A. CABALLERO MORENO***************   //
// Solo para fines educativos   //
//   robot velocista mini FK BOT  V 2.0                                            //
// micro motores pololu MP 10:1, sensores qtr 8rc, driver drv8833, arduino nano    //
//                                                      
// ACTUALIZADO 22/4/2015          //  
/////////////////////////////////////////////////////////////////////////////////////

#define NUM_SENSORS   8  //numero de sensores usados
#define TIMEOUT       2500  // tiempo de espera para dar resultado en uS
#define EMITTER_PIN   6    //pin led on
///////////////pines arduino a utilizar/////////////////////
#define led1          13 
#define led2          4  
#define mot_i         7
#define mot_d         8
#define sensores      6
#define boton_1       2  //pin para boton
#define pin_pwm_i     9
#define pin_pwm_d     10

QTRSensorsRC qtrrc((unsigned char[]) {19, 18, 17, 16,15,14,11,12}
,NUM_SENSORS, TIMEOUT, EMITTER_PIN);

//variables para almacenar valores de sensores y posicion
unsigned int sensorValues[NUM_SENSORS];
unsigned int position=0;

/// variables para el pid
int  derivativo=0, proporcional=0, integral=0; //parametros
int  salida_pwm=0, proporcional_pasado=0;


//_______AQUI CAMBIEREMOS LOS PARAMETROS DE NUESTRO ROBOT_________________
int velocidad=70; //variable para la velocidad, el maximo es 255
float Kp=0.18;
float Kd=2;
float Ki=0.01;  //constantes
//variables para el control del sensado
int linea=0;                //  0 para lineas negra, 1 para lineas blancas
int flanco_color =0;      // aumenta o disminuye el valor del sensado
int en_linea=500;         //valor al que considerara si el sensor esta en linea o no
int ruido=  50;          //valor al cual el valor del sensor es considerado como ruido
//________________________________________________________________________________

void setup()
{
  delay(800);
 pinMode(mot_i, OUTPUT);//pin de direccion motor izquierdo
 pinMode(mot_d, OUTPUT);//pin de direccion motor derecho
 pinMode(led1, OUTPUT); //led1
 pinMode(led2, OUTPUT); //led2
        pinMode(boton_1, INPUT); //boton 1 como pull up
        
        for (int i = 0; i < 50; i++)  //calibracion durante 2.5 segundos,
 {                                 //para calibrar es necesario colocar los sensores sobre la superficie negra y luego 
  digitalWrite(led1, HIGH);  //la blanca
                delay(20);
  qtrrc.calibrate();    //funcion para calibrar sensores   
  digitalWrite(led1, LOW);  
                delay(20);
 }
        digitalWrite(led1, LOW); //apagar sensores para indicar fin 
                                  //de calibracion 
        delay(400); 
        digitalWrite(led2,HIGH); //encender led 2 para indicar la
                                 // espera  de pulsacion de boton
       
        while(true)
        {
          int x=digitalRead(boton_1); //leemos y guardamos el valor
                                      // del boton en variable x
                                      delay(100);
          if(x==0) //si se presiona boton 
          {
             digitalWrite(led2,LOW); //indicamos que se presiono boton
             digitalWrite(led1,HIGH); //encendiendo led 1
             delay(100);
             break; //saltamos hacia el bucle principal
          }
        }
}       



void loop()
{

                    
  pid(linea, velocidad, Kp, Ki, Kd, flanco_color, en_linea, ruido); //funcion para algoritmo pid(modificado )
    //(tipo_linea,velocidad,kp,ki,kd,flanco_color,en_linea,ruido)

         
  frenos_contorno(linea,700); //funcion para frenado en curvas tipo 
                  //flanco de comparación va desde 0 hasta 1000 , esto para ver 
                 //si esta en negro o blanco
}


////////funciones para el control del robot////

//aqui esta modificado la funcion del pid para que reciba los nuevos parametros  para la libreria modificada
 void pid(int linea, int velocidad, float Kp, float Ki, float Kd,int flanco_color, int en_linea,int ruido)
{
  position = qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, linea,flanco_color, en_linea, ruido ); //0 para linea 
                                                //negra, 1 para linea blanca
  proporcional = (position) - 3500; // set point es 3500, asi obtenemos el error
  integral=integral + proporcional_pasado; //obteniendo integral
  derivativo = (proporcional - proporcional_pasado); //obteniedo el derivativo
  if (integral>1000) integral=1000; //limitamos la integral para no causar problemas
  if (integral<-1000) integral=-1000;
  salida_pwm =( proporcional * Kp ) + ( derivativo * Kd )+(integral*Ki);
  
  if (  salida_pwm > velocidad )  salida_pwm = velocidad; //limitamos la salida de pwm
  if ( salida_pwm < -velocidad )  salida_pwm = -velocidad;
  
  if (salida_pwm < 0)
 {
  motores(velocidad+salida_pwm, velocidad);
 }
 if (salida_pwm >0)
 {
  motores(velocidad, velocidad-salida_pwm);
 }

 proporcional_pasado = proporcional;  
}

void motores(int motor_izq, int motor_der)
{
  
  if ( motor_izq >= 0 )  //motor izquierdo
 {
  digitalWrite(mot_i,HIGH); // con high avanza
  analogWrite(pin_pwm_i,255-motor_izq); //se controla de manera
                                                 //inversa para mayor control
 }
 else
 {
  digitalWrite(mot_i,LOW); //con low retrocede
  motor_izq = motor_izq*(-1); //cambio de signo
  analogWrite(pin_pwm_i,motor_izq); 
 }


  if ( motor_der >= 0 ) //motor derecho
 {
  digitalWrite(mot_d,HIGH);
  analogWrite(pin_pwm_d,255-motor_der);
 }
 else
 {
  digitalWrite(mot_d,LOW);
  motor_der= motor_der*(-1);
  analogWrite(pin_pwm_d,motor_der);
 }

  
}

void frenos_contorno(int tipo,int flanco_comparacion)
{
  
if(tipo==0)
{
  if (position<=500) //si se salio por la parte derecha de la linea
 {
  motores(-80,90); //debido a la inercia, el motor 
                                  //tendera a seguri girando
                                  //por eso le damos para atras , para que frene
                                 // lo mas rapido posible 
  while(true)  
  {
   qtrrc.read(sensorValues); //lectura en bruto de sensor   
if ( sensorValues[0]>flanco_comparacion || sensorValues[1]>flanco_comparacion ) 
//asegurar que esta en linea
   {
    break;
   } 
  }
 }

 if (position>=6500) //si se salio por la parte izquierda de la linea
 { 
  motores(90,-80);
  while(true)
  {
   qtrrc.read(sensorValues);
if (sensorValues[7]>flanco_comparacion || sensorValues[6]>flanco_comparacion )
   {
    break;
   }  
  }
 }
}

//*******
if(tipo==1) //para linea blanca con fondo negro
{
  if (position<=500) //si se salio por la parte derecha de la linea
 {
  motores(-80,90); //debido a la inercia, el motor 
                                  //tendera a seguri girando
                                  //por eso le damos para atras , 
                                  //para que frene lo mas rapido posible 
  while(true)  
  {
   qtrrc.read(sensorValues); //lectura en bruto de sensor
if ( sensorValues[0]<flanco_comparacion || sensorValues[1]<flanco_comparacion )
//asegurar que esta en linea
   {
    break;
   }
   
  }
 }

 if (position>=6500) //si se salio por la parte izquierda de la linea
 { 
  motores(90,-80);
  while(true)
  {
   qtrrc.read(sensorValues);
  if (sensorValues[7]<flanco_comparacion || sensorValues[6]<flanco_comparacion)
   {
    break;
   }  
  }
 }
}

}



viernes, 3 de abril de 2015

MODIFICACION LIBRERIA "QTR SENSORS" PARA MEJOR SENSADO - Parte I

Modificacion de librería"QTR SENSORS" para un mejor sensado

En este post  voy a presentar algunas de las modificaciones que hice al a librería "QTRSensors" para  el uso con los sensores "qtr 8rc" y "qtr 8a"  para lecturas en  linea blanca. 


En la libreria  QTRSensors se tiene la opcion de cambiar el tipo de linea que queramos sensar, cambiando desde la funcion de lectura de linea o mejor dicho:
qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, 0);

En las indicaciones nos dice que si queremos sensar lineas blancas, entonces debemos colocar en el ultimo parámetro de la funcion un "1" en ves del 0 que esta por defecto para las  lineas negras. 

Hasta aqui todo esta bien, pues solo hay que cambiar un parametro y listo, deberia funcionar bien para lineas blancas. Pero aqui viene  lo  frustrante del caso, o almenos ocurrió en el mio:

Yo utilizaba los sensores "qtr-8rc" en un robot velocista que debia competir para  una pista  que estaba impresa  en un baner que tenia lineas blancas y el fondo era negro, y me di con la sorpresa que el robot no seguía las lineas. tras varios test que hacia al robot y cuestionamientos, chekar infinidad de veces la programación , no llegaba a ver cual era la razón por la que no funcionaba bien el robot. 
Me puse  a indagar en internet y foros acerca del tema pero, nadie daba con la respuesta, Asi que me llene de valor y  decidí a  resolver este misterio.  Busque los datasheets de cada componente, estudie  a profundidad el esquema electronico del arreglo de los sensores, y no encontre  nada de malo, por lo que la unica solucion podria hallarse en el algoritmo de sensado de la libreria, asique no me quedo de otra que tratar de entender a la libria QTRsensors  para buscar la solucion.
Pues, asi fue, le dedique su  tiempo a eso y logre entender el funcionamiento de la libreria y puedo decir  que encontre la solucion :D.  Ahora les explicare:


MODIFICACION DE LA FUNCION DE LECTURA DE LINEA
Puedes descargar la libreria modificada:" https://mega.nz/#!CkMkiZhA!FMK4eJQVmOGZK9GZzfqSKRgEPOijTSkMmbNDUwbf5C0"

La instalacion es como cualquier otra libreria convencional de arduino, por lo que eso pasos los ignorare, o sino puedes guiarte del post donde hablo de eso : Utilizando la libreria QTR SENSORS


Como veran ahora en la modificacion que hice aparecen  3 nuevos parámetros: flanco_color, en_linea, ruido.

         qtrrc.readLine(sensorValues, QTR_EMITTERS_ON, 1, flanco_color, en_linea, ruido);

flanco_color: Este parametro sirve para aumentar  o disminuir valores de lectura. Como sabemos cada  sensor lee valores desde 0 ( mínima reflactancia) hasta 1000 (maxima reflactancia). pero    segun los testeos que hice, no se llega a obtener un valor adecuado, por eso  cree una variable que aumentara o disminuyera esos valores forzosamente para asi obtener valores decentes que sean medibles. el valor por defecto es 0

en_linea: Con este parámetro podemos variar la forma en que la libreria  tomara los valores de los sensores y los considerara "si esta o no en una linea", luego la libreria tomara los valores de cada sensor y los  promediara para asi obtener un valor de posicion con respecto a esa linea. su valor por defecto es de 200.

ruido: Con este parametro se podra variar  desde que valores  de reflactancia es  considerados como ruido, el valor por defecto es de 50.


EN ACCION!

Unos valores que probe en linea blanca  que funcionan, y podria decir que hasta mejor que antes,  son estos :

             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 0 , 400 , 30);
             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 500 , 400 , 50);
             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 500 , 500 , 50);
             position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 1 , 300 , 500 , 100);

Valores para linea negra:
 position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 0 , 0 , 400 , 30);
position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 0 , 0 , 300 , 50);
position = qtrrc.readLine(sensorValues,QTR_EMITTERS_ON, 0 , -200 , 200 , 100);

pueden  probar con estos  valores, y  ver que tal les va. Cada valor dependera del tipo de superficie, por lo que los resultados variaran, asi que si no te resulta estos valores trata de buscar tus valores adecuados testeando los con el ejemplo y te sacas la duda de como funcionan en verdad cada paramtro ;) :

Nota: esta modificacion es valida tambien para sensores QTRA (todavia no he  probado en estos sensores , pero en teoria deberian funcionar, si lo pruban porfavor aganmelo saber si les funciono o no  para seguir mejorandolo :D). Si lo quieres utilizar para estos sensores solo debes  escoger el ejemplo que dice QTRAExample y cambia lo mismo como lo indicado arriba.


viernes, 26 de diciembre de 2014

Bootloader usb para Microcontroladores PIC 18f2550, 18f4550

Bootoader usb para uC 18f2550 y  18f4550



Un bootloader es un programa que reside dentro de la memoria del microcontrolador en el cual nos permitira reprogramar el microcontrolador sin necesidad de utilizar un grabador externo. 
Para esto, es necesario programar el microcontrolador por los medios convencionales ( utilizando un programador externo),  cargandole el hexagesimal del bootloader.
Una  ves hecho esto, nuestro microcontrolador esta listo para ser utilizado si necesidad  de utilizar un programador externo. 
Pero antes de todo esto se preguntaran. Como cargo entonces mis programas al microcontrolador?
Pues es necesario utilizar un medio como comunicacion con el pc, y  nuestro microcontrolador cuenta con ese medio, que es el USB.  
El bootloader ya esta esta programado  para trabajar con ese modulo USB de nuestro PIC,  lo unico que nos quedaria es realizar nuestro circuito para  que nuestro microcontrolador pueda funcionar correctamente


 

En la imagen se puede apreciar que existen 2 botones, 1 que es para el reset y el otro para el entrar al modo bootloader.Para entrar al modo bootloader, es necesario reiniciar el microcontrolador y seguidamente presionar el boton "boot mode" hecho esto, el microcontrolador esta listo para ser programado.

Como la arquitectura del pic 18f4550 es igual al del 18f2550, salvo que el 18f4550 tiene mas pines, este bootloader es funcional para estos 2 tipos de microcontroladores.
La ventaja de este bootloader, es que se puede integrar  con el CCS C compiler, de esta manera se nos hara mucho mas facil la carga de nuestros programas.



Dejo el link de Descarga con los archivos y las instrucciones de instalacion, Saludos!!