После откл/вкл. питания отеря связи между nRF24l01
- Войдите на сайт для отправки комментариев
Всем привет. Я не спец, только учусь. Делаю радиоуправление для самолета. Оборудование Arduino nano 2шт. и два модуля nRF24l01(один с усилком). Столкнулся с проблемой: загружаю скетч в приемник и передатчик- все работает без проблем. Снимаю питание и включаю опять (без разници приемник или передатчик), управление теряется, reset и повторная загрузка скэтча не помогает. Загружаю в ардуинки тестовый скэтч (GettingStarted_CallResponse) связь есть в двух направлениях, откл/вкл. связь в норме. Опять загружаю скэтч приемника и передатчика и все работает до снятия питания, и так по кругу. Если при наличии связи сделать reset то все работает нормально, затыкается если только питание снимаю. Ни кто не сталкивался с такой проблемой?
http://arduino.ru/forum/programmirovanie/nrf24l01-pomogite-v-kode-propis...
сезон похоже начался
Спасибо, почитал. С установкой в нужные значения серво я разобрался, но не понял как сделать переинициализацию радиомодуля. Вставка "protocol.init(&wireless);" выдает ошибку "protokol was not declared in this scope", явно чего-то не хватает, ткните носом плиз что не так делаю. А как работает эта команда?
ты вставил целый код, а не команду
библиотека нужна другая. я давал ссылку
Я видать не правильно понял. Скачал твою библиатеку RF24 и копирую ее в папку libraries(rf24 свою удалил) и дописываю protocol.init(&wireless); , выдает ошибку всеравно.
идэ перезапускал. когда меняешь или устанавливаешь лучше перезапускать
я у тебя не увидел кода передатчика. хз куда ты его вставляешь
Я видать не правильно понял. Скачал твою библиатеку RF24 и копирую ее в папку libraries(rf24 свою удалил) и дописываю protocol.init(&wireless); , выдает ошибку всеравно.
Передатчик с таким кодом.
А вставляю в приемник так
Ура!!!! Заработало, а дело было в библиотеке, видать не такая какая-то стояла. Спасибо огромное. Странно что отказывался работать после откл\вкл питания- суть проблемы не понятна была.
А подскажи такой вопрос если не трудно. При управлении БК двигателем с ардуино (не через радио) диапазон стоит такой int val = map (analogRead(0), 0, 1023, 800, 2300); и обороты с потенциометра от минимума до максимума. Когда в передатчике ставлю так же (как в скетче ниже msg[2]), то за полный ход потенциометра движок раз шесть ускоряется и останавливается и отсутствуют максимальные обороты, или поймать их не могу. Другой диапазон нужен? p.s. 2300
к несколько раз набирает и сбрасывает обороты
бросилось в глаза что ты используешь map не проверяя диапазон. а если число не в диапазоне будет?
я по правильному все значения что передаешь по радиоканалу отправь в терминал и там посмотри. искать ошибки нужно так))
Что значит map не проверяя диапазон? Не, то что потенциометр выдает от 0 до 1023 это я проверил конечно. Вот для серво весь диапазон потениометра мы делим на градусы от 0 до 180 от этого и угол поворота зависит. А при управлении движком не через радиоканал я весь диапазон приравнивал а 800-2300 и все норм. А если через радио то не хочет почему-то, крайнее нулевое движок вообще ругается и шесть раз за диапазон обороты то ростут то сбрасывает. Не вьеду ни как.
с мар еще раз посмотрю. а вот то что ты отправляешь значение в 63 строке от 800 до 2300, а массив у тебя 4 строка byte и значения не могут быть больше 255
а про терминал ты не заметил?
А что про терминал, что не заметил? не понял вопрос просто, я просто только постигаю азы так сказать. Все методом проб и ошибок, плюс примеры других.
отправляй в терминал что отправляешь через радиомодули. serial.print и т.д. и увидишь в чем проблема
Выставил msg[2] = map(analogRead(Left_joy_vertical), 0, 1022, 0, 255); В терминале смотрю, от 0-90 - движок пищит ошибкой, 110-680 разгон, дальше остановка и пищит опять, не вьеду ни как :(
весь код выкладывай и передатчика и приемника
Передатчик
Приемник
ну конечно. msg 2 смотри что придет на двигатель. ты перепутал что можно передавать через переменную byte и что нужно для управления двигателем. используй терминал!!! сам бы увидел ошибку по значениям
Поправь если не так, а то не вьеду пока. byte - значение в диапазоне 0....255, для управления двигателем нужен диапазон 800...2200. Вереоятно нужно поменять byte на int и поменять значение msg[2] с (0, 255) на (800, 2200).
это если в миллисекундах нужно отдавать. а если в градусах там же диапазон от 0 до 180. нужно ли тебе более точное управление
Тогда сдаюсь, пока не пойму.
напиши в 63 строке передатчика
если не будет хватать точности управления тогда переделаешь на управление миллисекундами
Спасибо попробую. Я правильно понял, что в случае работы с byte мы должны использовать диапазон как для сервы так и двигателя (0,180)? Я думал что (0,180) это условная единица так же равная градусам, но как тогда градус приравнивается к вращению мотора (мин и макс обороты), ведь максимальное значение byte=255
byte это как размер емкости, ты же не можешь в литровую банку налить 1.5литра воды?
так ты не знаешь как серва и двигатель управляются чтоли. одинаково. просто ты сигналы управления выдаешь по разному в коде. можно в микросекундах можно в градусах. в микросекундах точнее можно управлять, но это одно и тоже
http://arduino.ru/Reference/Serial
это про терминал
по серве
http://arduino.ru/Reference/Library/Servo
в градусах
http://arduino.ru/Reference/Library/Servo/write
в мкс
http://arduino.ru/Reference/Library/Servo/writeMicroseconds
Спасибо большое за помощь. Я только учусь пока. Я читал прежде чем пробовать, вероятно не все понял правильно. Вот например про Servo.write() написано что управление двигателем (0,180) это максимальные значения скорости в разных направлениях, а 90 - это стоп. Но БК двигатель мы не изменим вращение програмно же, только провода местами. И исходя из написанного мне вроде как в коде надо прописать msg[2] = map(analogRead(Left_joy_vertical), 0, 1022, 0, 90); - в чем подвох? что опять не понял? Я понял что есть команда Servo.write() и Servo.writeMicroseconds() и пробовал их применять при управлении напрямую без радиоканала, а вот их применение к радиоканалу не понял. Библиотеку servo мы используем на приемнике и прописав например в своем коде строку 35 как L2.writeMicroseconds(msg[2]); он будет принимать в микросекундах? но тогда мы по идее должны и передавать в микросекундах? А какая команда определяет порядок передатчика в градусах или микросекундах тогда?
серва 0-180 градусов, 90 - середина
мотор с реверсом. 0-90 вперед, 0 макс. вперед, 90-180 назад, 180 макс назад. 90 - стоп
бк мотор 0-180. 180 макс
если передаешь в градусах, но и на серву нужно передавать командой от градусов, приемнике уже стоит команда от градусов так что ничего менять не надо. только то что я писал. я про код выше
Спасибо, запомню как аксиому. Про "код выше" я понял. А что конкретно определяет отсылку в градусах или микросекудах, только byte и int?
ты!!! а исходя из твоего решения делаешь что нужно, в том числе и выбор типа переменной. ты же молотком не заводишь машину, как и ключами не забиваешь гвозди. хотя смотрю попытки у тебя все таки есть))
ну это от неправильного представления ключей и молотка ))). Приведи пример отсылки в микросекундах если не сложно, так сказать увидеть воочию ;)
"Матрица" ко мне не совсем еще пришла )))
хорошо что начало до тебя доходить. а то у меня терпение уже заканчивалось
Еще раз спасибо, пойду дальше пробовать и учиться
Добрался до дома и прописал как ниже. В результате в терминале что передача, что прием msg2 (0,180), а вот движок всеравно пищит и интервалах (0,22) и (174,180) и критить двигатель начинает где-то от 113. Не нравяться крайние положения почему-то :(
Передатчик
Приемник
ну если значения нормальные в терминале, значит проблему нужно в другом месте искать. или диапазон твоего драйвера другой и нужно через микросекунды управлять, или ошибка монтажка и невыполнение банальных требований по питанию
Пока не получается в микросекундах, что-то не так прописываю. Монтаж вроде в норме +- на крайние а переменный вывод на А3 как в скетче прописано
напрямую попробуй без радиоканала
Ура, разобрался, получилось, ему действительно сигнал в микросекундах нужен был
в чем без разницы. важен диапазон. в градусах от 1000 до 2000 только можно. нужен другой подается в микросекундах. у тебя другой диапазон просто
у меня получился (800, 2300)
ну вот. просто другой диапазон нужен
А есть формула перевода из микросекунд в градусы, или только методом научного тыка? )))
да что ты прицепился к еденицам, это как дюймы и метры. просто для градусов диапазон жесткий заданный в библиотеке 0-180 градусов/1000-2000мкс
Ааааааа, Семен Семеныч, понял теперь ))) Вот оно ключевое слово 0-180=constanta=1000-2000
ну ты жираф)))
Я просто совсем новичок в этом ремесле. Только неделю разбираюсь, уроки смотрю, пробую
привыкнешь