Vixen+Arduino+nrf24l01, нужна помощь

Тема в разделе "Arduino & Shields", создана пользователем Maori, 30 ноя 2015.

  1. Maori

    Maori Нуб

    Всем привет! с ардуинками работаю не так давно, прошу простить за кривой код)
    Суть задачи: Передача данных из программы Vixen Light 3 через радиопередатчики с одной ардуины на другую. Общая цель - управление RGB светодиодной лентой на расстоянии. Из Vixen получаем значения цветов в определенную секунду и шлем эти данные на другой конец. Пока работаю без RGB лента, просто считываю данные в серийник второй ардуины.
    т е Vixen -> com port -> arduino uno -> nrf24l01 --------- nrf24l01 -> arduino uno -> com port
    Данные Vixen отправляет в формате "+>" и дальше 8 бит
    Проштудировав форум все таки завел радиомодули.Передают все гладко без потерь. Начал воевать с Vixen 3, столкнулся с проблемой что данные передаются недостаточно верно.
    Ниже прикладываю скрины монитора порта в который значения отсылает Vixen, коды программ и что в итоге мне приходит на вторую ардуинку. Буду благодарен за любую помощь
     

    Вложения:

    • send_vixen_3.ino
      Размер файла:
      1,1 КБ
      Просмотров:
      672
    • 1.png
      1.png
      Размер файла:
      98,4 КБ
      Просмотров:
      1.038
    • 2.png
      2.png
      Размер файла:
      102,8 КБ
      Просмотров:
      969
    • 3.png
      3.png
      Размер файла:
      244,3 КБ
      Просмотров:
      1.077
    • GET.ino
      Размер файла:
      734 байт
      Просмотров:
      659
  2. ИгорьК

    ИгорьК Гуру

    Maori, не все представляют о чем идет речь в принципе. С программой этой не все работали и по картинкам не слишком понятно что к чему.
    И из вопроса не понятно в чем проблема в частности.
     
  3. Maori

    Maori Нуб

    Проблема в передаче данных. Программа к примеру передает в ком порт значение + > 255 0 0 255 255 255, потом передатчик отправляет данные без "+>", а на вторую ардуину приходит 255 0 0 0 0 0
     
  4. ИгорьК

    ИгорьК Гуру

    А в Ардуино эти же данные "заходят"? Что мешает вместо отправки на NRF вернуть их в компорт и посмотреть как дела?
     
  5. Maori

    Maori Нуб

    посмотрел, там все хорошо. данные теряются между NRF
     
  6. mobistrike

    mobistrike Нерд

    Здравствуйте!
    Собрал макет управляемых led костюмов на nrf24l01 . Сейчас это один передатчик и два приемника (в перспективе 5).
    В силу нехватки знаний в программировании за основу был взят этот же код из и сети и переделан под себя, а в качестве управления все тот же Vixen 3.
    Все работает но чувствуется несинхронность. Уверен что можно ускорить работу .
    Обращаюсь к знатокам , помогите плиз оптимизировать код
    Вот видео работы



    Передатчик
    Код (C++):

    #include <RF24Network.h>
    #include <RF24.h>
    #include <SPI.h>
    #define MAX_CHANNELS 28

    RF24 radio(9, 10);

    // Network uses that radio
    RF24Network network(radio);
    int Data[] = {4, 5, 6, 7, 8, 14, 15, 16, 17, 18};
    int state;
    int ch;
    int chVal[MAX_CHANNELS] = {0};
    int NODE01[MAX_CHANNELS / 2] = {0}; //массив для NODE01
    int NODE02[MAX_CHANNELS / 2] = {0}; //массив для NODE02
    enum states
    {
      IDLE,
      DELIM,
      READ,
      DISP
    };

    void setup(void)
    {
      Serial.begin(57600);
      pinMode(8, OUTPUT);
      digitalWrite(8, HIGH);
      SPI.begin();
      radio.begin();
      network.begin(/*channel*/ 90, /*node address*/ 00);             // канал и адрес узла


      {
        state = IDLE;
        ch = 0;
        Serial.begin(57600);

      }
      delay(1000);

    }

    void loop(void)
    {


      network.update();                                              // нужно постоянно запускать, чтобы транслировались
      if (Serial.available())
      {
        switch (state)
        {
          case IDLE:
            ch = 0;
            if (Serial.read() == '+')
            {
              state = DELIM;
            }
            else
            {
              state = IDLE;
            }
            break;

          case DELIM:
            ch = 0;
            if (Serial.read() == '>')
            {
              state = READ;
            }
            else
            {
              state = IDLE;
            }
            break;

          case READ:

            chVal[ch++] = Serial.read();
            if (ch >= MAX_CHANNELS)
            {
              ch = 0;
              state = DISP;
            }
            break;

          case DISP:
            state = IDLE;

            //Serial.print("Sending...");
            // Готовим массив для NODE 01---
            for (int n01 = 0; n01 < MAX_CHANNELS / 2; n01++) {
              NODE01[n01] = chVal[n01];
            }
            //------------------------------

            //------------------------------
            // Готовим массив для NODE 02---
            for (int n02 = 14; n02 < MAX_CHANNELS; n02++) {
              NODE02[n02 - 14] = chVal[n02];
            }
            //------------------------------

            // Передача на NODE 01  ------
            RF24NetworkHeader header01(/*to node*/ 01);                      // тут указываем на какое устройство отправляем данные
            //bool ok = network.write(header,&NODE01,sizeof(NODE01));            // передаем, функция возвращает статус
            network.write(header01, &NODE01, sizeof(NODE01));          // передаем, функция  не возвращает статус

            //----------------------------
            // Передача на NODE 02  ------
            RF24NetworkHeader header02(/*to node*/ 02);                      // тут указываем на какое устройство отправляем данные
            //bool ok = network.write(header,&NODE02,sizeof(NODE02));            // передаем, функция возвращает статус
            network.write(header02, &NODE02, sizeof(NODE02));          // передаем, функция не возвращает статус
            //----------------------------
            digitalWrite(8, !digitalRead(8));

            // if (ok)                                                        // смотрим на статус и отписываемся в Serial
            // Serial.println("ok.");
            //else
            //  Serial.println("failed.");


            //  break;
        }
      }

    }
     
    Приемники
    Код (C++):

    #include <RF24Network.h>
    #include <RF24.h>
    #include <SPI.h>
    #define MAX_CHANNELS 14
    int ch;
    int chVal[MAX_CHANNELS] = {0};
    int            data[MAX_CHANNELS];
    RF24 radio(7, 8);

    RF24Network network(radio);


    #define ID 01 // ID устройства
    //****************Переменные пинов светодиодов
    int l1 = 1;
    int l2 = 2;
    int l3 = 19;
    int l4 = 4;
    int l5 = 5;
    int l6 = 6;
    int l7 = 9;
    int l8 = 10;
    int l9 = 14;
    int l10 = 15;
    int l11 = 16;
    int l12 = 17;
    int l13 = 18;
    int l14 = 3;
    //**************************
    int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14}; // массив пинов светодиодов

    const char inv_off = LOW ;   //LOW для макета, HIGH для костюма с транзисторами
    const char inv_on = HIGH ;  // HIGH для макета, LOW для костюма с транзисторами

    void setup(void)
    {
      //Serial.begin(57600);

      for (int i = 0; i < 14; i++) {
        pinMode(lp[i], OUTPUT);
        digitalWrite(lp[i], inv_on);
      }


      SPI.begin();
      radio.begin();
      network.begin(/*channel*/ 90, /*node address*/ ID);
      //radio.setAutoAck(false); // отключаем подтверждение приема пакетов
    }

    void loop(void)
    {

      network.update();                                        // нужно постоянно запускать, чтобы транслировались
      // данные между узлами


      while ( network.available() )                            // если пришли данные
      {
        // If so, grab it and print it out
        RF24NetworkHeader header;

        network.read(header, &data, sizeof(data));             // читаем данные
        // отправляем в сериал для отладки
        for (ch = 0; ch < MAX_CHANNELS; ch++) {
          ;
          digitalWrite(lp[ch], !data[ch]);
        }

        // Serial.println("  ");
        // Serial.println("______________________________________");


        //digitalWrite(l1, !data[0]);
        //digitalWrite(l2, !data[1]);
        //digitalWrite(l3, !data[2]);
        //digitalWrite(l4, !data[3]);
        //analogWrite(l5, data[4]);
        //analogWrite(l6, data[5]);
        //analogWrite(l7, data[6]);
        //analogWrite(l8, data[7]);
        //digitalWrite(l9, !data[8]);
        //digitalWrite(l10, !data[9]);
        //digitalWrite(l11, !data[10]);
        //digitalWrite(l12, !data[11]);
        //digitalWrite(l13, !data[12]);
        //analogWrite(l14, data[13]);
      }


    }
     
    Спасибо !
     
  7. mobistrike

    mobistrike Нерд

    Похвастаюсь !
    Вот что получилось

     
    ИгорьК нравится это.
  8. mobistrike

    mobistrike Нерд