Estou trabalhando em um projeto que inicialmente é para funcionar assim, vai ter dois Arduinos e os dois vão precisar se comunicar.
No Arduino Mestre pretendo colocar algumas funções como um display 16x2, um menu de configurações e no Arduino Escravo controlar um motor de passo com a Biblioteca AccelStepper.

Eu estava olhando alguns exemplos da comunicação I2C e Serial, mas pelos exemplos que ele envia somente uma variável.

Preciso que o Arduino Mestre envie as informações como velocidade, aceleração e deslocamento. No Arduino Escravo preciso ler as informações que citei acima e retornar para o Arduino Mestre quando o deslocamento foi concluído.

Consigo fazer isto com a Comunicação I2C ou Serial ou tem alguma outra forma de fazer?

Exibições: 1447

Responder esta

Respostas a este tópico

Boa Tarde pessoal,

Eu estava meio ocupado nos últimos dias sem tempo para mexer no projeto mas consegui uma folguinha  e fiz uns testes.

Segue abaixo o código que está no arduino mega para a comunicação serial.

void serialRX() {
String conteudo = "";
char caractere;

while (Serial1.available() > 0) {
caractere = (char) Serial1.read();
if (caractere != '\n') {
conteudo += caractere;
}
if (caractere == '\n') {
Serial.print("Conteudo: ");
Serial.println(conteudo);
int carIni = conteudo.indexOf('#');
int carFin = conteudo.indexOf('&', carIni + 1);
String carTot = conteudo.substring(carIni + 1, carFin);
idUno = carTot.toInt();
Serial.print("Saida: ");
Serial.println(idUno);
conteudo = " ";
}
}

}

No arduino mega utilizo a Serial1. para a comunicação com o arduino uno e a Serial. para monitorar o valor recebido conforme está no documento em anexo saida.txt.

No arquivo em anexo uno.ino está o código que é utilizado no arduino uno para enviar dados para o arduino mega.

Gostaria de saber se alguém tem alguma dica de como resolver o problema que está no anexo saida.txt onde tem alguns números que falham ou outro código mais eficiente para o envio, leitura e conversão dos dados.  

 

Está apresentando erro quando adiciono os anexos por isto segue abaixo o código.

*****************Código Arduino Uno*********************
String serialMega;
byte lastUnoId, unoId = 0;
int id, vel, acel, mov;

void setup() {

Serial.begin(9600);
//delay(3000);
}
void loop() {

/////////Teste
unoId++;
delay(500);
if (unoId > 200) {
unoId = 0;
}

serialTX();
}

void serialTX() {

if (unoId != lastUnoId) {
lastUnoId = unoId;
serialMega += '#';
serialMega += unoId;
serialMega += '&';
Serial.print(serialMega);
Serial.print('\n');
}
}

********************Arquivo Saida.txt**********************

onteudo: 8&#29&#30&
Saida: 29
Conteudo: &#31&
Saida: 31
Conteudo: &#32&
Saida: 32
Conteudo: #32&#33&
Saida: 32
Conteudo:
Saida: 0
Conteudo: 3&#34&#35&
Saida: 34
Conteudo: &#35&#36&
Saida: 35
Conteudo: #35&#36&#37&
Saida: 35
Conteudo: 38&
Saida: 38
Conteudo: 6&#37&#38&#39&
Saida: 37
Conteudo: &#38&#39&#40&
Saida: 38
Conteudo:
Saida: 0
Conteudo: 1&#42&
Saida: 42
Conteudo: &
Saida: 0
Conteudo:
Saida: 0
Conteudo: 5&
Saida: 5
Conteudo: &#45&#46&
Saida: 45
Conteudo: 47&
Saida: 47
Conteudo: 8&
Saida: 8
Conteudo: #49&
Saida: 49
Conteudo: 8&#49&#50&
Saida: 49
Conteudo: #51&
Saida: 51
Conteudo: 52&
Saida: 52
Conteudo: &#53&
Saida: 53
Conteudo: 52&#53&#54&
Saida: 53
Conteudo: &#55&
Saida: 55
Conteudo: 56&
Saida: 56
Conteudo: &#57&
Saida: 57
Conteudo: 56&#57&#58&
Saida: 57
Conteudo: #59&
Saida: 59
Conteudo: 0&
Saida: 0
Conteudo: #61&
Saida: 61
Conteudo: 0&#61&#62&
Saida: 61
Conteudo: 63&
Saida: 63
Conteudo: &
Saida: 0
Conteudo: 5&
Saida: 5

Consegui resolver o problema segue abaixo como ficou o código no arduino mega.

void serialRX() {

while (Serial1.available()) {

char inChar = (char)Serial1.read();
if (inChar == '\n') {
stringComplete = true;
} else {
inputString += inChar;
}
}

if (stringComplete) {
Serial.print("Conteudo: ");
Serial.println(inputString);
int carIni = inputString.indexOf('#');
int carFin = inputString.indexOf('&', carIni + 1);
String carTot = inputString.substring(carIni + 1, carFin);
idUno = carTot.toInt();
Serial.print("Saida: ");
Serial.println(idUno);
inputString = "";
stringComplete = false;
}

No arduino uno ficou da seguinte forma.

void serialTX() {

if (unoId != lastUnoId) {
lastUnoId = unoId;
Serial.print('#');
Serial.print(unoId);
Serial.print('&');
Serial.print('\n');
}
}

Gostaria de implementar o teste de CRC na comunicação serial, alguém tem alguma dica de como fazer isto.

A própria comunicação Serial já possui CRC.

No protocolo de comunicação que eu estou desenvolvendo, utilizo a técnica de Replayback!

Ou seja retorno o próprio conteúdo enviado, se a origem e destino forem iguais, está OK.

Pelo que eu estava vendo acho que comunicação serial não possui CRC.

Ou será que estou enganado?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço