Visual Basic 6 comunicacion serie con Arduino Mega

Bueno me presento, soy novatillo en el tema asi que os remito unas cuestiones..... Tengo un programilla en visual que le envia via serie un dato de 0 a 255(lo hago con la MSCOM de visual) , el programa es muy sencillo tal que asi:

Private Sub Form_Load()

With MSComm1 'sets up COM settings .Handshaking = 0 .RThreshold = 0 .RTSEnable = False .Settings = "9600,n,8,1" .SThreshold = 0 .PortOpen = True End With End Sub

Private Sub Command3_Click() MSComm1.Output = Text1.Text + Chr(13) End Sub

Y asi le envio el valor de una variable, esta variable es la que intensidad de un led conectado al pin 13.

El arduino recibe el dato y me lo vuelve a enviar... Pero solo me envia la ultima parte de la variable o sea si le envio un 22 el me devuelve un 2... Es raro a ver si alguno de vosotros le paso o sabe que le pasa... Ahora pongo el programa del arduino es que lo tengo en casa y estoy en el curro :-[ .... Un saludo

Qué código utilizas en arduino??

Tienes que mandarlo en un byte, no como cadena.....Text1.Text es un string, lo mandas como primero "2" y luego otro "2"... Es decir, cada numero es un byte (ASCII).... no se si me explico bien.... :o

Por lo que comentas, parece que te esta pasando ésto... ¿no?. Es decir, tu programa de Arduino esta esperando un byte, pero en tu programa de Visual Basic, estas enviando una cadena=varios bytes.

¿puede ser? ;)

Igor R.

Igor tienes razon, por eso en el arduino tengo hecho por codigo que la cadena string la convierta en int ... Pero y funciona ... Mi problema ahora es que cuando hago el map para enviarlo a la salida analogica siempre me da cero :-[ .. El codigo del arduino es:

// These constants won't change. They're used to give names // to the pins used: const int analogInPin = 0; // Analog input pin that the potentiometer is attached to const int analogOutPin = 13; // Analog output pin that the LED is attached to

int sensorValue = 0; // value read from the pot int outputValue = 0; // value output to the PWM (analog out)

char valordefecto=0; int a; char temp[20]; /* Cadena temporal para realizar la conversion */

void setup() { // initialize serial communications at 9600 bps: Serial.begin(9600); }

void loop() {

if(Serial.available()>0){

valordefecto= Serial.read(); /* Convierte el caracter a cadena / sprintf(temp, "%c", valordefecto); / Convierte la cadena a entero */ a=atoi(temp); } // read the analog in value: sensorValue = a; // map it to the range of the analog out: outputValue = map(sensorValue, 0, 1023, 0, 255); // change the analog out value: analogWrite(analogOutPin, outputValue);

// print the results to the serial monitor: Serial.println(outputValue); // Serial.print(sensorValue); // Serial.print("\t output = "); // Serial.println(outputValue);

// wait 10 milliseconds before the next loop // for the analog-to-digital converter to settle // after the last reading: delay(100); }

A ver si veis algo...

En Visual Basic... ¿puedes poner un ejemplo del valor de Text1.text?

Lo digo, porque si es del tipo Text1.Text= "255" + chr(13).... (por ejemplo).

Estas mandando: 32h 35h 35h Dh (es decir el Ascii del 2 + el Ascii del 5, ...) => http://personal.telefonica.terra.es/web/oscarmartinez/_imatges/ascii.gif

En caso de que estes mandando un sólo byte, no entiendo por qué conviertes... ya estas mandando el número. (es decir, envias un byte que vale de 0-255, no el número en ASCII, lo cual serían más de un byte). Para entendernos, chr(255)....

Te pongo un ejemplo para Arduino: Serial.print(78) envia "78" Serial.print(78, BYTE) envia "N" ( http://arduino.cc/en/Serial/Print )

Puedes hacer la prueba, poniendo en Text1.text="N", y en tu Arduino recogiendo el byte (sin convertirlo, byte=Serial.read()). Deberias tener un 78d, que no es lo mismo que "78".

Tampoco entiendo para que usas el map, si se supone que mandas un número de 0 a 255, ya esta bien. Estas escalando, sin necesidad de hacerlo.... Por ejemplo, si lees del ADC (que son 10 bits), entonces si harías esto, para convertirlo a 8 bits. En cristiano, pasar de un rango de 0-1023 a 0-255.

Esta claro que estoy verde :P ... Estoy intentando desde el mismo Serial monitor enviarle un dato (la cadena que se envia desde aqui es ASCII?) y le envio un 200 pero el led no le ilumina lo que le toca es mas le envio un 0 y no se apaga.. Como le envio los datos en formato Byte?? Este es el programa con el que pruebo siguiendo las indicaciones de Igor:

byte incomingByte;

void setup() { // set pins 2 through 13 as outputs: pinMode(13, OUTPUT); Serial.begin(9600); }

void loop() { // iterate over the pins: if (Serial.available()) {

// da el valor al 'incomingByte' variable incomingByte = Serial.read();

// escribe el valor en el pin 11 analogWrite(13, int(incomingByte));

Serial.print(incomingByte);

} }

Un saludo...

Puedes bajarte un monitor mejor, por ejemplo: http://realterm.sourceforge.net/

En Visual Basic, creo que era la orden ASC(numero) chr(numero), te devuelve el ascii equivalente. Es decir, si haces Text1.text=chr(150), y lo envias, deberias recoger 150 en tu programa de Arduino.

Si envias Intro, tu programa lo tratara como 13...No necesitas enviarlo.

Saludos

Igor R.

- EDITADO -

Igor de esa manera solo convierte el primer numero el "1" del 150 ya que todo el rato envio un 49 si en cambio pongo 250 envia un 50 o sea el primer valor... Tal vez con un : Text3.Text = Asc(1) & Asc(5) & Asc(1) me envia un 505150 ... Pero ni aun asi lo acepta el programa del arduino ya que enciende el led con poco luminosidad y aunque le envie otro valores no varia la tension del led... Seguire investigando... Joder que torpe soy :-X

Tronico,yo he podido encender y apagar un led con visual basic,si es eso lo que pretendes hacer te dejo el codigo:

Codigo Vb:

Private Sub Command1_Click()
MSComm1.Output = Text1.Text
valor = MSComm1.Input
Text2.Text = valor
End Sub

Private Sub Form_Load()
With MSComm1
.Handshaking = 0
.RThreshold = 0
.RTSEnable = False
.Settings = “9600,n,8,1”
.SThreshold = 0
.PortOpen = True
End With

End Sub


Codigo Arduino:

int valor;
int lastvalor;
void setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);
}

void loop () {
valor=Serial.read();
if (lastvalor==49)
{
digitalWrite(13, HIGH);
}
else if (lastvalor==50)
{
digitalWrite(13, LOW);
}
lastvalor=valor;
Serial.println(lastvalor);
delay(500);
}

Lo que hace es si le envio el valor 1 en vb a arduino enciende el led y si le envio un 2 lo apaga,en el codigo arduino si te fijas uso 49 y 50,porque al enviar a arduino un valor lo que hace es convertirlo en Ascii.

Si quieres,podrias hacer la conversion desde el mismo visual basic que es menos complicado para que cuando envies un 1 desde vb arduino reciba un 1.

Yo me confundi diciendo que la funcion era ASC(). Es CHR(). Es decir, Text1.text=chr(150), deberias leer un 150 en Arduino.... :o

es asi??

Ahora mismo lo pruebo ... Lo de encender y apagar un led lo tengo claro... El problema es cuando quiero pasarle un valor al arduino para la salida analogica...

Probado y funcionando.... Muchisimas gracias... Eres un crack :D

Oleeeeeeee!!!! :D ;D :D

Me alegro que te funcione. Siempre lleva a confusion el tema de ASCII..... ;)

Saludos

Igor R.