hola quisiera saber si me pueden ayudar con un proyecto que tengo... Estoy realizando una interfaz en visual basic para el control de un motor DC, ya pude hacer que encendiese y apagase el motor pero ahora quisiera realizar un control de velocidad del motor. si alguien puede ayudarme a programar agradecería mucho su apoyo, lo necesito de verdad
Hola amigo, podrías ilustrarnos más con tu trabajo? Cómo piensas controlar la velocidad del motor? Con PWM? Con voltaje? Que papel juega el arduino si controlas con la aplicación de visual basic? Para que requieres arduino?
Postea el código y dinos donde tienes el problema y acá con mucho gusto se te ayudará.
Saludos.
Gracias por responder... mira pienso controlar la velocidad con un trackbar en el programa, todo sea controlado desde mi interfaz desde el encendido y apagado del motor hasta el control de velocidad, te dejo unas imagenes de mi proyecto aun en curso y mi programación que tengo.
Programacion arduino:
void setup() {
//Definimos la velocidad de transferencia a 9600 baudios
//y el pin 2 como salida
pinMode(2,OUTPUT);
Serial.begin(9600);
}
void loop() {
//Mientras el puerto serie este accesible
while (Serial.available())
{
//Guardamos en dato el valor leído del puerto serie
byte dato = Serial.read();
switch (dato){
//Si es '1' ponemos el motor en marcha
case '1':
digitalWrite(2,HIGH);
break;
//Si es '0' paramos el motor
case '0':
digitalWrite(2, LOW);
break;
}
}
}
Programacion en Visual basic:
Public Class Form1
Dim Conectado As Boolean
' La variable valor será la que recibe el valor que vamos a enviar a Arduino
Dim valor As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Conectado = False Then
'Cargamos el Combobox con los puertos seriales conectados al PC
For Each PuertosDisponibles As String In My.Computer.Ports.SerialPortNames
ComboBox1.Items.Add(PuertosDisponibles)
Next
'Si hay algo en la lista del Combobox
If ComboBox1.Items.Count > 0 Then
'Cambiamos el texto del combobox
ComboBox1.Text = ComboBox1.Items(0)
'Cambiamos el valor del nombre del puerto serial al valor seleccionado en la lista del combobox
sport.PortName = ComboBox1.Text
'Abrimos el puerto serial
sport.Open()
'Activamos los botones "ON" Y "OFF"
Button2.Enabled = True
Button3.Enabled = True
'Desactivamos el botón "Conectar"
Button1.Enabled = False
MsgBox("Conectado")
'La variable Conectado es true
Conectado = True
Else
'Si no hay puertos mostramos un mensaje
MsgBox("Desconectado")
End If
Else
'Al terminar cerramos el puerto
sport.Close()
MsgBox("DESCONECTADO")
Conectado = False
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button2.Enabled = False
Button3.Enabled = False
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Si hay conexión
If Conectado = True Then
'La variable "valor" tendrá el valor "1" para activar el motor
valor = "1"
'Manda el valor al puerto
sport.Write(valor)
'Descarta los datos del búfer de transmisión del conductor de serie
sport.DiscardOutBuffer()
End If
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If Conectado = True Then
'La variable "valor" tendrá el valor "1" para activar el motor
valor = "0"
sport.Write(valor)
sport.DiscardOutBuffer()
End If
End Sub
Visual basic manda los datos y arduino los recibe y da paso a hacer trabajar mi motor.
como podes ver ya logre que mi interfaz reconociese y conectase con arduino y asi poder encender y apagar mi motor pero ahora quiero realizar, por medio de un trackbar en visual, el control de velocidad de mi motor, cosa que no tengo claro como hacerlo bien :(.
Aunque has posteado bien tu código, no lo hiciste bien con las imágenes usa este método aprovechando que ya estan almacenadas.
Usa este tag de imágenes que te indico en la figura.
Primero capturas el enlace de las imagenes que ya adjuntaste y los aprovechas. Cómo? Vas al primer enlace y parado en Sin titulo.png botón derecho y copias el enlace de la imagen y luego con este ícono de imagenes, pones ahi el valor copiado usando CTRL+V o bien Pegar. Es tedioso porque debes hacerlo por cada uno o bien capturas cada enlace lo pegas en un notepad (archivo de texto) y luego cuando estas editando vas levantando cada enlace y lo pones cuando te pide la URL.
Gracias por el dato... ya se muestran bien mis imagenes espero puedas darme una ayuda
KiriMercury:
pero ahora quiero realizar, por medio de un trackbar en visual, el control de velocidad de mi motor, cosa que no tengo claro como hacerlo bien
Bueno... simple. Tu código (de Arduino) solo cambia dos estados: encendido o apagado. Si lo que buscas es variar la velocidad, entonces tendrás que cambiar el pin del motor (al 3); y empezar a jugar con analogWrite.
No sé qué es un "trackbar", pero me imagino que es algo como un "potenciómetro de barra" pero en la pantalla del PC.
Te voy a hacer la siguiente pregunta; si no la entendiste, sólo dilo y te explico. Bueno la pregunta es:
¿Puedes hacer que tu programa de Visual Basic mande el valor de ese "trackbar" en forma binaria? (como un único byte)
Lucario448:
Bueno... simple. Tu código (de Arduino) solo cambia dos estados: encendido o apagado. Si lo que buscas es variar la velocidad, entonces tendrás que cambiar el pin del motor (al 3); y empezar a jugar con analogWrite.No sé qué es un "trackbar", pero me imagino que es algo como un "potenciómetro de barra" pero en la pantalla del PC.
Te voy a hacer la siguiente pregunta; si no la entendiste, sólo dilo y te explico. Bueno la pregunta es:
¿Puedes hacer que tu programa de Visual Basic mande el valor de ese "trackbar" en forma binaria? (como un único byte)
Pues si, se podia mandar en forma binaria, a como he visto en una programacion de control de luminosidad de un led.
Y si el Trackbar se puede ver como un tipo potenciometro de barra, asi no tendrias que comprar el potenciometro en fisico, ya lo tendrias en la interfaz y controlarias la velocidad desde ahi.
Una pregunta... ¿Podrias darme un ejemplo de la referencia que me hiciste de jugar con los analogWrite?
Mira la guia de Metaconta en documentacion. Tiene interfaces VB6.0 y .NET resueltas con Arduino. Son muy buenas y didácticas. Si algo no entiendes pregunta.
Buenos días desde Venezuela señores. El truco esta en asignarle al trackbar 0 - 100% y mediante la programación visualbasic ir haciendo como una especie de regla de 3 o conversion de ese valor de velocidad segun el porcentaje de la barra del trackbar. No se si me explique.
Ejemplo para el trackbar con 7 bits ya que el 8 y mas significativo ira para otra función:
0% = 0 (0000000) en binario
100% = 127 (1111111)
50% = 63 (0111111)
13% = 16 (0001111)
Esto fue solo un ejemplo para indicarle a tu aqplicacion en visualbasic como debes enviarle los datos al arduino, otra manera también puede ser directamente en decimal y hacer tus cálculos en tu arduino.
La velocidad del motor podría ser con PWM tomando como referencia 0 - 255 y colocara la velocidad según el dato que envié la aplicación visualbasic según lo indique el trackbar. obvio ese dato nunca sera mayor a 255 porque dará error.
Ahora vamos a lo otro y es como organizar el programa en tu arduino para indicarle cuando encender tu motor, cuando apagarlo y cuando variar la velocidad. Esto se hace acomodando la información en una palabra o código de palabra lo que no es mas que bits arreglados de tal manera que le indiquen al arduino que hacer según la trama de bits recibida. En este caso tal cual como lo tienes no es posible ya que estas utilizando CASE.. imagina tener 127 CASE según el valor de la velocidad.. Es una locura.
Lo que se hace es enviarle al programa arduino 1 byte arreglado de la siguiente manera.
El primer bit mas significativo informa sobre la acción a tomar, ejemplo:
1 0000000 = Encender el motor
0 0000000 = Apagarlo
Ahora bien, acá le indicamos en los siguientes 7 bits la velocidad a regular. desde 000001 hasta 111111 según lo indique arriba
Con la función bitRead en tu arduino leemos el valor de cada bit y ejecutamos la tarea según corresponda.
Si algún compañero tiene una mejor idea también se vale jejeje.
Saludos
Bueno... lo de carlosjq10 funciona; sin embargo... es necesario el bit de encendido/apagado?
De por sí, poner el trackbar "en cero" ya debería apagar del todo el motor.
Entonces que envíe valores entre 0 y 255, en forma de un byte sin signo.
Si aún así fuera necesario un "interruptor virtual", que el estado de este lo mande en un segundo byte.
Mira como se simplificaría el código si enviaras el valor del "trackbar" en forma binaria:
// Código para utilizar con trackbar, sin interruptor virtual
void setup() {
//Definimos la velocidad de transferencia a 9600 baudios
//y el pin 3 como salida
pinMode(3, OUTPUT);
Serial.begin(9600);
}
void loop() {
//Mientras el puerto serie este accesible
while (Serial.available())
{
//Guardamos en dato el valor leído del puerto serie
byte dato = Serial.read();
analogWrite(3, dato);
}
}
Es correcto lucario. Simplemente el botón de On envía 11111111, el botón de Off envía 00000000 y el trackbar envía un numero entre 0-255.
Pregunto algo:
analogWrite(3, dato); acá la variable dato sólo puede ser en binario para que funcione el pwm o puede ser en decimal?
Si "en decimal" te refieres a "en forma de texto"... no.
Sólo imagínate que para enviar el valor 255 como texto, serían 3 bytes (0x32, 0x35, 0x35) y no solo uno.
while (Serial.available())
{
//Guardamos en dato el valor leído del puerto serie
byte dato = Serial.read();
analogWrite(3, dato);
}
Si este pedazo de código recibiera ese valor en forma de texto, ocurriría lo siguiente:
analogWrite cambiaría el ciclo de trabajo del PWM tres veces seguidas, quedándose en la tercera hasta el próximo comando. Así:
- analogWrite(3, 50); 0x32 == 50
- analogWrite(3, 53); 0x35 == 53
- analogWrite(3, 53); 0x35 == 53
Claro... todo esto ocurre en un parpadeo, entonces las dos primeras no se notarán.
Además, trabajar con datos binarios es mucho más fácil para un microprocesador; por lo tanto, mucho más rápido.