Académique Documents
Professionnel Documents
Culture Documents
MATERIA
ROBOTICA
CARRERA
ING. MECATRONICA
ALUMNOS
REPORTE
PROYECTO FINAL
03 DE DICIEMBRE DE 2018
INTRODUCCION
Por medio de este documento describiremos todo lo que nos implicó el desde el
diseño y elaboración del brazo robótico así como sus cálculos realizados con
matrices y demostración realizada de una manera gráfica con Matlab y una
manera física con la maqueta.
Este brazo robótico se conforma de 3 de ejes o 3 grados de libertad este será
controlado mediante un arduino para enviarle los pulsos a los micro servos y estos
muevan los ejes del brazo robótico y se pueda llegar a la posición deseada
mediante los pulsos, enviados por potenciómetros conectados a el circuito
realizado con arduino nano.
MARCO TEORICO
Materiales:
El servo SG90 tiene un conector universal tipo “S” que encaja perfectamente en la
mayoría de los receptores de radio control incluyendo los Futaba, JR, GWS,
Cirrus, Hitec y otros. Los cables en el conector están distribuidos de la siguiente
forma: Rojo =Alimentación (+), Cafe = Alimentación (–) o tierra, Naranja= Señal
PWM.
Este tipo de servo es ideal para las primeras experiencias de aprendizaje y
prácticas con servos, ya que sus requerimientos de energía son bastante bajos y
se permite alimentarlo con la misma fuente de alimentación que el circuito de
control. Por ejemplo, si se conecta a una tarjeta arduino, se puede alimentar
durante las pruebas desde el puerto USB del PC sin mayor problema.
Características
Micro Servo Tower-pro
Velocidad: 0.10 sec/60° @ 4.8V
Torque: 1.8 Kg-cm @ 4.8V
Voltaje de funcionamiento: 3.0-7.2V
Temperatura de funcionamiento: -30 ℃ ~ 60 ℃
Ángulo de rotación: 180°
Ancho de pulso: 500-2400 µs
Longitud de cable de conector: 24.5cm
RESISTENCIAS
Para saber el valor de una resistencia tenemos que fijarnos que tiene 3 bandas de
colores seguidas y una cuarta más separada. Las 3 primeras bandas nos dice
su valor, la cuarta banda nos indica la tolerancia, es decir el valor + - el valor que
puede tener por encima o por debajo del valor que marcan las 3 primeras bandas.
Push botón
INTERRUPTORES
Un interruptor es un operador eléctrico cuya función es abrir o cerrar un circuito de forma
permanente. Al accionarlo, hacemos que varíe su posición, abriendo un circuito que
estaba cerrado o cerrando uno que estaba abierto, y permanece así hasta que lo
volvamos a accionar.
Algunos interruptores se accionan automáticamente. Este es el caso de los interruptores
diferenciales que se colocan como protección y desconectan el circuito rápidamente
cuando se produce una fuga o derivación de corriente, por ejemplo al tocar un cable que
está mal aislado.
La mayoría de los aparatos eléctricos llevan uno o varios interruptores para permitir el
paso de la corriente y regular su funcionamiento.
- Por temperatura: Constan de una lámina que se deforma con la temperatura y hace
contacto con otra que está inmóvil. El termostato de una plancha eléctrica funciona al
revés: cuando aumenta la temperatura, la lámina se deforma, abre el contacto y deja de
calentar.
- Por presión: Se accionan por la presión que ejerce un fluido. Por ejemplo, por la presión
del aceite, en el caso del testigo de un automóvil, o del agua, en el caso de la
electroválvula de cierre de paso del agua a la lavadora.
Arduino nano
El Arduino Nano es una pequeña, pero poderosa tarjeta basada en el ATmega328. Posee
las mismas funcionalidades que un Arduino UNO, solo que en un tamaño reducido. Para
programarla solo se necesita de un cable Mini USB.
Características:
Microcontrolador: ATMega328
Voltaje de operación: 5V
Voltaje de alimentación (Recomendado): 7-12V
I/O Digitales: 14 (6 son PWM)
Memoria Flash: 32KB
EEPROM: 1KB
Frecuencia de trabajo: 16MHz
Dimensiones: 0.73″ x 1.70″
METODOLOGIA
PROCEDIMIENTO
Primero se hizo el bosquejo del brazo robótico de que estaría conformado y los eslabones
que se ocuparían esto se hizo dibujándolo en papel y sacando las medidas que se
ocuparían para después pasar el bosquejo de las piezas que se ocuparían para el
ensamble del brazo robótico.
Con las medidas obtenidas se pasó a dibujar cada una de las piezas en SOLIDWORDS
que posteriormente se maquinaran en una impresora 3D que es la que se encargara de
hacer físicas las piezas que se ocuparan para el ensamble del brazo robótico.
Eslabón principal
Eslabón secundario
Eslabón final
Ya con las piezas físicas se empezara a hacer el ensamble utilizando los demás
componentes
RESULTADOS
Art. Θi di αi-1 ai-1
1 Θ1 0 0 0
2 Θ2 0 90 6 cm
3 Θ3 0 0 6 cm
4 0 0 0 6 cm
Programación en Matlab
function varargout = RRR_ROBOT(varargin)
% RRR_ROBOT MATLAB code for RRR_ROBOT.fig
% RRR_ROBOT, by itself, creates a new RRR_ROBOT or raises the
existing
% singleton*.
%
% H = RRR_ROBOT returns the handle to a new RRR_ROBOT or the handle
to
% the existing singleton*.
%
% RRR_ROBOT('CALLBACK',hObject,eventData,handles,...) calls the
local
% function named CALLBACK in RRR_ROBOT.M with the given input
arguments.
%
% RRR_ROBOT('Property','Value',...) creates a new RRR_ROBOT or
raises the
% existing singleton*. Starting from the left, property value pairs
are
% applied to the GUI before RRR_ROBOT_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property
application
% stop. All inputs are passed to RRR_ROBOT_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only
one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Outputs from this function are returned to the command line.
function varargout = RRR_ROBOT_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
Th_1 = str2double(handles.Theta_1.String)*pi/180;
Th_2 = str2double(handles.Theta_2.String)*pi/180;
Th_3 = str2double(handles.Theta_3.String)*pi/180;
L_1 = 6;
L_2 = 6;
L_3 = 6;
Robot = SerialLink(L);
Robot.name = 'RRR_ROBOT';
Robot.plot([Th_1 Th_2 Th_3]);
Robot = SerialLink(L);
Robot.name = 'RRR_ROBOT';
T = [ 1 0 0 PX;
0 1 0 PY;
0 0 1 PZ;
0 0 0 1];
Robot.plot(J*pi/180);
Programación en arduino
/*
serial config:
Port: tty.usbseriala400eMNr
Programmer: USBtinyISP
*/
// Definitionen
Servo servo_0;
Servo servo_1;
Servo servo_2;
Servo servo_3;
int count0, arrayStep, arrayMax, countverz, Taster, stepsMax, steps, time = 1000, del = 1000, temp;
// Taster = Button
long previousMillis1 = 0;
long previousMillis2 = 0;
long previousMillis3 = 0;
long previousMillis4 = 0;
long previousMicros = 0;
unsigned long currentMillis = millis();
// arrays
float dif[4], ist[4], sol[4], dir[4]; // difference between stored position and momentary position
int joint1[180];
int joint2[180];
int joint3[180];
int top = 179; // we should not write over the end from a array
// status
void setup()
pinMode(6, INPUT);
servo_1.attach(10);
servo_2.attach(9);
servo_3.attach(11);
//delay(1000);
digitalWrite(13, LOW);
currentMicros = micros();
Button();
if(currentMillis - previousMillis1 > 25) // 25miliseconds until next manual mode update
//record();
{
if (Step) // next step read from array
if (arrayStep < arrayMax) // we not reach the end from stored data
calculate(); // find biggest travel distance and calculate the other 3 servos (the have to do
smaler steps to be finished at same time!)
Step = 0;
digitalWrite(13, LOW);
arrayStep = 0; //
countverz += 1;
calc_pause();
//Serial.println(arrayStep);
{
if (currentMicros - previousMicros > time) // here we do a single micro step
{ //
previousMicros = currentMicros;
play_servo();
previousMillis2 = currentMillis;
/*count0 = 0;
while(count0 < 4)
Serial.println(val);
//Serial.println("test");
count0 += 1;
}
Serial.println(playmode);
Serial.println(arrayStep);
Serial.println(arrayMax);
Serial.println(" ");
}*/
void calc_pause() // read pot and map to usable delay time after a complete move is done
readPot();
temp = SensVal[3];
/*Serial.print(temp);
Serial.print(" ");
Serial.print(verz);
Serial.print(" ");
Serial.println(countverz);*/
void readPot() // read analog inputs and add some offsets (mechanical corrections)
void mapping() // we need microsecond for the servos instead potentiometer values
Serial.println(ist[2]); // CHECK
void record()
joint1[arrayStep] = ist[1];
joint2[arrayStep] = ist[2];
joint3[arrayStep] = ist[3];
void Read()
sol[1] = joint1[arrayStep];
sol[2] = joint2[arrayStep];
sol[3] = joint3[arrayStep];
void move_servo()
servo_1.writeMicroseconds(ist[2]);
servo_2.writeMicroseconds(ist[0]);
servo_3.writeMicroseconds(ist[1]);
void calculate()
dif[0] = abs(ist[0]-sol[0]);
dif[1] = abs(ist[1]-sol[1]);
dif[2] = abs(ist[2]-sol[2]);
dif[3] = abs(ist[3]-sol[3]);
stepsMax = max(dif[0],dif[1]);
stepsMax = max(stepsMax,dif[2]);
stepsMax = max(stepsMax,dif[3]);
// stepsMax is the biggest distance a servo have to do beween momentary position and new
pos read from the array
//Serial.println(stepsMax);
if (stepsMax < 500) // del(ay) between a single step is bigger is move is smaler. just looks cool
del = 1200;
else
del = 600;
// need that to do move all servos in a loop (stepsMax times done) with different values.
// This makes all servos have done the traveling distance at same time
//Serial.println(dir4);
void play_servo()
steps += 1;
if (steps < stepsMax) // sure we not reach the end from a move
else if(steps == 40) time = del*3; // time is the delay in microsecns we wait in the mainloop
until
else if(steps == 100) time = del-1; // cannot explain here is not del*1
if(steps == stepsMax-200) time = del*2; // stop ramp down (200 microsteps before end time
will be increased
ist[1] += dir[1];
ist[2] += dir[2];
ist[3] += dir[3];
servo_1.writeMicroseconds(ist[2]); // Hand
servo_2.writeMicroseconds(ist[0]); // Schulter
servo_3.writeMicroseconds(ist[1]); // Ellbogen
else
int i = 0;
digitalWrite(13, HIGH);
i += 1;
Serial.println("Joint0");
i = 0;
digitalWrite(13, HIGH);
i += 1;
Serial.println("Joint1");
i = 0;
digitalWrite(13, HIGH);
i += 1;
Serial.println("Joint2");
i = 0;
digitalWrite(13, HIGH);
i += 1;
Serial.println("Joint3");
if (digitalRead(6) == false)
delay(1);
if (Taster == 0)
Taster = 1;
previousMillis3 = currentMillis;
Taster = 2;
//Serial.println(Taster);
Taster = 3;
Serial.println(Taster);
}*/
arrayStep += 1;
arrayMax = arrayStep;
record();
Taster = 0;
playmode = false;
delay(100);
digitalWrite(13, LOW);
else if (Taster == 2)
arrayStep = 0;
playmode = true;
Taster = 0;
Step = 1;
Serial.println("playmode ");
data_out();
delay(250);
digitalWrite(13, LOW);
/*if (Taster == 3)
// ++ arrayStep
// playmode = 1;
Taster = 0;
Serial.println("Clear ");
}*/
Taster = 0;
//Serial.println("restart ");
}
Evidencias
Piezas impresas en 3D
Ensamblaje de piezas en soliworks y físico
Conclusión
En conclusión en este proyecto se utilizaron los conocimientos en la materia sacando las tramas del
brazo así como el cálculo del efector final y la cinemática inversa esto no ayudo a realizar todo el
análisis necesario para la elaboración del brazo, también se utilizo el conocimiento de Matlab
impartido por el profesor para diseñar una comprobación en Matlab, el proyecto tuvo sus
contratiempos por material defectuoso o por error a la hora de calibrar el brazo ya que las piezas
impresas fueron diseñadas específicamente para nuestros materiales, dando como resultado un
proyecto exitoso como conclusión del curso.
BIBLIOGRAFIA
http://www.ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf
https://electronilab.co/tienda/micro-servo-9g-towerpro/
http://www.areatecnologia.com/electricidad/resistencia-electrica.html
http://www.abc.com.py/edicion-impresa/suplementos/escolar/tecnologia-de-los-pulsadores-e-
interruptores-904222.html
http://www.ingmecafenix.com/electronica/potenciometro/
https://components101.com/potentiometer
http://irishelectronics.ie/10K-16mm-Linear-Potentiometer
https://arduino.cl/arduino-nano/