AS BATERÍAS

Unha das partes fundamentais de todo sistema autónomo, é a fonte de alimentación. Neste caso a importancia multiplícase, xa que ao tratarse dun robot de pequeno tamaño, a fonte de alimentación (baterías en este caso) non pode ser moi voluminosa nin pesada e ter que suministrar o nivel de tensión e corrente adecuados para os compoñentes do robot, durante o maior tempo posible, que será igual ao tempo da autonomía do robot.

Moitos robots de características similares, empregan 2 baterías, unha para alimentar a lóxica (microcontrolador, sensores, etc) e outro para a potencia (motores) isto o fan así, por que as baterías que empregan, cando hai picos de demanda de corrente (esto ocurre cando o robot está detido contra algo, pero os motores están exercendo a súa máxima forza) non dan un suministro constante, o que proboca que os microcontroladores se reinicien, con todo o que esto conleva (dependendo do programa, perda da ruta, desconexións coas bases transmisoras, descoñecemento das rutinas a realizar, etc.)

O uso de 2 baterías, normalmente pilas alcalinas, incrementa o peso e o volumen do robot, a vez que diminue a súa autonomía.

Este problema foi atacado e solucionado en este robot empregando baterías capaces de ceder maior cantidade de corrente, ata 850 mAh.

En esta páxina explícan moi ben os conceptos relacionados cos distinto tipos de baterías.

As baterías escollidas son as NOKIA BL-5C de 3.7V

CIMG1734

O robot emprega o regulador de tensión LM-7805 polo que precisa unha batería que suministre unha tensión comprendida entre 7 e 25 V.

As baterías NOKIA BL-5C son de tipo Li-ion polo que a tensión suministrada pode variar, en función da carga das mesmas, entre os 4.2 e os 2.3 V. Estas baterías teñen un circuito de protección que corta a corrente ao chegar ao valor de tensión de 2.3V Isto danos a seguridade de a tensión das baterías non pasará po debaixo deste valor (de isto acontecer, a batería podría estropearse).

Como se precisa unha tensión mínima de 7V, únense en serie 3 de estas baterías para así suministrar unha tensión máxima de: 4.2 x 3 = 12.6V e unha tensión mínima de 2.3 * 3 = 6.9V

As baterías constan de 3 pines, 2 de alimentación e 1 de saída de datos, empregado polos teléfonos para coñecer a temperatura, o nivel de carga, etc.

CIMG1736

Para poder empregar estas baterías sóldanse 3 cables a estos 3 pines. Con 3 Baterías, un puñado de cables, conectores e unha goma.

CIMG1739

Obténse unha batería adecuada para o robot:

CIMG1742A conexión serie conséguese conectando:

-bat.1 –> -robot

+bat.1 –> -bat.2

+bat.2 –> -bat.3

+bat.3 –> +robot

E para recargalas pódese empregar o teléfono móbil que as empregaba con pequenas modificacións.

CIMG1750

CIMG1751

CIMG1752

 A ter en conta que a hora de cargalas, hai que separar as 3 baterías e conectalas por separado.

No robot as baterías introdúcense no seu interior e se conectan o positivo (vermello) a dereita e o GND (negro) a esquerda.

CIMG1744

CIMG1749

Se poden empregar outras baterías que cumpran as condición eléctricas do robot, pero escolléronse estas, por que son doadas de atopar e baratas (en internet por 5€).

En moitos lugares fálase do perigo de empregar este tip ode baterías, pero tras as probas, obsérvase que son bastante resistenes. Xa as teño cortocircuitado, posto a cargar durante máis de 12 horas, etc, etc e sen problemas; o que non quere decir que non sexa convinte telas controladas, sobre todo nos momentos de carga das mesmas.

 

 

APLICACIÓN MÓBIL

APP1

Está é unha imaxen da aplicación móbil empregada para controlar o robot.

Accédese a aplicación móbil, pulsando na icona que representa a aplicación no teléfono móbil.

APP22Unha vez dentro, o teléfono está desconectado do robot e por iso todos os botóns de ordes deste están deshabilitados.

app4

Co Bluetooth do teléfono activado prémese no botón Conectar, abrirase unha ventá onde permite elixir entre os dispositivos enlazados vía Bluetooth con anterioridade ao teléfono, e nela seleccionamos a dirección MAC do robot.

app3

Se o robot está acendido e dentro do alcance do teléfono e todo funciona correctamente, a aplicación regresará ventá anterior, pero agora as teclas de ordes do robot, estarán activadas.

app5Dende esta pantalla pode ordenarse ao robot avanzar, retroceder, xirar a esquerda e a dereita, pararse ou trocar a súa velocidade aumentándoa ou diminuíndoa coas teclas (+) e (-). A maiores permite activar a ferramenta Antichoque a cal impide o avance cara adiante do robot se este detecta cos seus sensores de infravermellos dianteiros un obstáculo próximo.

A aplicación avisa da presenza dun obstáculo trocando o texto do botón Adiante por Stop con fondo vermello. Este aviso dáse sempre que estea en modo manual, incluso coa Antichoque desactivada.

app6

Tamén permite a activación do modo Automático.

Pulsando en Preferencias accedese a outra ventá onde mostra a distancia percorrida polo robot en metros dende o inicio da conexión e permite reseteala pulsando en Resetear.

app7

A pantalla de preferencias da o acceso ao modo Sigue_Linea sempre e cando o móbil e o robot estean conectados. Se se selecciona este modo e se preme en Volver, regresamos a primeira ventá onde dos botóns de dirección, unicamente quedan activos os de Adiante e Deter xa que neste modo non se ten control sobre a dirección do robot.

app8

Se na ventá de Preferencias púlsase en Configurar Sigue_linea, péchase esta e regrésase a primeira ventá pero con outra configuración que permite por en marcha ou deter o robot e variar a configuración do regulador que utiliza este para seguir a liña.

app9

A aplicación dispón dun sistema de alerta para a baixada do nivel de carga das baterías do robot. Se a carga ofrecida polo robot descende ata un nivel, considerado perigoso, o robot avisa á aplicación e esta alerta ao usuario trocando a cor do fondo da pantalla a laranxa; así o usuario sabe que se quere seguir funcionando co robot en óptimas condicións, é necesario recargar as baterías, se non, este deixará de responder correctamente, chegando a apagarse.

app10

Para desconectar, saír e pechar a aplicación hai que pulsar en Saír, pois saíndo da aplicación coas teclas do teléfono esta non se pecha e a conexión bluetooth segue activada.

A aplicación está aloxada en GitHub e pode descargarse de forma gratuita.

As instruccións de descarga e instalación da mesma encóntranse no arquivo README do enlace anterior.

Dende o seguinte enlace pódese acceder ao manual_usuario da aplicación.

 

 

INTRODUCCIÓN A MIT APP INVENTOR

Realizouse unha aplicación móbil que permite controlar o robot vía bluetooth. Empregouse o entorno de desenrolo MIT App Inventor. MIT App Inventor é unha ferramenta de deseño de aplicacións de teléfonos Android a cal utiliza o navegador web xunto con un teléfono conectado ou un emulador para realizar os programas. Os servidores de MIT App Inventor almacenan os
traballos realizados o que permite o acceso dende calquera ordenador con acceso a internet.
MIT App Inventor está rexistrado coa licencia MIT a cal é unha licencia libre e ten documentación rexistrada baixo a Creative Commons Attribution 3.0 Unported license (CC BY 3.0). Ademais é multiplataforma, permitindo o desenrolo tanto en sistemas operativos Windows coma Linux. Este entorno está deseñado para poder utilizarse sen que sexan necesarios moitos coñecementos sobre programación e se poida realizar unha pequeña aplicación dunha maneira gráfica e bastante intuitiva, o que non quere dicir que, con maiores coñecementos, non se poidan realizar aplicacións moito mais complexas.

