Você está na página 1de 9

INSTITUTO TECNOLGICO SUPERIOR DE HUAUCHINANGO

CARRERA:

INGENIERIA MECATRNICA
SEPTIMO SEMESTRE
REPORTE:
Proyectos de brazo
NOMBRE DE LA ASIGNATURA:
Programacin Avanzada.
CATEDRTICO:
Manuel Cruz Luna


PRESENTA:
Gregorio Hernndez Hernndez
Laura Benita Alvarado Cruz
Jess Daniel Cruz Rivera
Denis Prez Tllez















INTRODUCCION
La comunicacin realizada con el puerto serial es una comunicacin
asncrona, la cual consiste en el envi de un byte de informacin de manera
secuencial, en los puerto seriales bidireccionales, los cuales necesitan 2 hilos para
la comunicacin.
OBJETIVO
Utilizar la comunicacin del puerto serial entre el ordenador y la tarjeta
arduino, mediante el desarrollo de algoritmos utilizando el software de Visual Studio
mediante proyectos de C# y el software de arduino, para el control de giro de varios
servomotores, los cuales simulan articulaciones de un brazo robtico.
DESARROLLO
A continuacin se presentan 2 proyectos que se realizaron en las diferentes
plataformas de desarrollo, as como tambin se describen algunas de las funciones
en las lneas de programacin.
1.- Brazo controlado desde C# con trackbar.
*programacin en arduino:
#include <Servo.h> //se incluye la librera del servomotor
Servo servo1;// declarando variables de servos
Servo servo2;
Servo servo3;
Servo servo4;
int mov=0;//declaracin de una variable entera la cual representa los grados a rotar
int mov2=0;
int mov3=0;
int mov4=0;
void setup()
{
Serial.begin(9600);// llama al puerto serial
servo1.attach(3); // se declaran pines a los que van conectados las seales de los servos
servo2.attach(5);
servo3.attach(6);
servo4.attach(9);
}
void loop()
{
if (Serial.available()) // se inicia la comunicacin serial
{
mov=Serial.read();// se lee el valor de trackbar enviado mediante la comunicacin serial
servo1.write(mov);// escribiendo el valor del trackbar respectivo
delay(50);// tiempo en reposo
mov2=Serial.read();
servo2.write(mov2);
delay(50);
mov3=Serial.read();
servo3.write(mov3);
delay(50);
mov4=Serial.read();
servo4.write(mov4);
delay(50);
}
}
*programacin en Visual Studio mediante C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO.Ports; //se incluye la comunicacin serial de entradas y salidas del sistema

namespace arduinovisual
{
public partial class Form1 : Form
{
// Se declaran las variables globales
Graphics graf;
float ultimoangulo = 1;
float ultimoangulo2 = 1;
float ultimoangulo3 = 1;
float ultimoangulo4 = 1;
Image carro = global::arduinovisual.Properties.Resources.Segmento2BG; //se incluyen
las imagenes utilizadas para el proyecto
Image carro2 = global::arduinovisual.Properties.Resources.Segmento1BG;
public Form1()
{
InitializeComponent();
serialPort1.PortName = "COM5";//se declara el numero serial del puerto de arduino
serialPort1.BaudRate = 9600;//se declara la velocidad de transmisin de arduino
serialPort1.Open();//se abre el puerto serial
}

private void button1_Click(object sender, EventArgs e)
{
graf = this.CreateGraphics();// crea el rea del grafico
timer1.Enabled = true;// se inicia el timer

}

private void timer1_Tick(object sender, EventArgs e)
{

if ((ultimoangulo != MOV.Value) || (ultimoangulo2 != MOV2.Value) ||
(ultimoangulo3 != MOV3.Value) || (ultimoangulo4 != MOV4.Value) || )//condicin para que
se empiece el dibujo
{
graf.Clear(Color.Green);//pone en verde el rea en la cual se va a dibujar
//empieza a dibujar y a rotar ngulos para colocar las imgenes.
graf.TranslateTransform(185, 35);
graf.RotateTransform(MOV.Value);
graf.TranslateTransform(100, 0);
graf.RotateTransform(MOV2.Value);
graf.TranslateTransform(100, 0);
graf.RotateTransform(MOV3.Value);
graf.TranslateTransform(100, 0);
graf.RotateTransform(MOV4.Value);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-MOV4.Value);
graf.TranslateTransform(-100, 0);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-MOV3.Value);
graf.TranslateTransform(-100, 0);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-MOV2.Value);
graf.TranslateTransform(-100, 0);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-MOV.Value);
graf.TranslateTransform(-185, -35);
graf.DrawImage(carro2, 10, 10);
//crea un arreglo con los valores de cada trackbar
byte[] valores = new byte[4];
valores[0] = Convert.ToByte(90 - MOV.Value);
valores[1] = Convert.ToByte(90 - MOV2.Value);
valores[2] = Convert.ToByte(90 - MOV3.Value);
valores[3] = Convert.ToByte(90 - MOV4.Value);
serialPort1.Write(valores, 0, 4);//se envan datos en cadena a travs del puerto serial
ultimoangulo = MOV.Value;
ultimoangulo2 = MOV2.Value;
ultimoangulo3 = MOV3.Value;
ultimoangulo4 = MOV4.Value;
}
}

private void button2_Click(object sender, EventArgs e)
{
this.Close();//termina el proceso de dibujado
}
private void Form1_Load(object sender, EventArgs e)
{

}

}
}
}

2.- Brazo controlado desde arduino simultneamente dibujando en C#:
#include <Servo.h>//se incluye librera

Servo art1; // se declaran las variables de cada servo
Servo art2;
Servo art3;
Servo art4;

int pot1=A0;// se declaran los pines para cada servo
int pot2=A1;
int pot3=A2;
int pot4=A3;

int val1;// se declara una variable entera
int val2;
int val3;
int val4;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);// se llama al puerto serial
}

void loop() {
// put your main code here, to run repeatedly:
val1 =analogRead(pot1);//lectura analgica
val1=map(val1,0,1023,0,179);// convierte el valor ledo del potencimetro a grados
art1.write(val1);/ /escribe el valor
Serial.print("A");
Serial.print(val1);

val2 =analogRead(pot2);
val2=map(val2,0,1023,0,179);
art2.write(val2);
Serial.print("A");
Serial.print(val2);

val3 =analogRead(pot3);
val3=map(val3,0,1023,0,179);
art3.write(val3);
Serial.print("C");
Serial.print(val3);

val4 =analogRead(pot4);
val4=map(val4,0,1023,0,179);
art4.write(val4);
Serial.print("D");
Serial.print(val4);
delay(500);
}


*programacin en Visual Studio mediante C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;


namespace brazoooo
{
public partial class Form1 : Form

{
SerialPort puerto = new SerialPort("COM5", 9600); //define el puerto serial

Graphics graf;
float ultimoAngulo = 1;
float ultimoAngulo2 = 1;
float ultimoAngulo3 = 1;
float ultimoAngulo4 = 1;

Image carro = global::conexion_usb.Properties.Resources.Segmento2BG;//se inserta la
imagen
Image carro2 = global::conexion_usb.Properties.Resources.Segmento1BG;
int art1 = 0;
int art2 = 0;
int art3 = 0;
int art4 = 0;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
puerto.Open();
puerto.DataReceived += lectura;
graf = this.CreateGraphics();
timer1.Enabled = true;
}
private void lectura(Object origen, SerialDataReceivedEventArgs evento)
{
try
{
string cadena = puerto.ReadLine();
String letra = cadena.Substring(0, 1);
int valor = Convert.ToInt16(cadena.Substring(1, cadena.Length - 1));
if (letra == "A")
{
ActualizarLista(valor);
art1= valor;
}
if(letra=="B")
{
ActualizarLista2(valor);
art2= valor;
}
if (letra == "C")
{
ActualizarLista3(valor);
art3= valor;
}
if (letra == "D")
{
ActualizarLista4(valor);
art4= valor;
}

}
catch (Exception)
{

}
}
delegate void delegadoactualiza(int valor);
delegate void delegadoactualiza2(int valor);
delegate void delegadoactualiza3(int valor);
delegate void delegadoactualiza4(int valor);
private void ActualizarLista(int valor){
if (listBox1.InvokeRequired)
{
delegadoactualiza actualizador=new delegadoactualiza(ActualizarLista);
this.Invoke(actualizador, new Object[] {valor});

} else
{
listBox1.Items.Add(valor);
}
}
private void ActualizarLista2(int valor)
{
if (listBox2.InvokeRequired)
{
delegadoactualiza2 actualizador2 = new delegadoactualiza2(ActualizarLista2);
this.Invoke(actualizador2, new Object[] { valor });

}
else
{
listBox2.Items.Add(valor);
}
}
private void ActualizarLista3(int valor)
{
if (listBox3.InvokeRequired)
{
delegadoactualiza3 actualizador3 = new delegadoactualiza3(ActualizarLista3);
this.Invoke(actualizador3, new Object[] { valor });

}
else
{
listBox3.Items.Add(valor);
}
}

private void ActualizarLista4(int valor)
{
if (listBox4.InvokeRequired)// si se mueven los potencimetros la condicin se
cumple.
{
delegadoactualiza4 actualizador4 = new delegadoactualiza4(ActualizarLista4);
this.Invoke(actualizador4, new Object[] { valor });
}
else
{
listBox4.Items.Add(valor);
}
}

private void timer1_Tick(object sender, EventArgs e)
{
if ((ultimoAngulo != art1) || (ultimoAngulo2 != art2) || (ultimoAngulo3 != art3) ||
(ultimoAngulo4 != art4)|| )
{
graf.Clear(Color.Black);// crear rea de grfico y empieza a dibujar
graf.TranslateTransform(185, 35);
graf.RotateTransform(-art1+90);
graf.TranslateTransform(100, 0);
graf.RotateTransform(-art2+90);
graf.TranslateTransform(100, 0);
graf.RotateTransform(-art3+90);
graf.TranslateTransform(100, 0);
graf.RotateTransform(-art4+90);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-(-art4+90));
graf.TranslateTransform(-100, 0);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-(-art3+90));
graf.TranslateTransform(-100, 0);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-(-art2+90));
graf.TranslateTransform(-100, 0);
graf.DrawImage(carro, -26, -26);
graf.RotateTransform(-(-art1+90));
graf.TranslateTransform(-185, -35);
graf.DrawImage(carro2, 10, 10);
ultimoAngulo = art1;
ultimoAngulo2 = art2;
ultimoAngulo3 = art3;
ultimoAngulo4 = art4;

}
}
}
}

Conclusiones:
Los principales problemas que tuvimos fueron la transmisin de datos por el puerto serial y
mandarlo a cada articulacin correspondiente

Otro problema fue actualizar las listas con el mtodo de los delegados.

Otro problema fue el nombre de las variables debido a que escribamos mal.

Lo que se tom en cuenta fue la comunicacin del puerto serial

Você também pode gostar