Arduino и nrf24l01
Пт, 05/01/2018 - 01:25
Kislotik
Offline
Зарегистрирован: 05.01.2018
Очень прошу помощи, есть пульт на ардуино и nrf24l01, и приемник на ардуино и nrf24l01, делаю кораблик. Столкнулся с проблеммой если на пульте во время движения кораблика сели батарейки и сигнал пропал, то кораблик будет плыть пока не сядет аккумулятор, подскажите что должно быть написано в скетче, в приемнике или в передатчике для того что бы при пропадании сигнала мотор выключался, сервоприводы поворачивались и т.д.
Скетч приемника, может в нем много ошибок, не судите строго первый мой скетч. Спасибо
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> //Скачиваем и устанавливаем библиотеку RF24 для радио модуля!!!!!!!!! #include <Servo.h> Servo myservo1; Servo myservo2; Servo myservo3; Servo myservo4; #define CE_PIN 9 #define CSN_PIN 10 const uint64_t pipe = 0xB1E8F0F0E1LL; RF24 radio(CE_PIN, CSN_PIN); int joystick[9]; unsigned long time; void setup() { delay(50); radio.begin(); radio.setChannel(9); radio.setDataRate(RF24_250KBPS); // Установка минимальной скорости; radio.setPALevel(RF24_PA_HIGH); // Установка максимальной мощности; radio.openReadingPipe(1,pipe); radio.startListening(); //myservo1.attach(A0); // Пин сервопривода мотор myservo2.attach(A0); // Пин сервопривода поворот myservo3.attach(A1); // Пин сервопривода сброс myservo4.attach(A2); // Пин сервопривода правый-левый pinMode(A3, OUTPUT); //Пин выхода на светодиод для подсветки от джойстика pinMode(A4, OUTPUT); //Пин выхода на светодиод для фонаря pinMode(A5, OUTPUT); //Пин выхода на светодиод от джойстика } void loop() { if ( radio.available() ) { time = millis(); bool done = false; while (!done) { done = radio.read( joystick, sizeof(joystick) ); if (millis() - time > 1000) { joystick[0]=0; joystick[1]=0; joystick[2]=0; joystick[3]=0; joystick[4]=0; joystick[5]=0; joystick[6]=0; joystick[7]=0; joystick[8]=0; } else bool done = true; while (done) { done = radio.read( joystick, sizeof(joystick) ); if (millis() - time > 3000) digitalWrite(A5, LOW); } // myservo1.write(joystick[0]); // Сервопривод мотор myservo2.write(joystick[1]); // Сервопривод поворот digitalWrite(A3, !joystick[2]); //кнопка подсветка digitalWrite(A4, !joystick[4]); //кнопка фонарь digitalWrite(A5, !joystick[3]); //кнопка джойстика if(!joystick[5]==HIGH) { myservo3.write(178); } if(!joystick[6]==HIGH) { myservo3.write(2); } if(!joystick[7]==HIGH) { myservo4.write(110); } if(!joystick[8]==HIGH) { myservo4.write(60); } else if(!joystick[7]==LOW) if(!joystick[8]==LOW) myservo4.write(85); } } }
Djn
- Войдите на сайт для отправки комментариев
if(radio.available()) { //если принимаем - делаем то-то или то-ту } else { //если ,например , в течение 1сек нет приема //тушим двигатель и включаем сирену }1if(radio.available())2{3//если принимаем - делаем то-то или то-ту4}5else6{7//если ,например , в течение 1сек нет приНе могли бы вы любой абразец написать?
Kislotik, суть в том, что передатчик должен регулярно отсылать приемнику какой-то сигнал (например, раз в 10 секунд). Приемник же должен запоминать время прихода последнего стигнала и, если сигнала долго нет (например, 21 секунду), выключать мотор, etc.
Пытаю этот код приспособить, но что то без результатно =((Может вы подскажите?
Простой принцип, делается метка времени (переменная типа unsigned long), в которую в момент приёма сигнала складывается время из millis(). Потом условие, если millis минус метка больше чем некий порог, то отключать.
01byterfdata;//payload=102unsignedlonglastcmd=millis();0304voidloop(){05booldone=0;06if(radio.available()){07while(!done) done=radio.read(&rfdata,1);08lastcmd=millis();09// custom code here...10if(rfdata==7) PORTD&=B10011111;//stop11}12if(millis()-lastcmd>=3000) PORTD&=B10011111;//auto stop if no radio data13}По такой схеме делают обнаружение отсутствия связи в DMX приёмниках.