Go Down

Topic: Comunicación Serial (Read 2570 times) previous topic - next topic

fermg

Hola a todos, tengo una duda y la verdad no se muy bien donde tengo que ponerla, el problema es que estoy haciendo con visual basic 6.0 un programita para "digitalizar" una maqueta de tren, comunicación tengo y puedo mover los desvíos y encender luces, pero el problema es que quiero manejar desde el programa por un scrollbar la velocidad (bueno cada vía con uno distinto claro) pero no se muy bien como mandarlo y como hacer para que cuando pulse un botón haga el cambio de sentido (marcha adelante y marcha atrás),
yo en el visual basic mando por el puerto serie con la opción MSComm1.Output = "n" y con eso muevo los desvio y enciendo y apago las luces, y con el arduino lo que hago es:

char c;

void setup()
.............
..............
..........

void loop()
{
c=serial.read();

if (c == 'n')
{
digital........
}
y claro no se muy bien como enviarle los datos para poder regular la velocidad por PWM.

Muchas gracias a todos.

curro92

Hola,
tal vez podrías preguntar en Google arduino visual basic serial y seguro que salen un montón de ejemplos.

fermg

muchas gracias de antemano, he mirado y que retemirado y no veo nada parecido he visto un chico que lo manda como un chr$(y valor del scrollbar) que eso me serviría para poder manejar una de als vias pero lo que no se es como hacer el puente H utilizando un boton y como mandar los otros datos del otro scroll.
muchas gracias a todos.

fermg

Hoal de nuevo, solo quería saber porque no me funciona el código, el problema es que quiero mandar por serial como había comentado en anteriores post pero es que cuando mando por ejemplo la 'a' la luz se me enciende pero cuando le mando cualquier otra cosa ('g' o 't' )no me hace nada, que estoy haciendo mal? porque si le hago un Serial.print(datos), me sale bien la cadena de caracteres que le he metido. Muchas gracias a todos y perdón si estoy siendo pesado pero llevo dias con el tema y no consigo dar con el problema.

Quote

char datos[20];
char c;
int i=0;

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

void loop() {
  while (Serial.available() > 0) {
   c = Serial.read();
   datos=c;
   i++;
  }   
   
  if (datos[0] == 'a')
  {
    digitalWrite(13,HIGH);
  }
  if(datos[3]=='g')
  {
    digitalWrite(13,LOW);
  }
  if (datos[5]=='t')
  {
    for (int i=0; i<3; i++)
    {
    digitalWrite(13,HIGH);
    delay(100);
    digitalWrite(13,LOW);
  }
  }
  for (int j=0; j <i; j++)
    {
    Serial.print(datos[j]);
  }
  i=0;
}
}

noter

#4
Mar 04, 2013, 12:09 am Last Edit: Mar 04, 2013, 12:15 am by noter Reason: 1
Pues de momento, sin saber exactamente qué deseas que haga tu programa, en el bucle while, donde pones datos=c supongo que quieres decir datos=c. EDITO: supongo que sí has puesto datos(i), ya que yo lo he puesto y se come la "i" entre corchetes.
¿Por qué pones if datos[0], datos[3] y datos[5]?¿Se supone que cada letra debe ir en una posición concreta de la cadena o algo así?


Si sólo se trata de ir leyendo cada carácter y actuando según lo leído, te podría valer algo así:

void loop(){
  if (Serial.available()){
     switch(Serial.read()){
        case 'a':
           digitalWrite(13,HIGH);
           break;
        case 'g':
           digitalWrite(13,HIGH);
           break;
        case 't':
........etc.
     }
  }
}

curro92

Hola,
tendrías que poner el índice a la cadena datos, y poner un null al final.

