Контроллер для детской машинки на Arduino Mega 2560

Автор HECTEPOB, 16 Нояб. 2014 в 21:35

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

skros

#270
такс, вроде реализовал я дифф, пока правда тока руками тормозил колеса, ребенок не катался........возник сразу вопрос, вот я с этим диффом попадаю в яму одним колесом и получается, что дифф понизит на застрявшем колесе pwm до минимума заложенного в проге ( у меня 80 из 255) а свободное будет хреначить все pwm=255...........что скажете?

так посмотрел вывод в сериал и получается что у меня не доходит до возможного минимума понижения pwm, т.к. сработка диффа происходит по разнице тока между колес (сейчас у меня стоит при разнице в 250), т.е. когда мы понижаем pwm на колесе соответственно начинает падать сила тока и условия сработки диффа пропадают........значение pwm максимум упало с 255 до 148, тогда разница по току не попадает в условие сработки диффа

но все же когда там сидит ребенок думаю pwm упадет до минимума и на таком pwm из ямы не выедешь

HECTEPOB

Как правило в реальных условиях до нуля упасть не успевает. А вообще надо делать самоблок.  Если одно колесо буксует,  будет потреблять мало,  надо вычислять порог срабатывания самоблока пропорционально значению педали и если колесо ест меньше порога,  включать самоблок.

Добавлено 14 Июль 2015 в 08:46

А вообще,  код в студию,  ну или хотя бы в личку.

skros

да я тут выложу скетч попозже, надо опробывать в реальных условиях........думаю сделать контрольку - зуммер на сработку диффа, чтобы отслеживать его работу

по самоблоку приснилось, что, или делать по кнопке его включение, или про то что вы говорите, но надо смотреть скорость и при ее = 0-0.х км включать............у моей педали два значения 0 и 1

HECTEPOB

[user]skros[/user], ды выкладывайте что есть,  сразу разберемся,  что поедет,  что нет. Если педаль не линейная,  значит порог считать пропорционально базовому значению ШИМ

HECTEPOB

А по опыту эксплуатации могу сказать,  что ни разу с начала сезона,  несмотря на то,  что водители большие любители поездить по буеракам,  не видел,  чтобы машину удалось "засадить". Такого,  что одно колесо заблокировано,  второе "шлифует" ни разу не было. Думаю это связано с инерционностью дифа (у меня значение коррекции меняется плавно,  на каждом цикле сигналы тока сравниваются на "больше-меньше" и коррекция инкрементируется,  либо декрементируется). Пока значение коррекции "устаканивается" авто как правило успевает преодолеть припятствие.

HECTEPOB

По "контрольке" была идея задействовать задние габаритные огни (зажигать тот,  который больше потребляет)

skros

такс вот скетч, прикручен пока зуммер с заделом еще на 2 светика

в бою еще не опробован

HECTEPOB

[user]skros[/user],

Простите, если что, но не удержался:

Как говорят в среде программеров: "Да вы батенька грязный извращенец"! Это я о:

L_tok = 0;
  R_tok = 0;
  for (i = 0; i < 20; i++) {
    L_tok = L_tok + analogRead(L_IS_pin);
    R_tok = R_tok + analogRead(R_IS_pin);
  }

  L_tok = round(L_tok / 20);
  R_tok = round(R_tok / 20);


Я конечно понимаю, что процы быстрые, но не до такой же степени! Цикл жрет время.
Для усреднения и отсутствия "дребезга" сигнала достаточно хранить 20 последних значений в массиве (это и есть "кольцевой буфер" или просто "кольцо") и на каждом шаге основного цикла добавлять по одному. Тогда необходимость в чтении (тем более двойном) аналогового сигнала в цикле отпадет, останется только суммирование, код будет более эффективен. Длину массива лучше выбирать кратную степени двойки (поскольку деление на длину массива будет на порядок быстрее, фактически деление заменяется побитовым сдвигом на число разрядов, равное показателю степени).

HECTEPOB

//итого по диффу
  L_down = constrain(L_down, 0, L_max_speed);
  R_down = constrain(R_down, 0, R_max_speed);
 
  if (diff_on) {
     L_pwm = L_pwm - L_down;
     R_pwm = R_pwm - R_down;
  }


Тут на мой взгляд кроется фундаментальное зло (на сколько я понял из беглого анализа, может протупил...)! Поскольку код только уменьшает электрическую мощность подводимую к более нагруженному колесу, и не повышает мощность, подводимую к менее нагруженному, должно наблюдаться уменьшение скорости движения в повороте. Думаю этот эффект негативно скажется на "драйве" от вождения. Эффект "ввинчивания" в поворот будет недостигнут, хотя это вероятно более безопасно.

skros

Цитата: HECTEPOB от 15 Июль 2015 в 14:07
[user]skros[/user],

Простите, если что, но не удержался:

Как говорят в среде программеров: "Да вы батенька грязный извращенец"! Это я о:

L_tok = 0;
  R_tok = 0;
  for (i = 0; i < 20; i++) {
    L_tok = L_tok + analogRead(L_IS_pin);
    R_tok = R_tok + analogRead(R_IS_pin);
  }

  L_tok = round(L_tok / 20);
  R_tok = round(R_tok / 20);


Я конечно понимаю, что процы быстрые, но не до такой же степени! Цикл жрет время.
Для усреднения и отсутствия "дребезга" сигнала достаточно хранить 20 последних значений в массиве (это и есть "кольцевой буфер" или просто "кольцо") и на каждом шаге основного цикла добавлять по одному. Тогда необходимость в чтении (тем более двойном) аналогового сигнала в цикле отпадет, останется только суммирование, код будет более эффективен. Длину массива лучше выбирать кратную степени двойки (поскольку деление на длину массива будет на порядок быстрее, фактически деление заменяется побитовым сдвигом на число разрядов, равное показателю степени).

тут с вами не соглашусь,
вы пробовали делать вольтметр на ардуине (частный случай)?.....изучая этот вопрос, в частности о точности считывания с аналогового пина (это было надо для умного дома), так вот люли повышали точность измерения количеством считывания из пина (усреднение)........причем цикл был>100.....я здесь сначала тоже делал цикл=100, но потом подумал, что такой точности нафик здесь не надо........по скорости обработки - ее тут хватает предостаточно......двойное чтение а.пина как бы не правильно, это считывается ток с левого и правого драйвера

Добавлено 15 Июль 2015 в 20:13

Цитата: HECTEPOB от 15 Июль 2015 в 14:27
//итого по диффу
  L_down = constrain(L_down, 0, L_max_speed);
  R_down = constrain(R_down, 0, R_max_speed);
 
  if (diff_on) {
     L_pwm = L_pwm - L_down;
     R_pwm = R_pwm - R_down;
  }


Тут на мой взгляд кроется фундаментальное зло (на сколько я понял из беглого анализа, может протупил...)! Поскольку код только уменьшает электрическую мощность подводимую к более нагруженному колесу, и не повышает мощность, подводимую к менее нагруженному, должно наблюдаться уменьшение скорости движения в повороте. Думаю этот эффект негативно скажется на "драйве" от вождения. Эффект "ввинчивания" в поворот будет недостигнут, хотя это вероятно более безопасно.

да все верно я не увеличивал, подумал что не надо иначе в повороте машина будет ускоряться........считаете нужно увеличивать?

skros

#280
я испробовал в реале, но ребенок маленький и я поставил ограничение макс=6В.......попискивает периодически зуммер...........но нет возможности посмотреть 12В и поворот..........пока поправил некоторые коэффициенты

у вас нет возможности испытать мой пример в реале у себя?

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

skros

у меня акк агм 12В 20Ач, можно ли, временно по кнопке подрубать последовательно акк от упса 12В 7 или 9А/ч ?...........заряжать отдельно

