10 de maig del 2011
Primers moviments (Robot econòmic)
El primer objectiu és fer moure el robot endavant. Amb una sèrie de ordres donades al microprocessador i el driver de motor podem controlar si la roda girarà endavant o al contrari, i la velocitat amb que girarà. El programa que hem utilitzat en la programació del robot és el PICAXE Programing Editor.
Com que en la construcció del robot hem utilitzat servomotors trucats, hi ha una petita diferencia entre els dos, de manera que encara ficant el mateix valor (digital) en la programació de velocitat el robot es desvia cap a un cantó.
Per tal de facilitar la programació en un futur hem fet una gràfica amb el valor digital de la velocitat d'una roda, en funció de l'altra.
Amb aquesta taula, els valors entre els que hem trobar perquè el robot vagi recte seran més fàcils de trobar, per tant el primer objectiu ja està assolit.
6 de maig del 2011
5 de maig del 2011
Comparativa de l'electrònica de comandament
típic de 800 mA).
. Separar la lògica d'alimentació i alimentació del motor
. Funció de fre
. circuit de desconnexió tèrmica construïda en
. paquet compacte (14 pins MFP)
-Ressonador intern més ràpid (fins 32MHz) és de fins a 8 vegades més ràpid que el programa de processament.
-Capacitat de memòria (en bytes) 2.048 128.256 2.048
-Max. Capacitat de memòria (línies) 1.800 110.220 1.800
4 de maig del 2011
Inici de programació del robot professional
- En apretar el polsador que el led faci pampallugues:
#include
int main()
{
set_digital_input(IO_D4,PULL_UP_ENABLED);
while(is_digital_input_high(IO_D4))
{
}
while(1)
{
red_led(1);
delay_ms(100);
red_led(0);
delay_ms(100);
}
}
Amb aquest programa aconseguim que en cas de que no es pitgi el polsador el led es queda apagat, però quan el pitgem aquest comença a fer pampallugues amb un interval de 100 milisegons .
- Programa per fer girar el robot cap a l'esquerra, la dreta i l'esquerra una atra vegada:
#include
int main()
{
set_digital_input(IO_D4,PULL_UP_ENABLED);
while(is_digital_input_high(IO_D4))
{
}
while(1)
{
delay_ms(500);
set_motors(20,-20);
delay_ms(500);
set_motors(-20,20);
delay_ms(1000);
set_motors(20,-20);
}
}
Per a fer aquest programa hem utilitzat la mateixa metodologia que per a fer les pampallugues del led, però en aquest cas el que fem es moure els dos motors del robot.
- Programació del moviment de va i be:
#include
int main()
{
set_digital_input(IO_D4,PULL_UP_ENABLED);
while(is_digital_input_high(IO_D4))
{
}
delay_ms(500);
for (char i = 0; i < 80; i++)
{
if ((i<21) (i>59))
{
set_motors(20,-20);
}
else
{
set_motors(-20,20);
}
delay_ms(20);
}
set_motors(0,0);
}
Aquest programa funciona de manera diferent que els dos anteriors. El que fem ara és que el microcontrolador conti el temps, i segons en quin instant es troba ha de fer un moviment o un altre. Aquest programa ens anirà bé per a què en iniciar les curses amb el robot rastrejador, aquest faci el moviment abans de començar i així els sensors reculleixin la informació dels canvis de llum que troba al terra.
·Lectura sensors:
Aquesta part del programa serveix per a detectar el color sobre el qual es despaça el robot, cada
sensor detecta un color, i això serveix per detectar on esta la linia que ha de seguir el robot.
Aquestes dades senvien al programa Putty que enregistra les dades captades pel sensors.
#include
#include
unsigned int sensors[8]; // array amb les lectures dels sensors
unsigned char qtr_analog_pins[] = {7, 6, 0, 1, 2, 3, 4, 5}; // com estan col·locats els sensors
char buffer[4]; // buffer per realitzar la conversio enter - ascii
int main()
{s
erial_set_baud_rate(9600);// velocitat comunicacio serie
qtr_analog_init(qtr_analog_pins, 8, 3, IO_D7); // 8 sensors, 3 mostres per sensor. emissor D7
set_digital_input(IO_D4,PULL_UP_ENABLED);
while(is_digital_input_high(IO_D4))
{
}
while(1)
{
delay_ms(500);
qtr_read(sensors, QTR_EMITTERS_ON); // lectura analogica dels sensors
qtr_emitters_off(); //apaguem els sensors
for (char i = 0; i < 8; i++)
{
sensors[i]=1024-sensors[i];
itoa(sensors[i],buffer,10); // convertim a ascii la lectura del sensor i
serial_send(buffer, 4); // ho enviem pel port serie
delay_ms(10); // esperem
serial_send(" ", 1); // espai
delay_ms(10); // esperem
}s
erial_send("\r\n",2); // canvi de linia
}
}
·Detecció de la posició del robot.
Una vegada tenim els valors obtinguts pels sensors hem de determinar la posició en la qual es troba el robot respecta la línia blanca. D'aquesta manera el podrem corregir per tal de que sempre tingui els dos sensors centrals sobre la línia.
#include
#include
unsigned int sensors[8]; // array amb les lectures dels sensors
unsigned char qtr_analog_pins[] = {7, 6, 0, 1, 2, 3, 4, 5}; // com estan col·locats els sensors
char buffer[4]; // buffer per realitzar la conversio enter - ascii
int main()
{s
erial_set_baud_rate(9600);// velocitat comunicacio serie
qtr_analog_init(qtr_analog_pins, 8, 3, IO_D7); // 8 sensors, 3 mostres per sensor. emissor D7
set_digital_input(IO_D4,PULL_UP_ENABLED);
while(is_digital_input_high(IO_D4))
{
}
while(1)
{
delay_ms(500);
qtr_read(sensors, QTR_EMITTERS_ON); // lectura analogica dels sensors
qtr_emitters_off(); //apaguem els sensors
unsigned int suma=0;
for (unsigned char i = 0; i < 8; i++)
{
sensors[i]=(1024-sensors[i])/10;
suma= suma+sensors[i];
itoa(sensors[i],buffer,10); // convertim a ascii la lectura del sensor i
serial_send(buffer, 4); // ho enviem pel port serie
delay_ms(10); // esperem
serial_send(" ", 1); // espai
delay_ms(10); // esperem
}s
erial_send("\r\n",2); // canvi de linia
itoa(suma,buffer,10);
serial_send(buffer, 4);
delay_ms(10); // esperem
serial_send("\r\n",2);
unsigned int posicio= (10*sensors[0] + 20*sensors[1] + 30*sensors[2] + 40*sensors[3] +
50*sensors[4] + 60*sensors[5] + 70*sensors[6] + 80*sensors[7])/suma;
itoa(posicio,buffer,10);
serial_send(buffer, 4);
delay_ms(10); // esperem
serial_send("\r\n",2);
}
}
·Funcionament robot amb control proporcional
Quan ja tenim la posició per a poder corregir la posició del robot fem servir l'error proporcional per a variar les velocitats de cadascuna de les rodes, depenent del sentit de la corba. D'aquesta manera el robot sempre seguira la línia blanca.
#include
/*
* motors1: for for the Orangutan LV, SV, SVP, X2, Baby-O and 3pi robot.
*
* This example uses the OrangutanMotors functions to drive
* motors in response to the position of user trimmer potentiometer
* and blinks the red user LED at a rate determined by the trimmer
* potentiometer position. It uses the OrangutanAnalog library to measure
* the trimpot position, and it uses the OrangutanLEDs library to provide
* limited feedback with the red user LED.
*
* http://www.pololu.com/docs/0J20
* http://www.pololu.com
* http://forum.pololu.com
*/
int main()
{
unsigned char velocitat=115;
int cp=0;
int kp=30;
int posicio=50;
int posicio_ant=50;
unsigned int sensors[8]; // array amb les lectures dels sensors
int sensors_max[]={86, 97, 100, 100, 100, 100, 100, 100};
int sensors_min[]={14, 14, 25, 27, 28, 33, 29, 31};
unsigned char qtr_analog_pins[] = {7, 6, 0, 1, 2, 3, 4, 5}; // com estan col·locats els sensors
qtr_analog_init(qtr_analog_pins, 8, 3, IO_D7); // 8 sensors, 3 mostres per sensor. emissor D7
set_digital_input(IO_D4,PULL_UP_ENABLED);
while(is_digital_input_high(IO_D4));
{}
delay_ms(500);
// aqui caldria posar la sequencia del polsador per iniciar.
while(1)
{
posicio_ant=posicio;
qtr_read(sensors, QTR_EMITTERS_ON); // lectura analogica dels sensors
qtr_emitters_off(); //apaguem els sensors
// delay_ms(500); // esperem
unsigned int suma=0;
for (unsigned char i=0;i<=7;i++) // sumem valors i escalem perque no surti d'escala. Linia
blanca, fons negre
{
// sensors[i]=(sensors[i])/10; //fons blanc
sensors[i]=(1024-sensors[i])/10; //fons negre
if (sensors[i]>=sensors_max[i])
{
sensors[i]=100;
}else if (
sensors[i]<=sensors_min[i])
{
sensors[i]=0;
}else
{
sensors[i]=100*(sensors[i]-sensors_min[i])/(sensors_max[i]-sensors_min[i]);
}suma=suma +
sensors[i];
}
if (suma>100)
{
posicio=15*sensors[0]+25*sensors[1]+35*sensors[2]+45*sensors[3]+55*sensors[4]+65*sensors[5]
+75*sensors[6]+85*sensors[7];
posicio=posicio/suma;
}
else
{
if (posicio_ant<50)
{
posicio=15;
}else
{
posicio=85;
}
}
// ara que tenim la posicio, calcularem els errors
cp= kp*(posicio-50)/10;
if (cp>0)
{
if (cp>velocitat)
{
cp=velocitat;
}s
et_motors(-velocitat,-(velocitat-cp));
}else
{
if (cp<-velocitat)
{
cp=velocitat;
}s
et_motors(-(velocitat+cp),-velocitat);
}
}
}
A partir de canviar les variables de velocitat i de la constant, l'error proporcional canvia i podem fer que augmenti la rapidesa.
1 de maig del 2011
Robot Final
En el nostre cas analitzem quins són els materials que necessitem per a la costrucció del robot professional.
Quantitat | Peça | enllaç | pes (grams) | Preu (€) | mida (mm) |
1 | placa sensors QTR-8A | http://www.pololu.com/docs/0J12/all | 3,1 | 14,95 | 74,90 x 12.52 |
2 | Barres de carboni | 152,41 de llargada x 2,04 de diametre | |||
1 | Lipo Hyperion | 6,5 | 7,75 | ||
1 | Placa Baby Orangutan B-328 | http://www.pololu.com/catalog/product/1220 | 1,5 | 19 | |
2 | Motor pololu 10:1 | http://www.pololu.com/catalog/product/999 | 1 | 16 | |
2 | Rodes | 23,2 | |||
1 | polsador | ||||
2 | Adaptadors del motor | ||||
4 | cargols i femelles | ||||
1 | Polulu Adjustable Boost Regulator 4-25V | http://www.pololu.com/catalog/product/799 | 1,6 | 12 | |
1 | tira de cables | ||||
1 | placa PCB | 137,76 X 45,34 | |||
2 | condensadors | ||||
total | 58,5 |
29 d’abril del 2011
Material per a la construcció d'un robot econòmic
Aquí mostrem una taula on hi apareix el preu i pes de cada element:
Les piles estan en sèrie que donen 7,4 V amb el regulador de tensió corresponent.
Els motors, són servos trucats, on s'hi acoplava unes rodes reciclades dels ratolins d'ordinador.
20 d’abril del 2011
Tipus d'alimentació
Suposant que les bateries estan en serie la tensió total seria de 7,4 volts.
En la següent fotografia es pot observar un exemple de placa per a generar els 5V.
Aquesta té un preu de 11,95€ i pot regular la tensió de 2 a 12 volts.
Les mides de la placa són de 10,16 x 17,78 x 4 mm.
La tensió de sortida es pot ajustar amb un metre i una càrrega lleugera (per exemple, una resistència de 1k). Girant el potenciòmetre en sentit horari augmenta la tensió de sortida. La tensió de sortida es pot veure afectada per un tornavís tocar el potenciòmetre, de manera que la mesura de la producció hauria de fer-se sense res de tocar el potenciòmetre. El potenciòmetre no té límits físics, el que significa que els eixugaparabrises es pot girar 360 graus i en una regió no vàlid en el qual s'estableix la tensió de sortida de 2,5 V (per al V 2,5-9,5 V i 4 V a 25 V versions ). El voltatge d'entrada no ha de superar la tensió de sortida, per la qual cosa es recomana ajustar la tensió de sortida amb la tensió d'entrada del sistema al voltant de 2,5 V.