A maiores se pode destacar que con mais de 100 horas de programación con MIT App Inventor, obsérvase que esta, ten certas limitacións que non permiten, ou fan mais complicadas a realización de certas tarefas complexas, inda así, é suficiente para o nivel de complexidade exixido pola aplicación realizada.O crear un novo proxecto, pódese deseñar o aspecto cunhas utilidades predeseñadas e engadir o control sobre certos compoñentes dos teléfonos móbiles coma son o bluetooth, o GPS, a cámara, etc.
Unha vez realizado o deseño da parte visual, hai que abrir o Editor de Bloques, o cal descárgase e execútase coma un programa de escritorio.blue1No editor de Bloques prográmase de forma gráfica o funcionamento da aplicación. Todos os cambios son gardados automaticamente o que aporta unha gran seguridade fronte a caídas da rede, cortes de alimentación, etc. Isto sempre e cando se teña conexión a internet.
Coa aplicación rematada esta pódese compilar e descargar cun formato executable .apk a un teléfono o cal pode estar conectado por wifi ou por cable (esta opción precisa instalar o software App Inventor setup no teléfono) ao ordenador ou se pode utilizar un emulador para testala, inda que recoméndase a primeira opción. A aplicación instálase automaticamente no
teléfono e aparece igual que calquera aplicación do mesmo.

MATICES SOBRE O PROGRAMA DO ROBOT

RUTINA PRINCIPAL:

Esta rutina está encargada de realizar os cálculos comúns a tódolos modos de funcionamento do robot e de chamar as sub-rutinas que sexan necesarias en cada instante.

rutinaPPAL

Cálculo da velocidade:

O cálculo da velocidade axúdase da sub-rutina “cálculo_v” a cal se lle pasan os valores necesarios para que poida realizar as operacións programadas. Despois de chamar a esta sub-rutina actualízanse e almacénanse os valores da velocidade. Esta operación realízase para o motor dereito e para o esquerdo.

//CALCULO DA VELOCIDADE
if(millis()-ultimo_calculo >tiempo_entre_calculos)//este tempo ten que ser igual a tiempo_entre_regulaciones
{
  ultimo_calculo=millis();
  v_realD=calculo_v(contadorD, nD, tiempoD);
  contadorD=0; //Resetea contador
  tiempoD=micros(); // Actualiza tempo para calculos
  v_realI=calculo_v(contadorI, nI, tiempoI);
  contadorI=0;
  tiempoI=micros();
}
Sub-rutina calculo_v:
float calculo_v(int contadorZ, int nZ, float tiempoZ) //CALCULO DA VELOCIDADE
{
  float v_real=0;
  //calculo da velocidade en rpm
  v_real=1000000*60*contadorZ/nZ; // devolve un valor en voltas/micros Seg
  v_real=v_real/(micros()-tiempoZ);
  return v_real;// Devolve a velocidade en rpm
}

Cálculo do regulador:

O fragmento de código encargado de calcular a velocidade execútase cunha frecuencia determinada pola variable “tiempo_entre_calculos”, isto faise así para que a velocidade calculada vaia acorde cos cálculos realizados na sub-rutina encargada de regular a tensión de alimentación dos motores, a cal se mostra a continuación xunto co fragmento de código da rutina principal encargado de chamala cunha determinada frecuencia e de pasarlle os valores adecuados.

//CALCULA REGULADOR
if(sigue_lineas==0)//O siguelineas ten seu propio regulador
{
  if(millis()- ultima_regulacion > tiempo_entre_regulaciones)//Para chamar ao regulador cada ZZ segundos
  {
    rpmI=regulador(v_realI, v_realD, acelerando_izquierda);
    rpmD=regulador(v_realD, v_realI, acelerando_derecha);
  }
}
float regulador(float v_real,float v_otra, float aceleracion)// REGULADOR empregado sempre menos no caso do modo SIGUE_LINEA
{
  //calculo de erros
  float error_v_referencia = v_referencia - v_real;
  float error_v_otra = v_otra - v_real;
  //calculo da saida
  float rpm=0;
  rpm= v_referencia + error_v_referencia * kp1 + error_v_otra * kp2 + aceleracion *2 ;//A aceleracion
  multiplicase *2 para anular o efecto de error_v_otra
  return rpm;
}

A rutina “regulador” calcula a diferencia entre a velocidade marcada como v_referencia, que é a que debe de alcanzar o robot e a “v_real” calculada anteriormente e que obtén os datos do encoder de cada roda. Tamén calcula a diferencia de velocidade entre cada roda.
Coas diferenzas de velocidade calculadas, aplícase un logaritmo para corrixir o erro cometido, neste logaritmo entran en xogo os valores “kp1” e “kp2”.

A variable “aceleración” é a empregada para corrixir a posición do robot nos modos de funcionamento en que ten que seguir paredes.

Control dos motores:

O código empregado para administrar o sentido de xiro dos motores e regular a tensión que se lles entrega, controlando así a súa velocidade, sigue o seguinte diagrama.

rutinamotores

A sub-rutina “rpm_a_pwm()”  encárgase de converter o valores calculados polo regulador que están en Revolución Por Minuto (rpm) en Modulación por Anchura de Pulso (Pulse-Width Modulation (PWM)). Para isto, emprega a función definida a anacos obtida na entrada anterior.

SUBRUTINAS DE COMPORTAMENTO:

As sub-rutinas encargadas do comportamento do robot, son: sigueLineas() automatico() e manual(). Estas a súa vez empregan outras sub_rutinas para realizar distintas tarefas. A continuación resúmese o seu funcionamento.

Subrutina S.Lineas()

De esta rutina se pode resaltar que as lecturas realizadas polo CNY-70 léense de forma analóxica, o que permite elixir os valores que determinarán a localización da liña. Isto é útil para acomodar os rangos de valores que representan a liña e os
que representan o resto da superficie, en función da luz, do tipo e do color de liña e de superficies empregadas, e incluso do nivel das baterías, xa que de estar moi baixas, poden non entregar a tensión adecuada aos sensores e facer que estes varíen a súa tensión de saída.

rutinaSL
A localización da linea segue o esquema representado sobre a seguinte imaxen.

sl_robot

Na imaxen anterior, a posición da linea está representada polas franxas negras. En función da posición da linea respecto aos sensores do robot, a variable error_sl varia o seu valor según marcan os números da imáxen.

O programa encargado de regular o movemento do robot pola línea é o seguinte:

Variar_V=Kp_sl*error_sl + Kd_sl*(error_sl-error_sl_ant);
error_sl_ant=error_sl;
ultima_regulacion_sl=millis();
rpmI=v_referencia + Variar_V;
rpmD=v_referencia - Variar_V;

O programa, emprega un regulador proporcional derivativo P-D. O regulador aplica un valor de corrección de ruta en función de onde se encontre a liña respecto aos sensores CNY-70.

Kp_sl e Kd_sl teñen uns valores asignados en función das probas realizadas e poden modificarse para cada circuito en función da súa dificultade.

Subrutina Automático()

A sub-rutina encargada do modo Automático do robot encárgase de xestionar outras sub-rutinas en función do estado do mesmo.

rutinaautomatico

Subrutina Dondeestoy()

A sub-rutina “dondeestoy()” emprégase para intentar localizar unha parede que seguir, consulta o estado dos sensores dianteiros e laterais do robot e se detecta algo diante ou o seu carón, vai na súa busca; se non detecta nada, fai que o robot continúe avanzando en liña recta.

rutinaDondestoy

Para traballar cos sensores de ultrasóns, o robot realiza a media das 20 derradeiras medidas de cada sensor, para así evitar modificar a súa ruta, por falsos ecos. As rutinas encargadas desta tareas son as chamadas smoothing.

int smoothing_izq(int nueva_lectura)// Funcion para calcular a media do US esquerdo
{
  total_izq=total_izq-lecturas_izq[index_izq];//Elimina o valor existente nesa posicion
  lecturas_izq[index_izq]=nueva_lectura;//Carga a lectura na taboa
  total_izq=total_izq+lecturas_izq[index_izq];//Suma o valor desta nova lectura
  index_izq=index_izq+1;//aumenta o punteiro da taboa
  if(index_izq==numeroLecturas)//Si o punteiro desborda, volve a 0
  {
    index_izq=0;
  }
  int media=total_izq/numeroLecturas;//Calcula a media dos valores almaceados
  delay(2);
  return media;//Devolve la media
}

 Sub-rutinas enparedizquierda() e enparedderecha()

As sub-rutinas “enparedizquierda()” e “enparedderecha()” son moi similares polo que unicamente considérase necesario a explicación dunha delas.
A sub-rutina “enparedizquierda()” despraza ao robot ao longo dunha parede situada na súa cara esquerda. Se mentres está executando esta rutina detecta algo diante do robot, regrésase á rutina “dondeestoy()” para así poder evitar a colisión. Como é moi complicado que o robot continúe totalmente recto ao longo das paredes, este algoritmo o que fai é forzar un desprazamento de acercamento e afastamento en función da distancia a que os sensores de ultrasóns detecten que se atopa a parede. Cando o robot aproxímase a menos de 6 cm da parede, o motor correspondente a mesma e acelerado forzando así o afastameno do robot da parede. Se o robot sobrepasa a distancia de 12 cm, o motor contrario a parede é o acelerado para que así se aproxime a parede. Se o sensor detecta que a distancia á parede é maior a 35 cm considérase que a parede foi perdida; isto ocorre no caso das portas abertas, o que se fai neste lugar é cambiar a rutina “dondeestoy()” a cal se encargará de que o robot xire na dirección da parede para así poder seguir rastreándoa.

rutinaEnpared

Sub-rutina manual()

A sub-rutina “manual()” é empregada no control manual do robot a través da aplicación móbil (Que explicarei nunha próxima entrada). Esta rutina executa distintos algoritmos en función dos comandos enviados dende o teléfono.
Cada vez que se executa a rutina, que é cada 300 mS, fai unha lectura dos sensores dianteiros e avisa a aplicación móbil se existe perigo de colisión dianteira, enviando un “1” se se detecta un obstáculo preto e un “2” si non se detecta nada. A maiores, se a función Antichoque está activada e detecta un obstáculo diante do robot, bloquea o avance deste, permitindo unicamente os xiros e o retroceso.

 

Relación da velocidade dos motores coa tensión de alimentación

Para poder regular a velocidade dos motores do robot, para así poder realizar trazados rectos, é necesario obter a relación existente entre a tensión media aplicada a cada motor e a velocidade que este transmite a roda.
Como o control de velocidade dos motores realízase mediante Modulación de Anchura de Pulso (PWM) e esta está directamente relacionada coa tensión media aplicada aos motores, realízase unha proba variando o PWM e medindo a velocidade obtida en cada roda.

DATOS OBTIDOS
A velocidade dos motores exprésase como RPM roda e a Modulación de Anchura de Pulso que pode variar entre 0 e 255 por PWM.
A variación do PWM está entre 0 e 255 por que o xerador de PWM do microcontrolador ATMEGA328P-PU é de 8 bits o que nos da
8^2 =256 valores distintos para a codificación da sinal.
Os resultados pertencentes a PWM máis baixa, dependen moito da presión exercida polas rodas contra os motores.
As probas realizáronse alimentando o circuíto coa batería ao máximo nivel de carga, polo que o voltaxe entregado ao robot nunca descendeu por debaixo dos 5 V. As medidas foron tomadas co robot circulando nunha superficie de madeira pulida de 170cm.
Ambos motores teñen unha velocidade moi similar, polo que non é necesario realizar a linealización de ambos por separado.

