Vous êtes sur la page 1sur 56

Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -1-

PRACTICAS de AUTOMATIZACION INDUSTRIAL PARTE 1


1. EN CADA PRACTICA presentar prototipo virtual y físico , con autocalificacion.
Presentar el informe digital antes de la primera nota una carpeta , todo es por
grupos. Cada practica consta de prototipo virtual y prototipo físico, el prototipo
físico debe contener el informe acompañado de fotos , video para mostrar la
evidencias.
Cada grupo debe presentar un archivo en Word , con una hoja de calificación y su
informe correspondiente para cada practica.

El delegado debe presente los informes digitales de toda la sección ordenados en


directorios por cada grupo acompañados de sus evidencias, firma del profesor , del
delegados, fotos , videos,. La organización valdrá 5 puntos

Se debe entregar al delgado el informe del prootipo físico y virtual se sugiere el siguiente
formato de calificación
UNIVERSIDAD NACIONAL
DE SAN AGUSTIN
ESCUELA PROFESIONAL
DE INGENIERIA
INDUSTRIAL
CURSO AUTOMATIZACION INDUSTRIAL
NRO INTEGRANTESS
1 ALUMNO 1
2 ALUMNO2
3 ALUMNO 3
4 ALUMNO 4
5 ALUMNO 5
Nota Nota
PRACTICA1 Prototipo Virtual pv Pf
simular circuitos de control con
instrumentos de medición en
Proteus
informe en word ( es en otro
archivo . Digital)
justificacion d ela notas

Nota Nota
PRACTICA 2 Prototipo Virtual pv Pf
simular circuitos de control con
instrumentos de medición en
Proteus
informe en word ( es en otro
archivo . Digital)
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -2-

LISTA DE PRACTICAS
Practica1. Cicruito electrónico con instrumentos de medida
Practica 2 hacer funcionar el blink
Practica3 comunicación serial con arduino que tiene las siguientes tareas

a) Pasar inofrmacion digital del exterior al arduino ( arduino lee)


Prender 3 leds desde el exterior puede ser monitor serial ,

b) Pasar información digital del arduino a exterior ( arduino escribe)


c) Pasar información analogica del exterior al arduino ( arduino lee)
Caso de led RGB
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -3-

SOLUCION DE AYUDA MINIMA REQUERIDO . PROTOTIPO VIRTUAL Y FISICO

PRACTICA1. PRACTICA DE ELECTRONICA EN PROTEUS

TAREA 1.
Prototipo Virtual. simular circuitos de control con instrumentos de medición en Proteus (
por esta vez será en grupo por que no hay laboratorio pero se hara preguntas individuales
pag 33 pag 1

Comience con el siguiente circuito

Agregue instrumentos de medida

Uando la ley de OHM verifique los voltajes , la resistencia del led, y la caída de la tensión
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -4-

Realice cálculos con ley de OHM

determinación del amperaje


VOL MARCADO 5
INT MARCADA 12.6 0.0126
Calculando resistencia de led
aprox

2.772

res 2.228 176.825397


0.0126

intensidad 5 0.0126
396.825397
segunda manera de calcular la
resistencia
R V 177.777778
I

Agregue una resistencia variable mueva la resistencia el cambio del brillo del led

Tarea 2. Prototipo Físico.

Realizar el ejercicio anterior en protoboard y compruebe las medidas con el voltimetro.


Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -5-

PRACTICA 2. INICIANDO CON ARDUINO BLINK

Objetivo. Simular el funcionamiento del arduino en forma virtual con proteus y en forma
física . realizando el ejercicio básico del blink

Tarea 1 Prototipo Virtual. hacer funcionar el blink de arduino virtual en proteus


Las indicaciones se encuentran en la guía de practicas 2 pagina 1 al 12, realice los 14
ejercicios del kit básico

Tarea 2 Prototipo Fisico. hacer funcionar el blink de arduino real en fisico

PRACTICA 3. COMUNICACIÓN SERIAL CON ARDUINO

Tarea 1.- LECTURA SERIAL DIGITAL CON ARDUINO


El arduino recibe la señal del exterior. Realice el siguiente ejercicio. (

Se tiene tres focos se tiene el siguiente cuadro de control

FOCO PRENDIDO APAGADO


ROJO A D
VERDE B E
AZUL C F

Explicado en la pagina 19 de la practica 3

Prototipo virtual en Proteus y arduino virtual


Prototipo Fisico en Protoboard y arduino

TAREA 2.- ESCRITURA SERIAL DIGITAL CON ARDUINO

El arduino envía la señal digital al exterior


Explicado en T3 Lectura serial de una entrada digital en pagina 70 de libro de Kit de Arduino
y en la pagina 15 de guía de practicas Nro 2

1. Elaborar el siguiente diagrama en proteus


Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -6-

Ejecute el siguiente codigo en arduino

//Leer una entrada digital y mostrar por la pantalla del computador (consola serial) el estad
o del pulsador cuando es oprimido */
int boton=2; //Pin donde se encuentra el pulsador, entrada
int led =13;
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
pinMode(boton,INPUT); //Configurar el boton como una entrada
pinMode(led,OUTPUT); //Configurar el boton como una entrada
Serial.begin(9600); //Inicia comunicación serial
}
void loop() // Esta funcion se mantiene ejecutando
{ // cuando este energizado el Arduino
//Guardar en una variable entera el valor del boton 0 ó 1
int estado = digitalRead(boton);
digitalWrite(led,estado);
switch(estado)
{ case 0: Serial.println('A'); break;
case 1: Serial.println('B'); break;
}
delay(10); //Retardo para la visualización de datos en la consola
}

Para probar el envio de la señal de Arduino al monitor serial presione o apague el boton
simulado en proteus y vera que envia la letra A o la letra B por el monitor serial.
En HMI ver como Prender un foco desde visual basic

Tarea 3.- TAREA 3 LECTURA SERIAL ANALOGICA CON ARDUINO

Diseño en proteus

CODIGO EN ARDUINO

char Cadena[10]="R123";
char dato;
char letra;
int nro,i;
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -7-

int Rojo=11;
int Verde=10;
int Azul=9;
int valor=0;
void setup() {
pinMode(Rojo,OUTPUT);//D
pinMode(Verde,OUTPUT);//D
pinMode(Azul,OUTPUT);//D
Serial.begin(9600);
}
void loop()
{ i=0;
if (Serial.available() > 0)
{ valor=1;
while (Serial.available() > 0)
{
dato= Serial.read();
delay(5);
if (i==0 )
letra=dato;
else
Cadena[i-1]=dato;
i++;
}
Cadena[i-1]='\n';
Serial.println(Cadena);
nro = ato******************i(Cadena) ;
i=0;
}
if (valor==1)
{
Serial.print(letra);

Serial.println(Cadena);
switch(letra)
{ case 'R': analogWrite(Rojo, nro); break;
case 'V': analogWrite(Verde, nro); break;
case 'A': analogWrite(Azul, nro); break;
}
delay(10);
valor=0;
}
}

Si usted escribe por Ejemplo V234 se prende el led verde a esa intensidad ,

Prototipo Fisico. use un difuminador para ver todos los colores

TAREA 4 LECTURA SERIAL ANALOGICA CON ARDUINO

Pasar información analógica del arduino a exterior ( el arduino escribe)


Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -8-

Elabore el siguiente diagrama en Proteus

El Codigo de Arduino es

int EntradaX =A0;


int EntradaY =A1;
int EntradaZ =A2;
void setup()
{
pinMode(EntradaX, INPUT);
pinMode(EntradaY, INPUT);
pinMode(EntradaZ, INPUT);
Serial.begin(9600); //Inicia comunicación serial
}
void loop() // Esta funcion se mantiene ejecutando
{
int valorX= analogRead(EntradaX);
delay(10);
int valorY= analogRead(EntradaY);
delay(10);
int valorZ= analogRead(EntradaZ);
delay(10);
Serial.print(valorX);
Serial.print(":");
Serial.print(valorY);
Serial.print(":");
Serial.println(valorZ);
}

El Resultado es
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca -9-

En HMI girar el cubo en coordendas XYZ

PRACTICA 4. HMI CON VISUAL Y ARDUINO

Tarea1. Pasar información digital del exterior digital del exterior al arduino con HMI
visual Basic

Prender un led desde el Visual Basic ( aumente para prender varios leds)

Diseñe lo siguiente en un Formulario de Visual Basic 2017

ESCRIBA el siguiente código en Visual Basic

Imports System.IO
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 10 -

Imports System.IO.Ports
Imports System.Threading
Public Class Form1
Shared _continue As Boolean
Shared _serialPort As SerialPort
'Dim Cadena As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "COM4" ' Cambia el Puerto
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default
ListBox1.Items.Add("PUERTO CERRADO")
End Sub
Private Sub Listar(sender As Object, e As EventArgs) Handles BtnListar.Click
' Show all available COM ports.
For Each sp As String In My.Computer.Ports.SerialPortNames
ListBox1.Items.Add(sp)
Next
End Sub

Private Sub BtnAbrir_Click(sender As Object, e As EventArgs) Handles BtnAbrir.Click


SerialPort1.Open()
BtnCerrar.Enabled = True
BtnAbrir.Enabled = False
ListBox1.Items.Add("PUERTO ABIERTO")
End Sub
Private Sub btnPrender_Click(sender As Object, e As EventArgs) Handles
BtnPrender.Click
Me.BackColor = Color.LightGreen
Try
SerialPort1.Write("A")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub btnApagarfoco(sender As Object, e As EventArgs) Handles btnApagar.Click
Me.BackColor = Color.DarkGreen
Try
SerialPort1.Write("B")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub BtnCerrar_Click(sender As Object, e As EventArgs) Handles
BtnCerrar.Click
SerialPort1.Close()
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 11 -

BtnCerrar.Enabled = False
BtnAbrir.Enabled = True
ListBox1.Items.Add("PUERTO CERRADO")
End Sub
End Class

Su salida es

Abra el monitor serial de arduino y abra el Puerto de visual basic y vera que al presionar
abrir puerto y luego click en el botón prender envía la letra A para prender el led y al
hacer clik en el botón apagar envia la letra B para Apagar el Led en Arduino

Diseñe lo siguiente en proteus


Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 12 -

Cierre el puerto serial de arduino para que ocupe visual Basic


Y prenda y apague led desde visual basic ( puede poner mas leds) y ejecute el proteus

El codigo del arduino es

int foco = 13;


void setup()
{
Serial.begin(9600);
pinMode(foco,OUTPUT);
}
void loop() // Esta funcion se mantiene ejecutando
{char leer=Serial.read();
delay(10);
switch(leer)
{case 'A':digitalWrite(foco,HIGH);break;
case 'B':digitalWrite(foco,LOW);break;
}
}
Su ejecución es

Tarea2. Pasar información digital del arduino al exterior con HMI visual Basic( arduino
escribe). Envie por el puerto serial (monitor serial de arduino) una letra y el visual basic
debe recibir. Diseñe el siguiente formulario en visual Basic
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 13 -

SU CODIGO ES

Public Class Form1


Dim cadena As String
Dim letra As String
Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs)
SerialPort1.Close()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "COM4"
' Cambia el Puerto probando con el puerto virtual
SerialPort1.BaudRate = 9600
CheckForIllegalCrossThreadCalls = False
End Sub
Private Sub btnAbrir_Click(sender As Object, e As EventArgs) Handles btnAbrir.Click
Try
SerialPort1.Open()
btnABrir.Enabled = False
btnCerrar.Enabled = True
Catch ex As Exception
MsgBox("ERROR AL ABRIR EL PUERTO")
End Try
End Sub
Private Sub SerialPort1_DataReceived(sender As Object, e As
System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Try
cadena = SerialPort1.ReadLine()
TextBox1.Text = cadena
letra = Mid(cadena, 1, 1)
Select Case letra
Case "A" : btnPrueba.BackColor = Color.LightGreen
Label1.Text = "FOCO PRENDIDO"
Case "B" : btnPrueba.BackColor = Color.DarkGreen
Label1.Text = "FOCO APAGADO"
End Select
Catch ex As Exception
TextBox1.Text = "error"
End Try
End Sub
Private Sub BtnCerrar_Click(sender As Object, e As EventArgs) Handles
BtnCerrar.Click
SerialPort1.Close()
BtnCerrar.Enabled = False
btnAbrir.Enabled = True
Label1.Text = ""
End Sub
Private Sub btnListar_Click(sender As Object, e As EventArgs) Handles btnListar.Click
For Each sp As String In My.Computer.Ports.SerialPortNames
ListBox1.Items.Add(sp)
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 14 -

Next
End Sub
End Class

Su ejecución es

Abra el monitor serial de arduino y envie una seña si el visual basic recibe la letra A
Indica que el foco esta prendido y se recibe la letra B indica que el foco esta apagado

Para simular en proteus diseñe lo siguiente

Su codigo en arduino es

//Leer una entrada digital y mostrar por la pantalla del computador (consola serial) el
estado del pulsador cuando es oprimido */
int boton=2; //Pin donde se encuentra el pulsador, entrada
int led =13;
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
pinMode(boton,INPUT); //Configurar el boton como una entrada
pinMode(led,OUTPUT); //Configurar el boton como una entrada
Serial.begin(9600); //Inicia comunicación serial
}
void loop() // Esta funcion se mantiene ejecutando
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 15 -

{ // cuando este energizado el Arduino


//Guardar en una variable entera el valor del boton 0 ó 1
int estado =!digitalRead(boton);
delay(5);
digitalWrite(led,estado);
switch(estado)
{ case 0: Serial.println('A'); break;
case 1: Serial.println('B'); break;
}
delay(10); //Retardo para la visualización de datos en la consola
}

Cierre su Puerto virtual y realice la comunicación serial con visual Basic

Si se prende un foco en proteus aparece una señal de que el fofo esta prendido

Tarea 3. Pasar información analogica del exterior al arduino ( arduino lee) y usando
HMI Visual Basic( visual Basic escribe)

Diseñe en un formulario de visual Basic lo siguiente:


Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 16 -

Su codigo es

Imports System.Drawing
Imports System.IO
Imports System.IO.Ports
Imports System.Threading
Public Class Form1
Shared _continue As Boolean
Shared _serialPort As SerialPort
Public rojo As Integer
Public verde As Integer
Public azul As Integer
Public CadRojo As String
Public CadVerde As String
Public CadAzul As String
Public contVerde As Integer = 0
Public Velocidad As Integer = 10
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "COM4" ' Cambia elbli Puerto
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default
BtnCerrar.Enabled = False
btnAbrir.Enabled = True
txtRojo.Text = rojo
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 17 -

txtVerde.Text = verde
txtAzul.Text = azul
End Sub

Private Sub BtnCerrar_Click(sender As Object, e As EventArgs) Handles


BtnCerrar.Click
SerialPort1.Close()
BtnCerrar.Enabled = False
btnAbrir.Enabled = True
End Sub
Private Sub btnListar_Click(sender As Object, e As EventArgs) Handles btnListar.Click
For Each sp As String In My.Computer.Ports.SerialPortNames
ListBox1.Items.Add(sp)
Next
End Sub
Private Sub btnAbrir_Click(sender As Object, e As EventArgs) Handles btnAbrir.Click
Try
btnAbrir.Enabled = False
BtnCerrar.Enabled = True
Catch ex As Exception
MsgBox(ex.Message)
End Try
SerialPort1.Open()
End Sub

Private Sub BtnEnviarRojo(sender As Object, e As EventArgs) Handles btnRojo.Click


Try
rojo = Val(txtRojo.Text)
CadRojo = "R" + txtRojo.Text
btnRojo.BackColor = Color.FromArgb(rojo, 0, 0)
btnPrueba.BackColor = Color.FromArgb(rojo, verde, azul)
SerialPort1.WriteLine(CadRojo)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub btnVerde_Click(sender As Object, e As EventArgs) Handles btnVerde.Click


Try
CadVerde = "V" + txtVerde.Text
verde = Val(txtVerde.Text)
btnVerde.BackColor = Color.FromArgb(0, verde, 0)
btnPrueba.BackColor = Color.FromArgb(rojo, verde, azul)
SerialPort1.WriteLine(CadVerde)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub BtnAzul_Click(sender As Object, e As EventArgs) Handles btnAzul.Click


Try
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 18 -

CadAzul = "A" + txtAzul.Text


azul = Val(txtAzul.Text)
btnAzul.BackColor = Color.FromArgb(0, 0, azul)
btnPrueba.BackColor = Color.FromArgb(rojo, verde, azul)
SerialPort1.WriteLine(CadAzul)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


btnObtenerColor.Click
ColorDialog1.ShowDialog()
rojo = ColorDialog1.Color.R
verde = ColorDialog1.Color.G
azul = ColorDialog1.Color.B
txtRojo.Text = rojo
txtVerde.Text = verde
txtAzul.Text = azul
End Sub

Private Sub btnTodo_Click(sender As Object, e As EventArgs) Handles btnTodo.Click


btnVerde_Click(sender, e)
System.Threading.Thread.Sleep(10) ' 1 segundo
BtnEnviarRojo(sender, e)
System.Threading.Thread.Sleep(10) ' 1 segundo
BtnAzul_Click(sender, e)
System.Threading.Thread.Sleep(10) ' 1 segundo
End Sub
End Class

Pruebe el puerto Serial en visual basic ( Sin necesidad de proteus ) solo usando el
monitor serial de arduino.
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 19 -

Para similar en Proteus .Diseñe el siguiente diagrama

El codigo del arduino es

char Cadena[10]="R123";
char dato;
char letra;
int nro,i;
int Rojo=9;
int Verde=10;
int Azul=11;
int valor=0;
void setup() {
pinMode(Rojo,OUTPUT);//D
pinMode(Verde,OUTPUT);//D
pinMode(Azul,OUTPUT);//D
Serial.begin(9600);
}
void loop()
{ i=0;
if (Serial.available() > 0)
{ valor=1;
while (Serial.available() > 0)
{
dato= Serial.read();
delay(5);
if (i==0 )
letra=dato;
else
Cadena[i-1]=dato;
i++;
}
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 20 -

Cadena[i-1]='\n';
Serial.println(Cadena);
nro = atoi(Cadena) ;
i=0;
}
if (valor==1)
{
Serial.print(letra);

Serial.println(Cadena);
switch(letra)
{ case 'R': analogWrite(Rojo, nro); break;
case 'V': analogWrite(Verde, nro); break;
case 'A': analogWrite(Azul, nro); break;
}
delay(10);
valor=0;
Serial.flush();
}
}

Cierre el monitor serial de arduino y pase información de visual basic a proteus

Prototipo físico.- use un difuminador para ver mejor las combinaciones de un


led RGB

Tarea 4. Pasar información analogica del arduino al exterior ( arduino escribe) y


usando HMI Visual Basic( visual Basic lee)

Se tiene los siguientes vértices de un cubo ( puede ser cualquier poliedro) grabe lo
seleccionado en amarillo como archivo de texto llamado vértices puntosCubo.txt
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 21 -

VERTICE X Y Z
0 0 0 0
1 1 0 0
2 1 1 0
3 0 1 0
4 0 0 1
5 1 0 1
6 1 1 1
7 0 1 1

Y los siguientes caras de un cubo ( grabe las celdas pintadas de amarillo como
CarasCubo.txt

CARA 0 1 2 3
0 0 1 2 3
1 1 5 6 2
2 4 5 6 7
3 0 4 7 3
4 3 2 6 7
5 0 1 5 4
Diseñe el siguiente formulario en Visual Basic 2017
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 22 -

La estructura del proyecto es

Y el codigo del programa es ( es codigo simplificado use OpenglGl. Para mas


realismo)

Imports System.Windows.Forms
Imports System.IO
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 23 -

Imports System.IO.Ports
Imports System.Threading
Imports System.Drawing

Public Class frmModelado3D


Shared _continue As Boolean
Shared _serialPort As SerialPort
Public MiFuente As New Font("Verdana", 12, FontStyle.Bold)
Private Sub btnIniciar_Click(sender As Object, e As EventArgs) Handles btnIniciar.Click
ListBox1.Items.Add("ARCHIVO DE PUNTOS ")
RecuperarMatriz(ArchivoPuntos, MVert, NfilasV, NColV)
MostrarMatrizFormulario(MVert, NfilasV, NColV)
ListBox1.Items.Add("ARCHIVO DE CARAS")
RecuperarMatriz(ArchivoCaras, MCaras, NfilasC, NColC)
MostrarMatrizFormulario(MCaras, NfilasC, NColC)
End Sub

Sub Iniciar()
DataGridView1.ColumnCount = 6
DataGridView1.RowCount = 5
Dim fila As Integer
For fila = 1 To 5
DataGridView1.Columns(fila).Width = 50
Next
For fila = 0 To DataGridView1.RowCount - 1
DataGridView1.Rows(fila).HeaderCell.Value = fila.ToString
Next
DataGridView1.Columns(0).HeaderText = "PARAMETROS"
DataGridView1.Columns(1).HeaderText = "UNIDAD"
DataGridView1.Columns(2).HeaderText = "EjeX"
DataGridView1.Columns(3).HeaderText = "Eje Y"
DataGridView1.Columns(4).HeaderText = "Eje Z"
DataGridView1.Columns(5).HeaderText = "VarD o W"

DataGridView1.Rows(0).Cells(0).Value = "ROTACION EJE"


DataGridView1.Rows(0).Cells(1).Value = "Grados"
DataGridView1.Rows(0).Cells(2).Value = AnguloX
DataGridView1.Rows(0).Cells(3).Value = AnguloY
DataGridView1.Rows(0).Cells(4).Value = AnguloZ
DataGridView1.Rows(0).Cells(5).Value = varAngulo
DataGridView1.Rows(1).Cells(0).Value = "TRASLACION EJE"
DataGridView1.Rows(1).Cells(1).Value = "Unidades"
DataGridView1.Rows(1).Cells(2).Value = tx
DataGridView1.Rows(1).Cells(3).Value = ty
DataGridView1.Rows(1).Cells(4).Value = tz
DataGridView1.Rows(1).Cells(5).Value = vart

DataGridView1.Rows(2).Cells(0).Value = "ESCALADO EJE"


DataGridView1.Rows(2).Cells(1).Value = "Unidades"
DataGridView1.Rows(2).Cells(2).Value = ex
DataGridView1.Rows(2).Cells(3).Value = ey
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 24 -

DataGridView1.Rows(2).Cells(4).Value = Ez
DataGridView1.Rows(2).Cells(5).Value = varEsca
DataGridView1.Rows(3).Cells(0).Value = "Modo (0,1) vel "
DataGridView1.Rows(3).Cells(1).Value = "Unidades"
DataGridView1.Rows(3).Cells(5).Value = D
End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As


System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim Cadena As String
Dim Rx, RY, Rz, pos1, pos2 As Integer
Try
Cadena = SerialPort1.ReadLine
txtSeñal.Text = Cadena
pos1 = InStr(Cadena, ":")
If pos1 > 0 Then
Rx = Mid(Cadena, 1, pos1 - 1)
pos2 = InStr(pos1 + 1, Cadena, ":")
If pos2 > 0 Then
RY = Mid(Cadena, pos1 + 1, pos2 - pos1 - 1)
Rz = Mid(Cadena, pos2 + 1)
txtX.Text = Rx
txtY.Text = RY
txtZ.Text = Rz
DataGridView1.Rows(0).Cells(2).Value = Rx
DataGridView1.Rows(0).Cells(3).Value = RY
DataGridView1.Rows(0).Cells(4).Value = Rz
btnTodo_Click(sender, e)
End If
Else
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub TxtEscalado_KeyDown(sender As Object, e As KeyEventArgs) Handles


txtEscalado.KeyDown
ex = DataGridView1.Rows(2).Cells(2).Value
ey = DataGridView1.Rows(2).Cells(3).Value
Ez = DataGridView1.Rows(2).Cells(4).Value
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
If ex >= -limiteex Then
ex = ex - varEsca
Else
ex = limiteex
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If ex <= limiteex Then
ex = ex + varEsca
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 25 -

Else
ex = -limiteex
End If
Case Keys.Y, Keys.Up ' 66 ' B Inverso De Y
If ey >= -limiteey Then
ey = ey - varEsca
Else
ey = limiteey
End If
Case Keys.B, Keys.Down ' traslacion
If ey <= limiteey Then
ey = ey + varEsca
Else
ey = -limiteey
End If
Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C
If Ez >= -100 Then
Ez = Ez - varEsca
Else
Ez = 100
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If Ez <= limiteez Then
Ez = Ez + varEsca
Else
Ez = -limiteez
End If
End Select
DataGridView1.Rows(2).Cells(2).Value = ex
DataGridView1.Rows(2).Cells(3).Value = ey
DataGridView1.Rows(2).Cells(4).Value = Ez
btnTodo_Click(sender, e)
txtEscalado.Text = ""
End Sub

Private Sub frmModelado3D_Load(sender As Object, e As EventArgs) Handles


MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "COM4" ' Cambia el Puerto
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default
CheckForIllegalCrossThreadCalls = False ' Esta línea no le gusta mucho a los
programadores, pero aquí la ponemos para que funcione el Label1
ListBox1.Items.Add("Puerto Abierto")

Form2.Width = ancho
Form2.Height = alto
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 26 -

grafico = Form2.CreateGraphics()
brocha = New SolidBrush(Color.Yellow)
'borrador = New SolidBrush(Color.Blue)
pluma = New Pen(Color.Red, 2)
Iniciar()
End Sub
Sub GraficarVertices(MvertW(,) As String, nvert As Integer)
Dim fila As Integer
Dim Px, Py, x, y, z As Single
For fila = 0 To nvert - 1
x = MvertW(fila, 0)
y = MvertW(fila, 1)
z = MvertW(fila, 2)
Px = x * D / (D + z)
Py = y * D / (D + z)
grafico.DrawEllipse(pluma, cx + Px, cy + Py, 5, 5)
grafico.DrawString(fila, MiFuente, brocha, cx + Px, cy + Py)
Next
End Sub

Private Sub btnActualizarTodo_Click(sender As Object, e As EventArgs) Handles


btnActualizarTodo.Click
AnguloX = DataGridView1.Rows(0).Cells(2).Value
AnguloY = DataGridView1.Rows(0).Cells(3).Value
AnguloZ = DataGridView1.Rows(0).Cells(4).Value
varAngulo = DataGridView1.Rows(0).Cells(5).Value
tx = DataGridView1.Rows(1).Cells(2).Value
ty = DataGridView1.Rows(1).Cells(3).Value
tz = DataGridView1.Rows(1).Cells(4).Value
vart = DataGridView1.Rows(0).Cells(5).Value
ex = DataGridView1.Rows(2).Cells(2).Value
ey = DataGridView1.Rows(2).Cells(3).Value
Ez = DataGridView1.Rows(2).Cells(4).Value
varEsca = DataGridView1.Rows(2).Cells(5).Value
D = DataGridView1.Rows(3).Cells(5).Value
End Sub
Private Sub Rotacion(sender As Object, e As Windows.Forms.KeyEventArgs) Handles
txtRot.KeyDown
AnguloX = DataGridView1.Rows(0).Cells(2).Value
AnguloY = DataGridView1.Rows(0).Cells(3).Value
AnguloZ = DataGridView1.Rows(0).Cells(4).Value
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
If AnguloX >= -3600 Then
AnguloX = AnguloX - varAngulo
Else
AnguloX = 3600
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If AnguloX <= 3600 Then
AnguloX = AnguloX + varAngulo
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 27 -

Else
AnguloX = 0
End If
Case Keys.B, Keys.Down ' 66 ' B Inverso De Y
If AnguloY >= -3600 Then
AnguloY = AnguloY - varAngulo
Else
AnguloY = 3600
End If
Case Keys.Y, Keys.Up ' ROTACION EJE Y
If AnguloY <= 3600 Then
AnguloY = AnguloY + varAngulo
Else
AnguloY = 0
End If
Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C
If AnguloZ >= -36000 Then
AnguloZ = AnguloZ - varAngulo
Else
AnguloZ = 3600
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If AnguloZ <= 3600 Then
AnguloZ = AnguloZ + varAngulo
Else
AnguloZ = 0
End If
End Select
DataGridView1.Rows(0).Cells(2).Value = AnguloX
DataGridView1.Rows(0).Cells(3).Value = AnguloY
DataGridView1.Rows(0).Cells(4).Value = AnguloZ
btnTodo_Click(sender, e)
txtRot.Text = ""
End Sub
Private Sub txtTraslacion_KeyDown(sender As Object, e As KeyEventArgs) Handles
txtTras.KeyDown
tx = DataGridView1.Rows(1).Cells(2).Value
ty = DataGridView1.Rows(1).Cells(3).Value
tz = DataGridView1.Rows(1).Cells(4).Value
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
If tx >= -limitetx Then
tx = tx - vart
Else
tx = limitetx
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If tx <= limitetx Then
tx = tx + vart
Else
tx = -limitetx
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 28 -

End If
Case Keys.Y, Keys.Up ' 66 ' B Inverso De Y
If ty >= -limitety Then
ty = ty - vart
Else
ty = limitety
End If
Case Keys.B, Keys.Down ' traslacion
If ty <= limitety Then
ty = ty + vart
Else
ty = -limitety
End If
Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C
If tz >= -100 Then
tz = tz - vart
Else
tz = 100
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If tz <= limitetz Then
tz = tz + vart
Else
tz = -limitetz
End If
End Select
DataGridView1.Rows(1).Cells(2).Value = tx
DataGridView1.Rows(1).Cells(3).Value = ty
DataGridView1.Rows(1).Cells(4).Value = tz
btnTodo_Click(sender, e)
txtTras.Text = ""
End Sub
Sub Proceso(Mvert(,) As String, MVertW(,) As String, NfilasV As Integer, NcolV As
Integer)
CopiarMatrices(Mvert, MVertW, NfilasV, NcolV)
RotacionXYZ(MVertW, AnguloX, AnguloY, AnguloZ, NfilasV)
EscaladoXYZ(MVertW, ex, ey, Ez, NfilasV)
TraslacionXYZ(MVertW, tx, ty, tz, NfilasV)
End Sub
Private Sub btnProcesar_Click(sender As Object, e As EventArgs) Handles
btnProcesar.Click
Proceso(MVert, MVertW, NfilasV, NColV)
End Sub
Sub MostrarMatrizFormulario(A(,) As String, nf As Integer, nc As Integer)
Dim fila, col As Integer
Dim cadena As String
For fila = 0 To nf - 1
cadena = ""
For col = 0 To nc - 1
cadena = cadena & A(fila, col) & vbTab
Next
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 29 -

ListBox1.Items.Add(cadena)
Next
End Sub

Sub GraficarCaras(MvertW(,) As String, MCaras(,) As String,


NfCaras As Integer, ncCaras As Integer)
Dim fila, col, ini, fin As Integer
Dim x1, y1, x2, y2, xa, ya, za, xb, yb, zb As Single
For fila = 0 To NfCaras - 1
For col = 0 To ncCaras - 2
ini = MCaras(fila, col)
fin = MCaras(fila, col + 1)
xa = MvertW(ini, 0)
ya = MvertW(ini, 1)
za = MvertW(ini, 2)
xb = MvertW(fin, 0)
yb = MvertW(fin, 1)
zb = MvertW(fin, 2)
x1 = xa * D / (D + za)
y1 = ya * D / (D + za)
x2 = xb * D / (D + zb)
y2 = yb * D / (D + zb)
grafico.DrawLine(pluma, cx + x1, cy + y1, cx + x2, cy + y2)
Next
ini = MCaras(fila, 0)
fin = MCaras(fila, ncCaras - 1)
xa = MvertW(ini, 0)
ya = MvertW(ini, 1)
za = MvertW(ini, 2)
xb = MvertW(fin, 0)
yb = MvertW(fin, 1)
zb = MvertW(fin, 2)
x1 = xa * D / (D + za)
y1 = ya * D / (D + za)
x2 = xb * D / (D + zb)
y2 = yb * D / (D + zb)
grafico.DrawLine(pluma, cx + x1, cy + y1, cx + x2, cy + y2)
Next
End Sub
Private Sub btnTodo_Click(sender As Object, e As EventArgs) Handles btnTodo.Click
grafico.Clear(Color.Black)
btnIniciar_Click(sender, e)
btnActualizarTodo_Click(sender, e)
Proceso(MVert, MVertW, NfilasV, NColV)
GraficarVertices(MVertW, NfilasV)
NfilasC = 4
GraficarCaras(MVertW, MCaras, NfilasC, NColC)
End Sub

Private Sub btnListar_Click(sender As Object, e As EventArgs) Handles btnListar.Click


For Each sp As String In My.Computer.Ports.SerialPortNames
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 30 -

ListBox1.Items.Add(sp)
Next
End Sub

Private Sub btnAbrir_Click(sender As Object, e As EventArgs) Handles btnAbrir.Click


SerialPort1.Open()
btnCerrar.Enabled = True
btnAbrir.Enabled = False
ListBox1.Items.Add("Puerto Abierto")
End Sub

Private Sub btnCerrar_Click(sender As Object, e As EventArgs) Handles


btnCerrar.Click
SerialPort1.Close()
btnCerrar.Enabled = False
btnAbrir.Enabled = True
ListBox1.Items.Add("Puerto Cerrado")
End Sub

Private Sub btnObtener_Click(sender As Object, e As EventArgs) Handles


btnObtener.Click
Dim Cadena, C As String
Dim Rx, RY, Rz, pos1, pos2 As Integer
Cadena = txtSeñal.Text
pos1 = InStr(Cadena, ":")
Rx = Mid(Cadena, 1, pos1 - 1)
pos2 = InStr(pos1 + 1, Cadena, ":")
RY = Mid(Cadena, pos1 + 1, pos2 - pos1 - 1)
Rz = Mid(Cadena, pos2 + 1)
txtX.Text = Rx
txtY.Text = RY
txtZ.Text = Rz
DataGridView1.Rows(0).Cells(2).Value = Rx
DataGridView1.Rows(0).Cells(3).Value = RY
DataGridView1.Rows(0).Cells(4).Value = Rz
btnTodo_Click(sender, e)
End Sub

Private Sub btnAbrirForm2_Click(sender As Object, e As EventArgs) Handles


btnAbrirForm2.Click
Form2.Show()
End Sub
End Class

CODIGO DEL MODULO 1

Module MODULE1
Sub Main()
Console.WriteLine("ARCHIVO DE PUNTOS ")
RecuperarMatriz(ArchivoPuntos, MVert, NfilasV, NColV)
MostrarMatriz(MVert, NfilasV, NColV)
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 31 -

Console.WriteLine("ARCHIVO DE CARAS")
RecuperarMatriz(ArchivoCaras, MCaras, NfilasC, NColC)
MostrarMatriz(MCaras, NfilasC, NColC)
Console.ReadLine()
End Sub
End Module

CODIGO DEL MODULO 2

Module Module2
Sub EscaladoXYZ(MVW(,) As String, ByVal Ex As Single,
ByVal Ey As Single, ByVal Ez As Single, nf As Integer)
Dim fila As Integer
For fila = 0 To nf - 1
MVW(fila, 0) = MVW(fila, 0) * Ex
MVW(fila, 1) = MVW(fila, 1) * Ey
MVW(fila, 2) = MVW(fila, 2) * Ez
Next
End Sub
Sub CopiarMatrices(Mvert(,) As String, MvertW(,) As String, nf As Integer, nc As
Integer)
Dim fila, col
For fila = 0 To nf - 1
For col = 0 To nc - 1
MvertW(fila, col) = Mvert(fila, col)
Next
Next
End Sub
Sub TraslacionXYZ(MVW(,) As String, ByVal tx As Single, ByVal ty As Single, ByVal tz
As Single, nf As Integer)
Dim fila As Integer
For fila = 0 To nf - 1
MVW(fila, 0) = MVW(fila, 0) + tx
MVW(fila, 1) = MVW(fila, 1) + ty
MVW(fila, 2) = MVW(fila, 2) + tz
Next
End Sub
Sub RotacionXYZ(MVW(,) As String, ByVal AnguloX As Single,
ByVal AnguloY As Single, ByVal anguloZ As Single, nf As Integer)
Dim x1 As Single, y1 As Single, z1 As Single
Dim x2 As Single, y2 As Single, z2 As Single
Dim fila As Integer = 0
REM rotacion X
Dim arx = AnguloX * Math.PI / 180
For fila = 0 To nf - 1
x1 = MVW(fila, 0)
y1 = MVW(fila, 1)
z1 = MVW(fila, 2)
x2 = x1
y2 = CSng(y1 * Math.Cos(arx) - z1 * Math.Sin(arx))
z2 = CSng(y1 * Math.Sin(arx) + z1 * Math.Cos(arx))
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 32 -

MVW(fila, 0) = x2
MVW(fila, 1) = y2
MVW(fila, 2) = z2
Next
REM rotacion Y
Dim ary = AnguloY * Math.PI / 180
For fila = 0 To nf - 1
x1 = MVW(fila, 0)
y1 = MVW(fila, 1)
z1 = MVW(fila, 2)
x2 = CSng(x1 * Math.Cos(ary) - z1 * Math.Sin(ary))
y2 = y1
z2 = CSng(-x1 * Math.Sin(ary) + z1 * Math.Cos(ary))
MVW(fila, 0) = x2
MVW(fila, 1) = y2
MVW(fila, 2) = z2
Next
REM rotacion Z
Dim arz = anguloZ * Math.PI / 180
For fila = 0 To nf - 1
x1 = MVW(fila, 0)
y1 = MVW(fila, 1)
z1 = MVW(fila, 2)
x2 = CSng(x1 * Math.Cos(arz) - y1 * Math.Sin(arz))
y2 = CSng(x1 * Math.Sin(arz) + y1 * Math.Cos(arz))
z2 = z1
MVW(fila, 0) = x2
MVW(fila, 1) = y2
MVW(fila, 2) = z2
Next
End Sub
End Module

CODIGO DEL MODULO 3

}Imports System.Drawing
Imports System.IO
Module Module3
Public Const limitetx As Integer = 500
Public Const limitety As Integer = 500
Public Const limitetz As Integer = 500
Public Const limiteex As Integer = 500
Public Const limiteey As Integer = 500
Public Const limiteez As Integer = 500
Public NfilasV As Integer
Public NColV As Integer
Public NfilasC As Integer
Public NColC As Integer
Public ArchivoPuntos As String = "C:\datos1\puntosCubo.txt"
Public ArchivoCaras As String = "C:\datos1\CarasCubo.txt"
Public tx As Single = 0
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 33 -

