Go Down

Topic: Arduino e C# (Read 3351 times) previous topic - next topic

eduardo_d

Mar 07, 2010, 12:16 am Last Edit: Mar 07, 2010, 02:51 pm by eduardo_d Reason: 1
Ola forum! ;D
Escrevi um  programa muito simples para o arduino que retorna 1 se um switch estiver pressionado e 0 se não estiver pressionado.
O objectivo é aprender a exportar dados do arduino para uma interface em c#.
Para isso li este tutorial:

"//csharp.simpleserial.com/"

Segui as explicações mas surgiu o seguinte problema:
Como era esperado, os valores 0 e 1 chegam á interface na forma de strings... o problema é que não chegam na forma "0" ou "1" . Em vez disso estão a chegar na forma "0/r/n" ou "1/r/n".
Alguem me sabe explicar a razão? :-?
Como fazer para que chegue apenas "0" ou "1"?

alguem me pode ajudar?
muito obrigado desde já!

Eduardo

eduardo_d

Olá!
Já resolvi o problema com a ajuda do forum! estava a usar Serial.println em vez de  Serial.print .
Mas agora estou com 2 dúvidas  :-/

#D1 -" Como podemos separar dados vindos do arduino??"
Estou a obter os dados em c# usando este pequeno código:

Code: [Select]
 
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
       {
           RxString = serialPort1.ReadExisting();//this is a string to collect data
           this.Invoke(new EventHandler(DisplayText));
       }


O problema é que a string para onde vão os dados está colocá-los de maneira serial, i.e : {00000000000000111111111100000000011111111000000}
Como podemos fazer para obter o valor instantâneo da porta ? i.e  apenas {0} ou {1} ?

#Q2 -"Como obter dados de dois switches?"
Imaginem que temos 2 switches (A e B) ligados a portas diferentes.Basicamente queremos activar um cronometro quando carregamos no A e pará-lo quando carregamos no B.

Ok, o problema é : Como podemos enviar dados do arduino e dizer-lhes que pertencem ao switch A ou ao switch B? Se isto não acontecer teremos {0000000011111000000111110000000011111}...
e não sabemos se os 0 pertencem ao switch A ou B!

Podem me dar alguma ajuda para poder continuar?
Obrigado por td!

Cumprimentos

Eduardo

eduardo_d

olá!
Já resolvi a Q2... mas continuo com duvidas na Q1  :-[

Alguem me pode ajudar?

cumps
Eduardo

Radames

você pode mandar uma string separando os dados importantes com algum caracter diferente de \n, por exmplo

Code: [Select]


Serial.print(val1);
Serial.print(",");
Serial.print(val2);
Serial.print(",");
Serial.print(val3);
Serial.print("\n");



Isso irá produzir uma string "val1,val2,val3"  e cada linha dessa string é um dado de valn sensores no arduino.
Depois em C# você pode dar um Split(","), e produzir um array com os três valores, não sei fazer isso em C#, mas em python por exemplo

Code: [Select]


s = Serial.serial("/dev/ttyUSB0", 19200) #porta serial em s
string = s.readline() # leio a porta jogo uma linha em string
vals = string.split(",") # isso ira colocar em vals = ["val1","val2","val3"]
# se os valores forem numeros converto tudo para um numero
vals = map(vals,float)


denadai

Caro Eduardo,

Eu utilizo Visual C# 2008 em minhas aplicações.

Para fazer o "decode" de uma String, eu posso pegar determinados campos dela com um comando chamado "SubString()" e compara-los.

Vou tentar Exemplificar:

//Voce tem 2 switches no arduino e quer saber se estes estao acionados ou nao.
//O melhor caminho é criar um protocolo para o mesmo, tipo assim:

"[button1ESTADOBOTAObutton2ESTADOBOTAO]"

Suponhamos que seu button1 esteja acionado em '1' e seu botao 2 esta desacionado em '0':

seu protocolo poderia ficar assim:

"[button1HIbutton2LO]"

Sempre tem que estabelecer um parametro! Enviar sempre da mesma forma, por exemplo:

Suponhamos que seu button1 esteja desacionado em '0' e seu botao 2 esta acionado em '1':

"[button1LObutton2HI]"

O que isso significa? Que quando voce for receber isto no PC, voce vai saber como o código vai chegar e assim poderá fazer um "decode" ou seja decodificar a mensagem recebida... Exemplo:

"[button1LObutton2HI]"

Voce sabe que:

[ - inicia mensagem
button1 - qual botao voce esta manipulando
LO - indica em que estado esta o botao, 1= HI e 0 = LO
button2 - qual botao voce esta manipulando
HI - indica em que estado esta o botao, 1= HI e 0 = LO
] - Fim da mensagem

Conseguiu ver a sacada? Voce cria seu proprio protocolo!

Como voce deve saber uma string tem indices ou seja, se voce recebe-se esta mensagem no Arduino, poderia ficar assim:

char string[20]; //tamanho do array char deve ser maior ou igual ao tamanho de seu protocolo

setup{
Serial.begin(9600);
}

loop{
if(serial.avaiable>0){

string = serial.read;

}

}

A string começa com o índice 0 (zero), logo:

[  b  u  t  t  o  n  1  L  O  b   u   t   t    o   n   2   H   I   ]
0 1  2  3  4 5  6  7  8  9  10 11 12 13 14 15 16  17 18 19

voce entao pode faze o decode assim;

if (string[0] == '['){  //indica que a mensagem chegou e que o decode comeca

if (string[1] == 'b' && string[2] == 'u' && string[3] == 't' && string[4] == 't' && string[5] == 'o' && string[6] == 'n' && string[7] == '1'){ // indica qual botao voce esta recebendo

if (string[8] == 'L' && string[10] == 'O'){// indica o estado do botao

led = 0; //exemplo apaga um led
}
}
}


No visual C# é mais facil;

Receba em uma string a mensagem da sua serial.

E faça isso:

if(StringRecebida.SubString(1, 7) == 'button1'){

// fazer o que vocve quizer com ele
}

StringRecebida.SubString(1, 7), significa que iniciei o meu decode em indice 1, e andei 7 indices.

deu pra entende?

falei falei falei falei e acho que nao disse nada;;;;

qq coisa poste suas duvidas, que acho que agora ficaram imensas...

HAHAHHA

abracos, e boa sorte.

eduardo_d

Pessoal!
Desde já peço desculpa por só agora responder ao tópico!
Obrigado radamés e denadai!  :)
As vossas respostas foram bastante úteis!
Infelizmente por motivos profissionais o Arduíno ficou um pouco parado (mas não esquecido) estes fins de semana  :-[.
Assim que tiver algum tempo livre, começarei a tentar aprender a escrever dados adquiridos por um sensor para uma cartão de memória.
Já algum de vocês fez isto? :-?

Um grande abraço
Eduardo

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy