Arduino em rede usando sockets

E aí galera! Passado o tempo de provas na faculdade e com algum tempo livre, resolvi criar um tutorial demonstrando como interligar o arduino a uma rede interna e poder controla-lo de qualquer computador interligado a essa rede.

Basicamente a implementação desse projeto consiste em um servidor onde o arduino será conectado e um cliente que através da conexão com o servidor poderá controlar o arduino remotamente. Veja a figura abaixo:

Essa figura representa o funcionamento básico do projeto. Como vocês podem ter vistos o tipo de datagrama usado será o TCP por prover uma conexão segura e confiável através do Three Way Handshake, para quem ainda não sabe como funciona uma conexão usando TCP aí vai uma rápida explicação: Na conexão TCP o cliente requisita uma conexão usando uma flag SYN (Synchronization) ativa, indicando um inicio de conexão. Então o servidor irá responder para o cliente com a mesma flag SYN ativa e também uma flag ACK (Acknowledgement) de reconhecimento, logo após isso o cliente responde ao servidor novamente com a flag ACK e então é feito um “aperto de mão em três vias” e assim é selada a comunicação entre os dois. Apartir daí a troca de dados é iniciada. a figura abaixo ilustra a explicação:

Bem, chega de teoria e vamos ao que interessa. A nossa implementação do cliente e servidor será através da linguagem Python, pois prove de forma simples uma conexão usando sockets.

Código do Servidor:

# ********************************************
# Autor: Fernando Krein Pinheiro
# Data: 12/05/2012
# Linguagem: Python
# ========= IMPORTANTE ===========
# O código esta livre para usar,
# citar e compartilhar desde que
# mantida sua fonte e seu autor.
# Obrigado.
#
# Código fonte baseado nos originais
# de Marcio Minicz encontrado em:
# http://www.python.org.br/wiki/SocketBasico
#
#********************************************

import socket
import thread
import os
import serial

HOST = ''
PORTA = 7000
PORTA_SERIAL = '/dev/ttyUSB1'
BAUD_RATE = 9600

conSerial = serial.Serial(PORTA_SERIAL, BAUD_RATE)
os.system("clear")

def conecta(conexao, cliente):

    print "IP conectado | Porta",   cliente

    while True:
        dados = conexao.recv(1024)
        if not dados: break
        print "Cliente para Arduino: ", dados
        conSerial.write(dados)
        mensagem = conSerial.readline()
	print "Arduino Diz: ", mensagem

    print 'Cliente encerrou conexao', cliente
    print "Terminando..."
    conSerial.close()
    conexao.close()
    thread.exit()
    sys.exit()

tcpSOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conexaoORIGEM = (HOST, PORTA)
tcpSOCKET.bind(conexaoORIGEM)
tcpSOCKET.listen(1)

while True:

    conexao, cliente = tcpSOCKET.accept()
    thread.start_new_thread(conecta, tuple([conexao, cliente]))

tcpSOCKET.close()

Código do Cliente:

# ********************************************
# Autor: Fernando Krein Pinheiro
# Data: 12/05/2012
# Linguagem: Python
# ========= IMPORTANTE ===========
# O código esta livre para usar,
# citar e compartilhar desde que
# mantida sua fonte e seu autor.
# Obrigado.
#
# Código fonte baseado nos originais
# de Marcio Minicz encontrado em:
# http://www.python.org.br/wiki/SocketBasico
#
#********************************************

import socket
import os
import serial

HOST = '127.0.0.1'
PORTA = 7000

tcpSOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
destinoCONEXAO = (HOST, PORTA)
tcpSOCKET.connect(destinoCONEXAO)

os.system("clear")
print "|====================================|"
print "|    Arduino na rede usando Python   |"
print "|====================================|"
print "| Digite SAIR para teminar a conexao |"

dados = raw_input()

while dados != 'SAIR':
    tcpSOCKET.send (dados)
    dados = raw_input()
tcpSOCKET.close()

Código Arduino:

/*********************************
Autor: Fernando Krein Pinheiro
Data: 12/05/2012
Linguagem: C (Wiring)
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/
void setup()
{
  Serial.begin(9600);
}

void loop()
{
    char dados;
     if (Serial.available() > 0)
     {
       dados = Serial.read();
       mensagem();
     }

}

void mensagem()
{
    Serial.println("Recebi seus dados Cliente");
}

Vídeo de demonstração:

Referencias:

http://olinux.uol.com.br/artigos/370/1.html
http://docs.python.org/library/socket.html
http://docs.python.org/howto/sockets.html
http://www.python.org.br/wiki/SocketBasico

Anúncios
por ferpinheiro Postado em Arduino

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s