collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

Autor Tópico: nRF24L01 + Nunchuck + servo x2  (Lida 2152 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline catarina

  • Mini Robot
  • *
  • Mensagens: 2
nRF24L01 + Nunchuck + servo x2
« em: 21 de Maio de 2017, 12:31 »
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

Código: [Seleccione]




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

Código: [Seleccione]

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

Código: [Seleccione]

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

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: nRF24L01 + Nunchuck + servo x2
« Responder #1 em: 21 de Maio de 2017, 13:14 »
radio.write(nunchuck_joyX).
O que é que isso faz?

O código não foi escrito por ti, dois estilos completamente diferentes..
O que queres fazer é simples, já tens tudo á frente, só falta colar, podemos ajudar a fazer isso, agora fazer o trabalho e entregar é que não.

E se calhar nem era preciso trancar o tópico, mas pronto, vamos "discutir" onde ninguem pode responder, kappa.
Avr fanboy