Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

DIY Arduino RC Receiver para modelos RC e projetos Arduino


Neste tutorial vamos aprender como fazer um receptor RC baseado em Arduino. Desde que construí meu transmissor DIY Arduino RC em um dos meus vídeos anteriores, recebi muitos pedidos de vocês, para fazer um receptor dedicado para ele, então aqui está.

Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo.

Agora, esses dois dispositivos podem se comunicar facilmente e podemos usá-los para controlar muitas coisas sem fio. Vou explicar como tudo funciona através de alguns exemplos. No primeiro exemplo usaremos este receptor Arduino RC para controlar um carro simples composto por dois motores DC. No segundo exemplo, mostrarei como controlar motores e servos sem escovas, que são componentes comuns encontrados em muitos aviões RC comerciais, barcos, carros e assim por diante. Se soubermos como controlá-los, podemos modificar e controlar facilmente muitos modelos de RC com nosso próprio transmissor Arduino personalizado.

Como terceiro exemplo, mostrarei como modifiquei e usei este sistema RC baseado em Arduino para controlar um carro RC comercial.

Diagrama de circuito do receptor Arduino RC


Para começar, vamos dar uma olhada no diagrama de circuito deste sistema. A comunicação via rádio é baseada nos módulos transceptores NRF24L01.

O transmissor envia constantemente dados de seus controladores, joysticks, botões, potenciômetros e interruptores, e nós recebemos esses dados com o receptor. Para mais detalhes sobre como este transmissor Arduino funciona, você pode conferir meu outro tutorial detalhado para ele.

Também podemos notar aqui que este receptor RC não funciona necessariamente apenas com este Transmissor específico que construí. Ele pode funcionar com qualquer outra configuração semelhante composta por uma placa Arduino e um módulo NRF24L01.

No entanto, o cérebro deste receptor RC é uma placa Arduino Pro Mini. Para alimentação, podemos usar o pino VCC ao qual podemos conectar 5V ou o pino RAW ao qual podemos conectar de 6 a 12V. Observe que existem duas versões do Arduino Pro Mini, como a que uso aqui que opera em 5V e a outra opera em 3,3V. Por outro lado, o módulo NRF24L01 opera em 3,3V, portanto, precisamos de um regulador de tensão. Desta vez estou usando o regulador de tensão AMS1117, que emite 3,3V de entradas que podem variar de 5V a 12V.

Você pode obter os componentes necessários para este Arduino RC Receiver nos links abaixo:
  • Módulo Transceptor NRF24L01…….………
  • NRF24L01 + PA + LNA …………………..…….
  • AMS1117 3,3V Regulador de tensão ………..
  • Pin Headers Masculino + Feminino ……………….. Amazon / Banggood / AliExpress
  • Arduino Pro Mini………………..……..………..
  • Arduino Pro Mini como o que eu usei……

Para comunicação com o Arduino, o módulo NRF24L01 utiliza o protocolo SPI, além de dois pinos digitais adicionais. Isso significa que ficamos com 9 pinos digitais que podem ser usados ​​como canais de saída, dois dos quais são os pinos RX e TX. Vale a pena notar que esses pinos devem ser desconectados de qualquer coisa enquanto estamos enviando um esboço para a placa Arduino, portanto, tornei possível conectar ou desconectar através de cabeçalhos de pinos separados. Na verdade, também podemos usar as entradas analógicas como saídas digitais, portanto, embora esta placa Arduino seja bastante pequena, temos muitas saídas ou canais disponíveis.

Projeto de PCB


No entanto, para manter este circuito compacto, fiz uma PCB personalizada usando o software de design de circuito online gratuito EasyEDA. Aqui, eu organizei os 8 canais ao lado de um 5V e um trilho de aterramento, e assim podemos conectar diretamente servos e ECSs a eles. O canal número 9 está localizado em uma posição separada, próximo ao pino VCC do Arduino, então podemos usar, por exemplo, um ESC para alimentar o Arduino com seu recurso Battery Eliminator Circuit que fornece 5V. Claro, poderíamos usar qualquer outro canal para essa finalidade, pois o pino VCC também está conectado a esses trilhos de 5V.

