Люди добрые помогите. Есть не большой проект. Открытие ворот по радиоканалу. Суть проекта такова: На передатчике (Ардуино 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."); //связи нет } } Схема
Светодиодами должна управлять программа, а не концевики. Примерно так: Код (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);//остановка актуатора } } }
Попробуйте приёмник Код (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);//остановка актуатора } } }
Огромное спасибо все заработало. Теперь как подключить светодиоды С учетом того, что 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);//остановка актуатора } } } Но к сожалению не работает, что я делаю не так.
сразу бросилась в глаза белиберда val_1 = digitalRead(KV_1); val_2 = digitalRead(KV_2); data1[0] = digitalRead(KV_1); data1[1] = digitalRead(KV_2);