Decodifique Sinais PPM de Receptor RC com Arduino: Guia Passo a Passo
Componentes e Materiais
- 1x Arduino UNO
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Transmissores RC são muito adequados para projetos que requerem link sem fio, pois têm links criptografados com bom alcance.
Todos receptores RC são feitos para acionar servomotores. Portanto, há 3 pinos por canal: terra, Vcc e sinal. Um tipo especial de sinal é usado: envia pulsos em intervalos. Quando o servo recebe pulso de 1,5ms, posiciona a 90°; variando de 1-2ms, vai ao mínimo e máximo.
O Problema
- Para cada canal do receptor, precisamos conectar um fio a um pino do Arduino. Isso não só requer muitas conexões como consome muitos pinos.
- A maioria dos Arduino tem apenas 2 pinos de interrupção; se usarmos mais de 2 canais, precisamos adicionar atrasos ao código, o que pode ser problemático.
A Solução: Pino PPM
Muitos receptores vêm com um pino extra chamado PPM. Este pino transmite dados de todos os canais em um único sinal.
Como o Sinal PPM é Composto
O sinal consiste em pacotes de dados separados por espaços em branco. O espaço entre picos representa o valor do canal. No caso, usei receptor de 6 canais, então há 7 pulsos.
No código, primeiro detectamos o espaço de separação e depois começamos a gravar dados dos pulsos para cada canal.
Como visto nas imagens, todos os dados são separados por aproximadamente 11500 microssegundos. Em seguida, 6 valores correspondem a cada canal.
Usando o Código
A função read_me() roda no pino de interrupção e captura 15 valores de tempo, armazenando em array.
A função read_rc() procura por qualquer espaço maior que 10000µs (espaço de separação). Ao detectar, move para a próxima seção. Após esse espaço, os 6 valores seguintes são as posições de cada canal, armazenados no array ch[1] a ch[6].
Código para Leitura de Canais RC
unsigned long int a, b, c;
int x[15], ch1[15], ch[7], i;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), read_me, FALLING);
}
void loop() {
read_rc();
Serial.print(ch[1]); Serial.print("\t");
Serial.print(ch[2]); Serial.print("\t");
Serial.print(ch[3]); Serial.print("\t");
Serial.print(ch[4]); Serial.print("\t");
Serial.print(ch[5]); Serial.print("\t");
Serial.print(ch[6]); Serial.print("\n");
delay(100);
}
void read_me() {
a = micros();
c = a - b;
b = a;
x[i] = c;
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) {
ch1[j] = x[j];
}
i = 0;
}
}
void read_rc() {
int i, j, k = 0;
for (k = 14; k > -1; k--) {
if (ch1[k] > 10000) {
j = k;
}
}
for (i = 1; i <= 6; i++) {
ch[i] = (ch1[i + j] - 1000);
}
}
Processo de manufatura
- Monitore a Temperatura da Sua Casa com Dashboard no Raspberry Pi
- Construa um Decodificador DTMF Usando Apenas um Arduino – Sem CIs Externos
- Crie um Sistema Ambilight Impressionante para Monitor com Arduino
- Construa um Dispositivo de Levitação Ultrassônica com Arduino – Guia Passo a Passo
- Programe Facilmente a Série Atmel AT89 com Arduino Uno – Guia Passo a Passo
- Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
- Monitor de Frequência Cardíaca IoT em Tempo Real com Arduino e MAX30100
- Servidor Web Arduino Uno WiFi: Controle LED via Navegador
- Contador Inteligente de Vagas: Rastreamento de Veículos em Tempo Real com Arduino, Processing e PHP
- Visualizador de Batimentos Cardíacos em Tempo Real com LED Alimentado por ECG