arduino и nrf24l01 нужна помощь с кодом

Тема в разделе "Arduino & Shields", создана пользователем vankenshtein, 16 апр 2014.

  1. vankenshtein

    vankenshtein Нерд

    здравствуйте уважаемые форумчане. Сделал на arduino и nrf управление машинкой
    код передатчика
    Код (Text):
    #include <SPI.h>

    #include "RF24.h"

    //int msg[1];

    //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino
    //SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    RF24 radio(9,10);

    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи

    int potpin = 0;  // подключаем ось У, руль
    int potpin1 = 1;  // подключаем ось X, ГАЗ
    int val[2];    // хранит значение считываемое с 0 и 1 пина

    void setup(void){                  
      radio.begin();
      radio.openWritingPipe(pipe); // Открываем канал передачи
    }
    void loop(void){
      val[0] = analogRead(potpin);
      val[1] = analogRead(potpin1);
     
    // val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
      val[0] = map(val[0], 0, 1023, 65, 145);    // scale it to use it with the servo (value between 0 and 180)
      val[1] = map(val[1], 0, 1023, 65, 145);
        //msg[0] = val[2];
        radio.write(&val, 2);
    }
    код приемника:
    Код (Text):

    #include <Servo.h>
    #include <SPI.h>
    #include "RF24.h"
    Servo myservo;  // create servo object to control a servo
    Servo myservo1;
    //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino
    //SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала
    int val[2];
    int analog1 = val[0];
    int analog2 = val[1];
    //int msg[1];
    void setup()
    {
    // Serial.begin(9600);
    myservo1.attach(4);
    myservo.attach(3);  // attaches the servo on pin 3 to the servo object
    radio.begin();
    radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
    radio.startListening(); // Начинаем слушать эфир
    }
    void loop()
    {
    if (radio.available()){
    bool done = false;
    while (!done){
    done = radio.read(&val, 2);    
    myservo.write (analog1);
    myservo1.write (analog2);
    }
    }
    }
    Не работает. Не подскажете что не так?
    управление одной сервой работает, но когда изменил на управление двумя, все перестало работать. Заранее спасибо.
     
  2. Mitrandir

    Mitrandir Гуру

    В приемнике вы читаете данные с канала но не используете их.
    На сервы вы передаете значения переменых analog* , которые никогда не меняются. И всегда равны скорее всего 0.
     
  3. Mitrandir

    Mitrandir Гуру

    Не знаком с библиоьекой радио, вы намеренно передаете функции чтения/передачи адрес указателя?
     
  4. vankenshtein

    vankenshtein Нерд

    Спасибо что так быстро откликнулись
    Простите не понял Вас. В передатчике считываю показания с джойстиков и передаю. В приемнике эти данные передаю на сервы. Не могли бы вы помочь подправить код
     
    Последнее редактирование: 16 апр 2014
  5. Mitrandir

    Mitrandir Гуру

    Только вечером. С телефона неудобно код писать.
    Строки arnalog1 = val[0]
    Перенесите после вызова функции read
     
  6. vankenshtein

    vankenshtein Нерд

    спасибо огромное)) попробовать тоже вечером только смогу, железо дома
     
  7. vankenshtein

    vankenshtein Нерд

    Пришел домой, прошил...... не работает(
    Правильно ли я Вас понял, код должен быть таким?
    Код (Text):
    #include <Servo.h>
    #include <SPI.h>
    #include "RF24.h"
    Servo myservo;  // create servo object to control a servo
    Servo myservo1;
    //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino
    //SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала
    int val[2];
    int analog1;
    int analog2;

    //int msg[1];
    void setup()
    {
    // Serial.begin(9600);
    myservo1.attach(4);
    myservo.attach(3);  // attaches the servo on pin 3 to the servo object
    radio.begin();
    radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
    radio.startListening(); // Начинаем слушать эфир
    }
    void loop()
    {
    if (radio.available()){
    bool done = false;
    while (!done){
    done = radio.read(&val, 2);  
    analog1 = val[0];
    analog2 = val[1];
    myservo.write (analog1);
    myservo1.write (analog2);
    }
    }
    }
     
  8. Mitrandir

    Mitrandir Гуру

    Надо убрать & перед val

    функции read/write требуютадрес буфера который надо отправить, куда сложить прочитанную переменную.

    если вы посылаете переменную типа int то надо передать её адрес. Для получения адреса используется операнд &.

    val в вашем случае это массив. в языке си массив отличается от обычной переменной. в val хрранится адрес первого элемента массива.
    таким образом передав функциям write/read &val. вы передали не массив, а адрес переменной ггде хранится массив.
    для передачи массива надо делать так:
    Посылаем:
    Код (Text):

    int val[2];
    radio.write(val,2*sizeof(int));
    Код (Text):
    int val[2];

    radio.read(val,2*sizeof(int))
     
  9. vankenshtein

    vankenshtein Нерд

    Полазил по форумам, погуглил. Написал скетч для проверки.
    Передатчик
    Код (Text):
    #include <SPI.h>
    #include "RF24.h"

    int msg[2];

    RF24 radio(9,10);

    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи

    int potpinX = 0;
    int potpinY = 1;
    int val;
    int val1;

    void setup(void){                  
      radio.begin();
      radio.openWritingPipe(pipe); // Открываем канал передачи
    }
    void loop(void){
      val = analogRead(potpinX);            // reads the value of the potentiometer (value between 0 and 1023)
      val = map(val, 0, 1023, 65, 145);    // scale it to use it with the servo (value between 0 and 180)
    val1 = analogRead(potpinX);            // reads the value of the potentiometer (value between 0 and 1023)
      val1 = map(val, 0, 1023, 65, 145);
    msg[0] = val;
      msg[1] = val1;
        radio.write(msg, 2);
    }
    Приемник
    Код (Text):
    #include <Servo.h>
    #include <SPI.h>
    #include "RF24.h"
    //Servo myservo;
    //Servo myservo1;  // create servo object to control a servo
    //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino
    //SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала
    void setup()
    {
    Serial.begin(9600);
    //myservo.attach(3);  // attaches the servo on pin 3 to the servo object
    //myservo1.attach(4);
    radio.begin();
    radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
    radio.startListening(); // Начинаем слушать эфир
    }
    void loop()
    {
    if (radio.available()){
    bool done = false;
    while (!done){
      int msg[2];
    done = radio.read(msg, 2);
    int analog1 = msg[0];
    int analog2 = msg[1];
    Serial.println("osX--");
    Serial.println(analog1);
    Serial.println("osY--");
    Serial.println(analog2);
    //myservo.write (msg[0]);
    //myservo1.write (msg[1]);
    }
    }
    }

    В порте сыпится Y-- -1, X-- -3072 на наклоны стиков джойстика никак не реагирует
     
  10. Mitrandir

    Mitrandir Гуру

    Int в ардуино сколько байт?
     
  11. vankenshtein

    vankenshtein Нерд

    2байта
     
  12. vankenshtein

    vankenshtein Нерд

    вместо int использовать byte?
     
  13. Mitrandir

    Mitrandir Гуру

    Как вариант, или функциям рид врайт передавать не количество элементов в масстве, а количество передаваемых байт т.е. Не 2 а 4
     
  14. vankenshtein

    vankenshtein Нерд

    Код (Text):
    if (radio.available()){
    bool done = false;
    while (!done){
      byte msg[2];
    done = radio.read(msg, 2);
    byte analog1 = msg[0];
    byte analog2 = msg[1];
    Serial.println("osX--");
    Serial.println(analog1);
    Serial.println("osY--");
    Serial.println(analog2);
    //myservo.write (msg[0]);
    //myservo1.write (msg[1]);
    }
    }
    }
    Вот так? Я правильно Вас понял?
     
  15. Mitrandir

    Mitrandir Гуру

    А луше использовать sizeof
     
  16. Mitrandir

    Mitrandir Гуру

    Msg тоже байтом объявлено?
    Функция рид прочитает с эфира два байта и положит их в память начиная с адреса msg. Ей без разницы какого типа переменная,

    В отправителе тоже надо на байт перейти
     
  17. vankenshtein

    vankenshtein Нерд

    это понятно спасибо большое за помощь.
    вместо byte msg[2]; написать int msg[2];?

    простите за тупость, только учусь
     
  18. Mitrandir

    Mitrandir Гуру

    Там и там должно быть одинакоинаково
     
  19. vankenshtein

    vankenshtein Нерд

    т.е. так правильно?
    Код (Text):
    if (radio.available()){
    bool done = false;
    while (!done){
      byte msg[2];
    done = radio.read(msg, 2);
    byte analog1 = msg[0];
    byte analog2 = msg[1];
    Serial.println("osX--");
    Serial.println(analog1);
    Serial.println("osY--");
    Serial.println(analog2);
    //myservo.write (msg[0]);
    //myservo1.write (msg[1]);
    }
    }
    }
     
  20. lerik2703

    lerik2703 Гик

    плохо лазили :)