A seguinte gráfica mostra a evolución das RPM (azul) e dos PWM (laranxa) da saída do motor con carga.

GRAFICA1

Como pode observarse, a evolución de ambas non é directamente equivalente, polo que se fai necesario analizar os datos con mais precisión. Para isto, elabórase unha gráfica onde se mostra a evolución das RPM respecto a os PWM, para a partir desta, obter a función característica necesaria.

A seguinte gráfica mostra a variación das RPM (Eixe vertical) respecto a variación dos PWM (Eixe horizontal).

GRAFICA2

Empregando a ecuación da recta: y=m⋅x+ b

A pendiente dados dous puntos: m= ( y 2 − y 1 ) / ( x 2 −x 1 )

E a función definida a anacos: f ( y)=m⋅x + b→ f (x )=( y−b)⋅(1/m) ; si a< y< l

Obténse a seguinte ecuación:

f (x )=0 ; si y=0→ Para 0 RPM fórzase PWM =0 para non descargar as baterías
f (x)_1 =( y −(−202))⋅(1/2.525); si 0<y≤101
f (x )_2 =( y−1,006)⋅(1/0.833): si 101<y≤151
f (x )_3 =( y −115)⋅(1/0.2); si 151<y≤155
f (x )_4 =( y−75)⋅(1/0.4); si 155<y

Con esta función definida a anacos é posible obter o porcentaxe PWM a aplicar nos motores, en función das RPM desexadas, sendo y=RPM e x=PWM

Función empregada no programa principal do robot:

int rpm_a_pwm(float rpm)//PASO DE RPM A PWM
{// En funcin do valor de rpm aplica unha ou outra formula para adaptarse a ecuacion achada no estudo do comportamento dos motores
 int pwm=0;
 if(rpm<1)
 {
  pwm=0;
 }
 else
 {
  if(rpm<=101)
  {
   pwm=(rpm+202)/2.525;
  }
  else
  {
   if(rpm<=151)
   {
    pwm=(rpm-1.006)/0.8333;
   }
   else
   {
    if(rpm<=155)
    {
     pwm=(rpm-115)/0.2;
    }
    else
    {
     pwm=(rpm-75)/0.4;
    }
   }
  }
 }
 return pwm;//Valor que devolve
}

Cálculo do desplazamento do robot a partir dos datos dos encoders

CONTA DE FRANXAS:

Os encoders proporcionan a súa saída un cambio de nivel da tensión, por cada cambio de franxa das rodas.
As interrupción externas do microcontrolador configúranse para activarse cada vez que un dos pins asociados aos encoders pasan de nivel alto a nivel baixo e de nivel baixo a nivel alto.
Para o microcontrolador, nivel alto é unha tensión igual ou superior a 3 V e nivel baixo unha tensión igual ou menor a 2 V. A saída dos encoders varía a súa tensión o suficiente como para disparar estas interrupcións é así poder calcular canto tempo pasa entre cada unha.
O código relacionado co cálculo da velocidade é o seguitne:

// Declaración das rutinas de interrupción

main()
{
attachInterrupt(1, I_interrupt, CHANGE); //dig3
attachInterrupt(0, D_interrupt, CHANGE); //dig2
}

//Definición das rutinas de interrupción e aumento dos contadores

void I_interrupt() //Declaro rutina de interrupcion
{
contadorI++;    //constante empregada para calcular a velocidade
contadorI2++;  //constante empregada para ver si esta parado
contadorI3++;
}

void D_interrupt() //rutina de interrupcion
{
contadorD++;
contadorD2++;
}

