Olá,
Eu necessito de interligar dois arduino, um Mega e um UNO, porque preciso de enviar valores de componentes que estão conetados ao arduino Mega para o UNO e vice-versa, e porque queria que a programação que criei desse para colocar nos dois de modoa que estejam a comunicar entre si.
Alguem sabe como se fazer??
Que é que já fizeste? A que distância vão estar ambos os Arduinos um do outro?
Com a informação que deste existem mil e uma maneiras de fazer isso.
Os dois arduinos vão estar a poucos centimetros de distancia. Estou a usar um reconhecimento de voz e um ecrã touch e a programação para ambos está no mesmo IDE e os componentes não cabem todos no UNO por isso é que preciso que interligar os dois arduinos.
Por exemplo, tenho tres sensores PIR e estão ligados ao MEGA mas queria que os dois arduinos recebessem os valores que os sensores enviarem para que a minha programação possa funcionar tanto no UNO como no MEGA.
O arduino uno está a usar a porta série? Se não estiver essa será uma hipótese.
De outra forma podes tentar com I2C ou SPI.
A porta serie que estás a dizer é porta USB que liga o arduino ao pc? Se for essa, sim, estou a usar a porta serie para testar a programação. Mas mais tarde, os arduinos serão alimentados com uma fonte de alimentação, não sendo necessário ligar os arduinos ao pc.
O que eu estava a pensar era que um arduino fosse o principal e o outro fosse o secundário, onde o principal terá o código e o secundário servirá para enviar/receber dados para a programação e ligar os componentes á programação. Será que dá para fazer assim?
a outra forma que estás a dizer, através do I2C ou SPI, existe programação na Internet que funcione, é que nunca trabalhei com este modo com arduino.
Eu estive à procura de como interligar dois arduinos, e vi que responderam que podia ser ligando o pino TX de um arduino ao RX do outro e vice-versa.
Caso tenha que interligar dois arduinos através do I2C ou SPI, qual é que aconselha a usar?
Qual será o mais fácil?
Vais ter mais alguma coisa ligada? Se sim, possivelmente será I2C... logo SPI poderá ser melhor. Mas tudo depende do que tens ligado.
Sim, vou ter dois motores de passo, tres microswitch e sensores pir, um EasyVR- reconhecimento de voz, um ecrã touch, e um RTC DS3231, se conseguir mostrar a hora e data no ecrã touch, isto tudo ligado aos arduinos.
Então estás a dizer que será melhor usar o I2C, sabendo que tenho estes componentes todos?
Eu referia-me a teres mais coisas ligadas por I2C... mas sinceramente tanto dá. Agora tens de começar a estudar protocolos de ocmunicação para transferir os dados de qualquer das maneiras que escolhas, Série, I2C ou SPI.
O RTC que vou usar, usa uma interface I2C, é o único componente que vou usar com I2C. Então, estás a dizer que tanto faz, qual eu uso, escolho uma que se adapta melhor ao fim que eu quero?
Estive a procurar na Internet programação sobre o I2C, e encontrei este https://portal.vidadesilicio.com.br/i2c-comunicacao-entre-arduinos/, e pareceu-me bem e experimentei, penso que funcionou, e queria enviar mais valores do que apenas para um led, tipo enviar valores de um motor de passo e o atual led.
Podem-me mostrar como faço para enviar mais do que um valor para apenas um componente?
Eu já disse com esta frase:
bubulindo:
Agora tens de começar a estudar protocolos de ocmunicação para transferir os dados de qualquer das maneiras que escolhas,
Tens de definir um protocolo de comunicação e implementá-lo. Imagina algo como:
<L.12> - Liga Led 12
<D.12> - Desliga Led 12
Se pesquisares no fórum por protocolos de comunicação vais encontrar imensos posts acerca disso.
Se poderes ser mais especifico, agradecia, é não percebi o que quiseste dizer e como nunca fiz uma coisa destas...
Já estive a procurar no forum como disseste e em todos os que eu vi não tentam comunicar dois arduinos.
Eu optei por usar o site: http://www.arduinobr.com/arduino/i2c-protocolo-de-comunicacao/
Acho que a programação está correta, e as ligações também, mas não funciona.
Criei um exemplo, que é, se clicares no microswitch, acenderá um led.
Envio a programação para ver o que poderá estar errado.
Master
#include <Wire.h>
#define SLAVE 0x1
#define microswitch 7
int ler_microswitch;
void setup()
{
Serial.begin(9600);
Wire.begin();
pinMode(microswitch,INPUT);
}
void loop()
{
ler_microswitch=digitalRead(microswitch);
Wire.beginTransmission(SLAVE);
Wire.write(ler_microswitch);
Wire.endTransmission();
delay(3000);
}
Slave
#include <Wire.h>
#define i2c_address 0x1
int led = 3;
int microswitch;
void setup()
{
Serial.begin(9600);
pinMode(led,OUTPUT);
Wire.begin(i2c_address);
Wire.onReceive(receberdados);
}
void receberdados()
{
microswitch = Wire.read();
}
void loop()
{
if(microswitch==1)
{
digitalWrite(led,HIGH);
Serial.println("Led ligado!");
}
else
{
digitalWrite(led,LOW);
Serial.println("Led desligado!");
}
delay(2000);
}
Como está ligado o microswitch? Tens uma resistência de pull-up?
Como tens ligados os Arduinos? Não terás um fio desligado?
Não precisas do delay() no código do slave...
Vê o que é que a função endTransmission retorna.
The results are returned as a byte. The results are as follows:
0: Successful send.
1: Send buffer too large for the twi buffer. This should not happen, as the TWI buffer length set in twi.h is equivalent to the send buffer length set in Wire.h.
2: Address was sent and a NACK received. This is an issue, and the master should send a STOP condition.
3: Data was sent and a NACK received. This means the slave has no more to send. The master can send a STOP condition, or a repeated START.
4: Another twi error took place (eg, the master lost bus arbitration).
Se for algo diferente de 0, há problemas.
O que é isso de resistência pull-up??Eu tenho o conetor comum do microswitch ligado ao ground e o outro, que é o NO ligado ao pino do arduino e uma resistência de 10kohms aos 5v.
Os arduinos ligei-os SDA-SDA e SCL-SCL, pino 20 do MEGA-pino A4 do UNO, e pino 21 do MEGA-pino A5 do UNO e ground do Mega com ground do UNO.
Como é que eu vou ver o que a função endTransmission retorna se serve apenas para terminar a transmissão?
penguim:
O que é isso de resistência pull-up??
Eu tenho o conetor comum do microswitch ligado ao ground e o outro, que é o NO ligado ao pino do arduino e uma resistência de 10kohms aos 5v.
Se a resistência estiver ligada ao pino do Arduino, acabaste de descrever um pull up. Sendo assim o botão tem sempre um nível lógico definido.
penguim:
Os arduinos ligei-os SDA-SDA e SCL-SCL, pino 20 do MEGA-pino A4 do UNO, e pino 21 do MEGA-pino A5 do UNO e ground do Mega com ground do UNO.
Pergunta estupida, como estás a alimentar ambos?
penguim:
Como é que eu vou ver o que a função endTransmission retorna se serve apenas para terminar a transmissão?
unsigned char ret = 0;
ret = Wire.endTransmisstion();
Serial.print("retorno");
Serial.println(ret);
Dificil???
Estava a alimentá-los com uma pilha de 9v, mas como vou ter mais coisas ligadas aos dois arduinos vou usar um tranformador, do qual podemos escolher a tensão que entra no arduino, e estava a pensar ligada com 9v-5A.
Nem me tinha lembrado de atribuir a uma variavel o valor da função, cabeça a minha...
Então tenho o microswitch ligado com uma resistência pull-up correto?
Era só para dizer que já consegui com que a programação funcionasse, o problema não era a programação mas sim as ligações. Eu penso que o que fiz mal era o facto de ter ligado o pino ground do MEGA com o ground do UNO, porque desta vez não liguei e funcionou, as únicas ligações que tenho entre os arduinos são os pinos SDA-SDA e SCL-SCL.
Só que agora, estou com outra dúvida para enviar mais do que uma variável, terei que colocar mais funções Wire.Read(), no slave, ou basta um?
Master
#include <Wire.h>
#define SLAVE 0x1
#define microswitch 7
#define microswitch 8
#define microswitch 9
int ler_microswitch;
int ler_microswitch1;
int ler_microswitch2;
unsigned char ret=0;
void setup()
{
Serial.begin(9600);
Wire.begin();
pinMode(microswitch,INPUT);
pinMode(microswitch1,INPUT);
pinMode(microswitch2,INPUT);
}
void loop()
{
ler_microswitch=digitalRead(microswitch);
ler_microswitch1=digitalRead(microswitch1);
ler_microswitch2=digitalRead(microswitch2);
Wire.beginTransmission(SLAVE);
Wire.write(ler_microswitch);
Wire.write(ler_microswitch1);
Wire.write(ler_microswitch1);
ret=Wire.endTransmission();
Serial.print("Retorno:");
Serial.print(ret);
}
Slave
#include <Wire.h>
#define i2c_address 0x1
int led = 3;
int led1 = 4;
int led2 = 5;
int microswitch, microswitch1, microswitch2;
void setup()
{
Serial.begin(9600);
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
Wire.begin(i2c_address);
Wire.onReceive(receberdados);
}
void receberdados()
{
microswitch = Wire.read();
microswitch1 = Wire.read();
microswitch2 = Wire.read();
}
void loop()
{
if(microswitch==1)
{
digitalWrite(led,HIGH);
Serial.println("Led ligado!");
}
else
{
digitalWrite(led,LOW);
Serial.println("Led desligado!");
}
if(microswitch1==1)
{
digitalWrite(led1,HIGH);
Serial.println("Led ligado!");
}
else
{
digitalWrite(led1,LOW);
Serial.println("Led desligado!");
}
if(microswitch2==1)
{
digitalWrite(led2,HIGH);
Serial.println("Led ligado!");
}
else
{
digitalWrite(led2,LOW);
Serial.println("Led desligado!");
}
}