• No se han encontrado resultados

CAPTULO IV DESARROLLO

4.3 Desarrollo de la interfaz electrónica

La tarjeta electrónica es realizada con ayuda del programa PCB Wizard ya que ofrece la posibilidad de crear componentes con dimensiones proporcionadas por el diseñador, se necesita crear un componente que cumpla con las características del driver que se utiliza para el control de los motores.

El driver A4988 no es proporcionado por este programa por lo que fue diseñado basado en las características físicas del controlador.

Para la creación de un nuevo componente es necesario abrir un nuevo proyecto y para mayor facilidad en la pestaña View->Grid/snap se selecciona la opción de 0.1 In esto facilita las dimensiones ya que los dispositivos son creados en pulgadas. El espaciamiento entre pines convencional es de 0.1 pulgada por lo que colocamos una

“pad” cada pulgada, enseguida se redimensiona el ancho y el largo para que la

separación entre ellas sea la adecuada. Consecutivamente se crea la parte física, esto sirve como referencia al momento de montar el dispositivo, y para futuros usos es guardado en una de las librerías del programa.

En la figura 34 se muestra el diagrama del circuito en PCB visto desde la cara frontal y es creado cumpliendo las características del diseño del diagrama eléctrico.

La figura 35 muestra el diagrama del circuito impreso visto desde la parte posterior, en esta figura se muestra las pistas del circuito impreso, la distribución de los componentes son adecuados conforme las salidas del microcontrolador, la alimentación es proporcionada por la computadora por medio de un cable USB, para la etapa de potencia se necesita una segunda fuente entre 8 volts y 25 volts.

CONCLUSIONES

La propuesta del sistema mecánico sirve para conocer las características que se necesitan en la interfaz electrónica y las dimensiones de desplazamiento para la interfaz gráfica, ya que a partir del diseño se obtuvo el tipo de motor a utilizar, las dimensiones en las que podrá trabajar el transductor ultrasónico y la distancia mínima entre la adquisición de cada señal.

Con la implementación de la interfaz gráfica garantiza mayor precisión al momento de la toma de señales, además, la interfaz gráfica logra hacer barridos en algún área que se desee y con el espaciamiento entre cada muestra de señal ingresado por el usuario dándole un mayor control al operador.

La interfaz electrónica proporciona la conexión entre la máquina de posicionamiento y la interfaz gráfica, en esta etapa el microcontrolador es el encargado de la manipulación de ambos motores, la adquisición de señal, usando el puerto USB le da

al sistema una mayor portabilidad comparado con un puerto DB – 39 ya que puede

ser manipulado desde una computadora portátil siempre y cuando tenga la interfaz gráfica. Los drivers utilizados para la etapa de potencia de los motores ofrecieron menor dimensión a la interfaz electrónica al momento de la creación del circuito en PCB.

RECOMENDACIONES PARA TRABAJO A FUTURO

Para el sistema de posicionamiento, se necesitan agregar algunas implementaciones que no se incluyen en el presente trabajo por motivo de los alcances del mismo, los cuales son los siguientes:

 Desarrollar la propuesta del sistema mecánico que se ha planteado.

 Creación de la etapa de acondicionamiento de la señal para el transductor ultrasónico.

 Procesamiento de la señal proporcionada por el transductor ultrasónico

Si el diseño del sistema mecánico es modificado para su desarrollo es necesario considerar los cambios tanto en la interfaz electrónica como la interfaz gráfica ya que puede reducir la eficiencia del presente trabajo.

Referencias [1] http://es.wikipedia.org/wiki/Control_numerico [2]http://www.elprisma.com/apuntes/ingenieria_mecanica/controlnumericocnc/default20.asp [3] http://es.wikipedia.org/wiki/Interfaz_gr%C3%A1fica_de_usuario [4] http://www.hipertexto.info/documentos/interfaz.htm [5]http://msdn.microsoft.com/es-MX/library/dd460654.aspx [6]http://msdn.microsoft.com/es-MX/library/dd460654.aspx [7]http://empiezoinformatica.com/2014/04/01/microsoft-visual-c/ [8]http://www.uaeh.edu.mx/docencia/Tesis/icbi/licenciatura/documentos/Soluciones%20de%20softwar e%20libre%20para%20el%20desarrollo%20de%20aplicaciones.pdf [9] http://msdn.microsoft.com/es-es/library/vstudio/bb514232(v=vs.100).aspx [10] http://academica-e.unavarra.es/bitstream/handle/2454/3547/577435.pdf [11] http://i.msdn.microsoft.com/dynimg/IC15013.png [12] http://msdn.microsoft.com/es-es/library/8bxxy49h(v=vs.110).aspx [13] http://www.ceduvirt.com/resources/Microcontroladores.pdf [14] http://www.mikroe.com/img/publication/spa/pic-books/programming-in-basic/chapter/01/fig0-1.gif [15] http://www.unicrom.com/Tut_PICs2.asp [16] http://www.asifunciona.com/electronica/af_conv_ad/conv_ad_5.htm [17] http://galia.fc.uaslp.mx/~cantocar/microprocesadores/EL_Z80_PDF_S/24_ADC.PDF [18] http://www.lu3hba.com.ar/ARTICULOS%2010/UNIVERSAL%20SERIAL%20BUS.pdf [19] http://platea.cnice.mecd.es/~alopez1/ [20] http://server-die.alc.upv.es/asignaturas/lsed/2003-04/0.USB/lsed/topolo.html [21] http://www.otdl.com/Image18.gif [22] http://www.aquihayapuntes.com/indice-practicas-pic-en-c/comunicacion-usb-pic18f4550- utilizando-la-clase-cdc.html [23] http://server-die.alc.upv.es/asignaturas/lsed/2003-04/0.USB/lsed/protoc.html##prot1 [24] http://www.usb.org/developers/hidpage/ [25] http://www.usb.org/developers/devclass_docs/usb-msc-overview-1.3b.pdf [26] http://www.usb.org/developers/devclass_docs/CDC_EEM10.pdf [27] http://serverpruebas.com.ar/news14/nota01/fig01g.jpg [28] http://serverpruebas.com.ar/news14/nota01/fig02g.jpg [29] http://www.todorobot.com.ar/informacion/tutorial%20stepper/bipolar1.jpg [30] http://www.todorobot.com.ar/informacion/tutorial%20stepper/unipolar2.jpg [31] http://www.todorobot.com.ar/informacion/tutorial%20stepper/hbridge.jpg [32] http://www.todorobot.com.ar/informacion/tutorial%20stepper/hbridge2.jpg [33] http://www.todorobot.com.ar/informacion/tutorial%20stepper/fig-3.gif [34] http://www.pololu.com/product/1182 [35]http://bololu-iles.com/picture/0J3360.600.png

Análisis de costos

En este apartado se muestran los costos generados en el desarrollo de este diseño, a continuación se muestra el desglose del costo por rubro para el desarrollo del proyecto.

Tabla 6. Costos de Software utilizado

Nombre del artículo Precio por unidad Subtotal

Microsoft Windows 7

Home Premium $1,500 $1,500

Visual Studio 2012 $4,386 $4,386

CSS C Compiler $2,600 $2,600

Pickit2 $715 $715

PCB Wizard 3.5 Licencia Gratuita $0

ISIS Proteus $6,331 $6,331

MPLab Licencia Gratuita $0

Sketchup 13.0 $7,670 $7,670

Total $23,202

Tabla 7. Costo de la herramienta para la fabricación de la tarjeta electrónica

Nombre del artículo Precio por unidad Cantidad Subtotal

Taladro Dremel $800 1 $800

Cautín $250 1 $250

Soldadura $23 1 $23

Pasta para soldar $12 1 $12

Base de Cautín $48 1 $48

Sujetador de PCB $130 1 $130

Tabla 8. Componentes de la tarjeta electrónica

Nombre del artículo Precio por unidad Cantidad Subtotal

Cloruro Férrico $30 1 $30

Placa fenólica de fibra de

vidrio $35 1 $35

PIC 18F4550 $150 1 $150

Driver A4988 $170 2 $340

Terminales para circuito

impreso 2 tornillos $6 4 $24

LED´s rojo y verde $3 2 $6

USB Hembra tipo B $13 1 $13

Oscilador 20 MHz $16 1 $16

Capacitor 22nF $4 2 $8

Capacitor 100nF $4 1 $4

Resistencias 1kΩ $5 1 $5

Resistencias 220Ω $5 1 $5

Capacitor 100uF 50 volts $35 1 $35

Cable USB 2.0 $49 1 $49

Total $720

Tabla 9. Costo de Recurso del Personal

Recurso personal Precio por hora Horas totales Subtotal

Interfaz Gráfica $50 720 $36,000

Diseño de estructura

mecánica $30 67 $2,010

Diseño y elaboración

del circuito impreso $100 24 $2,400

Tabla 10. Costo de Hardware y utilería

Nombre del artículo Precio por unidad Cantidad Subtotal

Computadora Intel Core i5 RAM 4 GB $7,000 2 $14,000 Papeleria $258 1 $258 Internet $299 8 $2,392 Total $16,650

Tabla 11. Costo total del proyecto

Tipo de Costo Subtotal

Costo de Software utilizado $23,202

Costo de la herramienta para la

fabricación de la tarjeta electrónica $1,263

Componentes de la tarjeta electrónica $630

Costo del recurso del personal $40,410

Costo de Hardware y utilería $720

Anexo A: Código de programación interfaz gráfica using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; using System.Runtime.InteropServices; using MecaniqueUK; using System.Threading; using System.IO; namespace ProgramaTESIS {

publicpartialclass Form1 : Form {

UInt32 controlador; int contador = 0;

double ADCvalue1 = 0; int x_uni,y_uni;//posicion0;

int x_ini, y_ini, x_fin, y_fin, wbarrido, lbarrido; int x_actual=0, y_actual=0;

int flag1 = 1, flag2 = 1,flag3 = 1, flag4 =1,flaguniversal=1; int ADCcontrol = 0;

int controlbarrido = 0, diego = 0, alan = 0, primeraDir = 1; string s, s1;

int etqx, etqy,etq2x, etq2y;

int RANGO_ANCHO = 600, RANGO_ALTO=500;

public Form1() {

InitializeComponent(); }

privatevoid Dispositivo_Conectado(UInt32 handle) {

if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)

{

EasyHID.SetReadNotify(handle, true); controlador = handle;

} }

privatevoid IniciaConexion_Click(object sender, EventArgs e) {

try

{

EasyHID.Connect(Handle);

if (EasyHID.IsAvailable(EasyHID.VENDOR_ID, EasyHID.PRODUCT_ID) == true)

{

habilitar();

MENSAJE_USB.Items.Clear();

MENSAJE_USB.Items.Add("Dispositivo USB Conectado!"); IniciaConexion.Text = "DISPOSITIVO CONECTADO"; IniciaConexion.BackColor = Color.Yellow; IniciaConexion.ForeColor = Color.Black; } else { MENSAJE_USB.Items.Clear();

MENSAJE_USB.Items.Add("Dispositivo no encontrado,"); MENSAJE_USB.Items.Add("controlador conectado..."); IniciaConexion.Text = "CONTROLADOR CONECTADO"; IniciaConexion.BackColor = Color.GreenYellow;

IniciaConexion.ForeColor = Color.Black; }

}

catch { MENSAJE_USB.Items.Add("imposible conectar controlador"); } }

privatevoid Dispositivo_desconectado(UInt32 handle) {

if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)

{

MENSAJE_USB.Items.Clear();

MENSAJE_USB.Items.Add("Dispositivo USB, desconectado."); IniciaConexion.BackColor = Color.Red;

IniciaConexion.ForeColor = Color.White;

IniciaConexion.Text = "CONECTAR DISPOSITIVO"; deshabilitar();

EasyHID.Disconnect(); }

}

protectedoverridevoid WndProc(ref Message message) {

if (message.Msg == EasyHID.WM_HID_EVENT) { switch (message.WParam.ToInt32()) { case EasyHID.NOTIFY_PLUGGED: Dispositivo_Conectado((UInt32)message.LParam.ToInt32()); break; case EasyHID.NOTIFY_UNPLUGGED: Dispositivo_desconectado((UInt32)message.LParam.ToInt32()); break; case EasyHID.NOTIFY_READ: Lee_datos((UInt32)message.LParam.ToInt32()); break; } }

base.WndProc(ref message); }

