Skip to content

Conversation

@roversochi
Copy link

Алгоритм определения монетки переписан, ИМХО правильнее сравнивать значение датчика со всеми номиналами и находить минимальное отклонение - это и будет искомая монетка.
В этом случае исключаются ситуации, когда монетку опустили, но она не распозналась.

Для повышения точности каждая монетка была добавлена 2 раза в массив.
Пробовал добавить 3 раза, но при увеличении массива coin_value до 15, начинают происходить странные вещи с суммой. С этим надо бы разобраться для повышения точности.

Так, как у одного номинала монетки немного отличаются друг от друга, то вводим дополнительные значения в массив, по 3 значения
переписан алгоримт поиска монетки
Надо разбираться, почему при количестве монет 15 или больше, сумма криво считается.
Добавил константу memory_offset, которая смещает область хранения количества каждой монетки.
Это позволяет указывать количество монеток больше 10, а значит повышает точность измерений.
 Пока что установил в значение 40, но при необходимости можно генерить его динамически,  например memory_offset = coin_amount*2+5
@AlexGyver
Copy link
Owner

  1. я бы закидывал подряд 3 монетки каждого номинала, а не через период всех монеток
  2. "грязность" монетки не влияет на измерение, влияет аккуратность вброса и равномерность движения монетки по каналу датчика

@roversochi
Copy link
Author

Добрый день.

  1. Можно и по 3 монетки одного номинала. Тогда надо дополнительно информировать пользователя, что монетка успешно опозналась, например: 10рублей, 1 из 3. Или как-то так. В принципе ход логичный, но времени пока нет для реализации :)
  2. Грязность монетки влияет на измерение. Не сильно, но влияет. И в случае использования первого алгоритма, эта небольшая разница может повлиять на результат. Например вместо 2 рублей опознается 10. Убедился в этом, когда пытался заставить нормально работать первый алгоритм. В итоге добавил кучу статистики в serialPrint, построил аналитический график и прочее.
    Используя мой алгоритм "псевдо"обучения на разных монетках, проблемы ошибочных распознаваний нет.
    Аккуратность вброса не влияет, если приемный лоток сделать длиной от 10см, датчик поставить в конце лотка и сам лоток установить не под большим углом. К моменту, когда монетка докатится до датчика, все ее колебания и прыжки "устаканятся", останется равномерное прямолинейное движение.

@AlexGyver
Copy link
Owner

  1. Да, именно так и надо сделать (P.S. У меня со временем вообще бедаааа... Но в новой версии копилки так и сделаю).
  2. Не разбирался ещё, новый алгоритм задаёт "разброс" сигнала для каждой монетки? Грубо говоря минимум и максимум.
    P.S. Длинный канал это понятно, но очень некомпактно выйдет
  3. В новой версии думал отказаться от горизонтального вброса, сделать вертикальный и поставить 2 датчика. Пока не могу спрогнозировать, смогут ли два датчика определить размер случайно летящей монетки, или это слишком нелинейное дерьмо =(

@roversochi
Copy link
Author

  1. В моем алгоритме нет никаких минимумов и максимумов :) Есть абсолютное эталонное значение. И все монетки сравниваются с этими эталонными значениями. Тот эталон, который будет "ближе всех" к зафиксированному, считается истинным. Это одна из причин обучения по нескольким монеткам разной "загрязненности". В идеале вообще вынести эту проверку отдельной функцией, а значения хранить немного по другому, по пути организовать хранение суммы одним интом без всякий куч с количествами монет.
  2. Вертикальный вброс ИМХО существенно ухудшит точность, так как монетки будут проходить мимо датчиков на разных расстояниях от стенок в зависимости от настроения кидающего, фазы луны и прочего шаманства. Придется мудрить механизм центрирования/успокоения монетки. Думаю, что для уменьшения длины можно сделать лоток в 2 яруса по 5 см :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants