16

Клинит плату Arduino nano. В чём может быть проблема?

Добрый день.

Конструирую один танк. Дошёл до этапа тестирования ходовой. Всё ездит, всё хорошо. НО есть проблема. Иногда плата зависает и танк продолжает движение. Помогает лишь перезагрузка платы. Сначала казалось, что проблема только при движении назад направо. Но когда снимал видео, то проблемы повторились и при движении в других направлениях. При том разок (первое зависание на 6 секунде, второе на 11) даже отвис.

Конструктивно всё просто. Стоит ардуино нано с модулем nrf24l01, аккумулятор и контроллер двигателей. Программно тоже просто - считываю переменную с показаниями джойстика, а потом преобразовываю и конструкцией из нескольких if - else if определяю что и куда подавать.


Думал либо помехи, либо код. Но вспомнил, что в предыдущем танке была такая же проблема. А там и код другой, и конденсаторы ставил, и конструкция в целом отличается.

Подскажите, пожалуйста, в чём может быть причина? Если всё же помехи с питания (разве контроллер двигателей не должен их устранять?), то как лучше от них избавиться? Просто подбором конденсаторов? Но как тогда определить какие именно конденсаторы нужны? Моторы на 12 вольт (понимаю, что кондёры должны быть от 12 и выше), питание Li-Po 3S. Пытался гуглить, но в основном говорят брать просто как можно больше. И всё.

Ёмкость и тип конденсаторов подобрать думаю как. А если не в помехах дело, то в чём может быть ещё?


Код приёмника https://ideone.com/6R3kkS

Код передатчика https://ideone.com/SXeR6W


Upd 2: Не хочу торопить события, но (кажется) проблема решилась конденсатором на модуль nrf24l0. Всем большое спасибо.


P.S. Опять же, не уверен правильно ли указал сообщество.

Arduino & Pi

1.5K постов20.9K подписчиков

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

0
Автор поста оценил этот комментарий

Ну вроде проблему решили, тем не менее, интересно глянуть схему. Есть? Каким напряжением питаете ардуину?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Схема простая. Есть такой контроллер, к нему подключил нано, двигатели и аккумулятор. А nrf модуль к нано. Соответственно, Ардуино 5 вольт берёт. Через Vin
Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий
Если я правильно понял ... перемещение только в одну из четырёх сторон

Нет, вообще не правильно поняли.


значения "левый/правыйСерво" и осьX/Y могут быть, например, +-32767, +-255 и т.д. Это не +-1, а плавное изменение.


Эта схема позволит вам двигаться в любом направлении, плавно регулируя скорость, в том числе плавно поворачивая при движении. И это довольно простой вариант, без, например, точного расчёта окружности поворота.


Вбейте в код и посмотрите, что будет. Только надо задать диапазоны значений, и добавить мапы (от значений джойстика - в значение осей, и от "скорости серва" - в значения, которые принимает серв).

раскрыть ветку (1)
Автор поста оценил этот комментарий

Кажется суть уловил, спасибо. Буду пробовать.

0
Автор поста оценил этот комментарий

То безобразие, что у вас в if/else, я бы нафиг переписал, потому что в данный момент там надо разбираться с лупой и бутылкой алкоголя. Но беглым взглядом не похоже, что там может что-то "заклинить", соответственно, смотрите советы электронщиков.


Управление танком дискретное или аналоговое?


Просто, например, блок управления можно было бы сделать так:


-------------------

осьX = (из геймпада, лево-, право+)

осьY = (из геймпада, вперёд+, назад-)


левыйСерво = 0  (0 - стоит, - крутится назад, +крутиться вперёд)

правыйСерво = 0 (0 - стоит, - крутится назад, +крутиться вперёд)


левыйСерво += осьY.

правыйСерво += осьY

/*жмём вперёд, едет вперёд. Жмём назад, едет назад оба трака.         Жмём сильнее - едет быстрее.*/


левыйСерво += осьX

правыйСерво -= осьX

/*

Жмём вправо - начинает крутиться по часовой. Левой - против часовой. Жмём сильнее - крутится быстрее


Дальше вам надо будет сделать проверку выхода за пределы допустимого диапазона.

Например если значения в сервах в +-255, и геймпад возвращает +-255,

добавляем if/else, по типу if левыйСерво > 255 левыйСерво = 255. По идее должна быть функция clamp для ээтого, её можно написать, если нет.


Ну и потом делаем map в диапазон, который скармливается в серв.

*/