privatevoid habilitar () { // Origen.Enabled = true; inicia1.Enabled = true; inicia_barrido.Enabled = true; //MENSAJE_USB.Enabled = true; }

privatevoid deshabilitar() { //Origen.Enabled = false; inicia1.Enabled = false; inicia_barrido.Enabled = false; //MENSAJE_USB.Enabled = false; }

privatevoid izquierda() {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x10;

EasyHID.Write(controlador, BufferOUT); }

privatevoid derecha() {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE]; BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x30; EasyHID.Write(controlador, BufferOUT); }

privatevoid arriba() {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x50;

EasyHID.Write(controlador, BufferOUT); }

privatevoid abajo() {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x60;

EasyHID.Write(controlador, BufferOUT); }

privatevoid origenbarrido2() {

x_ini = x_ini - x_actual; int etq2y2 = etq2y - y_actual; if (x_ini > 0) { derecha(); } else { izquierda(); }

if (etq2y > 0) { arriba(); } else { abajo(); }

for (int j = 0; j < (2 * Math.Abs(x_ini)); j++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x20;

EasyHID.Write(controlador, BufferOUT); Thread.Sleep(100);

}

for (int j = 0; j < (2 * Math.Abs(etq2y2)); j++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x40; EasyHID.Write(controlador, BufferOUT); Thread.Sleep(100); } x_actual = etq2x; y_actual = etq2y2; s = x_actual.ToString(); s1 = y_actual.ToString(); posicionX.Text = s; posicionY.Text = s1; }

privatevoid origenbarrido() {

x_ini = x_ini - x_actual; y_ini = y_ini - y_actual; if (x_ini > 0) { derecha(); } else { izquierda(); }

if (y_ini > 0) { arriba(); } else { abajo(); }

for (int j = 0; j < (2 *Math.Abs( x_ini)); j++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x20; EasyHID.Write(controlador, BufferOUT); Thread.Sleep(100); }

for (int j = 0; j < (2 * Math.Abs(y_ini)); j++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A;

BufferOUT[2] = 0x40; EasyHID.Write(controlador, BufferOUT); Thread.Sleep(100); } x_actual = etq2x; y_actual = etq2y; s = x_actual.ToString(); s1 = y_actual.ToString(); posicionX.Text = s; posicionY.Text = s1; }

privatevoid siguientepaso() { etq2x = etq2x + 1; if (etq2x <= x_fin) { derecha(); for (int j = 1; j <= 2; j++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE]; BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x20; EasyHID.Write(controlador, BufferOUT); Thread.Sleep(100); } x_actual = etq2x; y_actual = etq2y; s = x_actual.ToString(); s1 = y_actual.ToString(); posicionX.Text = s; posicionY.Text = s1; } }

privatevoid siguientelinea(){

x_ini = Convert.ToInt32(x_inicioBarrido.Text); x_ini = int.Parse(x_inicioBarrido.Text);

// y_ini = Convert.ToInt32(y_inicioBarrido.Text); //y_ini = int.Parse(y_inicioBarrido.Text);

etq2x = x_ini; etq2y = etq2y +1; if (etq2y <= y_fin) { origenbarrido(); }

else { MessageBox.Show("Barrido Terminado"); controlbarrido = 0; contador = 0; }

}

privatevoid Form1_Load_1(object sender, EventArgs e) {

deshabilitar(); }

privatevoid Desconectar_Click(object sender, EventArgs e) {

EasyHID.Disconnect(); deshabilitar();

IniciaConexion.Text = "CONECTAR NUEVAMENTE"; IniciaConexion.BackColor = Color.Blue;

IniciaConexion.ForeColor = Color.White; MENSAJE_USB.Items.Clear();

MENSAJE_USB.Items.Add("Desconectado Todo!..."); }

privatevoid inicia1_Click(object sender, EventArgs e) {

EstadoMaquina.Items.Add("Maquina Trabajando..."); x_uni = Convert.ToInt32(x_unica.Text);

x_uni = int.Parse(x_unica.Text);

y_uni = Convert.ToInt32(y_unica.Text); y_uni = int.Parse(y_unica.Text);

if (!((x_uni > RANGO_ANCHO) && (y_uni > RANGO_ALTO))) {

etqx = x_uni; etqy = y_uni;

y_uni = y_uni - y_actual; if (x_uni > 0) { derecha(); } else { izquierda(); } if (y_uni > 0) { arriba(); } else { abajo(); }

for (int j = 0; j < (2 *Math.Abs( x_uni)); j++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE]; BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x20; EasyHID.Write(controlador, BufferOUT); Thread.Sleep(100); }

for (int j = 0; j < (2 *Math.Abs( y_uni)); j++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE]; BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x40; EasyHID.Write(controlador, BufferOUT); Thread.Sleep(100); } x_actual = etqx; y_actual = etqy; s = x_actual.ToString(); s1 = y_actual.ToString(); posicionX.Text = s; posicionY.Text = s1; ADCcontrol = 2; }

else { MessageBox.Show("Coordenada fuera de rango vuelva a ingresar"); } }

