Tutoriales de Electrónica Básica
TUTORIAL DE CNC:

Aquí comenzamos una nueva sección de la web, pensaba inaugurar otra dedicada exclusivamente a este tema, pero bueno, luego veremos si es necesario o no, por lo pronto aquí queda instalada.

CNC - PROGRAMACION (Parte III) - Programando Pixeles
Programando en VisualBasic - Píxeles

Bienvenidos a la programación en VisualBasic, lo que vimos en páginas anteriores, no son otra cosa que herramientas para la programación, y aquí citaré otras que también nos serán de gran utilidad para comprender el código fuente del programa que desarrollamos con mis alumnos, para el control de nuestra CNC, así que, a ponerle ganas.

Lo primero que se nos ocurrió es que, si la máquina va a graficar una imagen, sería bueno verla mientras la va trazando, y lo que utilizamos para ver el punto exacto donde se encuentra la máquina es un Método llamado PSet.

La sintaxis para dibujar un Píxel es la siguiente...

Objeto.PSet [Step] (x, y), [Color]

(x,y): Valores Requerido de tipo Single, que indican las coordenadas horizontal y vertical del punto que se va a establecer.

Color: Opcional. Valor entero de tipo Long que indica el color RGB especificado para el punto. Si se omite, se usará el valor de la propiedad ForeColor.

Step: Opcional. Es una palabra clave que especifica que las coordenadas son relativas a la posición actual, especificada por las propiedades CurrentX y CurrentY.

Bien, ahora haremos un mini-programa para ejemplificar el uso de PSet. Entonces... Crea un nuevo proyecto y agrégale dos botones al formulario, en la propiedad Caption del botón le pones Punto al primero, y Línea al Segundo. y pegas este código, luego lo ejecutas, y de ahora en más ya puedes jugar con este programa...

  1. Private Sub Command1_Click()
  2.    PSet (1000, 500)
  3. End Sub
  4. -------------------------------
  5. Private Sub Command2_Click()
  6.    For i = 1000 To 2000
  7.       PSet (i, 1000)
  8.    Next
  9. End Sub

Por ejemplo, podríamos hacer que las líneas sean de color rojo, para ello sólo necesitas utilizar la función RGB(nRojo, nVerde, nAzul), donde nRojo,nVerde y nAzul son valores que van de 0 a 255 y representan la intensidad para cada uno de esos colores, otra función similar sería QBColor(CódigoColor), en esta última, CódigoColor es un valor entero entre 0 y 15, deberíamos tener una tabla de colores, no te parece..?, bueno, aquí tienes un ejemplo de estas funciones...

  1. Private Sub Command1_Click()
  2.    PSet (1000, 500), QBColor(12)
  3. End Sub
  4. ------------------------------
  5. Private Sub Command2_Click()
  6.    For i = 1000 To 2000
  7.       PSet (i, 1000), RGB(255, 0, 0)
  8.    Next
  9. End Sub

El argumento Step, la verdad es que aún no lo utilicé, aunque creo que será de gran ayuda cuando nuestro programa lea coordenadas relativas, pero por ahora lo vamos a dejar de lado.

Algo que no dije todavía es que el punto o la coordenada (0,0) se encuentra en la esquina superior izquierda del formulario, o sea aquí...

Ahora bien, si minimizas la ventana y luego la vuelves a restaurar, verás que desaparecieron tanto el punto como la línea que recién habíamos trazado, y esto se debe a que la propiedad AutoRedraw del Formulario está a False, si la cambias a True, VisualBasic guardará la posición de cada uno de esos puntos, y al restaurar el form los volverá a pintar, Prueba...!!!

La velocidad de un bucle For...Next depende de la máquina en la que se encuentre trabajando, de la velocidad de micro, por ejemplo, no es lo mismo una PC de 100 MHz (mi pobre y bien amada AMDK5) que una de 800 MHz (la que estoy usando en este momento), y esto, qué importancia tiene...? dirás...

Bueno, imagínate que debes mover los motores PaP mientras estas trazando la línea, eso significa que debes enviar señales al motor en cada punto que marcas en el form, es algo así comooooo... "Un punto - Un Paso".

El motor deberá alimentar sus bobinas, al hacerlo generará un campo magnético y finalmente se producirá un torque en el interior del motor, haciendo que éste mueva su eje. Pregunta... Si el Motor debe dar 1000 pasos a 800 MHz, ¿lo Hará...?

No te quedes con la duda, prueba...!!!

Qué tal sería hacerlo con un Timer?, bueno, hagamos la prueba, el intervalo mínimo de un Timer es de 1 milisegundo, debes saber que la equivalencia es 1000 ms = 1 Segundo, y veamos cómo se traza la línea (click en la imagen para verlo...).

  1. Option Explicit             'declaración de variables
  2. Dim i As Integer
  3. ----------------------------
  4. Private Sub Command1_Click()
  5.     Timer1.Enabled = True   'habilita el timer
  6.     i = 1000                'el contador empieza en 1000
  7. End Sub
  8. ----------------------------
  9. Private Sub Timer1_Timer()
  10.     PSet (i, 1000), RGB(255, 0, 0)	'pinta un punto
  11.     i = i + 1               'contador se incrementa
  12.     'si llegó a 2001 ese ya no lo pinta y detiene el Timer
  13.     If i = 2001 Then Timer1.Enabled = False
  14. End Sub

Olvidé decir que el Timer queda oculto en modo de ejecución. No olvides agregarlo cuando estés programando.

Hasta aquí, la cantidad de puntos a trazar se encuentra dentro del código, sería mejor si fuera el usuario quien decida cuantos puntos desplazarse, y desde donde hacerlo, algo como lo que sigue.

Programa Trazador de líneas

Bueno, ponle el nombre que quieras, ni yo sé cómo llamarlo, esto es más que nada para jugar un poco con píxeles, no tiene mucho que ver con nuestro objetivo, aunque no estaría mal hacer un programa para eso, pero ya hay un millón de estos y sería una pérdida de tiempo y de neuronas, jaja, las economicemos un poco y utilicemos este programa para practicar, aquí lo tienes...

Esta vez no grafiqué en el Form, sino en un Picture, que como bien sabemos debe tener su propiedad AutoRedraw=True, y su propiedad BackColor está en negro. Ahora veamos los controles que están en el Frame...

Hay una matriz de 8 CommandButton a los cuales los llamé cmdXY, el primero de todos, es decir cmdXY(0) es el que apunta hacia arriba, y girando en sentido horario se encuentra cmdXY(1) y el resto, la propiedad Caption de estos controles son "p,{,u,y,q,x,t,z" que corresponden al tipo de fuente Wingdings 3, el círculo que ves en el centro es un Label que en su propiedad Caption tiene el caracter Å de la fuente Symbol.

El primer TextBox es para cargar el número de puntos a trazar (txtPuntos), el segundo es la velocidad (txtVelocidad), en realidad es el intervalo que utilizará el Timer para marcar cada punto, los otros dos (txtX,txtY) solo indican la posición inicial de trazado, que luego se irá actualizando a medida que vaya trazando una línea.

El botón Limpiar pinta el picture de color negro, es como borrar la imagen que se acaba de trazar, y el Botón Salir, bueno ya sabes...

Lo que no se ve allí, es el Timer, puesto que está en modo de Ejecución, de entrada al iniciar el programa, su propiedad Enabled está a False, y cambiará de estado cuando se presione cualquiera de los 8 controles de desplazamiento.

Ahora nos metemos de cabeza en el código...

Ten en cuenta que el Eje Y está Invertido, y que el desplazamiento será Punto-a-Punto

De lo que vimos en funciones lineales, si la pendiente es cero, tienes 4 posibles sentidos de desplazamiento desde el punto inicial, a saber...

  • Hacia Arriba (y=-1; x=0)
  • Hacia Abajo (y=1; x=0)
  • A la Derecha (y=0; x=1)
  • A la Izquierda (y=0; x=-1)

Si no lo entiendes, deberás volver a ver funciones lineales, creías que no era necesario...???

Vamos por los desplazamientos diagonales. Un desplazamiento será en diagonal cuando la pendiente sea distinta de cero, pero como en este caso es sencillo ya que los desplazamientos diagonales son a 45 grados, el cociente y/x será "1", es decir, cuando te muevas un punto en el Eje X, también deberás hacerlo en el Eje Y.

Pero aquí también tienes 4 posibles sentidos de desplazamientos, a saber...

  • Hacia Arriba y a Derecha (y=-1; x=1)
  • Hacia Abajo y a Derecha (y=1; x=1)
  • Hacia Abajo y a Izquierda (y=1; x=-1)
  • Hacia Arriba y a Izquierda (y=-1; x=-1)

Como habrás notado, el 1 indica en que eje me debo desplazar, podría haber sido 2, pero como el desplazamiento será punto-a-punto, pues debe ser 1, si es 0, significa que ese eje permanecerá sin cambios. El signo, indica el sentido de desplazamiento según los ejes X,Y

No voy a dar un tutorial de VisualBasic, parto de que ya tienes conocimiento de este lenguaje ok...!!!

Como los CommandButton forman una matriz de controles, lo que debes hacer primero, es averiguar cuál de ellos se pulsó, y según el caso asignarle a cada variable el sentido y el valor de desplazamiento que le corresponde, una vez que tengas esas variables cargadas, cargarás el resto de las variables del programa, por ejemplo...

  • El punto inicial, dado por (txtX, txtY)
  • La velocidad o el Intervalo para el Timer, dado por (txtVelocidad)
  • La cantidad de puntos a marcar, dado por (txtPuntos)

Y finalmente habilitar el Timer. Lo que hace el Timer, también es fácil de comprender

Primero, debemos ir mermando los puntos a trazar, luego al punto actual o a la coordenada actual, le sumamos el valor y sentido que le corresponde, y utilizamos esa coordenada como argumento de la instrucción PSet para pintar ese punto, finalmente actualizamos txtX y txtY. Ahora, todo debe terminar cuando el número de puntos a pintar sea cero, en ese caso ponemos la propiedad Enabled del Timer a False y Fin de la historia.

Oye...!!!, y si bajas el programa y lo ves funcionando...?

Descargar

Bueno, llegó el momento de complicar todo lo que vimos hasta ahora, mmmmmmmmm... y si lo hacemos mañana...?, sí mejor lo dejamos aquí.



R-Luis...