------------------


Это упрваление аналоговым джойстиком. Проще ведь? И без огромной портянки.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Аналоговое.


Если я правильно понял, то тут речь о просто передачи значений на двигатели. Таким образом возможно перемещение только в одну из четырёх сторон, при этом с полной остановкой при смене направления. Или я неверно вас понял?


Для "гоночного" танка не совсем подойдёт. Мне потому и пришлось идти в кучу if/else, чтобы определить направление, а потом уже мочь устанавливать скорость.  Чтобы на ходу поворачивать, замедляя одну из гусениц.

показать ответы
3
Автор поста оценил этот комментарий

Обработку координат запихать в отдельную функцию, которая уже будет выдавать направление. И это направление передавать уже в switch...case.

Примерно так:

int Joy(int x, int y){

int result = 0;

if (x>0 && x<100) { result += 1; } //вправо

if (x<0 && x>-100) { result += 2; } //влево

if (y>0 && y<100) { result += 10; } //вверх

if (y<0 && y>-100) { result += 20; } //вниз

return result;

}

j = Joy(x,y);

switch (j) {

case 0: 

//стоим на месте

break;

case 1:

//вправо

break;

case 2:

//влево

break;

case 10:

//вперед

break;

case 20:

//назад

break;

case 11:

//поворачиваем вправо и вперед

break;

case 12:

//поворачиваем влево и вперед

break;

case 21:

//поворачиваем вправо и назад

break;

case 22:

//поворачиваем влево и назад

break;


default:


break;

}

раскрыть ветку (1)
Автор поста оценил этот комментарий

Таким образом на предыдущем танке пробовал реализовать.

Только вот потом подумал, что если уж всё равно приходится делать кучку if/else, то можно в них же и устанавливать скорость. Или тут всё равно лучше расширять код для switch/case?


Как минимум попробую со switch/case. Ещё какая-то мысль начала крутиться в голове.

показать ответы
0
Автор поста оценил этот комментарий

Код в студию! Или куски кода. Желательно не только принимающей, но и передающей стороны.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Добавил в пост оба варианта

1
Твайлайтовое
Автор поста оценил этот комментарий

Сейчас попробую понять как можно сделать
https://pastebin.com/

раскрыть ветку (1)
Автор поста оценил этот комментарий

Там запрещено правилами сообщества.

Но добавил разрешённым способом.

показать ответы
1
Автор поста оценил этот комментарий

Я бы первым делом смотрел код, но кода тут нет, а ясновидение не работает.


Танк и гусеницы печатали или купленный?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Добавил код в пост

показать ответы
1
Автор поста оценил этот комментарий

Я бы первым делом смотрел код, но кода тут нет, а ясновидение не работает.


Танк и гусеницы печатали или купленный?

раскрыть ветку (1)
Автор поста оценил этот комментарий

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


Моделировал, затем печатал.

показать ответы
5
Автор поста оценил этот комментарий

Да, похоже на помехи по питанию. Можно попробовать допаять керамические конденсаторы параллельно и/или ferrite bead 1к (на 0.5 - 3A) или дроссель на 100мкГн последовательно питанию Arduino.



>Ёмкость и тип конденсаторов подобрать думаю как


Достаточно 0.1мкФ на 50В керамических  одну - две штуки параллельно питанию... тут же не пульсации нужно сгладить, а помехи заземлить до того, как они попадут на Arduino

раскрыть ветку (1)
Автор поста оценил этот комментарий

Спасибо, буду пробовать.

показать ответы
11
Автор поста оценил этот комментарий

На модуле nrf24l01 обязательно должен стоять конденсатор не менее 10 мкФ, он без него очень любит подвиснуть. Возможно при пуске двигателя немного проседает напряжение и он виснет. Конденсатор нужно подпаивать прямо к ножкам модуля, как можно ближе, 90% в нём и будет этот глюк.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Спасибо, попробую.

Про конденсаторы на модуль слышал, но слышал чисто про увеличение дальности, а не стабильности работы. Но обязательно попробую.

показать ответы
2
Автор поста оценил этот комментарий

Вместо if else if давно уже придумали switch...case.

раскрыть ветку (1)
Автор поста оценил этот комментарий

О нём знаю, но для определения направления всё равно нужно проверять положение джойстика через if. То есть приходят координаты, а я проверяю по ним направление.

В switch вроде нельзя делать выражения (или переменные) в качестве case.

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества