Controle de servo motor sem fio usando link de comunicação de 2,4 GHz

Controle de servo motor sem fio usando link de comunicação de 2,4 GHz

Neste post, vamos construir um circuito servo motor sem fio que pode controlar 6 servo motores sem fio em um link de comunicação de 2,4 GHz.



Introdução

O projeto está dividido em duas partes: um transmissor com 6 potenciômetros e um circuito receptor com 6 Servo Motors .





O controle remoto tem 6 potenciômetros para controlar 6 servo motores individuais de forma independente no receptor. Girando o potenciômetro, o ângulo do servo motor pode ser controlado .

O circuito proposto pode ser usado onde você precisa de movimento controlado, por exemplo, braço de um robô ou controle de direção da roda dianteira de um carro RC.



O coração do circuito é o módulo NRF24L01 que é um transceptor que funciona na banda ISM (banda Industrial, Científica e Médica) é a mesma banda de frequência em que o seu WI-FI funciona.

Ilustração dos módulos NRF24L01:

Possui 125 canais, taxa de dados máxima de 2 MBps e alcance máximo teórico de 100 metros. Você precisará de dois desses módulos para estabelecer um link de comunicação.

Configuração do pino:

Funciona no protocolo de comunicação SPI. Você precisa conectar 7 dos 8 pinos ao Arduino para fazer este módulo funcionar.

Ele funciona em 3,3 V e 5 V elimina o módulo, portanto, deve-se tomar cuidado ao energizar. Felizmente, temos um regulador de tensão de 3,3 V integrado no Arduino e ele deve ser alimentado apenas pelo soquete de 3,3 V do Arduino.

Agora vamos passar para o circuito do transmissor.

Circuito do transmissor:

O circuito consiste em 6 potenciômetros de valor de 10K ohm. O terminal do meio de 6 potenciômetros é conectado aos pinos de entrada analógica A0 a A5.

A tabulação é fornecida ao lado do esquema para NRF24L01 para conexão Arduino que você pode consultar, se tiver alguma confusão no diagrama de circuito.

Este circuito pode ser alimentado por USB ou bateria de 9 V via conector DC.

Faça download do arquivo da biblioteca aqui: github.com/nRF24/

Programa para transmissor:

//----------------------Program Developed by R.Girish------------------------//
#include
#include
#include
RF24 radio(9,10)
const byte address[6] = '00001'
#define pot1 A0
#define pot2 A1
#define pot3 A2
#define pot4 A3
#define pot5 A4
#define pot6 A5
const int threshold = 20
int potValue1 = 0
int potValue2 = 0
int potValue3 = 0
int potValue4 = 0
int potValue5 = 0
int potValue6 = 0
int angleValue1 = 0
int angleValue2 = 0
int angleValue3 = 0
int angleValue4 = 0
int angleValue5 = 0
int angleValue6 = 0
int check1 = 0
int check2 = 0
int check3 = 0
int check4 = 0
int check5 = 0
int check6 = 0
const char var1[32] = 'Servo1'
const char var2[32] = 'Servo2'
const char var3[32] = 'Servo3'
const char var4[32] = 'Servo4'
const char var5[32] = 'Servo5'
const char var6[32] = 'Servo6'
void setup()
{
Serial.begin(9600)
radio.begin()
radio.openWritingPipe(address)
radio.setChannel(100)
radio.setDataRate(RF24_250KBPS)
radio.setPALevel(RF24_PA_MAX)
radio.stopListening()
}
void loop()
{
potValue1 = analogRead(pot1)
if(potValue1 > check1 + threshold || potValue1 {
radio.write(&var1, sizeof(var1))
angleValue1 = map(potValue1, 0, 1023, 0, 180)
radio.write(&angleValue1, sizeof(angleValue1))
check1 = potValue1
Serial.println('INPUT:1')
Serial.print('Angle:')
Serial.println(angleValue1)
Serial.print('Voltage Level:')
Serial.println(potValue1)
Serial.println('----------------------------------')
}
potValue2 = analogRead(pot2)
if(potValue2 > check2 + threshold || potValue2 {
radio.write(&var2, sizeof(var2))
angleValue2 = map(potValue2, 0, 1023, 0, 180)
radio.write(&angleValue2, sizeof(angleValue2))
check2 = potValue2
Serial.println('INPUT:2')
Serial.print('Angle:')
Serial.println(angleValue2)
Serial.print('Voltage Level:')
Serial.println(potValue2)
Serial.println('----------------------------------')
}
potValue3 = analogRead(pot3)
if(potValue3 > check3 + threshold || potValue3 {
radio.write(&var3, sizeof(var3))
angleValue3 = map(potValue3, 0, 1023, 0, 180)
radio.write(&angleValue3, sizeof(angleValue3))
check3 = potValue3
Serial.println('INPUT:3')
Serial.print('Angle:')
Serial.println(angleValue3)
Serial.print('Voltage Level:')
Serial.println(potValue3)
Serial.println('----------------------------------')
}
potValue4 = analogRead(pot4)
if(potValue4 > check4 + threshold || potValue4 {
radio.write(&var4, sizeof(var4))
angleValue4 = map(potValue4, 0, 1023, 0, 180)
radio.write(&angleValue4, sizeof(angleValue4))
check4 = potValue4
Serial.println('INPUT:4')
Serial.print('Angle:')
Serial.println(angleValue4)
Serial.print('Voltage Level:')
Serial.println(potValue4)
Serial.println('----------------------------------')
}
potValue5 = analogRead(pot5)
if(potValue5 > check5 + threshold || potValue5 {
radio.write(&var5, sizeof(var5))
angleValue5 = map(potValue5, 0, 1023, 0, 180)
radio.write(&angleValue5, sizeof(angleValue5))
check5 = potValue5
Serial.println('INPUT:5')
Serial.print('Angle:')
Serial.println(angleValue5)
Serial.print('Voltage Level:')
Serial.println(potValue5)
Serial.println('----------------------------------')
}
potValue6 = analogRead(pot6)
if(potValue6 > check6 + threshold || potValue6 {
radio.write(&var6, sizeof(var6))
angleValue6 = map(potValue6, 0, 1023, 0, 180)
radio.write(&angleValue6, sizeof(angleValue6))
check6 = potValue6
Serial.println('INPUT:6')
Serial.print('Angle:')
Serial.println(angleValue6)
Serial.print('Voltage Level:')
Serial.println(potValue6)
Serial.println('----------------------------------')
}
}
//----------------------Program Developed by R.Girish------------------------//

Isso conclui o transmissor.

O receptor:

O circuito receptor consiste em 6 servo motores, um Arduino e duas fontes de alimentação separadas.

O servo motores precisam de corrente mais alta para operar, portanto, não devem ser alimentados por arduino . É por isso que precisamos de duas fontes de alimentação separadas.

Por favor, aplique a tensão ao servo apropriadamente para micro servo motores 4,8 V é o suficiente, se você quiser alimentar servo motores mais volumosos, aplique a tensão correspondente à classificação do servo.

Lembre-se de que o servo motor consome alguma energia mesmo quando não há momento, isso porque o braço do servo motor sempre luta contra qualquer mudança de sua posição comentada.

Programa para receptor:

//----------------------Program Developed by R.Girish------------------------//
#include
#include
#include
#include
RF24 radio(9,10)
const byte address[6] = '00001'
Servo servo1
Servo servo2
Servo servo3
Servo servo4
Servo servo5
Servo servo6
int angle1 = 0
int angle2 = 0
int angle3 = 0
int angle4 = 0
int angle5 = 0
int angle6 = 0
char input[32] = ''
const char var1[32] = 'Servo1'
const char var2[32] = 'Servo2'
const char var3[32] = 'Servo3'
const char var4[32] = 'Servo4'
const char var5[32] = 'Servo5'
const char var6[32] = 'Servo6'
void setup()
{
Serial.begin(9600)
servo1.attach(2)
servo2.attach(3)
servo3.attach(4)
servo4.attach(5)
servo5.attach(6)
servo6.attach(7)
radio.begin()
radio.openReadingPipe(0, address)
radio.setChannel(100)
radio.setDataRate(RF24_250KBPS)
radio.setPALevel(RF24_PA_MAX)
radio.startListening()
}
void loop()
{
delay(5)
while(!radio.available())
radio.read(&input, sizeof(input))
if((strcmp(input,var1) == 0))
{
while(!radio.available())
radio.read(&angle1, sizeof(angle1))
servo1.write(angle1)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle1)
Serial.println('--------------------------------')
}
else if((strcmp(input,var2) == 0))
{
while(!radio.available())
radio.read(&angle2, sizeof(angle2))
servo2.write(angle2)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle2)
Serial.println('--------------------------------')
}
else if((strcmp(input,var3) == 0))
{
while(!radio.available())
radio.read(&angle3, sizeof(angle3))
servo3.write(angle3)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle3)
Serial.println('--------------------------------')
}
else if((strcmp(input,var4) == 0))
{
while(!radio.available())
radio.read(&angle4, sizeof(angle4))
servo4.write(angle4)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle4)
Serial.println('--------------------------------')
}
else if((strcmp(input,var5) == 0))
{
while(!radio.available())
radio.read(&angle5, sizeof(angle5))
servo5.write(angle5)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle5)
Serial.println('--------------------------------')
}
else if((strcmp(input,var6) == 0))
{
while(!radio.available())
radio.read(&angle6, sizeof(angle6))
servo6.write(angle6)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle6)
Serial.println('--------------------------------')
}
}
//----------------------Program Developed by R.Girish------------------------//

Isso conclui o receptor.

Como operar este projeto:

• Alimente os dois circuitos.
• Agora gire qualquer um dos botões do potenciômetro.
• Por exemplo, o terceiro potenciômetro, o servo correspondente no receptor gira.
• Isso se aplica a todos os servo motores e potenciômetros.

Nota: Você pode conectar o transmissor ao computador e abrir o monitor serial para ver os dados como o ângulo do servo motor, o nível de tensão no pino analógico e qual potenciômetro está sendo operado no momento.

Se você tiver alguma pergunta específica sobre este projeto de servo motor sem fio baseado em Arduino, expresse na seção de comentários que você pode receber uma resposta rápida.




Anterior: 200, 600 LED String Circuit on Mains 220V Próximo: Controlador de motor BLDC sem sensor de alta corrente usando EMF traseiro