void loop()
{
   i = 0;
   while (Serial.available() > 0)
   {
       c = Serial.read();
       datos = c;
       i++;
    }
    datos = '\0';
   ................ 
 

fermg

Gracias a todos por contestar, si que pongo " datos=c " porque compruebo al final con el for que todo los caracteres que ingreso estén dentro del array, pero cuando quiero mandar apagar el led, no lo hace, solo se enciende y no se muy bien porque no se apaga, ¿estaría mejor utilizar el swicht en vez del if?. lo que quiero es mandar por VB por el serial un valor y para pero como quiero controlar un motor a la hora de mandar el valor tendré que tener una AXXX o BXXX para saber si tiene que ir para adelante o para atrás.  muchas gracias a todos. por la noche probaré de nuevo y os comentaré los progresos.


noter

No puedo asegurártelo, pero tal y como tienes el código, para apagar tendrías que enviar una cadena con una g en 4ª posición, ya que en tu if miras si datos[3]=='g'. Es decir, si envías "123g" debería apagar. Por eso te preguntaba anteriormente por qué hacías el if de esa manera.
Deberías repasar un poco la referencia de Serial. Serial tiene otras funciones, aparte de leer un caracter. Por ejemplo, si sabes que a continuación debe ir un número para pwm puedes utilizar Serial.parseInt, que leerá automáticamente los siguientes caracteres numéricos y te devolverá un número entero. Con esto podrías recibir el pwm positivo o negativo, sin necesidad de almacenar lo recibido e ir recorriendo tú los datos.
p. ej. envío comando m-132
...
switch serial.read()
...
case 'm': //
     int pwm=serial.parseInt();  /// aquí pwm tomaría el valor -132

fermg

#8
Mar 04, 2013, 07:24 pm Last Edit: Mar 04, 2013, 07:31 pm by fermg Reason: 1
Eso es lo que quiero hacer exactamente, la opción de Serial.parseint no la conocia es la que me hace falta, pero la duda que tengo es porque cuando le hago un
if(datos[3] = 'g') no me apaga el led no lo entiendo porque deberia de agagarlo, tambien he puesto por ejemplo: if(datos[5] = 't') para que entrase en un un bucle for y no me lo hace, la verdad no entiendo muy bien porque, yo creo que el código no está mal. Pero claro yo no soy ningún experto. muchas gracias por contestar.
os lo pongo entero como lo tengo.
Quote

char datos[20];
char c;
int i=0;

void setup() {
 pinMode(13,OUTPUT);
 Serial.begin(9600);
}
void loop() {

  while (Serial.available() > 0) {
  c = Serial.read();
  datos=c;
  i++;
 }    
 datos == "\0";
 
 if (datos[0] == 'a')
 {
   digitalWrite(13,HIGH);
 }
 if(datos[3]=='g')
 {
   digitalWrite(13,LOW);
 }
 if (datos[5]=='t')
 {
   for (int i=0; i<3; i++)
   {
   digitalWrite(13,HIGH);
   delay(100);
   digitalWrite(13,LOW);
 }
 }
 for (int j=0; j <i; j++)
   {
   Serial.print(datos[j]);
 }
 i=0;
}



P.D: Lo siento soy un chapas. por cierto en datos si esta colocado la i dentro de los corchetes pero no sé porque no se ve.

noter

Supongo que para encender en el terminal pulsas a y después intro. Efectivamente encenderá. ¿Has probado después a teclear "123g" y luego intro? Sin haberlo probado, creo que debería apagarse, ya que buscas el caracter 'g' en datos[3].

fermg

Si que lo he probado ( vamos lo he probado todo yo creo ), es más si no pulsas intro no coge los caracteres introducidos, he probado mandarle los datos con la pantalla de serial del propio Arduino y con el Hyperterminal y no funciona,  he vuelto a escribir todo el código para ver si tenía fallos el anterior y nada, me sigue sin funcionar, seguro que es una tontería pero bueno, ya con la opción parseInt() que me dijiste ayer yo creo que me va a valer para hacer lo que quiero, si consigo hacer algo ya os comentare.

Muchas gracias a todos.

fermg

No entiendo muy bien lo que quieres decir, yo me coloco en la línea de la comunicación serial y pongo a123456767788 lo que sea y le doy a Enter y se me enciende el led, luego lo mismo 123g123455 y Enter y el led no se apaga y lo mismo con 't'  y no  entra en el bucle. Lo que voy a comprobrar al llegar a casa si poniendo en el array en la posición cero otra letra se me apaga el led solo por probar porque es lo único que no he probado.

fermg

Muchas gracias por el código, es practicamente igual que el que tengo yo, cada botón  manda un número o letra que reconoce el arduino, pero el problema es lo que te comentaba antes que tengo que usar parseint() para poder manejar un puente H para eso era el mandar una letra y un número que es la velocidad ejemplo a123 o b255 para que vaya en un sentido o en otro.

fermg

espero que no te hallas enfadado por lo que te he comentado luego a la tarde cuando llegue a casa voy a probra tu código para ver que es lo que tengo mal.

muchas gracias.

noter

Hola. No estaba enfadado, sino ausente. Tengo el handicap de no tener el Arduino a mano, así que lo que te envío está sin testear, pero espero que veas más o menos por dónde creo que tendrían que ir los tiros.

Code: [Select]

void setup() {
    Serial.begin(9600);
}

void loop() {
    while (Serial.available() > 0) {
        char comando=Serial.read();
        int valor=Serial.parseInt();
        if (Serial.read()=='\n'){
            Serial.print("Comando recibido: ");
            Serial.println(comando);
            Serial.print("Valor recibido: ");
            Serial.println(valor);
        } else Serial.println("Comando inválido.");
    }
}


Por cierto, en la referencia de Serial tienes también varios ejemplos que te pueden ser ilustrativos.

Go Up