Comunicação com sockets entre c# e arduino (utilizando shield ethernet)

Estou tentando fazer em c# a comunicação entre um PC e o Arduino com shield ethernet acoplado, esta comunicação tem que ser feita atravez de sockets mas não estou conseguindo algem pode me ajudar.

Exibições: 5289

Responder esta

Respostas a este tópico

Cara, voce conseguiu encontrar alguma solução para esse problema, se sim, pode compartilhar as fontes da sua pesquisa...por que estou com um caso parecido..

Segue em anexo um exemplo muito bacana de cliente Telnet (tcp porta padrão porta 23 mas, neste eu mudei pra porta 9763, se for caso retorne), já o usei como base para vários projetos

O Arduino inclusive tem, se não me engano, um exemplo de Telnet Server

Pra te ajudar indo mais direto no que você precisa eu preciso saber:

  - seu Arduino pretende deixá-lo como servidor ou como cliente

  - alguma porta específica ?

  - algum protocolo específico ? o que /qual tamanho de pacotes dados irá trafegar ?

qualquer coisa posta aí

Abraço

Anexos

Fala Marcelo, primeiramente obrigado. bem o arduino no caso sera cliente, pq ele so recebera um sinal de um servidor e alterara o status de algum componente. Quanto a porta acho que não tenho restrições....vai rodar em uma rede local....Quantoao protocolo provavelmente sera tcp/ip......Vou dar uma olhada com calma nesse projeto que vc me mandou...

Ok Felipe

Quem ficará "escutando" (esperando o outro conectar) Arduino ou programa em C# ?

do protocolo então me referia abaixo do tcp/ip mas, ok já entendi que será próprio simplesmente passando strings

Entao Marcelo, no caso é  arduino mesmo que será o servidor, me confundi aqui...ele fica esperando o programa se conectar passando o comando (ligar ou desligar) para ele alterar....

Ah...então ficou fácil: no Arduino tem exemplo de webserver,

você usa o programa que passei (altera o código fonte dele pra enviar comandos, etc) e no código do Arduino quando é feita a conexão ele executa o bloco de instruções à partir do

if (client) {

 Serial.println("new client");

....

....

}

então neste bloco de código você insere o seu códigotudo bem ? consegue seguir daí?

Tem um trabalhinho à fazer, nenhum bicho de 7 cabeças só um pouco de código :-)

qualquer coisa posta aí

Po Marcelo, ja ajudou muito kra....pode deixar q eu me viro kra....é um TCC entao...tenho q correr atras mesmo...mas ja clareou bastante.....vlw mesmo kra...

ok então, você está mais que certo;

qualquer coisa posta aí

Olá Marcelo tudo bem?, eu me Chamo Leandro estou com o mesmo problema que você teve.. Preciso controlar meus reles através de uma interface em C#,mas não pode ser serial, tem que ser tcp/ip. Faz semanas procuro algo pra tentar solucionar meu problema mas infelizmente não consegui nada. Caso tenha conseguido e puder me ajudar ficarei muito agradecido. Obrigado.

leandro.hashimoto@gmail.com

Dada a falta de material sobre o assunto, vou compartilhar minha guerra com o Arduino e o shield w5100. Vou logo avisando , NÃO sou expert em Arduino e/ou C#, mas recentemente me deparei com um projeto de automação que necessitou de ambos. Como já podem ter percebido é difícil encontrar um exemplo de programa (sem ser um navegador) acessando o web serve do Arduino , ainda mais em c#, o que me levou a muitas tentativas e erros, o que encontrei foi o seguinte: quando utilizasse uma conexão no shield do Arduino, para ele “perceber” que há uma conxao ele deve receber um byte qualquer, \n, ‘a’, oque seja, para ele passar dos teste de conexão(usando exemplo disponível na ide)

void loop() {

  // listen for incoming clients

  EthernetClient client = server.available();

  if (client) {

    Serial.println("new client");

    ...

        while (client.connected()) {Serial.println("chegou aqui conctado!");

      if (client.available()) {

        Serial.println("chegou aqui!avaliable");

 

                               ....  }

Como pode ver fiz alguns testes pra poder saber ate que ponto eu chegava no código, e so conseguir avançar quando enviava para Arduino um byte (0x00000001).

Feito isso conseguir acessar o arduino porem falta agora receber os dados no C#, não tenho certeza, diga-se de passagem,  se é correto o que vou afirmar, mas pelo o que eu entendi o arduino não implementa a estrutura de sockets como o c#.

Depois de inúmeros testes o código básico no C# ficou assim ( esse é o código que usei durante os testes , infelizmente o código final envolve características do sistema que estou desenvolvendo, não posso compartilhar):

 

static byte[] d={0x00000001};
static byte[] inStream = new byte[16];

 

if(teste=="a")
                {

// endereço ip utilizado
                     string strEnderecoIP = "192.168.0.51";

// IPEndPoint:  estrutura que encapsula endereço ip, porta, tipo de protocolo,etc
                    IPEndPoint ipEnd_cliente = new IPEndPoint(IPAddress.Parse(strEnderecoIP), 88);

// objeto socket iniciado com o IPEndPoint
                    Socket clientSock_cliente = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            
            // inicia a conexao
                clientSock_cliente.Connect(ipEnd_cliente);
                if(clientSock_cliente.Connected){Console.WriteLine("conctou\n");}else{Console.WriteLine("nao\n");}

// envia um dados qualquer para o Arduino, no caso especifico do meu código o arduino prontamente responde com um conjunto de dados que são salvos em um array
                clientSock_cliente.Send(d);
                clientSock_cliente.Receive(inStream,15, SocketFlags.None);
                
                for(int i=0;i<inStream.Length;i++)
                {
                    Console.WriteLine(""+inStream[i]);
                }
                clientSock_cliente.Close();
                teste=null;
                }
                if(teste=="0")break;

 

 

Com esse código é possível iniciar o desenvolvimento, ainda estou trabalhando no código final, tornalo assíncrono, etc, mas da pra fazer estudos em cima dele e avaçar.

Novamente , reitero que não sou expert em Arduino e C#, mas consegui fazer funcionar assim, fique a vontade para fazer correções e sugestões.

E acrescentando , o código c# também foi adaptado de códigos disponíveis na internet, nenhum deles foi disponível exclusivamente para arduino

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço