pwm y vb.net

Hola a todos, quiero hacer un proyecto en visula.net una barra de escoll mande numeros de 0 a 255 al arduino, no hay errror, creo que el problema esta en agarrar los datos en arduino.. dejo codigo

Codigo Visual

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load




        With SerialPort1
            .PortName = "COM3"
            .BaudRate = 9600
            .DataBits = 8
            .Parity = IO.Ports.Parity.None
            .StopBits = IO.Ports.StopBits.One
            .Handshake = IO.Ports.Handshake.None

        End With

        Try
            SerialPort1.Open()
        Catch ex As Exception
            MessageBox.Show(ex.ToString)


        End Try

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SerialPort1.Write("1")

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        SerialPort1.Write("0")
    End Sub

    Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
        Label2.Text = TrackBar1.Value
        Dim xxx As Integer


        xxx = TrackBar1.Value ' [b]Esto es lo que me interesa, en el label marca 1,2,3,4,....255[/b]
        SerialPort1.Write(xxx)


    End Sub
End Class

Codigo Arduino.

int LedPin = 3;
int xxx;

void setup() {

 pinMode(7,OUTPUT);
 pinMode(3,OUTPUT);
 Serial.begin(9600);

}

void loop() {

  if (Serial.available()){

    int led =(int)Serial.read() -48;
   

       analogWrite(LedPin,xxx);[b] / No toma ningun valor-... [/b]
    
    
    switch (led){
     case 1:
     digitalWrite(7,HIGH);  
   
      break;
      case 0:
      digitalWrite(7,LOW);
      break;
     // case 2:
      //digitalWrite(6,OUTPUT);
     // break; 
    }

     

}

}

Creo que he abierto mas de 200 paginas en google y youtube,, y todos los que haces ed decir

si TrackBar1 =1

que escriba 10

si TrackBar1 =10

que escriba 20
..... etc

Alguna ayuda?.. enserio muchas gracias
saludos a todos
fede

Primer error en tu receptor

 int led =(int)Serial.read() -48;

en realidad debe ser char o byte en lugar de int

byte led = Serial.read() -48;

empieza por ahi
Esta línea no hace nada

       analogWrite(LedPin,xxx); // No toma ningun valor-

xxx no tiene nada asignado
asi que sera un 0 en el pn 3 por siempre.
Comentala porque si envias desde la pc por VB.NET 1 2 o 3 solo quieres esos comandos por ahora.

El error que yo veo es que desde vb mandas valores segun el boton pulsado pero tambien desde el trackbar que supongo sera algun tipo de barra deslizante que envia valores segun la posicion ,en este caso de 0 a 255,por lo que lo primero que tendrias que hacer es distinguir de alguna manera en el arduino que valores que vienen de la pulsacion de botones y que valores del trackbar.

:smiley: Gracias por responder.!!!!

Explico mejor lo que necesito,

es prender un led de apoco hasta llegar al maximo, con pwm, si aprendo eso, podre controlar alomejor la velocidad de un motor etc.

Juro que he revisado google a mas no poder y todo lo que encuetro o no funciona o meten 255 valores en un if... (aclaro que mi conocimiento es poco)

dejo en limpio mi codigo

codigo en .net

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        With SerialPort1
            .PortName = "COM3"
            .BaudRate = 9600
            .DataBits = 8
            .Parity = IO.Ports.Parity.None
            .StopBits = IO.Ports.StopBits.One
            .Handshake = IO.Ports.Handshake.None

        End With

        Try
            SerialPort1.Open()
        Catch ex As Exception
            MessageBox.Show(ex.ToString)


        End Try

    End Sub

    Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll

        Label2.Text = TrackBar1.Value
        Dim Data As Byte

        Data = TrackBar1.Value
        SerialPort1.Write(Data)

    End Sub

End Class

codigo en mi arduino

int LedPin = 3;// Pin con PWM
byte Data; // Variable de Vb.Net

void setup() {


 pinMode(LedPin,OUTPUT);// Pin 3 como salida
 Serial.begin(9600);

}

void loop() {

  if (Serial.available()){ // copiado de google
    byte LedPin = Serial.read() -48; // copiado de google 
   

       analogWrite(LedPin,Data); // Trato de encender un led con pwm, que encienda de apoco con .net
    
    
}

}

Dejo una imagen, si corro el escroll este cuenta de 1 a 255

Muchisimas gracias por responder, se agradece enserio.!!
Saludos a todos
fede

track.gif

Prueba con esto en el arduino:

int LedPin = 3;// Pin con PWM
int  Data; // Variable de Vb.Net

void setup() {


 pinMode(LedPin,OUTPUT);// Pin 3 como salida
 Serial.begin(9600);

}

void loop() {

  if (Serial.available()){ // copiado de google
    Data = Serial.parseInt(); // copiado de google
    if (Data >= 0 && Data <= 255) { 
      analogWrite(LedPin,Data); // Trato de encender un led con pwm, que encienda de apoco con .net
    }
  }
}

Pero esto solo te funcionara si mandas los valores separados por algun caracter no numerico ,si tiene varios valores en el buffer en el momento de hacer la lectura ,los leera como un unico numero y no funcionara bien.Tambien deberias mirar en que evento del trackbar estas enviando la posicion ,no es lo mismo enviar la posicion en un evento que se dispare cada vez que la posicion del trackbar varia ,a que se dispare cuando dejes de hacer clic en el posicionador del trackbar .En el primer caso te mandara un monton de valores mientras mueves el trackbar ,saturando el buffer y en el segundo solo te enviara el valor final del trackbar.

Cuando se hacen estas cosas siempre me pregunto porque la gente comienza con su programa final y no va cumpliendo etapas intermedias.
Tu código inicial envia 1, 2, etc
Debiste haber intentado lograr antes que nada una buena lectura de caracteres enviados por VB.NET en el arduino y luego que lo logras, ajustas para que esos caracteres sean lo que tu quieres y controlen la salida del led usando PWM.
Es como te lo plantea jose aunque el fue directo al resultado final.

Debiste probar los ejemplos de arduino para leer el puerto Serie. Cosa que veo hiciste y de ahi ir construyendo, como se lee un entero o bien construirlo como varios caracteres enviados seguidos de un CR o '\n' que sin problemas puedes enviar con VB.net

Siempre que tengas una tarea MAYOR intentar resolver las cosas desde lo mas pequeño y ganar confianza en el proceso y aprender.
Ahora estas encaminado.

Hola.! Gracias de nuevo por responder y mas con la repuesta, lamentablemete no funciona bien, a veces prende a veces a media etc..
Me he demorado pora contestar, porque estoy buscando informacion, pero sere honesto... no encuentro o no entiendo, ... Llegue a un lugar que me dicen que busque en este foro "Metaconta en documentacion", pero mandan caracteres y prenden y apagan un led... :frowning: .. eso lo se hacer, el tema es que me fijado y mi trackBar si manda numeros de 0 a 255, no entiendo el error, y se que esta en vb, ya que habro la consola de arduino y ingreso los valores a mano y anda perfecto...

Alguna recomendacion??, sera mi arduino que esta medio roto?

Se agradece los comentarios.

Muchos Saludos y seguire investigando, esta de mas decir que si encuentran algun manual o algo referido a lo que busco, porfa me avisen.

saludos.!
Fede

Hola fedefrankk

Realmente el hilo se ha puesto interesante, razon suficiente para opinar.
A mí hay varias cosas que me intrigan.
¿ Como sabes que tu VB.NET manda bytes ? ¿ Crees que por asignar la lectura del scroll a una variable tipo byte se hace una conversión mágica ?
Lo mas probable es que el valor del scroll sea del tipo int y al hacer el cast a tipo byte estes perdiendo informacion, aunque por suerte quizás, en este caso no te perjudique.

Por otro lado tu envias ese byte despreocupadamente como si estuviese formateado para sacar en un display y olvidas que es parte de un numero binario de tamaño int y que recortas a byte.

La linea (copiada de Google por supuesto) que dice:

byte LedPin = Serial.read() -48; // copiado de google

no deberia de compilarte en el sketch porque:

// ... aquí definimos LedPin como int ...
int LedPin = 3;// Pin con PWM

// ... y aqui intentas redefinirla cambiando el tipo y ademas lo haces
// ... continuamente dentro del loop() !!!!!!!
byte LedPin = Serial.read() -48; // copiado de google

// ... Se vé claramente que tienes un pequeño lio / confusión

Además está el pequeño detalle de restar <48> al byte recibido. ¿ Para qué ?

Me dá la impresión de que esa linea se hizo para recibir caracteres numericos ASCII
cuyos valores van desde 0x30 ('0'), 0x31 ('1'),... hasta 0x39 ('9'), por lo que se les resta
el valor 48 (0x30) para obtener su valor binario puro.

No creo que VB.NET sea tan "generoso" como para codificar en ASCII el valor del scroll,...

Es lo que tiene cuando se hacen copy-paste de lineas de otros códigos sin analizar el contexto
en el que actuan. Puede ser un caos.

Ten en cuenta que VB.NET no "vé" a tu Arduino, solo reenvia una información via RS232, si quieres que esa información sea "digerible" por tu sketch debes formatearla en origen o bien en destino.

Por último si este código es el que usas en el sketch, no alcanzo a comprender como has podido hacerlo funcionar.

:slight_smile: Hola a todos. gracias por las repuetas, en el ultimo codigo no he puesto en mi arduino "
byte LedPin = Serial.read() -48;"

Lo que parece que esta mal es el TrackBar1....

He pusto un boton con valores y al precionarlo funciona de 10.!, obvio cambiando los valores a mano en vb.net...

de mi codigo, no quiero molestar mas con el tema, pero no encuentro nada en ningun lado...

codigo limpio de arduino:

int LedPin = 3;// Pin con PWM
int  Data; // Variable de Vb.Net

void setup() {


 pinMode(LedPin,OUTPUT);// Pin 3 como salida
 Serial.begin(9600);

}

void loop() {

  if (Serial.available()){ // copiado de google
    Data = Serial.parseInt(); // copiado de google
    if (Data >= 0 && Data <= 255) {
      analogWrite(LedPin,Data); // Trato de encender un led con pwm, que encienda de apoco con .net
    }
  }
}

Codigo de Vb.net. Limpio

Public Class Form1
    Dim Data As Byte
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        With SerialPort1
            .PortName = "COM3"
            .BaudRate = 9600
            .DataBits = 8
            .Parity = IO.Ports.Parity.None
            .StopBits = IO.Ports.StopBits.One
            .Handshake = IO.Ports.Handshake.None

        End With

        Try
            SerialPort1.Open()
        Catch ex As Exception
            MessageBox.Show(ex.ToString)


        End Try

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '  Dim Data As Byte
        Data = 10
        SerialPort1.Write(Data)

    End Sub

    Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll

        Label1.Text = TrackBar1.Value
        Data = TrackBar1.Value

    End Sub
End Class

Gracias por la paciencia, estoy en aprendisaje se que es complejo partir de este tema, pero lo necesito...

Enserio se agradece la buena dispocision para explicar.!

Saludos a todos

Fede ( diculpen los errores ortograficos )

Te puse arriba que el codigo podia no funcionar bien si no separabas los valores con algun caracter
no numerico ,como una coma,punto y coma,etc y que investigaras de que eventos dispone el trackbar para elegir,si es posible,un evento que no se dispare cuando cambia el valor del trackbar ,si no que recoja el ultimo valor del trackbar cuando has acabado el movimiento (dejas de hacer click en el trackbar) y no has corregido el codigo vb para hacer esto y probar.....