для движков увеличивать напряжение до 16-18В...............тигра писал что они вроде могут и 24В выдерживать...........у меня движки 12В 13500 оборотов

HECTEPOB

Если нужно повысить точность, уж лучше гасить проц на время преобразования. С учетом наводок от моторов и прочих помех, точность будет все равно никакая. А она в данном случае и не нужна, нужно всего лишь убрать "дребезг", а эта задача кольцом решается отлично. Сколько элементов хранить в кольце (или как в Вашем случае, сколько проходов цикла делать) - это отдельный вопрос. Возьму на себя смелость утверждать, что по точности измерения будет абсолютно одно и то же, если длинна кольца будет совпадать с количеством проходов цикла. А вот быстродействие, т.е. реакция на изменение сигналов тока будет значительно быстрее. Нужна эта скорость или не нужна - вопрос сложный, но меня учили так: делай хорошо, херово само получится.

Еще одна рекомендация: разложите сразу весь код по функциям. Это в разы улучшит читаемость и что самое главное возможность сопровождения, поиска багов и развития кода.

В комментариях к каждой функции опишите, что делает функция, какие параметры принимает, какие глобальные переменные использует, какое значение возвращает и т.д. Забывается все очень быстро, даже через месяц другой будет трудно сходу вспомнить логику работы.

По поводу нужно или не нужно увеличивать: Я увеличиваю управляющее воздействие на один мотор на столько же, на сколько уменьшаю второй. Если предположить, что обороты мотора линейны к значению ШИМ, то линейная скорость в повороте меняться не должна. На практике видимого изменения не происходит.

HECTEPOB

[user]skros[/user],
Испытал бы, да вот только распиновка у нас с Вами разная, перепаивать надо кучу проводов, для меня это сложно. Я потратил вагон времени, чтобы собрать все по человечески, разложить и зафиксировать провода, прикрутить корпуса и т.д. Для меня это сложно, я ж не спец по электронике и по электрике.

skros

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

Добавлено 15 Июл 2015 в 20:33:09

Цитата: HECTEPOB от 15 Июль 2015 в 20:31
[user]skros[/user],
Испытал бы, да вот только распиновка у нас с Вами разная, перепаивать надо кучу проводов, для меня это сложно. Я потратил вагон времени, чтобы собрать все по человечески, разложить и зафиксировать провода, прикрутить корпуса и т.д. Для меня это сложно, я ж не спец по электронике и по электрике.

так пины в самом начале расписаны их легко поменять если знаешь свои.........ладно может тигра захочет свои драйверы всетаки прикрутить

HECTEPOB

[user]skros[/user],
Подрубать акк временно наверное можно, вопрос только зачем?

Сдается мне, если есть кнопка турбо, так ребенок ее постоянно будет жать, если ему скорости недостаточно. А если ему достаточно, то зачем она вообще.

Я решил, что для конструкции машины типа как моя (если конечно не делать отдельную тележку на раме как здесь: https://electrotransport.ru/index.php?topic=26020.0), скорость увеличивать не стоит. Когда ребенок захочет быстрее, тогда ему просто аппарат посерьезнее надо покупать (или делать самому).

HECTEPOB

[user]skros[/user],
Поменять наверное можно.... Что то я тупанул.

Могу попробовать, не обещаю только, что смогу это сделать быстро! Уезжаю в отпуск с 25-ого, делов невпроворот, а сын сам рулить пока не умеет, а РУ у Вас в проше нет.... И педаль у меня линейная....

Если подрубать акк, то надо контроль делать не только по току, но и по температуре движков. Я б наверное тогда уж на 24В переходил, как ув. Tygra предлагал.

HECTEPOB

[user]skros[/user],

"код мизерный" - это он сейчас мизерный, а со временем как начнет "пухнуть".... Аппетит же во время еды приходит...