publicvoid Lee_datos(UInt32 In_handle) {

if ((EasyHID.Read(In_handle, out BufferINP)) == true) { if (controlbarrido == 1) { contador=contador + 1; if (diego == 1) {

ADCvalue1 = (uint)(BufferINP[9] << 8) + BufferINP[10]; ADCvalue1 = (ADCvalue1 * 5) / 1022;

ADCvalue1 = Math.Truncate(100 * ADCvalue1) / 100; string voltaje = ADCvalue1.ToString();

DateTime x = DateTime.Now;

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"test2.txt",

true))

{

file.WriteLine(x+" Valores de barrido:");

file.WriteLine("posicion x:" + x_actual + " posicion y:" + y_actual); file.WriteLine(voltaje + " volts "); } diego = diego + 1; siguientepaso(); } if (contador > 1) {

ADCvalue1 = (uint)(BufferINP[9] << 8) + BufferINP[10]; ADCvalue1 = (ADCvalue1 * 5) / 1022;

ADCvalue1 = Math.Truncate(100 * ADCvalue1) / 100; string voltaje = ADCvalue1.ToString();

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"test2.txt", true)) {

file.WriteLine("posicion x:" + x_actual + " posicion y:" + y_actual); file.WriteLine(voltaje + " volts ");

}

siguientepaso();

if (etq2x == x_fin + 1) { siguientelinea(); } }

}

if (ADCcontrol == 2) { ADCvalue1 = (uint)(BufferINP[9] << 8) + BufferINP[10]; ADCvalue1 = (ADCvalue1 * 5) / 1022;

string voltaje = ADCvalue1.ToString(); DateTime x = DateTime.Now;

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"test.txt", true)) {

file.WriteLine(x);

file.WriteLine("posicion x:"+x_actual+" posicion y:"+y_actual); file.WriteLine(voltaje+" volts ");

}

ADCcontrol = 1;

MessageBox.Show("Medicion tomada"); EstadoMaquina.Items.Add("Terminado"); } if (flaguniversal == 1) { if (BufferINP[1] != (0x01)) { if (flag2 == 1) {

EstadoMaquina.Items.Add("Posicionando en origen..."); flag2 = flag2 + 1;

}

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE]; BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x20; EasyHID.Write(controlador, BufferOUT); } else {

if (flag1 == 1 && BufferINP[1] == 0x01) { EstadoMaquina.Items.Add("Posicion X origen"); flag1++; flag4 = 2; }

}

if (flag4 == 2) {

if (BufferINP[2] != 0x01) {

for (int i = 0; i < 1; i++) {

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE]; BufferOUT[0] = 0;

BufferOUT[1] = 0x0A; BufferOUT[2] = 0x40;

EasyHID.Write(controlador, BufferOUT); //Thread.Sleep(20);

} }

else { if (flag3 == 1) { EstadoMaquina.Items.Add("Posicion Y origen"); flag3++; flag4++; flaguniversal++; } }

} } } }

privatevoid button1_Click(object sender, EventArgs e) {

System.Diagnostics.Process.Start(@"test.txt"); }

privatevoid inicia_barrido_Click(object sender, EventArgs e) {

x_ini = Convert.ToInt32(x_inicioBarrido.Text); x_ini = int.Parse(x_inicioBarrido.Text);

y_ini = Convert.ToInt32(y_inicioBarrido.Text); y_ini = int.Parse(y_inicioBarrido.Text);

x_fin = Convert.ToInt32(x_finBarrido.Text); x_fin = int.Parse(x_finBarrido.Text);

y_fin = Convert.ToInt32(y_finBarrido.Text); y_fin = int.Parse(y_finBarrido.Text);

if (x_ini < RANGO_ANCHO && y_ini < RANGO_ALTO && x_fin < RANGO_ANCHO && y_fin < RANGO_ALTO)

{ etq2x = x_ini; etq2y = y_ini; origenbarrido(); controlbarrido = 1; diego = 1; alan = 1; }

else { MessageBox.Show("Rango de coordenadas no valido"); } }

privatevoid button1_Click_1(object sender, EventArgs e) {

System.Diagnostics.Process.Start(@"test2.txt"); }

privatevoid Form1_FormClosed(Object sender, FormClosedEventArgs e)

{

byte[] BufferOUT = newbyte[EasyHID.BUFFER_OUT_SIZE];

BufferOUT[0] = 0; BufferOUT[1] = 0x0A; BufferOUT[2] = 0x70;

EasyHID.Write(controlador, BufferOUT);

MessageBox.Show("Se desconectara la Interfaz"); EasyHID.Disconnect();

} } }

Anexo B: Código de programación interfaz electrónica

