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?
Tags:
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&
Saida: 29
Conteudo: &
Saida: 31
Conteudo:  &
Saida: 32
Conteudo: #32!&
Saida: 32
Conteudo:
Saida: 0
Conteudo: 3"#&
Saida: 34
Conteudo: #$&
Saida: 35
Conteudo: #35$%&
Saida: 35
Conteudo: 38&
Saida: 38
Conteudo: 6%&'&
Saida: 37
Conteudo: &'(&
Saida: 38
Conteudo:
Saida: 0
Conteudo: 1*&
Saida: 42
Conteudo: &
Saida: 0
Conteudo:
Saida: 0
Conteudo: 5&
Saida: 5
Conteudo: -.&
Saida: 45
Conteudo: 47&
Saida: 47
Conteudo: 8&
Saida: 8
Conteudo: #49&
Saida: 49
Conteudo: 812&
Saida: 49
Conteudo: #51&
Saida: 51
Conteudo: 52&
Saida: 52
Conteudo: 5&
Saida: 53
Conteudo: 5256&
Saida: 53
Conteudo: 7&
Saida: 55
Conteudo: 56&
Saida: 56
Conteudo: 9&
Saida: 57
Conteudo: 569:&
Saida: 57
Conteudo: #59&
Saida: 59
Conteudo: 0&
Saida: 0
Conteudo: #61&
Saida: 61
Conteudo: 0=>&
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?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por