Go Down

Topic: Arduino e C# (Read 3219 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