Olá,
Sou nova no mundo do arduino e tenho andado a tentar por um arduino a funcionar à distancia com 2 módulos nRF24L01.
Um deles seria o emissor e ficaria ligado a um arduino UNO.
Os comandos seriam dados por o controlo Nunchuck.
Do outro lado está um arduino Mega com 2 servo motores.
O meu problema:
Tenho 2 códigos que funcionam bem separados e deixo no fim deste post;
O 1º código faz o controlo do Nunchuck e trabalha perfeitamente mas infelizmente é para usar com apenas um arduino.
O 2º código faz uma comunicação perfeita entre os módulos nRF24L01. Com ele consigo controlar um botão analógico do tipo PS2 fazendo movimentar os Servos na outra extremidade.
Pedia a alguém que me desse uma ajudinha de forma a meter este código do nunchuck a funcionar.
deixo aqui o meu mail:
ispg3367@gmail.com
// ==========================================================
// --- Bibliotecas Auxiliares ---
#include <Wire.h> //I2C
#include <Servo.h> //Servo
#include "nunchuck_funcs.h" //Para controlar o comando Wii NunChuck
// ============================================================================
// --- Mapeamento de Hardware ---
//--------------------#define sv_base 8 //conexão servo da base
#define sv_dir 3 //conexão servo da direita
#define sv_esq 7 //conexão servo da esquerda
#define sv_gar 8 //conexão servo da garra
#define led 4 //led de indicação
#define led2 2 //led de indicação
#define led3 4
// ================================================
// --- Declaração de Objetos ---
Servo dir; //servo da direita
Servo esq; //servo da esquerda
Servo gar; //terceiro servo se houver
// ---------------------------
// ===================================
// --- Prototipo das Funçoes ---
void arm_control(); //Funçãoo de controle do braço robótico
void read_cbut(); //Função de leitura e tratamento do botão C
void ler_led2();
// =======
// --- Variáveis Globais ---
int loop_cnt = 0;
byte accx, accy, zbut, cbut, joyx, joyy;
boolean cbut_flag = 0x00,
hold_flag = 0x01;
// ==========================================
// --- Função Principal ---
void setup()
{
// -- Definição de SaÃda para os Servos e led --
pinMode(sv_dir, OUTPUT);
pinMode(sv_esq, OUTPUT);
pinMode(sv_gar, OUTPUT);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
// -- Inicialização do Controle NunChuck --
nunchuck_setpowerpins();
nunchuck_init();
hold_flag = 0x01; //seta hold_flag
nunchuck_get_data();
delay(10);
// -- Ligação dos Servo Motores --
dir.attach(sv_dir);
esq.attach(sv_esq);
gar.attach(sv_gar);
digitalWrite(led3,LOW);
} //end setup
//
// --- Loop Infinito ---
void loop()
{
Serial.begin(9600);
if ( loop_cnt > 100 ) //taxa de atualização de 100ms
{
loop_cnt = 0; //reinicia loop_cnt
//analogico
nunchuck_get_data(); //coleta dados do nunchuck
joyx = nunchuck_joyx(); //joystick X
joyy = nunchuck_joyy(); //joystick Y
// acelerômetro
accx = nunchuck_accelx(); //acelerômetro X (controlo eixo X)
accy = nunchuck_accely(); //acelerômetro Y (controlo eixo y)
zbut = nunchuck_zbutton();
cbut = nunchuck_cbutton(); //botão C (quando pressionado, congela)
// hold_flag2 = nunchuck_zbutton(); //botão Z (controlo apenas acelerometro)
arm_control(); //chama função de controle
ler_led2();
} //end if principal
read_cbut(); //lê e trata o botão C
loop_cnt++; //incrementa loop_cnt
delay(1); //a cada 1ms
} //end loop
// ======================================================================
// --- Desenvolvimento das Funções ---
void arm_control() //Função de controle do braço robótico
{
if(hold_flag) digitalWrite(led, HIGH);
else
{
joyx = map(joyx, 128, 0, 90, 0); //normaliza servo da esquerda
esq.write(joyx);
accy = map(accy, 20, 150, 35, 170),
dir.write(accy);
} //end else
} //end arm_control
//---------------------------------------------------------------------
void ler_led2(){
if(zbut) digitalWrite(led2, HIGH);
else
{
digitalWrite(led2, LOW);
} //end else
if(nunchuck_zbutton()==1){
digitalWrite(led3, HIGH);
}
else
{
digitalWrite(led3, LOW);
} //end else
}//End void ler_led2
void read_cbut() //Função de leitura e tratamento do botão C
{
if(cbut) cbut_flag = 0x01; //seta flag se cbut pressionado
if(!cbut && cbut_flag) //cbut solto e flag setada?
{ //sim...
cbut_flag = 0x00; //limpa flag
hold_flag = !hold_flag; //inverte o estado de hold_flag
} //end if !cbut
} //end read_cbut
Este é o do Emissor:
//Codigo do transmissor com analógico
//
#include <SPI.h>
#include "RF24.h"
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int msg[1];
int potpin_1 = A0;
int val_1;
int potpin_2 = A1;
int val_2;
void setup(void){
radio.begin();
radio.openWritingPipe(pipe);
}
void loop() {
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);
}
Finalmente, o do receptor:
//receptor com analógico
//
//
#include <Servo.h>
#include <SPI.h>
#include "RF24.h"
Servo servo1;
Servo servo2;
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int msg[1];
int data;
int pos;
void setup()
{
servo1.attach(3);
servo2.attach(7);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop()
{
if (radio.available())radio.read(msg, 1);
if (msg[0] <128 && msg[0] >-1)data = msg[0], pos = map(data, 0, 127, 7, 177),servo1.write(pos);
if (msg[0] >127 && msg[0] <255)data = msg[0], pos = map(data, 128, 254, 9, 177),servo2.write(pos);
}
Por favor, quem perceber um pouco disto ajude-me neste meu problema. Não sei o que mais fazer para conseguir colocar isto a funcionar.