Para calcular a velocidade a que xira cada roda é preciso coñecer o tempo que pasa entre cada interrupción e o número de interrupcións que ten un xiro completo de cada roda. O número de interrupcións por cada 360º vén dado polo número de franxas dos encoders, e estes teñen 24 marcas, polo que ao principio do programa defínese así:

int nI=24;/ /Numero de marcas dos encoders
int nD=24;

 

CÁLCULO VELOCIDADE RODAS

Para coñecer o tempo que pasa entre cada interrupción, lánzase a rutina de cálculo da velocidade cada 333,3 mS. Tendo este tempo fixado solo queda dividir 333,3 entre o resultado almacenado nas variables contadorD e contadorI que corresponde co número de interrupcións lanzadas durante este tempo.

float tiempo_entre_calculos=333.3;
//CALCULO DA VELOCIDADE
if (millis()-ultimo_calculo > tiempo_entre_calculos)
{
ultimo_calculo=millis();
v_realD=calculo_v(contadorD, nD, tiempoD);
contadorD=0; //Resetea contador
tiempoD=micros(); // Actualiza tempo para calculos
v_realI=calculo_v(contadorI, nI, tiempoI);
contadorI=0;
tiempoI=micros();
}

Para obter a velocidade de cada roda en revolucións por minuto, realízanse os seguintes cálculos:

V i =(1000000∗60∗númeroDeInterrupciónsDendeDerradeiroCálculo )/ númeroDeFranxasEncoder
 V f =V i /TempoDendeDerradeiroCálculo

O programa empregado para calcular esta velocidade é o seguinte:

float calculo_v(int contadorZ, int nZ, float tiempoZ) //CALCULO DA VELOCIDADE
{
float v_real=0;
//calculo da velocidade en rpm
v_real=1000000*60*contadorZ/nZ;// voltas/micros
v_real=v_real/(micros()-tiempoZ);
return v_real;// Devolve a velocidade en rpm
}

 

CÁLCULO VELOCIDADE ROBOT

Coa velocidade de cada roda e o seu diámetro, é posible calcular a velocidade de
desprazamento do robot coa seguinte fórmula:

V r =V f ∗DiámetroRoda

CÁLCULO XIRO ROBOT

Para calcular o que cada roda ten que xirar para que o robot xire sobre seu eixe vertical X grados, é preciso coñecer a distancia entre cada roda do robot, sendo esta de 8,7 cm os cálculos a realizar son os seguintes:

PulsosXirar i =((gradosXirar∗distanciaEntreRodas∗pi )/360)
 PulsosXirar f =PulsosXirar i /( DiámtroRoda∗pi / NumeroFranxasEncoder)

O resultado PulsosXirar f é o número de franxas que cada roda ten que xirar para que o robot xire X grados, definidos por gradosXirar . O programa encargado de realizar os cálculos anteriores é o mostrado a continuación:

void giro() //FUNCION QUE ENTREGA OS PULSOS A XIRAR EN FUNCION DO
ANGULO DESEXADO
{
pulsos_a_girar=((grados_a_girar*8.7*pi)/360)/(6.*pi/24);
}

ENCODERS

Nos robots móbiles deste tipo o que interesa medir con encoders é a velocidade das rodas, para con esa realimentación de datos e con outros sensores, poder calcular o desprazamento do robot. O cálculo da posición relativa do robot por medio dos encoders é o que se coñece como hodometría.
Os encoders seleccionados son de tipo óptico e incrementais, pero por tratarse dun robot de pequenas dimensións e pretender que o presuposto fora o máis baixo posible, optouse por desenvolver un sistema de encoders que evitara a compra dos mesmos, así como a compra duns motores adaptables aos encoders, os cales adoitan ser máis caros por este feito.
Decídese fabricar uns encoders baseados nun disco codificado con franxas brancas e negras.
Adosado este á cara interior das rodas e nun sensor de infravermellos CNY-70 acoplado enriba do motor e situando á saída de infravermellos a 0,8 mm do disco mirando cara a roda e perpendicular a ela.

ENCODER1
A codificación do disco pode variar en función das necesidades, pero realizando varias probas optouse por empregar unha codificación de 24 franxas, 12 brancas e 12 negras. Isto é así porque no programa a consulta das pulsacións dos encoders realízase por interrupcións e tendo en conta o tempo de execución do programa: se os motores xiraran a súa velocidade máxima, podería chegarse a perder datos dos encoders sobre a velocidade das rodas.
O circuíto empregado nos encoders explícase con mais detemento nunha entrada anterior, pero o interesante é que a tensión entregada a saída do circuíto varía o suficiente ao trocar o cor da franxa a cal reflicte a luz do sensor para disparar as interrupcións do microcontrolador.
Engadir que a cor branca e negra das franxas é así para aumentar ao máximo a variación da luz reflectida.
Realizando probas con distintos tipos de superficies e de tintas empregadas na construción dos discos, óptase por papel de impresión regular, evitando papeis con brillo e tinta negra, evitando o tóner das impresoras láser. Estes factores fan que a impresión dos discos sexa moi doada e económica. Para adosar o disco á roda, empregouse unha cartolina, para darlle consistencia ao disco e facilitar o pegado ao interior da roda.

ENCODER2

ENCODER3

 

DESEÑO MECÁNICO

representacion_robotNa ilustración  pode verse unha simulación do robot deseñado. Nela obsérvase que a súa estrutura está dividida en dúas plantas. A planta superior formada pola placa TOP e a planta inferior formada pola placa BOT, a cal da cabida ao circuíto BOT, aos motores e as
baterías, ademais de dar soporte á placa S.LINEAS e os sensores de infravermellos.

PLACA BOT:

A superficie que fai de soporte da planta inferior é unha lámina de 1mm de grosor de latón.
Ten forma de U para que se poidan fixar sensores na súa cara dianteira e para que impida a caída das baterías pola parte traseira.

P_BOT

PLACA TOP:

A placa superior é a formada polo circuíto TOP.

As placas TOP e BOT están unidas por catro varillas roscadas de 45 mm de lonxitude e 6,40 mm de diámetro. Estas varillas poden obterse en calquera ferraxería cunha lonxitude de 1 m. Para o robot precisaremos 2 destas, xa que só podemos empregar os 2 extremos de cada unha, porque ao cortar a varilla, estropéase a rosca e non podemos introducir as torcas necesarias para fixar as placas.

O material empregado nesta placa é a baquelita de 1mm de espesor.

P_TOP

ESCUADRAS:

Os motores están suxeitos á placa inferior por dúas escuadras de aluminio. Poden obterse en calquera ferraxería.

Estas pezas están aparafusadas á placa inferior e pegadas aos motores de tal forma que estes queden inmobilizados, impedindo unha rotación ou desprazamento non desexados. A altura dos motores pode regularse á hora de pegalos as escuadras, para así variar a altura e a inclinación do robot.

ESCUADRAS

RODAS:

As rodas son tamén un elemento moi importante. Estas teñen un diámetro de 60 mm e unha anchura de 8 mm.
Teñen unha abertura no centro a cal permite o seu correcto encaixe cos motores. Están construídas en plástico negro e a súa parte exterior está recuberta por unha goma, a cal mellora a adherencia coa superficie. Esta goma pode ser retirada e substituída por outra de considerarse necesario.

RODAS

PLACA S.LINEAS:

Na parte dianteira inferior sitúase outra placa, encargada de portar os sensores e o circuíto S.LINEAS empregando tamén a baquelita como material de construción.

P_SLINEAS

RODA LOCA:

Na parte inferior-dianteira sitúase unha roda loca de 9,5mm de diámetro constituída por unha bola de plástico que xira libre nun soporte o cal vai pegado a placa BOT e impide que a bola se desprenda. A funcionalidade desta bola é a de impedir que o robot roce contra o chan mellorando así a súa mobilidade.

DESPECE DO ROBOT

despiece