LusoRobótica - Robótica em Português

Robótica => Discussão geral sobre robótica => Tópico iniciado por: norbanvs em 31 de Dezembro de 2008, 05:41

Título: Comunicação directa entre dois Arduinos
Enviado por: norbanvs em 31 de Dezembro de 2008, 05:41
Ok pessoal, então é o seguinte...

Já se falou num outro tópico que "Ai... e tal... dois Arduinos que comunicam atravez de XBee... e por aí fora...".
Mas eu, como não tenho pachorra de gastar dinheiro em XBee, quero começar com algo mais primitivo, por isso eu pretendo ligar duas Arduinos fisicamente, de maneira a que, por exemplo, numa Arduino receba dados a partir de um potenciómetro, depois envie esses dados a uma segunda Arduino, os quais poderemos confirmar no pc.

A imagem que coloquei em anexo dá uma ideia de como vai ficar essa enorme confusão...

As ligações foram feitas de acordo com pesquisas que fiz, assim como as fontes de alimentação separadas, se bem que ainda não tenho a certeza se alguma coisa estará correcta.

Os programas para cada uma das Arduinos são simples, mas não dão bem aquilo que eu pretendo, talvez por serem simples em excesso, ainda não entendi bem esta parte...

Coloquei também em anexo os dois programas das Arduinos para que possam ver a onde é que poderei estar a errar.

Sei que nem toda a gente tem duas Arduinos, mas de qualquer maneira gostaria de ouvir a vossa justiça, nem que seja só para ver o que isto vai dar!  :P

Fiquem bem... e Feliz Ano Novo!
 ;D :D ;) :) :-* ::) :) ;) :D ;D
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: ngoncalves em 31 de Dezembro de 2008, 09:42
A forma de comunicar está engenhosa, mas só funciona se os dois arduinos estiverem a utilizar a mesma alimentação. E também é muito sensível ao ruído e maus contactos.
 
Podes tentar utilizar a porta série (RS-232) para enviar o valor lido de um arduino para o outro. É mais robusto a interferências. Ou em alternativa utilizar o I2C que permite ter vários arduínos a comunicarem utilizando apenas 2 fios. Mas é sempre necessário que a alimentação seja a mesma para a porta série ou para o I2C.  Talvez seja possível utilizar a porta série e alimentações diferentes se se utilizar um CI conversor de nível (o MAX232 ou parecido). Mas não tenho a certeza desta última.

Sem utilizar a mesma alimentação só rádio ou luz. Se o XBee é caro, tenta com 2 pares de leds inframvermelhos, um emissor e o outro receptor. O problema é que tens que escrever o código para garantir que os dois arduinos não tentam falar ao mesmo tempo. Mas se pretendes apenas que um fale e outro escute, então é simples. Um bocadinho mais caro que 4 leds é utilizar dois "leds" de infra-vermelhos utilizados nos comandos remotos. Procura na net por "sharp ir transceiver".
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: delphi em 31 de Dezembro de 2008, 11:09
Olá,

E se se usarem os pins TX/RX dos dois arduinos (o TX de um arduino ao RX do outro e vice-versa)?

Ou então podem-se utilizar outros pins digitais com a library http://www.arduino.cc/en/Tutorial/SoftwareSerial (http://www.arduino.cc/en/Tutorial/SoftwareSerial).


Bom Ano para todos!
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: ngoncalves em 31 de Dezembro de 2008, 11:24
Citar
E se se usarem os pins TX/RX dos dois arduinos (o TX de um arduino ao RX do outro e vice-versa)?

O problema de usar a porta série é que quase de certeza necessita de uma alimentação comum entre os dois arduinos. Mas para tirar as dúvidas só vendo o datasheet do Atmega168.

E utilizar quaisqueres outros pinos digitais tem o mesmo problema. Com alimentações diferentes, a tensão de referência 0 volts é diferente para os dois arduínos. Desconfio que ao ligar os fios, alguma corrente terá que passar entre os pinos dos arduinos por causa das alimentações serem diferentes. Mas posso estar errado.
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: ngoncalves em 31 de Dezembro de 2008, 11:38
Citar
Os programas para cada uma das Arduinos são simples, mas não dão bem aquilo que eu pretendo, talvez por serem simples em excesso, ainda não entendi bem esta parte...

O analogRead() utiliza o conversor analógico-digital (ADC) para ler a tensão no pino do potenciómetro. O analogWrite() gera uma onda quadrada com um determinado periodo. A relação entre a percentagem do período em que a onda está a 5V e a percentagem a que está a 0V depende do valor que é passado à função. O objectivo é que o valor médio da onda seja igual a 4.9 mv * valor_digital.

Mas para que o esquema funcione é necessário que o ADC no arduino que está à escuta funcione muito lentamente. Ou seja, veja o valor médio da onda quadrada. Caso contrário só vais ler 0V e 5V. A minha sugestão é que coloques um filtro RC passa-baixo na entrada do arduino que está à escuta. Ou seja:

  1) uma resistência entre o pino 3 do emissor e o pino 3 do receptor (10K por exemplo)
  2) um condensador entre o pino 3 do receptor e os 0V do receptor (10 uF por exemplo)

 Os valores devem ser calculados atraves da formula: fc = 1/(2 * pi * R * C) em que fc é a frequência de corte do filtro. Como se pretende obter o valor médio da onda quadrada, fc deve ser baixo (< 10 Hz), idealmente perto de 2 Hz ~ 5 Hz

 
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: TigPT em 31 de Dezembro de 2008, 12:01
Não basta meter ground comum entre os dois arduinos?

Quando receber o meu segundo posso depois testar isto (assim que tenha tempo).

A minha ideia ia mais para fazeres um segundo serial com pins digitais no arduino que está a ligado ao pc para poderes continuar a usar o usb para enviar dados para pc.

Não posso adiantar mt mais do que já foi dito sem testar!

Boa sorte para o projecto!
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: ngoncalves em 31 de Dezembro de 2008, 12:18
Citar
Não basta meter ground comum entre os dois arduinos?

Mas neste caso as alimentações não são separadas. Na figura que o norbanvs postou não é claro, mas eu fiquei com a impressão que são separadas.

Vendo melhor a imagem, não percebo o que lá está a pilha de 9V a fazer..... Porque não utiliza os 5V do primeiro arduino ? E parece-me que o potenciómetro também está mal ligado. O pino do meio é que devia ir ao pino analógico. Regra geral, ligam-se os 5V e os 0V aos pinos de fora. Tal como está parece-me que está a ler 5V menos a queda de tensão no potencíometro, que depende da corrente consumida pelo ADC.

No essencial tens razão, basta o ground ser comum. Mas cuidado que isso pode resultar mal a ligação à massa for feita através de um componente e não com um fio/pista no circuito.
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: TigPT em 31 de Dezembro de 2008, 12:21
Sim, os potenciómetros no geral tem a saída para analogico ao meio e a tensão às pontas!
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: norbanvs em 31 de Dezembro de 2008, 18:45
Citar
Sem utilizar a mesma alimentação só rádio ou luz. Se o XBee é caro, tenta com 2 pares de leds inframvermelhos, um emissor e o outro receptor. O problema é que tens que escrever o código para garantir que os dois arduinos não tentam falar ao mesmo tempo. Mas se pretendes apenas que um fale e outro escute, então é simples. Um bocadinho mais caro que 4 leds é utilizar dois "leds" de infra-vermelhos utilizados nos comandos remotos. Procura na net por "sharp ir transceiver".

Esta sugestão me parece boa... só por curiosidade... e se entre o emissor IR e o receptor IR eu coloca-se um cabo de fibra óptica?
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: TigPT em 31 de Dezembro de 2008, 20:12
Emisor receptor de IR

Fibra-optica exige um processamento elevadicimo e um preço ainda maior.. não te metas por ai rapaz ;)
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: guibot em 01 de Janeiro de 2009, 03:46
fiz um update ao tutorial sobre comunicação Serial, agora tenho um setup com fios, e outro sem fios:
http://lab.guilhermemartins.net/?p=346 (http://lab.guilhermemartins.net/?p=346)

Feliz 2009  ;D
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: TigPT em 01 de Janeiro de 2009, 05:59
fiz um update ao tutorial sobre comunicação Serial, agora tenho um setup com fios, e outro sem fios:
http://lab.guilhermemartins.net/?p=346 (http://lab.guilhermemartins.net/?p=346)

Feliz 2009  ;D
Excelente... Feliz 2009 para ti também.
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: norbanvs em 01 de Janeiro de 2009, 10:22
Citar
fiz um update ao tutorial sobre comunicação Serial, agora tenho um setup com fios, e outro sem fios:
http://lab.guilhermemartins.net/?p=346 (http://lab.guilhermemartins.net/?p=346)

Realmente, desta maneira está impecável!
É justamente isto tudo. Apenas uma coisa curiosa que descobri. Para esta experiência dar certo, as duas Arduinos tem que estar ligadas à mesma fonte de alimentação; já para o caso de cada uma ter a sua própria fonte de alimentação, ambas terão que estar ligadas ao GRN uma com a outra.
Mas de resto está tudo a 100%

Imaginem agora que este exemplo poderia ser aplicado a dois Smallduinos que por causa de dá-cá-aquela-palha eles teriam que trocar uma informação um com o outro, assim tipo o primeiro estudava um labirinto e depois passaria a informação ao "colega"... sei que é um exemplo meio maluco, mas lá que seria divertido, seria!
 ;D ;D ;D ;D

Obrigado pela explicação
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: norbanvs em 01 de Janeiro de 2009, 11:12
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fcache02.stormap.sapo.pt%2Ffotostore02%2Ffotos%2F%2F2c%2F43%2F37%2F2628801_kQJd4.gif&hash=42996df42d4f96792e7b105ac5a6c49ff8823a0c)
Título: Re:Comunicação directa entre dois Arduinos
Enviado por: guibot em 01 de Janeiro de 2009, 11:48
Não sei como estás a fazer o teu setup, mas a única coisa que precisas ligar entre os arduinos são os Tx Rx

A cena dos smallduinos está muita gira, seria engraçado experimentar ;)