Public ty As Single = 0
Public tz As Single = 0
Public AnguloX As Integer = 0
Public AnguloY As Integer = 0
Public AnguloZ As Integer = 0
Public Const maxfilas As Integer = 8
Public Const maxcol As Integer = 4
Public MVert(maxfilas, maxcol) As String
Public MVertW(maxfilas, maxcol) As String
Public Const ancho As Integer = 600
Public Const alto As Integer = 600
Public MCaras(maxfilas, maxcol) As String
Public grafico As Graphics
Public brocha As SolidBrush
Public pluma As Pen
Public ex As Single = 100
Public ey As Single = 100
Public Ez As Single = 100
Public cx As Integer = 200 'ancho / 2
Public cy As Integer = 200 ' alto / 2
Public cont As Integer = 0
Public varAngulo As Single = 10
Public vart As Single = 10
Public varEsca As Single = 1
Public D As Single = 1000
End Module

CODIGO DEL MODULO 4

Imports System.IO
Module Module4
Function ContarLetra(Cadena As String, letra As Char)
Dim LARGO As Integer = Len(Cadena)
Dim cont, cant As Integer
For cont = 0 To LARGO - 1
If Cadena(cont) = letra Then
cant = cant + 1
End If
Next
Return cant
End Function

Sub RecuperarMatriz(ByVal nombrearchivo As String, ByRef A(,) As String, ByRef nf As


Integer, ByRef nc As Integer)
Dim srLector As StreamReader
srLector = New StreamReader(nombrearchivo)
Dim fila As Integer, col As Integer
Dim cadena As String = ""
Dim subcadena As String
Dim pos As Integer = 0
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 34 -

Dim inicio As Integer = 1


cadena = srLector.ReadLine()
nc = ContarLetra(cadena, vbTab) + 1
Do While Not (cadena = "")
cadena = cadena & vbTab
inicio = 1
For col = 0 To nc - 1
pos = InStr(inicio, cadena, Chr(9))
subcadena = Mid(cadena, inicio, pos - inicio)
A(fila, col) = Val(subcadena)
inicio = pos + 1
Next
fila = fila + 1
cadena = srLector.ReadLine()
Loop
nf = fila
Console.WriteLine("Archivo leido satisfactoriamente")
srLector.Close()
End Sub

Sub MostrarMatriz(A(,) As String, nf As Integer, nc As Integer)


Dim fila, col As Integer
For fila = 0 To nf - 1
For col = 0 To nc - 1
Console.Write("{0} {1}", A(fila, col), vbTab)
Next
Console.WriteLine()
Next
End Sub
End Module

Ejecute la aplicacion

Clik en abrir formulario 1. Y se abre el formulario 1


Clik en botón todo y grafica un cubo en formulario 2
Rote el cubo poniendo el cursorr en la caja de texto txtrot. Se observa los cambio de los
angulos de rotación en la cuadricula

Mueva el cubo poniendo el cursor en la caja de texto txtTraslacion Se observa los


cambios de posición tx,ty,tz en la cuadricula

Escale el cubo poniendo el cursor en la caja de texto txtEscalado Se observa los


cambios de escalado ex,ey,ez en la cuadricula

Al presioanr el botón obtener se obtiene las coordendas x,y,z de la cadena enviada a


visual basic,puede usted cambiar una parte de la coordenadas y luego presioanr obtener
y se modificación del grafico del cubo

Abra el monitor serial del arduino se va simular use Vsp. Y pase información por ese
monitor por ejmplo la cadena 45:45:15 ( giro en eje X 45 grados, giro en Eje Y a 45
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 35 -

grados, giro en eje z A 15 grados) primero presione el botón abrir puerto y luego send y
vera usted que rota el cubo a esos valores

Implemente la simulación en proteus . es el mismo ejercicio de


TAREA 4 LECTURA SERIAL ANALOGICA CON ARDUINO

Pasar información analógica del arduino a exterior ( el arduino escribe)


Elabore el siguiente diagrama en Proteus

El Codigo de Arduino es

int EntradaX =A0;


int EntradaY =A1;
int EntradaZ =A2;
void setup()
{
pinMode(EntradaX, INPUT);
pinMode(EntradaY, INPUT);
pinMode(EntradaZ, INPUT);
Serial.begin(9600); //Inicia comunicación serial
}
void loop() // Esta funcion se mantiene ejecutando
{
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 36 -

int valorX= analogRead(EntradaX);


delay(10);
int valorY= analogRead(EntradaY);
delay(10);
int valorZ= analogRead(EntradaZ);
delay(10);
Serial.print(valorX);
Serial.print(":");
Serial.print(valorY);
Serial.print(":");
Serial.println(valorZ);
}

El Resultado es

Cierre el monitor serial de arduino para que lo emplee el proteus y vea el resultado al
mover los potenciómetros rota el cubo
Arregle las 3 ventanas para una mejor vision

Siga trabajando en este proyecto use OPengl, Blender


Prototipo Fisico. Lo mismo pero en físico los potenciómetros simulan los sensores
Rote los cubo con tres sensores de distancia.

En HMI girar el cubo en coordendas XYZ

TRABAJO CAS DOMOTICAS


Elbore un plano de visual basic enviar la señal a la prototipo por ejemplo la luz de
la cocina
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 37 -

Al revez , prender la luz de la cocina en el prototipo en blender


Hacer lo

Tarea 4. Alternativo . Pasar información analogica del arduino al exterior ( arduino


escribe) y usando HMI Visual Basic( visual Basic lee).
Realice una prueba de realidad virtual. Con arduino y HMI Visual Basic.

EL CODIGO DE VISUA BASIC ES

Imports System.IO
Imports System.IO.Ports
Imports System.Threading
Imports System.Drawing

Public Class Form1

Shared _continue As Boolean


Shared _serialPort As SerialPort

Public ancho As Integer = 600


Public alto As Integer = 600
Public pluma As Pen

Public nombre As String


Public grafico2 As Graphics
Public grafico1 As Graphics
Public myBitmap As Bitmap
Public RectFuente As Rectangle
Public RectDestino As Rectangle
Public Tx As Single = 0
Public Ty As Single = 0
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 38 -

Public Tz As Single = 0
Public Vart As Single = 1
Public limite As Single = 1024
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.PortName = "COM4" ' Cambia el Puerto
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
SerialPort1.Encoding = System.Text.Encoding.Default
CheckForIllegalCrossThreadCalls = False ' Esta línea no le gusta mucho a los
programadores, pero aquí la ponemos para que funcione el Label1
ListBox1.Items.Add("Puerto Abierto")
grafico1 = PictureBox1.CreateGraphics
Form2.Width = ancho
Form2.Height = alto
pluma = New Pen(Color.Red, 2)
grafico2 = Form2.CreateGraphics
Form2.Show()
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As
System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim pos1, pos2 As Integer
Dim Cadena, Rx, RY, Rz As String
Try
txtMensaje.Text = SerialPort1.ReadLine
Cadena = txtMensaje.Text
pos1 = InStr(Cadena, ":")
Rx = Mid(Cadena, 1, pos1 - 1)
pos2 = InStr(pos1 + 1, Cadena, ":")
RY = Mid(Cadena, pos1 + 1, pos2 - pos1 - 1)
Rz = Mid(Cadena, pos2 + 1)
TxtRx.Text = Rx
txtRy.Text = RY
txtRz.Text = Rz
txtTx.Text = TxtRx.Text
txtTy.Text = txtRy.Text
txttz.Text = txtRz.Text
enviar_Click(sender, e)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub enviar_Click(sender As Object, e As EventArgs) Handles BtnEnviar.Click


btnAbrir_Click(sender, e)
Tx = Val(txtTx.Text)
Ty = Val(txtTy.Text)
Tz = Val(txttz.Text)
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 39 -

grafico1.DrawRectangle(pluma, Tx, Ty, Tz, Tz)


RectFuente = New Rectangle(Tx, Ty, Tz, Tz)
RectDestino = New Rectangle(0, 0, ancho, alto)
grafico2.DrawImage(myBitmap, RectDestino, RectFuente, GraphicsUnit.Pixel)
End Sub

Private Sub btnBorrar_Click(sender As Object, e As EventArgs) Handles btnBorrar.Click


grafico2.Clear(Color.Black)
End Sub

Private Sub btnAbrir_Click(sender As Object, e As EventArgs) Handles btnAbrir.Click


'grafico2.ResetTransform()
nombre = "c:\DATOS1\cuzco1.bmp"
myBitmap = New Bitmap(nombre)
grafico1.DrawImage(myBitmap, 0, 0)

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnListar.Click


For Each sp As String In My.Computer.Ports.SerialPortNames
ListBox1.Items.Add(sp)
Next

End Sub

Private Sub btnAbrirPuerto_Click(sender As Object, e As EventArgs) Handles


btnAbrirPuerto.Click
SerialPort1.Open()
btnCerrarPuerto.Enabled = True
btnAbrirPuerto.Enabled = False
ListBox1.Items.Add("Puerto Abierto")

End Sub

Private Sub btnCerrarPuerto_Click(sender As Object, e As EventArgs) Handles


btnCerrarPuerto.Click
SerialPort1.Close()
btnCerrarPuerto.Enabled = False
btnAbrirPuerto.Enabled = True
ListBox1.Items.Add("Puerto Cerrado")

End Sub

Private Sub txttraslac_KeyDown(sender As Object, e As KeyEventArgs) Handles


txttraslac.KeyDown
Tx = txtTx.Text
Ty = txtTy.Text
Tz = txttz.Text
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 40 -

If Tx > Vart Then


Tx = Tx - Vart
Else
Tx = 0
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If Tx < limite Then
Tx = Tx + Vart
Else
Tx = 0
End If
Case Keys.Y, Keys.Up ' 66 ' B Inverso De Y
If Ty > Vart Then
Ty = Ty - Vart
Else
Ty = 0
End If
Case Keys.B, Keys.Down ' traslacion
If Ty < limite Then
Ty = Ty + Vart
Else
Ty = 0
End If
Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C
If Tz > Vart Then
Tz = Tz - Vart
Else
Tz = 0
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If Tz < limite Then
Tz = Tz + Vart
Else
Tz = 0
End If
End Select
txtTx.Text = Tx
txtTy.Text = Ty
txttz.Text = Tz
txttraslac.Text = ""
enviar_Click(sender, e)
End Sub

Private Sub btnObtenerDatos(sender As Object, e As EventArgs) Handles


btnObtener.Click
Dim pos1, pos2 As Integer
Dim Cadena, Rx, RY, Rz As String
Cadena = txtMensaje.Text
pos1 = InStr(Cadena, ":")
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 41 -

Rx = Mid(Cadena, 1, pos1 - 1)
pos2 = InStr(pos1 + 1, Cadena, ":")
RY = Mid(Cadena, pos1 + 1, pos2 - pos1 - 1)
Rz = Mid(Cadena, pos2 + 1)
TxtRx.Text = Rx
txtRy.Text = RY
txtRz.Text = Rz
txtTx.Text = TxtRx.Text
txtTy.Text = txtRy.Text
txttz.Text = txtRz.Text

End Sub
End Class

TAREA 4 LECTURA SERIAL ANALOGICA CON ARDUINO

Pasar información analógica del arduino a exterior ( el arduino escribe)


Elabore el siguiente diagrama en Proteus

El Codigo de Arduino es

int EntradaX =A0;


int EntradaY =A1;
int EntradaZ =A2;
void setup()
{
pinMode(EntradaX, INPUT);
pinMode(EntradaY, INPUT);
pinMode(EntradaZ, INPUT);
Serial.begin(9600); //Inicia comunicación serial
}
void loop() // Esta funcion se mantiene ejecutando
{
int valorX= analogRead(EntradaX);
delay(10);
int valorY= analogRead(EntradaY);
delay(10);
int valorZ= analogRead(EntradaZ);
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 42 -

delay(10);
Serial.print(valorX);
Serial.print(":");
Serial.print(valorY);
Serial.print(":");
Serial.println(valorZ);
}

El Resultado es

La solución es
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 43 -

BIBLIOGRAFIA
1. Tiendaderobotica.com. Guía Básica de Arduino.(Libro Kit Básico Pdf) 2014
Oscar Torrente Artero . Curso Arduino/ Curso practico de formcion .ALfaomega mexico
REVISION grupos a y c 30 de setiemrbe
Grupos cy jueves 03 de octubre del 2019

TAREA MODIFICADO DE HMI Y ARDUINO +BLENDER

Este programa es modificado de comunicación serial arduino HMI visual Basic y las
librerías OPENGL modificado de la pag 37
Se pide
Terminar el programa agregando luces
Hacer interface con el arduino usando potenciómetros y luego sensores de distancia
Hacer lo mismo pero con blender

Diseño del formulario


Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 44 -

Estructura del proyecto

CODIGO DEL FORMULARIO

Imports System.Drawing
Imports System.Windows.Forms
Imports Tao.Platform.Windows
Imports System.Windows
Public Class Form1
Dim Opengl As OGL
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 45 -

Sub MostrarMatrizFormulario(A(,) As String, nf As Integer, nc As Integer)


Dim fila, col As Integer
Dim cadena As String
For fila = 0 To nf - 1
cadena = ""
For col = 0 To nc - 1
cadena = cadena & A(fila, col) & vbTab
Next
ListBox1.Items.Add(cadena)
Next
End Sub

Private Sub btnIniciar_Click(sender As Object, e As EventArgs) Handles btnIniciar.Click


Iniciar()
End Sub
Sub Iniciar()
DataGridView1.ColumnCount = 6
DataGridView1.RowCount = 4
Dim fila As Integer
For fila = 1 To 5
DataGridView1.Columns(fila).Width = 32
Next
For fila = 0 To DataGridView1.RowCount - 1
DataGridView1.Rows(fila).HeaderCell.Value = fila.ToString
Next
DataGridView1.Columns(0).HeaderText = "PARAMETROS"
DataGridView1.Columns(1).HeaderText = "UNIDAD"
DataGridView1.Columns(2).HeaderText = "EjeX"
DataGridView1.Columns(3).HeaderText = "Eje Y"
DataGridView1.Columns(4).HeaderText = "Eje Z"
DataGridView1.Columns(5).HeaderText = "VarD o W"

DataGridView1.Rows(0).Cells(0).Value = "ROTACION EJE"


DataGridView1.Rows(0).Cells(1).Value = "Grados"
DataGridView1.Rows(0).Cells(2).Value = AnguloX
DataGridView1.Rows(0).Cells(3).Value = AnguloY
DataGridView1.Rows(0).Cells(4).Value = AnguloZ
DataGridView1.Rows(0).Cells(5).Value = varAngulo

DataGridView1.Rows(1).Cells(0).Value = "TRASLACION EJE"


DataGridView1.Rows(1).Cells(1).Value = "Unidades"
DataGridView1.Rows(1).Cells(2).Value = tx
DataGridView1.Rows(1).Cells(3).Value = ty
DataGridView1.Rows(1).Cells(4).Value = tz
DataGridView1.Rows(1).Cells(5).Value = vart

DataGridView1.Rows(2).Cells(0).Value = "ESCALADO EJE"


DataGridView1.Rows(2).Cells(1).Value = "Unidades"
DataGridView1.Rows(2).Cells(2).Value = ex
DataGridView1.Rows(2).Cells(3).Value = ey
DataGridView1.Rows(2).Cells(4).Value = Ez
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 46 -

DataGridView1.Rows(2).Cells(5).Value = varEsca

DataGridView1.Rows(3).Cells(0).Value = "traslac OBJETO"


DataGridView1.Rows(3).Cells(1).Value = "Unidades"
DataGridView1.Rows(3).Cells(2).Value = txObj
DataGridView1.Rows(3).Cells(3).Value = tyObj
DataGridView1.Rows(3).Cells(4).Value = tzObj
DataGridView1.Rows(3).Cells(5).Value = varObj
End Sub
Private Sub frmModelado3D_Load(sender As Object, e As EventArgs) Handles
MyBase.Load
Form2.Width = ancho
Form2.Height = alto
End Sub
Private Sub btnActualizarTodo_Click(sender As Object, e As EventArgs) Handles
btnActualizarTodo.Click
AnguloX = DataGridView1.Rows(0).Cells(2).Value
AnguloY = DataGridView1.Rows(0).Cells(3).Value
AnguloZ = DataGridView1.Rows(0).Cells(4).Value
varAngulo = DataGridView1.Rows(0).Cells(5).Value
tx = DataGridView1.Rows(1).Cells(2).Value
ty = DataGridView1.Rows(1).Cells(3).Value
tz = DataGridView1.Rows(1).Cells(4).Value
vart = DataGridView1.Rows(0).Cells(5).Value
ex = DataGridView1.Rows(2).Cells(2).Value
ey = DataGridView1.Rows(2).Cells(3).Value
Ez = DataGridView1.Rows(2).Cells(4).Value
varEsca = DataGridView1.Rows(2).Cells(5).Value

txObj = DataGridView1.Rows(3).Cells(2).Value
tyObj = DataGridView1.Rows(3).Cells(3).Value
tzObj = DataGridView1.Rows(3).Cells(4).Value
varObj = DataGridView1.Rows(3).Cells(5).Value
End Sub
Private Sub Rotacion(sender As Object, e As KeyEventArgs) Handles txtRot.KeyDown
AnguloX = DataGridView1.Rows(0).Cells(2).Value
AnguloY = DataGridView1.Rows(0).Cells(3).Value
AnguloZ = DataGridView1.Rows(0).Cells(4).Value
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
If AnguloX >= -3600 Then
AnguloX = AnguloX - varAngulo
Else
AnguloX = 3600
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If AnguloX <= 3600 Then
AnguloX = AnguloX + varAngulo
Else
AnguloX = 0
End If
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 47 -

Case Keys.B, Keys.Down ' 66 ' B Inverso De Y


If AnguloY >= -3600 Then
AnguloY = AnguloY - varAngulo
Else
AnguloY = 3600
End If
Case Keys.Y, Keys.Up ' ROTACION EJE Y
If AnguloY <= 3600 Then
AnguloY = AnguloY + varAngulo
Else
AnguloY = 0
End If

Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C


If AnguloZ >= -36000 Then
AnguloZ = AnguloZ - varAngulo
Else
AnguloZ = 3600
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If AnguloZ <= 3600 Then
AnguloZ = AnguloZ + varAngulo
Else
AnguloZ = 0
End If
End Select
DataGridView1.Rows(0).Cells(2).Value = AnguloX
DataGridView1.Rows(0).Cells(3).Value = AnguloY
DataGridView1.Rows(0).Cells(4).Value = AnguloZ

txtRot.Text = ""
End Sub
Private Sub txtTraslacion_KeyDown(sender As Object, e As KeyEventArgs) Handles
txtTras.KeyDown
tx = DataGridView1.Rows(1).Cells(2).Value
ty = DataGridView1.Rows(1).Cells(3).Value
tz = DataGridView1.Rows(1).Cells(4).Value
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
If tx >= -limite Then
tx = tx - vart
Else
tx = limite
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If tx <= limite Then
tx = tx + vart
Else
tx = -limite
End If
Case Keys.Y, Keys.Up ' 66 ' B Inverso De Y
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 48 -

If ty >= -limite Then


ty = ty - vart
Else
ty = limite
End If
Case Keys.B, Keys.Down ' traslacion
If ty <= limite Then
ty = ty + vart
Else
ty = -limite
End If
Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C
If tz >= -100 Then
tz = tz - vart
Else
tz = 100
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If tz <= limite Then
tz = tz + vart
Else
tz = -limite
End If
End Select
DataGridView1.Rows(1).Cells(2).Value = tx
DataGridView1.Rows(1).Cells(3).Value = ty
DataGridView1.Rows(1).Cells(4).Value = tz
txtTras.Text = ""
End Sub

Private Sub ObjetoTraslacion(sender As Object, e As KeyEventArgs) Handles


txtObjeto.KeyDown
txObj = DataGridView1.Rows(1).Cells(2).Value
tyObj = DataGridView1.Rows(1).Cells(3).Value
tzObj = DataGridView1.Rows(1).Cells(4).Value
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
If txObj >= -limite Then
txObj = txObj - varObj
Else
txObj = limite
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If txObj <= limite Then
txObj = txObj + vart
Else
txObj = -limite
End If
Case Keys.Y, Keys.Up ' 66 ' B Inverso De Y
If tyObj >= -limite Then
tyObj = tyObj - vart
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 49 -

Else
tyObj = limite
End If
Case Keys.B, Keys.Down ' traslacion
If tyObj <= limite Then
tyObj = tyObj + vart
Else
tyObj = -limite
End If
Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C
If tzObj >= -100 Then
tzObj = tzObj - vart
Else
tzObj = 100
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If tzObj <= limite Then
tzObj = tzObj + vart
Else
tzObj = -limite
End If
End Select
DataGridView1.Rows(1).Cells(2).Value = txObj
DataGridView1.Rows(1).Cells(3).Value = tyObj
DataGridView1.Rows(1).Cells(4).Value = tzObj
txtObjeto.Text = ""
End Sub

Private Sub TxtEscalado_KeyDown(sender As Object, e As KeyEventArgs) Handles


txtEscalado.KeyDown
ex = DataGridView1.Rows(2).Cells(2).Value
ey = DataGridView1.Rows(2).Cells(3).Value
Ez = DataGridView1.Rows(2).Cells(4).Value
Select Case e.KeyCode
Case Keys.A, Keys.Left ' A rotacion inverso de X
If ex >= -limite Then
ex = ex - varEsca
Else
ex = limite
End If
Case Keys.X, Keys.Right ' ROTACION EJE X
If ex <= limite Then
ex = ex + varEsca
Else
ex = -limite
End If

Case Keys.Y, Keys.Up ' 66 ' B Inverso De Y


If ey >= -limite Then
ey = ey - varEsca
Else
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 50 -

ey = limite
End If
Case Keys.B, Keys.Down ' traslacion
If ey <= limite Then
ey = ey + varEsca
Else
ey = -limite
End If
Case Keys.C, Keys.PageDown ' C ROTACION Inverso de C
If Ez >= -100 Then
Ez = Ez - varEsca
Else
Ez = 100
End If
Case Keys.Z, Keys.PageUp ' ROTACION EJE Z
If Ez <= limite Then
Ez = Ez + varEsca
Else
Ez = -limite
End If
End Select
DataGridView1.Rows(2).Cells(2).Value = ex
DataGridView1.Rows(2).Cells(3).Value = ey
DataGridView1.Rows(2).Cells(4).Value = Ez
txtEscalado.Text = ""
End Sub
Private Sub btnForm2_Click(sender As Object, e As EventArgs) Handles
btnAbrirOpengl.Click
Opengl = New OGL
Opengl.InitOPENGL(User.GetDC(Form2.Handle))
Form2.Show()
Opengl.BucleOpenGl()
End Sub
Private Sub btnCerrarOpengl_Click(sender As Object, e As EventArgs) Handles
btnCerrarOpengl.Click
Opengl.EliminarOpenGL()
Form2.Close()
End Sub
Private Sub BtnAbrir_Click(sender As Object, e As EventArgs) Handles BtnAbrir.Click
RecuperarMatriz(VerticesCoord, MVertCoord, NfVertCoord, NcVertCoord)
ListBox1.Items.Add("ARCHIVO DE VERTICES COOORDENADAS")
MostrarMatrizFormulario(MVertCoord, NfVertCoord, NcVertCoord)
RecuperarMatriz(VerticesCoord, MVertCoord, NfVert, NcVert)
RecuperarMatriz(CarasCoord, MCarascoord, NFCarasCoord, NcCarasCoord)
ListBox1.Items.Add("ARCHIVO DE CARAS")
MostrarMatrizFormulario(MCarascoord, NFCarasCoord, NcCarasCoord)
'xxxxxxxxxxxxxxxxxxxxxx
RecuperarMatriz(Vertices, MVert, NfVert, NcVert)

ListBox1.Items.Add("ARCHIVO DE VERTICES objeto")


MostrarMatrizFormulario(MVert, NfVert, NcVert)
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 51 -

RecuperarMatriz(Caras, MCaras, NFCaras, NcCaras)


ListBox1.Items.Add("ARCHIVO DE CARAS")
MostrarMatrizFormulario(MCaras, NFCaras, NcCaras)
End Sub
End Class

CODIGO DEL MODULO 1

Imports Tao.OpenGl
Imports Tao.OpenGl.Glu
Imports Tao.FreeGlut
Imports Tao.Platform.Windows
Module Module1

Sub MAIN()
'RecuperarMatriz(VerticesCoord, MVert, NfVert, NcVert)
'Console.WriteLine("MATRIZ VERTICES")
'MostrarMatriz(MVert, NfVert, NcVert)
'RecuperarMatriz(ArchivoCaras, MCaras, NFCaras, NcCaras)
'Console.WriteLine("MATRIZ Caras")
'MostrarMatriz(MCaras, NFCaras, NcCaras)
'Console.ReadLine()
End Sub
End Module

CODIGO DEL MODULO 2

Imports System.IO
Module Module2
Function ContarLetra(Cadena As String, letra As Char)
Dim LARGO As Integer = Len(Cadena)
Dim cont, cant As Integer
For cont = 0 To LARGO - 1
If Cadena(cont) = letra Then
cant = cant + 1
End If
Next
Return cant
End Function