Quanto aos canais número 7 e 8, podemos ver aqui como são interrompidos com esses cabeçalhos de pinos. Se quisermos usá-los, basta conectar os dois pinos. O cabeçalho de programação está localizado no canto superior direito e o capacitor de 100uF serve tanto para o regulador de tensão quanto para o módulo NRF24L01. No canto inferior esquerdo da PCB, coloquei os pinos analógicos.

Aqui podemos notar mais uma coisa, e é que algumas placas Arduino Pro Mini podem ter diferentes arranjos de pinos, então incluí mais uma versão do PCB para que você possa escolher aquela que combina com sua placa Arduino Pro Mini.

Aqui está um link para os arquivos de projeto deste PCB. Assim que terminei o projeto, gerei o arquivo Gerber necessário para a fabricação do PCB.

Arquivos Gerber:

Então encomendei o PCB da JLCPCB que também é o patrocinador deste vídeo.

Aqui podemos simplesmente arrastar e soltar o arquivo Gerber e, uma vez carregado, podemos revisar nosso PCB no visualizador Gerber. Se tudo estiver bem, podemos continuar e selecionar as propriedades que queremos para o nosso PCB. E é isso, agora podemos simplesmente encomendar nosso PCB a um preço razoável. Observe que, se for seu primeiro pedido da JLCPCB, você poderá obter até 5 PCBs por apenas US $ 2.

Montagem de PCB


Depois de vários dias, os PCBs chegaram. A qualidade dos PCBs é ótima e tudo é exatamente igual ao design.

Agora podemos seguir em frente e montar o PCB. Primeiro, precisamos soldar os pinos da placa Arduino. Uma maneira conveniente de fazer isso é usar uma placa de ensaio para colocar os cabeçalhos dos pinos nela e assim a placa permanecerá firme no lugar durante a soldagem. Como eu disse anteriormente, dependendo da sua placa, os pinos podem variar um pouco, então lembre-se disso ao soldá-los.

Além disso, existem alguns pinos de aterramento que precisamos deixar livres, pois existem alguns traços em execução no PCB sob eles. Depois de soldar a placa Arduino, cortei o excesso de comprimento dos pinos.

Em seguida, coloquei todos os outros cabeçalhos de pinos no lugar. Precisamos de cabeçalhos de pinos masculinos e femininos, ou depende de você quais cabeçalhos de pinos você escolherá usar. No entanto, é uma boa ideia usar pinos machos para os canais digitais, pois os servomotores e as conexões ESC são fêmeas, para que possamos conectá-los facilmente.

O regulador de tensão é um componente de montagem em superfície, então usei um adesivo Blue-Tack para mantê-lo no lugar durante a soldagem. Por fim, uma vez que soldamos os dois capacitores no lugar, podemos conectar o módulo NRF24L01 aos conectores de pinos apropriados.

Dependendo da aplicação ou do alcance que precisamos, podemos usar o módulo normal com a antena integrada ou aquele ao qual podemos conectar uma antena maior e conseguir comunicação sem fio de até 700 metros em espaço aberto . Então é isso, nosso Arduino RC Receiver já está pronto e podemos usá-lo para o que quisermos.

Para programar o receptor, ou conectar o Arduino Pro Mini ao computador, podemos usar uma interface USB para UART serial que pode ser conectada ao cabeçalho de programação.

No menu de ferramentas do Arduino IDE precisamos selecionar a placa Arduino Pro ou Pro Mini, selecionar a versão adequada do processador, selecionar a porta e selecionar o método de programação para “USBasp”.

E agora podemos fazer upload de códigos para o Arduino.

Exemplo 1 – Carro RC Arduino


Ok, agora podemos seguir em frente e dar uma olhada no primeiro exemplo.

É um carro simples composto por dois motores de 12V DC e em alguns dos meus vídeos anteriores já mostrei como funciona e como construí-lo.

Consulte também:Driver do Motor L298N – Interface Arduino, Como Funciona, Códigos, Esquemas

Desta vez, usaremos nosso novo receptor Arduino RC para controlá-lo. Para acionar os motores DC, estamos usando o driver do motor L298N e para alimentar, estamos usando 3 baterias de íon de lítio que fornecem cerca de 12V.

