Control de servomotor sense fils mitjançant enllaç de comunicació de 2,4 GHz

Proveu El Nostre Instrument Per Eliminar Problemes





En aquest post anem a construir un circuit de servomotor sense fils que pugui controlar 6 servomotors sense fils en un enllaç de comunicació de 2,4 GHz.



Introducció

El projecte es divideix en dues parts: un transmissor amb 6 potenciòmetres i un circuit receptor amb 6 servomotors .

El comandament a distància té 6 potenciòmetres per controlar 6 servomotors individuals de manera independent al receptor. En girar el potenciòmetre, l'angle del es pot controlar el servomotor .



El circuit proposat es pot utilitzar allà on necessiteu un moviment controlat, per exemple el braç d’un robot o el control de direcció de la roda davantera d’un cotxe RC.

El cor del circuit és el mòdul NRF24L01 que és un transceptor que funciona a la banda ISM (banda industrial, científica i mèdica), és la mateixa banda de freqüència que funciona el vostre WI-FI.

Il·lustració dels mòduls NRF24L01:

Té 125 canals, té una velocitat màxima de dades de 2 Mbps i un abast màxim teòric de 100 metres. Necessitareu dos mòduls d’aquest tipus per establir un enllaç de comunicació.

Configuració del pin:

Funciona amb protocol de comunicació SPI. Cal que connecteu 7 dels 8 pins a Arduino perquè aquest mòdul funcioni.

Funciona en 3,3 V i 5V i mata el mòdul, de manera que cal tenir precaució en alimentar-lo. Afortunadament tenim a bord un regulador de voltatge de 3,3 V a Arduino i només s’ha d’alimentar des de la presa d’Arduino de 3,3 V.

Ara anem al circuit del transmissor.

Circuit del transmissor:

El circuit consta de 6 potenciòmetres de 10 K ohmios. El terminal central de 6 potenciòmetres està connectat a pins d'entrada analògica A0 a A5.

Es presenta una tabulació al costat de l'esquema de la connexió NRF24L01 a Arduino que podeu referir, si teniu confusió en el diagrama de circuits.

Aquest circuit es pot alimentar des de la bateria USB o de 9V mitjançant una presa de corrent continu.

Si us plau, descarregueu el fitxer de la biblioteca aquí: github.com/nRF24/

Programa per a l'emissor:

//----------------------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------------------------//

Això conclou el transmissor.

El receptor:

El circuit receptor està format per 6 servomotors, un Arduino i dues fonts d'alimentació independents.

El els servomotors necessiten un corrent més alt per funcionar, de manera que no s’ha d’alimentar des d’arduino . Per això, necessitem dues fonts d’energia separades.

Si us plau, apliqueu tensió al servo de manera adequada per als micro servomotors de 4,8 V, ja que si voleu alimentar servomotors més voluminosos, apliqueu una tensió que coincideixi amb la qualificació del servo.

Recordeu que el servomotor consumeix una mica d’energia fins i tot quan no hi ha cap moment, perquè el braç del servomotor sempre lluita contra qualsevol canvi des de la seva posició comentada.

Programa per al 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------------------------//

Això conclou el receptor.

Com operar aquest projecte:

• Alimentar el circuit.
• Ara gireu qualsevol dels comandaments del potenciòmetre.
• Per exemple, el tercer potenciòmetre, gira el servo corresponent al receptor.
• Això s'aplica a tots els servomotors i potenciòmetres.

Nota: Podeu connectar el transmissor a l'ordinador i obrir el monitor sèrie per veure dades com ara l'angle del servomotor, el nivell de tensió del pin analògic i el potenciòmetre que s'utilitza actualment.

Si teniu alguna pregunta específica sobre aquest projecte de servomotor sense fils basat en Arduino, expresseu a la secció de comentaris que podreu rebre una resposta ràpida.




Anterior: 200, 600 circuits de cordes LED a la xarxa elèctrica de 220 V. Següent: Controlador de motor BLDC sense sensor d’alta intensitat mitjançant EMF posterior