Подключение концевых выключателей

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем OOM, 18 июн 2017.

  1. OOM

    OOM Нерд

    Люди добрые помогите.
    Есть не большой проект. Открытие ворот по радиоканалу.
    Суть проекта такова:
    На передатчике (Ардуино UNO) имеется двухпозиционный переключатель без фиксации (правое положение - центр - левое положение) и трехцветный светодиод для контроля положения актуатора.
    Приемник (Ардуино UNO) - двухканальное реле к которому подключен линейный привод (актуатор) и два концевых выключателя (КВ).
    Принцип действия:
    1. На приемнике горит красный светодиод, который сигнализирует, что ворота закрыты (т.е. КВ№1 - замкнут, КВ№2 - разомкнут), включаем левое положение переключателя, подаем питание на 1-й канал реле актуатора и начинается движение актуатора вперед, КВ№1 размыкается и при этом загорается синий светодиод, который сигнализирует, что ворота приоткрыты или идет движение актуатора, дойдя до крайнего положения актуатор замыкает КВ№2, отключает реле актуатора и загорается зеленый светодиод, который сигнализирует, что ворота открыты (при этом КВ№1 - разомкнут).
    2. Включаем правое положение переключателя на передатчике подаем питание на 2-й канал реле актуатора и начинается движение актуатора назад, КВ№2 размыкается и при этом загорается синий светодиод, который сигнализирует, что ворота приоткрыты или идет движение актуатора, дойдя до крайнего положения актуатор замыкает КВ№1, отключает реле актуатора и загорается красный светодиод, который сигнализирует, что ворота закрыты (при этом КВ№2 - разомкнут).
    3. Если отпустить переключатель во время движения актуатора (вперед/назад) в среднее положение актуатор останавливается, при этом горит синий светодиод.

    Смог добиться, только включить актуатор вперед и назад, а как подключить концевые выключатели и чтобы они включали светодиоды я не знаю, в Интернете ни чего подобного не нашел, поэтому и прошу у Вас помощи, или хотя бы подскажите где найти.
    Прилагаю свой код и схему.

    Приемник
    Код (C++):
    #include <RF24Network.h> // Подключение библиотеки для работы в радиосети
    #include <RF24.h> // Подключение радиомодуля для работы с радиомодулем
    #include <SPI.h>

    RF24 radio(9, 10); //Подключение радиомодуля к Ардуино УНО (CE -9 пин, CSN - 10 пин,
    //MOSI - 11 пин, MISO - 12 пин, SCK - 13 пин
    RF24Network network(radio); // Инициализация радиосети

    const uint16_t r_node_A = 01;
    const uint16_t t_node = 00;

    //Установки актуатора
    int forwards = 2; //движение актуатора вперед
    int backwards = 3;//движение актуатора назад

    int KV_1 = 4; // концевой выключатель №1
    int KV_2 = 5; // концевой выключатель 32

    int data[2]; // Массив принимаемых данных

    void setup(void)
    {
      Serial.begin(57600);
      pinMode(4, INPUT_PULLUP); //Пин4 концевого выключателя №1 на вход
      pinMode(5, INPUT_PULLUP); //Пин5 концевого выключателя №2 на вход
      pinMode(2, OUTPUT); //Пин2 1-го канала реле актуатора на выход
      pinMode(3, OUTPUT); //Пин3 2-го канала реле актуатора на выход

      delay(50);
      radio.begin(); // Инициализация радио
      network.begin(/*channel*/ 128, /*node address*/ r_node_A); // канал и адрес узла
    }

    void loop(void)
    {

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

        RF24NetworkHeader header;
        network.read(header, &data, sizeof(data));
     
    //////////////////////////////////////////////
        if (data[0] == 0)
        {
          digitalWrite(forwards, HIGH); //включается реле движения актуатора вперед
        }
          else
        {
          digitalWrite(forwards, LOW); //остановка актуатора
        }
        //////////////////////////
        if (data[1] == 0)
        {
            digitalWrite(backwards, HIGH); //включается реле движения актуатора назад
        }
        else
        {
          digitalWrite(backwards, LOW);//остановка актуатора
        }
      }
    }
    Передатчик
    Код (C++):
    #include <RF24Network.h> //Библиотека для работы в радиосети
    #include <RF24.h> //Библиотека для работы с радиомодулем
    #include <SPI.h> // Подключение библиотеки шины SPI

    // Установки радиомодуля и сети
    RF24 radio(9, 10); //Подключение радиомодуля к Ардуино УНО (CE -9 пин, CSN - 10 пин,
    //MOSI - 11 пин, MISO - 12 пин, SCK - 13 пин
    RF24Network network(radio); // Инициализация радиосети
    const uint16_t t_node = 00; // адрес основного узла (пульт управления)
    const uint16_t r_node_A = 01; //адрес гусеничной телеги

    int btnAkt1 = 2;  // пин для кнопки актуатора (вперед)
    int btnAkt2 = 3;  // пин для кнопки актуатора (назад)
    int LedR = 4; // пин-выход для красного светодиода
    int LedB = 5; // пин-выход для синего светодиода
    int LedG = 6; // пин-выход для зеленого светодиода

    //Определение массивов, аргументов функций
    int data [2];    // массив передаваемых данных

    //Начало программы
    void setup(void)
    {
      //Инициализация серийного монитора
      Serial.begin(57600);

      // Настройка радиосети
      radio.begin();  //инициализация радио
      network.begin(/*channel*/ 128, /*node address*/ t_node);  // канал и адрес узла

      pinMode(2, INPUT_PULLUP);  //устанавливаем пин3 на вход и включаем подтягивающий резистор
      pinMode(3, INPUT_PULLUP);  //устанавливаем пин3 на вход и включаем подтягивающий резистор
      pinMode (4, OUTPUT);
      pinMode (5, OUTPUT);
      pinMode (6, OUTPUT);
     
    }

    //Основной цикл программы
    void loop(void)
    {
      //Инициализация радиосети
      network.update(); //трансляция данных между узлами
        data[0] = digitalRead(btnAkt1);
        data[1] = digitalRead(btnAkt2);
       
        //Перадача данных на серрийный монитор
        Serial.print("Sending...");
        //Отправка данных на приемник с адрессом 01
        RF24NetworkHeader header(/*to node*/ r_node_A);         //тут указываем на какое устройство отправляем данные
        bool ok = network.write(header, &data, sizeof(data));   //передаем, функция возвращает статус
        if (ok) {                                               //смотрим на статус и информируем о работе сети и отписываемся в Serial
            Serial.println("ok."); //связь есть
        }
        else {
          Serial.println("failed."); //связи нет
        }
    }
     

     
    Схема
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Светодиодами должна управлять программа, а не концевики.

    Примерно так:
    Код (C++):
    //////////////////////////////////////////////
       if(data[0]==0)
       {
          while(digitalRead(2) == HIGH  // пока не сработал концевик
          {
             digitalWrite(forwards, HIGH);//включается реле движения актуатора вперед
          }
       }
         else
       {
          digitalWrite(forwards, LOW);//остановка актуатора
       }
       //////////////////////////
       if(data[1]==0)
       {
          while(digitalRead(3) == HIGH  // пока не сработал концевик
          {
            digitalWrite(backwards, HIGH);//включается реле движения актуатора назад
          }
       }
       else
       {
          digitalWrite(backwards, LOW);//остановка актуатора
       }
    }
    }
     
  3. vvr

    vvr Инженерище

    Попробуйте приёмник

    Код (C++):
    #include <RF24Network.h> // Подключение библиотеки для работы в радиосети
    #include <RF24.h> // Подключение радиомодуля для работы с радиомодулем
    #include <SPI.h>

    RF24 radio(9, 10); //Подключение радиомодуля к Ардуино УНО (CE -9 пин, CSN - 10 пин,
    //MOSI - 11 пин, MISO - 12 пин, SCK - 13 пин
    RF24Network network(radio); // Инициализация радиосети

    const uint16_t r_node_A = 01;
    const uint16_t t_node = 00;

    //Установки актуатора
    int forwards = 2; //движение актуатора вперед
    int backwards = 3;//движение актуатора назад

    int KV_1 = 4; // концевой выключатель №1
    int KV_2 = 5; // концевой выключатель 32

    int data[2]; // Массив принимаемых данных

    int val_1 = 0;
    int val_2 = 0;

    void setup(void)
    {
      Serial.begin(57600);
      pinMode(KV_1, INPUT_PULLUP); //Пин4 концевого выключателя №1 на вход
      pinMode(KV_2, INPUT_PULLUP); //Пин5 концевого выключателя №2 на вход
      pinMode(forwards, OUTPUT); //Пин2 1-го канала реле актуатора на выход
      pinMode(backwards, OUTPUT); //Пин3 2-го канала реле актуатора на выход

      delay(50);
      radio.begin(); // Инициализация радио
      network.begin(/*channel*/ 128, /*node address*/ r_node_A); // канал и адрес узла
    }

    void loop(void)
    {
      /// читаем концевики
     
       val_1 = digitalRead(KV_1);
       val_2 = digitalRead(KV_2);

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

        RF24NetworkHeader header;
        network.read(header, &data, sizeof(data));

        //////////////////////////////////////////////
        if (data[0] == 0 && val_1 == LOW)
        {
          digitalWrite(forwards, HIGH); //включается реле движения актуатора вперед
        }
        else
        {
          digitalWrite(forwards, LOW); //остановка актуатора
        }
        //////////////////////////
        if (data[1] == 0  && val_2 == LOW))
        {
          digitalWrite(backwards, HIGH); //включается реле движения актуатора назад
        }
        else
        {
          digitalWrite(backwards, LOW);//остановка актуатора
        }
      }
    }
     
     
  4. vvr

    vvr Инженерище

    пока писал уже ответили))))
     
  5. OOM

    OOM Нерд

    Огромное спасибо все заработало.
    Теперь как подключить светодиоды
    С учетом того, что NRF24 работает как на передачу, так и на прием, я попробовал так:
    Передатчик
    Код (C++):
    #include <RF24Network.h> //Библиотека для работы в радиосети
    #include <RF24.h> //Библиотека для работы с радиомодулем
    #include <SPI.h> // Подключение библиотеки шины SPI

    // Установки радиомодуля и сети
    RF24 radio(9, 10); //Подключение радиомодуля к Ардуино УНО (CE -9 пин, CSN - 10 пин,
    //MOSI - 11 пин, MISO - 12 пин, SCK - 13 пин
    RF24Network network(radio); // Инициализация радиосети
    const uint16_t t_node = 00; // адрес основного узла (пульт управления)
    const uint16_t r_node_A = 01; //адрес гусеничной телеги

    int btnAkt1 = 2;  // пин для кнопки актуатора (вперед)
    int btnAkt2 = 3;  // пин для кнопки актуатора (назад)
    int ledR = 4; // пин-выход для красного светодиода
    int ledB = 5; // пин-выход для синего светодиода
    int ledG = 6; // пин-выход для зеленого светодиода

    //Определение массивов, аргументов функций
    int data [2];    // массив передаваемых данных
    int data1 [2];    // массив передаваемых данных

    //Начало программы
    void setup(void)
    {
      //Инициализация серийного монитора
      Serial.begin(57600);

      // Настройка радиосети
      radio.begin();  //инициализация радио
      network.begin(/*channel*/ 128, /*node address*/ t_node);  // канал и адрес узла

      pinMode(2, INPUT_PULLUP);  //устанавливаем пин3 на вход и включаем подтягивающий резистор
      pinMode(3, INPUT_PULLUP);  //устанавливаем пин3 на вход и включаем подтягивающий резистор
      pinMode (4, OUTPUT);
      pinMode (5, OUTPUT);
      pinMode (6, OUTPUT);
     
    }

    //Основной цикл программы
    void loop(void)
    {
      //Инициализация радиосети
      network.update(); //трансляция данных между узлами
        data[0] = digitalRead(btnAkt1);
        data[1] = digitalRead(btnAkt2);
       
        //Перадача данных на серрийный монитор
        Serial.print("Sending...");
        //Отправка данных на приемник с адрессом 01
        RF24NetworkHeader header(/*to node*/ r_node_A);         //тут указываем на какое устройство отправляем данные
        bool ok = network.write(header, &data, sizeof(data));   //передаем, функция возвращает статус
        if (ok) {                                               //смотрим на статус и информируем о работе сети и отписываемся в Serial
            Serial.println("ok."); //связь есть
        }
        else {
          Serial.println("failed."); //связи нет
        }

    while ( network.available() )                            // если пришли данные
      {

        RF24NetworkHeader header1;
        network.read(header1, &data1, sizeof(data1));

    if (data1 [0]) {                                               //смотрим на статус и информируем о работе сети и отписываемся в Serial
             // включаем светодиод  
        digitalWrite(ledR, HIGH);
        digitalWrite(ledB, LOW);
      }

       else if (data1[1]) {  
        // включаем светодиод  
        digitalWrite(ledG, HIGH);
        digitalWrite(ledB, LOW);
     
      }
      else {
        // выключаем светодиод
           digitalWrite(ledB, HIGH);
            digitalWrite(ledR, LOW);
             digitalWrite(ledG, LOW);
      }

    }
    }
     

     
    Приемник:
    Код (C++):
    #include <RF24Network.h> // Подключение библиотеки для работы в радиосети
    #include <RF24.h> // Подключение радиомодуля для работы с радиомодулем
    #include <SPI.h>

    RF24 radio(9, 10); //Подключение радиомодуля к Ардуино УНО (CE -9 пин, CSN - 10 пин,
    //MOSI - 11 пин, MISO - 12 пин, SCK - 13 пин
    RF24Network network(radio); // Инициализация радиосети

    const uint16_t r_node_A = 01;
    const uint16_t t_node = 00;

    //Установки актуатора
    int forwards = 2; //движение актуатора вперед
    int backwards = 3;//движение актуатора назад

    int KV_1 = 4; // концевой выключатель №1
    int KV_2 = 5; // концевой выключатель 32

    int data[2]; // Массив принимаемых данных
    int data1[2]; // Массив принимаемых данных

    int val_1 = 0;
    int val_2 = 0;

    void setup(void)
    {
      Serial.begin(57600);
      pinMode(KV_1, INPUT_PULLUP); //Пин4 концевого выключателя №1 на вход
      pinMode(KV_2, INPUT_PULLUP); //Пин5 концевого выключателя №2 на вход
      pinMode(forwards, OUTPUT); //Пин2 1-го канала реле актуатора на выход
      pinMode(backwards, OUTPUT); //Пин3 2-го канала реле актуатора на выход

      delay(50);
      radio.begin(); // Инициализация радио
      network.begin(/*channel*/ 128, /*node address*/ r_node_A); // канал и адрес узла
    }

    void loop(void)
    {
      /// читаем концевики
       val_1 = digitalRead(KV_1);
       val_2 = digitalRead(KV_2);
       data1[0] = digitalRead(KV_1);
       data1[1] = digitalRead(KV_2);

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

        RF24NetworkHeader header;
        network.read(header, &data, sizeof(data));
       
        RF24NetworkHeader header1(/*to node*/ t_node);         //тут указываем на какое устройство отправляем данные
        network.write(header1, &data1, sizeof(data1));

        //////////////////////////////////////////////
         if (data[0] == 0 && val_1 == HIGH)
        {
          digitalWrite(forwards, HIGH); //включается реле движения актуатора вперед
        }
        else
        {
          digitalWrite(forwards, LOW); //остановка актуатора
        }
        //////////////////////////
        if (data[1] == 0  && val_2 == HIGH)
        {
          digitalWrite(backwards, HIGH); //включается реле движения актуатора назад
        }
        else
        {
          digitalWrite(backwards, LOW);//остановка актуатора
        }
      }
    }
    Но к сожалению не работает, что я делаю не так.
     
  6. vvr

    vvr Инженерище

    сразу бросилась в глаза белиберда
    val_1 = digitalRead(KV_1);
    val_2 = digitalRead(KV_2);
    data1[0] = digitalRead(KV_1);
    data1[1] = digitalRead(KV_2);
     
  7. vvr

    vvr Инженерище

    да и с передатчиком накрутили ))))