Você pode obter os componentes necessários para este exemplo nos links abaixo:
  • Motorista L298N ……………………………….. 
  • Motor CC de alto torque de 12V ………….. 
  • Motor DC com roda de pneu de plástico …….
  • Breadboard e jump wires ………… 

Então, as conexões são bem simples, os 12V vindos das baterias vão para o pino de 12V do nosso receptor, e os seis pinos de controle do driver vão para os 6 canais. Precisamos observar aqui que, para poder controlar a velocidade dos motores, precisamos fornecer sinal PWM para os pinos Enable A e Enable B do driver. Em nosso receptor os canais número 2, 3, 6 e 9 podem emitir sinais PWM, então ali conectei os pinos Enable do driver aos canais número 2 e 6 neste caso.

Vamos dar uma olhada no código do Arduino agora.
/*
   Arduino RC Receiver - Car Example 
   by Dejan, www.HowToMechatronics.com
   Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define enA 9  // Arduino pin D9 - CH6 on PCB board - PWM output
#define in1 8  // D8 - CH5 
#define in2 7  // D7 - CH4
#define in3 6  // D6 - CH3 
#define in4 4  // D4 - CH1 
#define enB 5  // D5 - CH2 - PWM output

RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

// Max size of this struct is 32 bytes
struct Data_Package {
  byte j1PotX;
  byte j1PotY;
  byte j1Button;
  byte j2PotX;
  byte j2PotY;
  byte j2Button;
  byte pot1;
  byte pot2;
  byte tSwitch1;
  byte tSwitch2;
  byte button1;
  byte button2;
  byte button3;
  byte button4;
};

Data_Package data; //Create a variable with the above structure

int  steering, throttle;
int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  //Serial.begin(9600);  
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); //  Set the module as receiver
  resetData();
}
void loop() {
  // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }
  
  // Parse the data from the Joystic 1 to the throttle and steering variables
  throttle = data.j1PotY;
  steering = data.j1PotX;  
  
  // Throttle used for forward and backward control
  // Joystick values: 0 to 255; down = 0; middle = 127; up = 255
  if (throttle < 110) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(throttle, 110, 0, 0, 255);
    motorSpeedB = map(throttle, 110, 0, 0, 255);
  }
  else if (throttle > 140) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(throttle, 140, 255, 0, 255);
    motorSpeedB = map(throttle, 140, 255, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }
  // Steering used for left and right control
  if (steering < 110) {
    // Convert the declining steering readings from 140 to 255 into increasing 0 to 255 value
    int xMapped = map(steering, 110, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  if (steering > 140) {
    // Convert the increasing steering readings from 110 to 0 into 0 to 255 value
    int xMapped = map(steering, 140, 255, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}
void resetData() {
  // Reset the values when there is no radio connection - Set initial default values
  data.j1PotX = 127;
  data.j1PotY = 127;
  data.j2PotX = 127;
  data.j2PotY = 127;
  data.j1Button = 1;
  data.j2Button = 1;
  data.pot1 = 1;
  data.pot2 = 1;
  data.tSwitch1 = 1;
  data.tSwitch2 = 1;
  data.button1 = 1;
  data.button2 = 1;
  data.button3 = 1;
  data.button4 = 1;
}Code language: Arduino (arduino)

Descrição: Então, primeiro precisamos incluir o SPI e a biblioteca RF24, definir alguns pinos, o objeto de rádio e a estrutura de dados onde armazenaremos os dados de entrada do transmissor. Na seção de configuração, precisamos definir as saídas dos pinos e iniciar a comunicação de rádio. Para mais detalhes de como isso funciona e o que cada uma dessas linhas faz, você pode conferir meu tutorial detalhado do NRF24L01.

Na seção de loop, verificamos constantemente se estamos recebendo dados e, se o fizermos, lemos os dados recebidos. Se dermos uma olhada rápida no código do transmissor, podemos ver que tipo de dados ele envia ao receptor. Ele lê os dados de todos os seus controladores, joysticks, potenciômetros e botões, e envia esses dados como um único pacote para o receptor.

Então, uma vez que lemos esses dados, podemos fazer o que quisermos com eles. Neste caso, usaremos o valor do eixo Y do Joystick 1 para controlar o acelerador e o valor do eixo X para controlar a direção. Eu coloquei esses dados em variáveis ​​separadas de aceleração e direção. Os valores que estamos obtendo dos joysticks são de 0 a 255. Então, se movermos o joystick para baixo, definiremos os pinos de controle do motorista adequadamente para que o carro se mova para trás e usaremos o valor do acelerador para controlar a velocidade do movimento. O mesmo princípio se aplica para dirigir para a frente, para a esquerda e para a direita. Mais uma vez, eu já tenho um tutorial detalhado sobre como esse carro funciona para que você possa conferir para melhor entendimento. Na parte inferior do código, podemos observar a função personalizada resetData(), que redefine todos os valores para seus valores padrão iniciais para que, caso a comunicação de rádio seja perdida, o carro detecte o movimento.

Exemplo 2 – Servos do receptor RC Arduino e controle de motores sem escova


Tudo bem, agora podemos seguir com o segundo exemplo, controlando servos e motores brushless usando este receptor Arduino RC.

Para controlar motores sem escova, precisamos de um ESC, ou Controlador Eletrônico de Velocidade. O Arduino se comunica com o ESC com apenas um único pino. Para controlar o ESC, o Arduino envia um sinal PWM específico para o ESC e com ele o ESC controla a velocidade do motor. O ESC com essa mesma conexão fornece 5V através do recurso Circuito Eliminador de Bateria, para que possamos alimentar nosso receptor também.

Veja também: Tutorial de controle de motor sem escova do Arduino | ESC | BLDC

Quanto aos servomotores, eles possuem o mesmo tipo de conexões que o ESC e podemos simplesmente anexá-los a qualquer um dos canais disponíveis.

Você pode obter os componentes necessários para este exemplo nos links abaixo:
  • Motor sem escova …………………………..
  • ESC 30A ………………………………………
  • Bateria Li-Po ……………………………
  • Servomotor MG996R ………………

Os sinais de entrada para controlar servos e motores brushless usando ESCs são quase os mesmos. Eles usam um sinal PWM específico de 50Hz que pode ser facilmente gerado usando a biblioteca Arduino Servo.

Observação:  Ao usar servos MG996R com esta configuração, eles podem causar um problema no circuito e queimar o Arduino Pro Mini. O pode atrair uma corrente mais alta e que pode causar picos de tensão no trilho de 5V. O Arduino Pro Mini deve suportar até 5,5V no pino de 5V, mas quando esses picos ocorrem, podem queimar o Arduino. Eu tive esse problema ao testar o circuito, e alguém na seção de comentários também relatou o mesmo. Uma solução para isso pode ser colocar capacitores de desacoplamento maiores nos servos, mas não tenho certeza e não testei. Então, por favor, esteja ciente deste problema.

Por outro lado, no exemplo, usei outros dois servos MG996R que não queimaram o Arduino, acho que porque não estavam causando picos tão altos. Também usei este exemplo com 4 servos S90 menores e não tive nenhum problema.

Veja também: Como funciona o servomotor & Como controlar servos usando Arduino
/*
  DIY RC Receiver - Servos and Brushless motors control
  by Dejan, www.HowToMechatronics.com
  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;
Servo esc;  // create servo object to control the ESC
Servo servo1;
Servo servo2;
int escValue, servo1Value, servo2Value;
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte j1PotX;
  byte j1PotY;
  byte j1Button;
  byte j2PotX;
  byte j2PotY;
  byte j2Button;
  byte pot1;
  byte pot2;
  byte tSwitch1;
  byte tSwitch2;
  byte button1;
  byte button2;
  byte button3;
  byte button4;
};
Data_Package data; //Create a variable with the above structure
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); //  Set the module as receiver
  resetData();
  esc.attach(10);   // Arduino digital pin D10 - CH9 on PCB board
  servo1.attach(4); // D4 - CH1
  servo2.attach(5); // D5 - CH2
}
void loop() {

  // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }

  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }

  // Controlling servos
  servo1Value = map(data.j2PotX, 0, 255, 0, 180); // Map the receiving value form 0 to 255 to 0 to 180(degrees), values used for controlling servos
  servo2Value = map(data.j2PotY, 0, 255, 0, 180);
  servo1.write(servo1Value);
  servo2.write(servo2Value);

  // Controlling brushless motor with ESC
  escValue = map(data.j1PotY, 127, 255, 1000, 2000); // Map the receiving value form 127 to 255 to  1000 to 2000, values used for controlling ESCs
  esc.writeMicroseconds(escValue); // Send the PWM control singal to the ESC
  
}
void resetData() {
  // Reset the values when there is no radio connection - Set initial default values
  data.j1PotX = 127;
  data.j1PotY = 127;
  data.j2PotX = 127;
  data.j2PotY = 127;
  data.j1Button = 1;
  data.j2Button = 1;
  data.pot1 = 1;
  data.pot2 = 1;
  data.tSwitch1 = 1;
  data.tSwitch2 = 1;
  data.button1 = 1;
  data.button2 = 1;
  data.button3 = 1;
  data.button4 = 1;
}Code language: Arduino (arduino)

Assim, após receber os dados do transmissor, convertemos os valores de 0 a 255 para valores de 0 a 180 para controlar os servos usando a função write(). De forma semelhante, convertemos os dados para controlar o ESC para valores de 1000 a 2000. Neste exemplo, controlamos este ESC do ponto médio do Joystick número 1, para a posição superior, portanto, convertemos os valores do meio , 127 a 255 em valores de 1000 a 2000. Usando a função writeMicroseconds() da Servo Library enviamos o sinal PWM para o ESC e assim podemos controlar a velocidade do motor brushless do mínimo ao máximo.

Veja também: Arduino RC Avião | 100% faça você mesmo

Então, é assim que podemos controlar aviões RC, carros, barcos e assim por diante, pois geralmente usam esse tipo de motores, servos e motores brushless.

Exemplo 3 – Controle de modelo de carro RC


O carro RC veio com seu próprio controlador que pode controlar as rodas dianteiras para mover para a esquerda e para a direita, bem como mover o carro para frente e para trás.

No entanto, como é um carro RC barato, os controles são digitais, ou ligados ou desligados, para a posição máxima esquerda e direita e velocidade máxima. Independentemente disso, desmontei o carro para ver o que tem dentro e como posso implementar o receptor Arduino RC para controlá-lo.

Assim que descobri os componentes eletrônicos, notei que os dois motores são na verdade motores CC simples que operam em 5V. Mesmo o motor dianteiro que controla os movimentos limitados da direção é um motor DC de rotação contínua simples.

Então, aparentemente, já sabemos como controlar motores DC, então substituir esta placa de circuito pelo nosso receptor Arduino DIY será bastante fácil. Além do nosso receptor, precisamos apenas de um driver de motor capaz de acionar dois motores ao mesmo tempo. Existem muitas opções para esse fim, mesmo a que usamos no primeiro exemplo, o driver L298N.

No entanto, esse é muito grande para esta aplicação, então escolhi o driver do motor MX1508. Este é um driver de motor DC duplo simples que possui ponte H e controle PWM. Possui 4 pinos de entrada de controle, 4 pinos para os motores e 2 pinos para alimentação.

Dessoldei as conexões dos motores da placa de circuito do carro RC e soldei-as ao motorista. Na parte de trás soldei os pinos de alimentação e o que resta agora é conectar este driver com o receptor. A energia para este carro RC vem da bateria Ni-Cd de 4,8V localizada na parte inferior do carro.

Então, usando jump wires eu conectei esses pinos ao pino VCC do Arduino, e também conectei os 4 pinos de entrada de controle do driver a 4 canais digitais. Como eu disse, este driver suporta controle PWM, então para o motor B, ou motor traseiro, usei os canais PWM número 2 e 3.

Você pode obter os componentes necessários para este exemplo nos links abaixo:
  • Carro MGRC RC ……………………………………
  • Driver de motor CC MX1508 ………………
  • Breadboard e jump wires ………… 

O código para este carro RC é muito semelhante ao primeiro exemplo.
/*
   Arduino RC Receiver - RC Model control
   by Dejan , www.HowToMechatronics.com
   Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define in3 5  // D5 - CH2 - PWM output
#define in4 6  // D6 - CH3 - PWM output
#define in1 7  // D7 - CH4
#define in2 8  // D8 - CH5


RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

// Max size of this struct is 32 bytes
struct Data_Package {
  byte j1PotX;
  byte j1PotY;
  byte j1Button;
  byte j2PotX;
  byte j2PotY;
  byte j2Button;
  byte pot1;
  byte pot2;
  byte tSwitch1;
  byte tSwitch2;
  byte button1;
  byte button2;
  byte button3;
  byte button4;
};

Data_Package data; //Create a variable with the above structure

int  steering, throttle;
int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); //  Set the module as receiver
  resetData();
}
void loop() {
  // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }
  // Parse the data from the Joystic 1 to the steering and throttle variables
  steering = data.j2PotX;
  throttle = data.j1PotY;


// Throttle used for forward and backward control
  if (throttle < 110) {
    // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedB = map(throttle, 110, 0, 0, 255);
    // Set Motor B backward
    analogWrite(in3, motorSpeedB);
    digitalWrite(in4, LOW);
  }
  else if (throttle > 140) {
    // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedB = map(throttle, 140, 255, 0, 255);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    analogWrite(in4, motorSpeedB);
  }
  // If joystick stays in middle the motors are not moving
  else {
    digitalWrite(in3, HIGH);
    digitalWrite(in4, HIGH);
  }
  
// steering used for left and right control
  if (steering < 110) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
  }
  if (steering > 140) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
  }
  // If joystick stays in middle the motors are not moving
  else {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, HIGH);
  }
}
void resetData() {
  // Reset the values when there is no radio connection - Set initial default values
  data.j1PotX = 127;
  data.j1PotY = 127;
  data.j2PotX = 127;
  data.j2PotY = 127;
  data.j1Button = 1;
  data.j2Button = 1;
  data.pot1 = 1;
  data.pot2 = 1;
  data.tSwitch1 = 1;
  data.tSwitch2 = 1;
  data.button1 = 1;
  data.button2 = 1;
  data.button3 = 1;
  data.button4 = 1;
}Code language: Arduino (arduino)

Usamos os dados provenientes dos joysticks para controlar o acelerador e a direção do carro RC. Para retroceder, usamos a função analogWrite() para enviar sinal PWM para o driver no pino Input3, enquanto mantemos o pino input4 em LOW. Para avançar, fazemos o contrário. Se o joystick ficar no meio, damos comando ao motorista para frear ou parar os motores. O mesmo princípio é usado para o motor de direção, embora aqui não precisemos usar a função analogWrite(), pois não precisamos controlar a velocidade desse motor.

Depois de fazer o upload deste sketch para o Arduino, tive que remontar o carro RC. Coloquei o pequeno driver na caixa interna e prendi o restante das peças com os parafusos. Eu reconectei o receptor com o motorista e o coloquei sob a carcaça externa do carro, que tinha espaço suficiente para caber no receptor.

Portanto, não apenas modificamos este carro RC para ser controlado com nosso transmissor RC DIY, mas também o melhoramos adicionando controle PWM para que agora também possamos controlar a velocidade do carro. Caso o modelo RC que você deseja modificar tenha servos e motores brushless em vez de motores DC, você pode seguir o método explicado no segundo exemplo.

Espero que tenham gostado deste tutorial e aprendido algo novo. Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo e não se esqueça de verificar minha coleção de projetos do Arduino.

Processo de manufatura

  1. DIY:Monitoramento e regulação de temperatura para HomeBrew
  2. Medição de temperatura para projetos de laboratório e ciências
  3. Escolha entre um roteador CNC e um cortador a laser CNC para seus projetos de artesanato DIY.
  4. Animação de LCD e jogos
  5. Faça você mesmo voltímetro usando Arduino e Smartphone
  6. Voltímetro DIY com Arduino e um visor Nokia 5110
  7. Comunicação Python3 e Arduino
  8. A importância dos modelos CAD para projetos de fabricação de metais
  9. Tornos aprimorados para polimento e rebarbação
  10. Mkr1000 Pinout:uma escolha preferencial para projetos de IoT