#include <18F4550.h> // Definición de registros internos del PIC18F2550. //#DEVICE ADC=8 // CAD a 8 bits, justificación a a la derecha.

#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha. //#DEVICE ADC=16 // CAD a 10 bits, justificación a a la izquierda.

#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Usamos una frecuencia de trabajo de 48Mhz.

#use delay(clock=48000000)

//===========================================================================

//===================================================================================== ===================

// Incluimos librerías utilizadas por la aplicación.

#include <pic18_usb.h> // Drivers's USB del PIC18F2550.

#include <DECLARACIONES.h> // Definición de funciones y hardware utilizado en el programa.

#include <Descriptor_easyHID.h>

//#include <APLICACION_HID.h> // Descriptores HID del proyecto.

#include <USB.c> // Funciones del USB.

// Usamos fast_io, en los puertos B y C.

#use fast_io(b) #use fast_io(c) #use fast_io(d)

void USB_debug(){

LED_ON(LED_RED); // Enciende el led error y apaga el led USB_OK.

LED_OFF(LED_GREEN);

usb_wait_for_enumeration(); // Espera a ser enumerado por el host.

LED_ON(LED_GREEN); // Enciende el led USB_OK y apaga el led USB_ERROR.

LED_OFF(LED_RED); }

void config_adcon2(void) { #asm movlw 0b10111110 // movlw 0b10111110 iorwf 0xFC0,1 #endasm } //===================================================================================== ======================

void main(void) // Función Principal.

{

int8 recibe[USB_EP1_RX_SIZE]; // Declaramos la variable recibe de 32 bytes.

int8 envia[USB_EP1_TX_SIZE]; // Declaramos la variable envía de 32 bytes.

int8 valor_adc_alta=0; // Contiene el MSB del valor del ADC.

int8 valor_adc_baja=0; // Contiene el LSB del valor del ADC.

// Configuraciones varias.

set_tris_b(0xFF); // Puerto B pines Todos como Entradas.

output_d(0x00); // Inicializamos las salidas a 0.

set_tris_c(0b00111111); // RC6,RC7,como salidas. set_tris_d(0x00); // Puerto D como salidas. setup_adc_ports(AN0_TO_AN2); // Configura canales usados por el ADC.

setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad: relog\64.

config_adcon2(); // Configuramos el ADCON2.

usb_init(); // Inicializamos el stack USB.

usb_task(); // Habilita el periferico usb y las interrupciones.

USB_debug(); // Nos muestra el estado de conección del USB.

while (TRUE) // Bucle

infinito.

{

if(usb_enumerated()) // Si el dispositivo está configurado...

{//output_toggle(PIN_D0);delay_ms(20);

// Leemos el estado de los pulsadores.

if(input_state(SW1)==0x01){delay_ms(20); envia[0]=0x01;}else{envia[0]=0x00;}

//interruptor de limite (eje x)

if(input_state(SW2)==0x01){delay_ms(20); envia[1]=0x01;}else{envia[1]=0x00;}

//interruptor de limite (eje y)

// Leemos canal analógico del PIC.

set_adc_channel(0); // Seleccionamos el canal 0 y comenzamos a leer.

delay_us(10); // Esperamos un tiempo para estabalizar el dato leido.

valor_adc_alta = (read_adc()>>8); // Enviamos la parte alta de la conversión de 10 bits.

valor_adc_baja = (int)(read_adc()); // Enviamos la parte baja de la conversión de 10 bits.

envia[8]=valor_adc_alta; envia[9]=valor_adc_baja;

usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE); // Enviamos el paquete de datos por USB.

if (usb_kbhit(1)) // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.

{

usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE); // En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....

if(recibe[0]==ACTIVA_SALIDAS){ // Si recibe comando de control de salidas...

switch(recibe[1]){ // Según el dato que recibe, controla driver A4988.

case LED_1:

output_bit(PIN_D2,0); // Direccion izquierda (eje x)

break; case LED_2:

output_toggle(PIN_D3); // Pulso step motor(eje x). break; case LED_3: output_bit(PIN_D2,1); // Direccion derecha(eje x). break; case LED_4:

output_toggle(PIN_D1); // Pulso step motor (eje y).

break; case LED_5:

output_bit(PIN_D0,1); // Direccion arriba (eje y).

break; case LED_6:

output_bit(PIN_D0,0); // Direccion abajo (eje y).

break; case LED_7: output_bit(PIN_D0,0); // Inicializa direcciones de motor. output_bit(PIN_D2,0); break; } } } } }

Documento similar