Sub RecuperarMatriz(ByVal nombrearchivo As String, ByRef A(,) As String, ByRef nf As


Integer, ByRef nc As Integer)
Dim srLector As StreamReader
srLector = New StreamReader(nombrearchivo)
Dim fila As Integer, col As Integer
Dim cadena As String = ""
Dim subcadena As String
Dim pos As Integer = 0
Dim inicio As Integer = 1
cadena = srLector.ReadLine()
nc = ContarLetra(cadena, vbTab) + 1
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 52 -

Do While Not (cadena = "")


cadena = cadena & vbTab
inicio = 1
For col = 0 To nc - 1
pos = InStr(inicio, cadena, Chr(9))
subcadena = Mid(cadena, inicio, pos - inicio)
A(fila, col) = subcadena
inicio = pos + 1
Next
fila = fila + 1
cadena = srLector.ReadLine()
Loop
nf = fila
Console.WriteLine("Archivo leido satisfactoriamente")
srLector.Close()
End Sub

Sub MostrarMatriz(A(,) As String, nf As Integer, nc As Integer)


Dim fila, col As Integer
For fila = 0 To nf - 1
For col = 0 To nc - 1
Console.Write("{0} {1}", A(fila, col), vbTab)
Next
Console.WriteLine()
Next
End Sub
End Module

CODIGO DEL MODULO 3

Imports System.Drawing
Imports Tao.OpenGl
Imports Tao.OpenGl.Glu
Imports Tao.FreeGlut
Imports Tao.Platform.Windows
Module Module3
Public tipo As Integer = 0
Public alto As Integer = 600
Public ancho As Integer = 600
Public AnguloX As Integer = 0
Public AnguloY As Integer = 0
Public AnguloZ As Integer = 0
Public Caras As String = "C:\datos1\Caras.txt"
Public CarasCoord As String = "C:\datos1\CarasCoord.txt"

Public VerticesCoord As String = "C:\datos1\Verticescoord.txt"


Public Vertices As String = "C:\datos1\Vertices.txt"
Public Const limite As Integer = 50
Public Const maxcol As Integer = 4
Public Const maxfilas As Integer = 50
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 53 -

Public cx As Integer = ancho / 2


Public cy As Integer = alto / 2
Public ex As Single = 1
Public ey As Single = 1
Public Ez As Single = 1
Public MCaras(maxfilas, maxcol) As String
Public MCarascoord(maxfilas, maxcol) As String
Public MVert(maxfilas, maxcol) As String
Public MVertCoord(maxfilas, maxcol) As String
Public NfVert As Integer
Public NcVert As Integer
Public NfVertCoord As Integer
Public NcVertCoord As Integer

Public NFCarasCoord As Integer


Public NcCarasCoord As Integer
Public NFCaras As Integer
Public NcCaras As Integer
Public qobj As Glu.GLUquadric
Public tam As Integer = 10 ' 10poner 4 para opengl
Public tx As Single = 0
Public ty As Single = 0
Public tz As Single = 0
Public txObj As Single = 5
Public tyObj As Single = 0
Public tzObj As Single = 0
Public varAngulo As Single = 10
Public varEsca As Single = 0.1
Public vart As Single = 1
Public varObj As Single = 1
End Module

CODIGO DE CLASE OGL

Imports Tao.OpenGl
Imports Tao.Platform.Windows
Imports System.Windows.Forms
Imports Tao.FreeGlut
Public Class OGL
Dim hRC As System.IntPtr
Dim hDc As System.IntPtr
' Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByVal
Destination As Gdi.PIXELFORMATDESCRIPTOR, ByVal Length As Integer)
Public Sub InitOPENGL(ByVal ghDC As System.IntPtr)
Dim pfd As Gdi.PIXELFORMATDESCRIPTOR
Dim PixelFormat As Integer
hDc = ghDC
'ZeroMemory(pfd, Len(pfd))
pfd.nSize = Len(pfd)
pfd.nVersion = 1
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 54 -

pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW Or Gdi.PFD_SUPPORT_OPENGL Or


Gdi.PFD_DOUBLEBUFFER
pfd.iPixelType = Gdi.PFD_TYPE_RGBA
pfd.cColorBits = 32
pfd.cDepthBits = 32
pfd.cStencilBits = 32
pfd.iLayerType = Gdi.PFD_MAIN_PLANE

PixelFormat = Gdi.ChoosePixelFormat(ghDC, pfd)


If PixelFormat = 0 Then
MessageBox.Show("Imposible obtener el formato de los pixels")
End
End If
If Not (Gdi.SetPixelFormat(ghDC, PixelFormat, pfd)) Then
MessageBox.Show("Imposible establecer formato de pixel")
End
End If
hRC = Wgl.wglCreateContext(ghDC)
If hRC.ToInt32 = 0 Then
MessageBox.Show("imposible obtener el contexto del renderizado")
End
End If

If Not (Wgl.wglMakeCurrent(ghDC, hRC)) Then


MessageBox.Show("Imposible hacer el contexto del renderizado")
End
End If
Inicializaciones()
End Sub
Sub reshape(w As Integer, h As Integer)
Gl.glViewport(0, 0, w, h)
Gl.glMatrixMode(Gl.GL_PROJECTION)
Gl.glLoadIdentity()
Gl.glOrtho(-tam, tam, -tam, tam, -tam, tam)
Gl.glMatrixMode(Gl.GL_MODELVIEW)
ancho = w
alto = h
Gl.glLoadIdentity()
End Sub
Public Sub EliminarOpenGL()
Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)
Wgl.wglDeleteContext(hRC)
End Sub
Public Sub Inicializaciones()
Gl.glClearColor(0.0, 0.0, 0.0, 0.0)
Gl.glShadeModel(Gl.GL_SMOOTH)
qobj = New Glu.GLUquadric
qobj = Glu.gluNewQuadric()
'Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_LINE)
'Gl.glPolygonMode(Gl.GL_BACK, Gl.GL_LINE)
Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_FILL)
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 55 -

Gl.glPolygonMode(Gl.GL_BACK, Gl.GL_FILL)
Gl.glClearColor(0.0F, 0.0F, 0.0F, 0.0F)
Gl.glMatrixMode(Gl.GL_PROJECTION)
Gl.glLoadIdentity()
Gl.glOrtho(-tam, tam, -tam, tam, -tam * 2, tam * 2)
Gl.glMatrixMode(Gl.GL_MODELVIEW)
Gl.glEnable(Gl.GL_DEPTH_TEST)
Gl.glLoadIdentity()
End Sub
Public Sub BucleOpenGl()
Do
Render()
Loop
End Sub

Sub DibujarCubo(Mvert(,) As String, MCaras(,) As String, nfcaras As Integer, ncCaras


As Integer)
Dim p1 As Integer
Dim z1, x1, y1 As Single
For fila = 0 To nfcaras - 1
'For fila = 0 To 2
Gl.glBegin(Gl.GL_QUADS)
For col = 0 To ncCaras - 1
p1 = CInt(MCaras(fila, col))
x1 = Mvert(p1, 0)
y1 = Mvert(p1, 1)
z1 = Mvert(p1, 2)
Gl.glVertex3f(x1, y1, z1)
Next
Gl.glEnd()
Next
End Sub

Sub DibujarCoordenadas(Mvert(,) As String, MCaras(,) As String,


nfcaras As Integer, ncCaras As Integer)
Dim p1 As Integer
Dim z1, x1, y1 As Single
For fila = 0 To nfcaras - 1
Select Case fila
Case 0 : Gl.glColor3f(1, 0, 0)
Case 1 : Gl.glColor3f(0, 1, 0)
Case 2 : Gl.glColor3f(0, 0, 1)
End Select
Gl.glBegin(Gl.GL_QUADS)
For col = 0 To ncCaras - 1
p1 = CInt(MCaras(fila, col))
x1 = Mvert(p1, 0)
y1 = Mvert(p1, 1)
z1 = Mvert(p1, 2)
Gl.glVertex3f(x1, y1, z1)
Next
Guía de practica AI2019 B mínima requerida \Ismael Véliz Vilca - 56 -

Gl.glEnd()
Next
End Sub

Sub display()
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
Gl.glLoadIdentity()
Gl.glRotatef(AnguloX, 1.0F, 0.0F, 0.0F)
Gl.glRotatef(AnguloY, 0.0F, 1.0F, 0.0F)
Gl.glRotatef(AnguloZ, 0.0F, 0.0F, 1.0F)
Gl.glTranslatef(tx, ty, tz)
Gl.glScalef(ex, ey, Ez)
'Gl.glColor3f(1, 1, 0)
'Glu.gluSphere(qobj, 1, 32, 32)
Gl.glColor3f(1, 0, 0)
DibujarCoordenadas(MVertCoord, MCarascoord, NFCarasCoord, NcCarasCoord)
Gl.glPushMatrix()
Gl.glTranslatef(txObj, tyObj, tzObj)
Gl.glColor3f(1, 1, 0)
DibujarCubo(MVert, MCaras, NFCaras, NcCaras)
Gl.glPopMatrix()
Gl.glFlush()
Gdi.SwapBuffers(hDc)
End Sub
Sub Render()
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
Application.DoEvents()
Gl.glColor3f(0, 1, 0)
display()
End Sub
End Class

Vous aimerez peut-être aussi