Hey, vinceherman, thanks for your reply!
Sorry for the code, new user here hehe.
The brushless motor is the Racestar 2212 980 KV and I'm using a generic 20 A ESC called "skylinker", but I had a similar result using an Emax BLHeli 20 A. Also, I'm using a 3S/5200 mAh/15 C LiPo battery.
That's correct! When there's no radio line code, it works ok. But when I add it and even if I'm not using it in the program, the motor tries spins.
I should also mention that it's not a constant spin, but it oscilates between the speed it should have (0) and this weird speed.
TX code:
#include <RH_NRF24.h> // Depende da biblioteca SPI do Arduino
#include <SPI.h>
// GND
// Vcc: divisor de tensão
// CE: qualquer pino digital (8)
// CSN: qualquer pino digital (10)
// SCK (slave clock): pino 13
// MOSI (Master Output / Slave Output): pino 11
// MISO (Mater Input / Slave Output): pino 12
// IRQ (interrupção): não necessário
// Pinos
#define CLIENT_ADDRESS 1 // Endereço do cliente (rádio controle)
#define SERVER_ADDRESS 2 // Endereço do servidor (drone)
#define Joystick_X1_Pin A0 // Joystick 1 eixo x (Guinada)
#define Joystick_Y1_Pin A1 // Joystick 1 eixo y (Aceleração)
#define Joystick_X2_Pin A2 // Joystick 1 eixo x (Rolagem)
#define Joystick_Y2_Pin A3 // Joystick 1 eixo y (Arfagem)
#define pin_div A4 // Define o pino analógico 4 como entrada da tensão
#define pin_led 1 // Define pino do LED de alerta de baixa bateria
#define pinoBotao 7// Define do push button
RH_NRF24 nrf24; // Cria instância do driver
struct Radio {
float valor1; // Guinada
int valor2; // Aceleração
float valor3; // Rolagem
float valor4; // Arfagem
int botao; // Botão liga-desliga PID
};
Radio pacote;
// Variáveis
int valorpot; // Variável que lê o potenciômetro: varia de 0 a 1024
float R1 = 10000.0; // Valor do resistor R1 para o cálculo da tensão
float R2 = 10000.0; // Valor do resistor R2 para o cálculo da tensão
//float v_cc[50]; // Declara v_cc como um vetor de 50 posições
float v_lido = 0; // Declara uma variável para leitura dos valores analógicos
float v_soma=0;
float v_cc=0;
float v_medido = 0; // Variável que armazenará a média das amostras da tensão cc
int Joystick_X1;
int Joystick_Y1;
int Joystick_X2;
int Joystick_Y2;
long Joystick_X1_cal = 0;
long Joystick_Y1_cal = 0;
long Joystick_X2_cal = 0;
long Joystick_Y2_cal = 0;
////////// VOID SETUP //////////
void setup() {
//Ativa serial monitor
//Serial.begin(2000000);
pinMode(pinoBotao, INPUT_PULLUP); //DEFINE O PINO COMO ENTRADA / "_PULLUP" É PARA ATIVAR O RESISTOR INTERNO
//DO ARDUINO PARA GARANTIR QUE NÃO EXISTA FLUTUAÇÃO ENTRE 0 (LOW) E 1 (HIGH)
pinMode(pin_led, OUTPUT); // Configura o pino do led como saída digital
if (!nrf24.init()) // Inicializa o gerenciador de rádio
// Padrão: 2.402 GHz (channel 2), 2Mbps, 0dBm
Serial.println("init failed"); // Caso a inicialização falhe, imprime a mensagem
if (!nrf24.setChannel(1))
Serial.println("setChannel failed");
if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
Serial.println("setRF failed");
// Calibração Joystick
for (int Cal = 0; Cal < 2000; Cal ++){ // Inicia calibração (lê 2000 valores)
Joystick_X1 = analogRead(Joystick_X1_Pin); // Lê eixo X do joystick 1: Guinada
// Joystick_Y1 = analogRead(Joystick_Y1_Pin); // Lê eixo Y do joystick 1: Aceleração
Joystick_X2 = analogRead(Joystick_X2_Pin); // Lê eixo X do joystick 2: Rolagem
Joystick_Y2 = analogRead(Joystick_Y2_Pin); // Lê eixo Y do joystick 2: Arfagem
Joystick_X1_cal += Joystick_X1; // Soma todos os valores de X1
// Joystick_Y1_cal += Joystick_Y1; // Idem para Y1
Joystick_X2_cal += Joystick_X2; // Idem para X2
Joystick_Y2_cal += Joystick_Y2; // Idem para Y2
delay(10); // Delay de 10 milisegundos
}
Joystick_X1_cal = Joystick_X1_cal/2000;
// Joystick_Y1_cal = Joystick_Y1_cal/2000;
Joystick_X2_cal = Joystick_X2_cal/2000;
Joystick_Y2_cal = Joystick_Y2_cal/2000;
}
void loop() {
//%%%%%%%%%%%%%% BATERIA - CARGA %%%%%%%%%%%%% // JOGAR ISSO PRO SETUP PRA SER MAIS EFICIENTE
/*
for(int i = 0; i < 50; i++){ // Itera 50 vezes
v_lido = analogRead(pin_div); // Lê o valor analógico do pino A4 e armazena na variável v_lido
v_soma = v_soma + v_lido; // Soma todas as leituras na variável v_soma
}
v_soma = v_soma/50; // Tira a média das leituras
v_medido = 0.009775*v_soma; // Calcula o valor final
if (v_medido < 7.5) { // Caso a voltagem seja menor que 7.5 V
digitalWrite(pin_led, HIGH); // Acende o LED 13
}
else { // Caso contrário
digitalWrite(pin_led, LOW); // Apaga o LED 13
}
Serial.println(v_medido);
*/
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/*
if(digitalRead(pinoBotao) == HIGH){ //SE A LEITURA DO PINO FOR IGUAL A LOW, FAZ
pacote.botao = 0;
}
else {
pacote.botao = 1;
}
//Serial.println(pacote.botao);
*/
//%%%%%%%%%%%%%% CONTROLE %%%%%%%%%%%%%%%%%%%%
Joystick_X1 = analogRead(Joystick_X1_Pin) - Joystick_X1_cal + 512; // Lê eixo X do joystick 1: Guinada
Joystick_Y1 = analogRead(Joystick_Y1_Pin); // Lê eixo Y do joystick 1: Aceleração
Joystick_X2 = analogRead(Joystick_X2_Pin) - Joystick_X2_cal + 512; // Lê eixo X do joystick 2: Rolagem
Joystick_Y2 = analogRead(Joystick_Y2_Pin) - Joystick_Y2_cal + 512; // Lê eixo Y do joystick 2: Arfagem
/*
Serial.print("Guinada: "); Serial.print(Joystick_X1);
Serial.print(" | Aceleração: "); Serial.print(Joystick_Y1);
Serial.print(" | Rolagem: "); Serial.print(Joystick_X2);
Serial.print(" | Arfagem: "); Serial.print(Joystick_Y2);
Serial.print(" | ");
*/
pacote.valor1 = map(Joystick_X1, 30, 945, -1000, 1000)/100.0; // Lê eixo X do joystick 1: Guinada
//pacote.valor2 = map(Joystick_Y1, 0, 1024, 1000, 2000); // Lê eixo Y do joystick 1: Aceleração
pacote.valor2 = Joystick_Y1+930;
pacote.valor3 = map(Joystick_X2, 47, 975, -1000, 1000)/100.0; // Lê eixo X do joystick 2: Rolagem
pacote.valor4 = map(Joystick_Y2, 79, 990, -1000, 1000)/100.0; // Lê eixo Y do joystick 2: Arfagem
// Imprime leitura dos analógicos já mapeados
//
// Serial.print("Guinada: "); Serial.print(pacote.valor1);
// Serial.print(" | Aceleração: "); Serial.print(pacote.valor2);
// Serial.print(" | Rolagem: "); Serial.print(pacote.valor3);
// Serial.print(" | Arfagem: "); Serial.println(pacote.valor4);
//
// Envio da mensagem
nrf24.send((uint8_t *)&pacote, sizeof(pacote));
}
RX code:
#include <Wire.h>
#include <ServoTimer2.h>
#include <RH_NRF24.h> // Bilioteca dependente da SPI.h, da Arduino
#include <SPI.h> // Biblioteca nativa da Arduino
ServoTimer2 Mot3;
RH_NRF24 nrf24; // Instância do driver de rádio
struct Radio { // Variáveis para recebimento dos dados de rádio antigo: tipoPacote
float value1; // Guinada
int value2; // Aceleração
float value3; // Rolagem
float value4; // Arfagem
int botao;
};
Radio pacote;
float a, b, c;
int throttle;
int d;
void setup() {
// put your setup code here, to run once:
//Serial.begin(2000000);
Mot3.attach(6);
if (!nrf24.init()) // Inicializa o gerenciador de rádio
// Padrão: 2.402 GHz (channel 2), 2Mbps, 0dBm
Serial.println("init failed"); // Caso a inicialização falhe, imprime a mensagem
if (!nrf24.setChannel(1))
Serial.println("setChannel failed");
if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
Serial.println("setRF failed");
Mot3.write(1000);
}
void loop() {
// put your main code here, to run repeatedly:
Mot3.write(1000);
if (nrf24.available()) // Se o RadioManager estiver disponível
{
// Espera pela mensagem do cliente
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (nrf24.recv(buf, &len))
{
memcpy(&pacote,&buf,len);
// Serial.print(pacote.value1); Serial.print(" | ");
//Serial.println(pacote.value2); //Serial.print(" | ");
// Serial.print(pacote.value3); Serial.print(" | ");
// Serial.println(pacote.value4);
a = pacote.value1; // Guinada
throttle = pacote.value2; // Aceleração
b = pacote.value3; // Rolagem
c = pacote.value4; // Arfagem
d = pacote.botao;
}
}
}