Не запускается скетч после ночи без перепрошивки.
- Войдите на сайт для отправки комментариев
Пт, 24/04/2020 - 16:43
Всем доброго дня.
У меня очередная проблема. В радиоуправляемую машинку залит нижеприведенный код. Все работает отлично только в день заливки. Выключаем машину на ночь, утром - никакой реакции. Перепрошиваю - опять все хорошо. Помогите победить эту проблему. Питание от ардуины снимается полностью. Выдергивание батарей не помогает.
// Версия от 20.04.20. // Работают мотор и сервы, свет, поворотники, допсигнал. // Добавлена TB6612FNG // Версия 03.00 #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> #include <U8g2lib.h> //const uint64_t pipeIn = 0xE8E8F0F001LL; //Remember that this code is the same as in the transmitter RF24 radio(A0, A1); //CSN and CE pins int recieved_data[11]; // массив принятых данных // The sizeof this struct should not exceed 32 bytes // #define DEBUG // Если не закомментированно, то, Serial.print() актевен! Только для отладки!! // #define DEBUG2 // Если не закомментированно, то, Serial.print() актевен! Только для отладки!! // #define DEBUG3 // #define PROCTIME // закомментировать после отладки // #define SERVOCHECK int consumption = 5; // расходы, максимальная скорость int thortle; // уровень газа int steering; // положение руля int oldSpeed; // предыдущее значение скорости int tailLight; // задние габариты int motorSpeed; // текущая скорость int oldMotorSpeed; // переменная предыдущей скорости int maxSpeed; // максимальная скорость int angleSteering = 0; // переменная для хранения угла поворота сервы boolean leftTurn = false; // левый поворотник boolean rightTurn = false; // правый поворотник boolean headLight = false; // Фары boolean specialLight = false; // спецсигнал boolean brakeLight = false; // стопсигнал boolean statusTurn = false; // флажок поворотников boolean lostCommand = false; // флажок потери сигнала boolean motorStoped = true; // флажок остановленного мотора // #define PIN_MOTOR_11 A7 // Пин 1 мотора 1 // #define PIN_MOTOR_12 A6 // Пин 2 мотора 1 #define PIN_MOTOR_1_SPEED 3 // пин ШИМ мотра 1 // #define PIN_MOTOR_21 A5 // пин 1 мотора 2 // #define PIN_MOTOR_22 A4 // пин 2 мотора 2 #define PIN_MOTOR_2_SPEED 5 // пин ШИМ мотора 2 #define PIN_STEERING 10 // пин сервы #define PIN_HEAD_LIGHT A2 // пин фар #define PIN_LEFT_TURN 2 // пин левого поворотника #define PIN_RIGHT_TURN 4 // пин правого поворотника #define PIN_TAIL_LIGHT 6 // пин задних огней #define PIN_SPECIAL_LIGHT 1 // пин спецсигнала //#define PIN_VOLT A3 // пин вольтметра #define INTERVAL 800UL // частота моргания поворотников Servo frontWheel; // Сервопривод руля Servo motor; // Контроллер скорости мотора void reset_the_Data() { // 'safe' values to use when NO radio input is detected recieved_data[0] = 127; recieved_data[1] = 127; recieved_data[2] = 127; recieved_data[3] = 0; //Throttle (channel 1) to 0 recieved_data[4] = 0; recieved_data[5] = 1; recieved_data[6] = 1; recieved_data[7] = 1; recieved_data[8] = 1; recieved_data[9] = 1; recieved_data[10] = 1; // Обнуляем значения на потребителях // set_Turn(); // set_Motor(); // set_Steering(); set_Commands(); leftTurn = true; // Включаем аварийку rightTurn = true; // lostCommand = true; } /**************************************************/ void setup() { // пины для драйвера мотора // pinMode(PIN_MOTOR_11, OUTPUT); // мотор, выход 1 // pinMode(PIN_MOTOR_12, OUTPUT); // мотор, выход 2 pinMode(PIN_MOTOR_1_SPEED, OUTPUT); // ШИМ мотора pinMode(PIN_STEERING, OUTPUT); // рулевая pinMode(PIN_HEAD_LIGHT, OUTPUT); // фары pinMode(PIN_LEFT_TURN, OUTPUT); // левый поворотник pinMode(PIN_RIGHT_TURN, OUTPUT); // правый поворотник pinMode(PIN_TAIL_LIGHT, OUTPUT); // задние огни pinMode(PIN_SPECIAL_LIGHT, OUTPUT); // спецсигнал frontWheel.attach(PIN_STEERING); // прикрутили рулевую серву к пину рулевого управления motor.attach(PIN_MOTOR_1_SPEED); // прикрутили контроллер скорости Serial.begin(9600); //We reset the received values // reset_the_Data(); //Once again, begin and radio configuration radio.begin(); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.openReadingPipe(1,pipeIn); //We start the radio comunication radio.startListening(); } /**************************************************/ unsigned long lastRecvTime = 0; //////////////////////////////////////////// void receive_the_data() // получение команды { while ( radio.available() ) { radio.read( &recieved_data, sizeof(recieved_data)); lastRecvTime = millis(); //Here we receive the data } } /**************************************************/ void loop() { //#ifdef PROCTIME // Проверяем, сколько времени занимает выполнение функции // long processTime = millis(); //#endif //Получаем коммаду по радио receive_the_data(); // Печатаем, что получили print_Data(); // Присваиваем полученное переменным set_Commands(); //////////This small if will reset the data if signal is lost for 1 sec. ///////////////////////////////////////////////////////////////////////// unsigned long now = millis(); if ( now - lastRecvTime > 1000 ) { // signal lost? reset_the_Data(); //Go up and change the initial values if you want depending on //your aplications. Put 0 for throttle in case of drones so it won't //fly away } #ifdef PROCTIME Serial.print("Execution time: \t\t\t"); Serial.print(millis() - processTime); Serial.println(" ms\n"); #endif }//Loop end // Функция управления мотором. Так же здесь идёт управление зависящим от скорости оборудованием. void set_Motor(){ int curSpeed; // текущая скорость // oldMotorSpeed = 0; #define THORTLE_MIN 0 #define THORTLE_MID 127 #define THORTLE_MAX 255 // скорость #define SPEED_MIN 0 #define SPEED_MID 90 #define SPEED_MAX 180 #define GAPE 5 if (lostCommand == true) {thortle = THORTLE_MID;} // если потерян сигнал, стоп curSpeed = (map(thortle, THORTLE_MIN, THORTLE_MAX, 0, 180)); motor.write(curSpeed); motorSpeed = 90 - curSpeed; motorSpeed = abs(motorSpeed); #ifdef DEBUG2 Serial.print ("Speed= "); Serial.print (motorSpeed); #endif if (motorSpeed <= GAPE ) // Стоп { brakeLight = true; // включаем стопсигнал setLights(); oldMotorSpeed=motorSpeed; #ifdef DEBUG2 Serial.println(" Stop "); #endif } if (motorSpeed < oldMotorSpeed ) // Стоп { brakeLight = true; // включаем стопсигнал setLights(); oldMotorSpeed=motorSpeed; #ifdef DEBUG2 Serial.println(" Brake "); #endif } if (motorSpeed > oldMotorSpeed ) // Стоп { brakeLight = false; // выключаем стопсигнал setLights(); oldMotorSpeed=motorSpeed; #ifdef DEBUG2 Serial.println(" Thortle "); #endif } /* {motorSpeed= map (thortle, THORTLE_MIN,THORTLE_MID, 255, 80); // устанавливаем максимальную скорость if ( oldMotorSpeed - 5 > motorSpeed) { brakeLight = true;} // проверяем скорости. если старая скорость больше, то включаем стопсигнал else { brakeLight = false;} // гасим стопсигнал setLights(); oldMotorSpeed=motorSpeed; #ifdef DEBUG2 Serial.print ("Forward "); Serial.println (motorSpeed); #endif } if (thortle >= THORTLE_MID - GAPE && thortle <= THORTLE_MID+GAPE) // Стоп { oldMotorSpeed = 0; brakeLight = true; // включаем стопсигнал setLights(); motorStoped = true; oldMotorSpeed=motorSpeed; #ifdef DEBUG2 Serial.println("Stop "); #endif } if (thortle > THORTLE_MID + GAPE) // Крутим моторчик назад {motorSpeed= map (thortle, THORTLE_MID,THORTLE_MAX, 80, 255); if ( oldMotorSpeed - 5 > motorSpeed) { brakeLight = true;} // проверяем скорости. если старая скорость больше, то включаем стопсигнал else { brakeLight = false;} // гасим Стопсигнал setLights(); } */ #ifdef SERVOCHECK Serial.print("thortle"); Serial.print(" "); Serial.print(motorSpeed); Serial.print(" "); #endif } void set_Motor_1(){ int SPEED_STEP = 20; // шаг прироста скорости int maxSpeed; // максимальная скорость #define THORTLE_MAX 250 #define THORTLE_MID 127 #define THORTLE_MIN 0 #define GAPE 10 maxSpeed = 255; //150 + (SPEED_STEP * (consumption)); // расчет максимальной скорости в зависимости от "расходов" // проверяем значение потенциометра if (lostCommand == true) {thortle = THORTLE_MID; } // Если потерян сигнал, стоп if (thortle < THORTLE_MID - GAPE) // Крутим моторчик вперед {motorSpeed= map (thortle, THORTLE_MIN,THORTLE_MID, maxSpeed, 80); // устанавливаем максимальную скорость // digitalWrite (PIN_MOTOR_11, LOW); // подаем напругу // digitalWrite (PIN_MOTOR_12, HIGH); // на нужные пины // if (motorStoped == true) {analogWrite (PIN_MOTOR_1_SPEED, 150); // если мотор стоял, даем пинок напругой // delay(50); // ждем чуток // motorStoped = false; // меняем флажок, что мотор крутится // } // motor.write (motorSpeed); // задаем скорость // analogWrite (PIN_MOTOR_1_SPEED, motorSpeed); // задаем скорость if ( oldMotorSpeed - 5 > motorSpeed) { brakeLight = true;} // проверяем скорости. если старая скорость больше, то включаем стопсигнал else { brakeLight = false;} // гасим стопсигнал setLights(); oldMotorSpeed=motorSpeed; #ifdef DEBUG2 Serial.print ("Forward "); Serial.println (motorSpeed); #endif } if (thortle >= THORTLE_MID - GAPE && thortle <= THORTLE_MID+GAPE) // Стоп { // digitalWrite (PIN_MOTOR_11, LOW); // digitalWrite (PIN_MOTOR_12, LOW); oldMotorSpeed = 0; brakeLight = true; // включаем стопсигнал setLights(); motorStoped = true; oldMotorSpeed=motorSpeed; #ifdef DEBUG2 Serial.println("Stop "); #endif } if (thortle > THORTLE_MID + GAPE) // Крутим моторчик назад {motorSpeed= map (thortle, THORTLE_MID,THORTLE_MAX, 80, maxSpeed); // digitalWrite (PIN_MOTOR_11, HIGH); // digitalWrite (PIN_MOTOR_12, LOW); // if (motorStoped == true) {analogWrite (PIN_MOTOR_1_SPEED, 150); // если мотор стоял, даем пинок напругой // delay(500); // ждем чуток // motorStoped = false; // меняем флажок, что мотор крутится // } // analogWrite (PIN_MOTOR_1_SPEED, motorSpeed); motor.write (motorSpeed); // задаем скорость if ( oldMotorSpeed - 5 > motorSpeed) { brakeLight = true;} // проверяем скорости. если старая скорость больше, то включаем стопсигнал else { brakeLight = false;} // гасим Стопсигнал setLights(); #ifdef DEBUG2 Serial.print ("Rear "); Serial.println (motorSpeed); #endif oldMotorSpeed=motorSpeed; } } // Функция управления сервой руля. Здесь так же можно выставить ограничения на углы поворота void set_Steering(){ #define WHEEL_MIN 0 #define WHEEL_MID 127 #define WHEEL_MAX 255 // угол поворота руля #define ANGLE_MIN 60 #define ANGLE_MID 90 #define ANGLE_MAX 120 #define GAPE 5 // нейстраль 406 // максимум право 63 // максимум лево 672 if (lostCommand == true) {steering = WHEEL_MID;} // если потерян сигнал, руль прямо // if(steering < WHEEL_MID - GAPE) { frontWheel.write(map(steering, WHEEL_MIN, WHEEL_MAX, ANGLE_MIN, ANGLE_MAX)); // } #ifdef SERVOCHECK Serial.print(steering); Serial.print(" "); Serial.println(map(steering, WHEEL_MIN, WHEEL_MAX, ANGLE_MIN, ANGLE_MAX)); #endif } void setLights() { // проверяем состояние фар, if (headLight == true) { analogWrite(PIN_HEAD_LIGHT, 255); // включаем фары analogWrite(PIN_TAIL_LIGHT, 60); // включаем задние габариты //#ifdef DEBUG // Serial.print("Head Light ON "); //#endif } else { analogWrite(PIN_HEAD_LIGHT, 0); // включаем фары analogWrite(PIN_TAIL_LIGHT, 0); // включаем задние габариты #ifdef DEBUG3 Serial.println("Head Light is OFF "); #endif } // прверяем состояние стоп огней if (brakeLight == true) { analogWrite(PIN_TAIL_LIGHT, 255); // включаем стоп-огни //#ifdef DEBUG2 // Serial.print("Brake Light ON "); //#endif } // Проверяем состояние спецсигнала if (specialLight == true) { analogWrite(PIN_SPECIAL_LIGHT, 255); // включаем спецсигнал } else { analogWrite(PIN_SPECIAL_LIGHT, 0); // тушим спецсигнал } ////// #ifdef DEBUG3 Serial.println("Special Light is ON "); #endif } void set_Turn() // функция моргания поворотниками. // пусть работает постоянно { static unsigned long previousMillis = 0; // храним время последнего переключения светодиода //проверяем не прошел ли нужный интервал, если прошел то if(millis() - previousMillis > INTERVAL) { // сохраняем время последнего переключения previousMillis = millis(); // меняем состояние выхода светодиода на противоположное текущему. // если горит - тушим, не горит - зажигаем. statusTurn=!statusTurn; //#ifdef DEBUG // Serial.println(statusTurn); //#endif } // проверяем, нужно ли включать поворотники, если нужно, то включаем if (leftTurn == true) {digitalWrite(PIN_LEFT_TURN,statusTurn); //#ifdef DEBUG // Serial.print("Left turn ON "); //#endif } else {digitalWrite(PIN_LEFT_TURN,LOW); //#ifdef DEBUG // Serial.print ("Left turn OFF"); //#endif } if (rightTurn == true) {digitalWrite(PIN_RIGHT_TURN,statusTurn); //#ifdef DEBUG // Serial.print("Right turn ON "); //#endif } else {digitalWrite(PIN_RIGHT_TURN,LOW); //#ifdef DEBUG // Serial.println("Right turn OFF "); //#endif } } // Данная функия нужна исключительно для проверки работы приёмника во время наладки. void print_Data() { #ifdef DEBUG Serial.print ("J1 X "); Serial.print (recieved_data[0]); Serial.print (" J1 Y "); Serial.print (recieved_data[1]); Serial.print (" J2 X "); Serial.print (recieved_data[2]); Serial.print (" J2 Y "); Serial.print (recieved_data[3]); Serial.print (" pot "); Serial.print (recieved_data[4]); Serial.print (" Sw_11 "); Serial.print (recieved_data[5]); Serial.print (" Sw_12 "); Serial.print (recieved_data[6]); Serial.print (" Sw_21 "); Serial.print (recieved_data[7]); Serial.print (" Sw_22 "); Serial.print (recieved_data[8]); Serial.print (" Sw_31 "); Serial.print (recieved_data[9]); Serial.print (" Sw_32 "); Serial.println (recieved_data[10]); #endif } void set_Commands() { // Отработка полученных данных consumption = 5; // расходы specialLight = recieved_data[10]; // спецсигнал headLight = recieved_data[9]; // фары setLights(); // отрабатываем состояние фар rightTurn = recieved_data[6]; // правый поворотник leftTurn = recieved_data[5]; // Левый поворотник set_Turn(); // Отрабатываем состояние поворотников steering = recieved_data[0]; // записываем положение руля set_Steering(); // отрабатываем состояние руля thortle = recieved_data[1]; // Записываем газ set_Motor(); // отрабатываем состояние газа }
Именно за ночь вытекает из ардуины скетч? Или в какое-то конкретное время - например, в полночь? Другие скетчи так же себя ведут? А если под замок запирать?
Вопрос понят, отвечаю.
За ночь - понятие условное. С учетом удаленно-самоизолированного графика работы, допиливание скетча и передача оборудования для тест-драйва подрастающему поколению происходит в вечернее время суток. Как следствие, около часа на тест и на полку, спать. Конкретное время вытекания скетча из ардуины установить не удалось. Весьма предположительно, что это происходит между 03:40 и 04:40. Может не без участия кошки.
Скетчи в других (рукоблуд)поделках ведут себя менее революционно. И тихонечко ждут своей очереди для использования.
врядли скетч виноват, весь смотреть смысла нет - время убивать. если отключить питание "полностью" минут на 10 есть проблемы?
меняйте камень, и сколько % занимает скетч? ну для очистки совести перепрошейте загрузчик. И да, бывало, что скетч слетал без объявления причин, даже 2 раза.
И чо было то ?
И да, бывало, что скетч слетал без объявления причин, даже 2 раза.
Парурас)))
Гриша, чот я нипонял: сначала пишешь шо не скечч, патом пишешь шо скечч да ещё парурас))) И как это понять???
А для кантролю целостности скечча сваяй простеццкую процедурку суммирования флеша начиная с конца (RWW-1) и до вектора reset (вся область флеша без бута) и выводи её хоть в сериал, хоть куда ещё. Ну или можешь сравнивать её с заранее посчитанным результатом. Этот фокус так-же очень хорош от "умникоф" , которые меняют чото в *.hex
Лично у меня прошивки ещё ниразу не "сыпались" )))
Лично у меня прошивки ещё ниразу не "сыпались" )))
DS18B20 + tm1637 и все ... после года непрерывной работы отказались реагировать - не мудрствуя лукаво накатил прошивку... До этого поменял кондер на БП (не запустились, вот он точно был дохлый) уже как год пашет после ремонта. Другим разом потерял на Atmega8 но там деталек поболее, после проверки напряжений на контрольных точках, залил тестовый, все работает. Залил рабочий все заработало. Оба случая после отключения Э/Э чего не должно быть. Чем разбираться и сравнивать - проще было по тесту прогнать... ИМХО
Скил кодера МК слабо прокачен...
чотам кодить-то? )))
Думаю, что проблема в другом.
Это скетч управления машинкой. А для ее управления нужен пульт. Пульт питается от 4х АА. Батареи новые. При замере сборка выдает 7 вольт. При включении питания пульта напряжение падает до 4 вольт. Ток 0.25А... Другая ардуина без nrf берет 0.2А.
Теперь вопрос. Как победить просадку питания?
При включении питания пульта напряжение падает до 4 вольт. Ток 0.25А... Другая ардуина без nrf берет 0.2А.
похоже в схеме напортачили, выкладывайте схему, что за ардуина у вас такая, что потребляет 0.2А. Стандартная Нано или Уно должна потреблять в 3-4 раза меньше
А вот так, чтобы из 2-х купленных лотерейных билетов на один попал крупный выигрыш, а на другой джекпот, не доводилось? Однако одной американской семейке в прошлом году так повезло.
Т.е. малая вероятность это не нулевая вероятность, а пути ТЗЧ неисповедимы.
Пипец - а прошить с утра и вечером проверить? Троллинг?
Может солнечная Ардуино? https://nat-geo.ru/science/meditsinskaya-zagadka-veka-solnechnye-malchiki-iz-pakistana/
похоже в схеме напортачили, выкладывайте схему, что за ардуина у вас такая, что потребляет 0.2А. Стандартная Нано или Уно должна потреблять в 3-4 раза меньше
Да какая схема? Пустая ардуина, без ничего. Правда амперметр DT838...
Пипец - а прошить с утра и вечером проверить? Троллинг?
Наоборот. Но не ссуть...
Коллеги, а вы смотрели Фиксиков? У них есть прекрасная песня про Батарейку.
Есть пульт, которым управляется афтомобиль. У пульта за зиму сели батарейки (АА). Я открываю крышку пульта и меняю 4 батарейки. Переделываю прошивку машины, прошиваю ее, и она работает. Вечером отдаю детЯм, они гоняют, ставят на ночь на полку. Проходит ночь, утром удаленная школа, у меня работа, к вечеру достаем машину опять. А она - не але. Пульт включается экранчик светицца. Да и батарейки я недавно менял. Значит проблема в машине. Перепрошиваю машину, она опять немного ездит... А в один прекрасный момент - пульт не заводицца. Мерю мультиметром, батареи 1.4В, но при включении питания пульта напряжение дико садится до 3-4 вольт. Соответвтенно, ардуина на стартует, nrf молчит...
Думаю, что АА - архаизм, и пора менять на 18650, разбираю пульт, а там блок батарей на 8 штук! 4 я заменил, а 4 - прошлогодние...
Заменил все. Работаит!!! Сегодня ночью оставлю на ночь. Утром проверю. Но что-то мне подсказывает, что колдунства больше не будет и все будет работать нормально.
Вот и славно. Чудес не бывает, а х*ня случается.
Странно это все. Прям уфология. 328й МК до 3V работает по даташиту. Да и от глюков при падении напряжения его какой-то правильно выставленный фьюз brown-out защищает.
Никакой уфологии. Это наверно на Vin такое напряжение, вот и не работает...
Вот и славно. Чудес не бывает, а х*ня случается.
Золотые слова, Бронеслав Бенедиктович!
Нужно запомнить эту простую, но мудрую фразу.
В общем, утром включаю! и О чудо! Все работает.
Спасибо за поддержку и форумскую мудрость!