Статьи » Разработки |
2021-09-14 в 22:48 (последнее изменение 2024-03-08 в 21:36)
Хочу поделиться одним из проектов. Он должен был стать коммерческим. Однако, тут возможно я переоценил свои знания в программировании. По итогу, сразу в начале обозначу что речь пойдет про создание электронного блока управления для мини-экскаватора, который не заработал. Разработка заняла 4 месяца. Это тестирование, изучение, написание кода, разработка платы, разработка схемотехники, постоянные тесты версий кода на самом экскаваторе. Но вот и прошло 4 месяца, и совместно с заказчиком было решено остановить разработку. Я и вышел из проекта. Не без убытков. Но об этом не здесь) Но теперь у меня присутствует большое желание поделиться наработками, ведь я уверен в том что они смогут кому-нибудь оказать огромную помощь в проектах данной сферы. Поступил заказ. Нужно было сделать для мини экскаватора Mitsubishi MM55SR новый электронный блок управления гидравликой. Это стрела, ковш, кабина и отвал. Родной блок управления окончательно вышел из строя и ремонту не подлежал. Компьютер выдавал огромное количество ошибок и с ними стрела с места не сдвигалась. Для начала я выяснил вообще принцип работы экскаватора. Все было довольно не сложно: Управление осуществляется с помощью двух джойстиков и ножной педали с отклонение влево и вправо. Так как никаких электронных схем не было, я начал поиск на родной плате всех входов и выходов. Начал с джойстиков. Конкретно я искал пины, значения на которых меняются в зависимости от отклонения джойстиков. Я такие нашел, их было 4 точки на родной плате. Обозначил как pinX1, pinY1, pinX2, pinY2. Код
int X1 = analogRead(pinX1); // считываем положение джойстика 1
int Y1 = analogRead(pinY1); int X2 = analogRead(pinX2); // считываем положение джойстика 2 int Y2 = analogRead(pinY2); Когда двигал джойстики я заметил, что в них имеются концевики. Подумал я что неплохо бы и мне их учитывать для безопасности. Я их так же нашел на плате. 4 контакта на плате. Обозначил konc_X1, konc_Y1, konc_X2, konc_Y2. Код
boolean koncX1State = digitalRead(konc_X1); // считываем состояние концевика X1
boolean koncY1State = digitalRead(konc_Y1); // считываем состояние концевика Y1 boolean koncX2State = digitalRead(konc_X2); // считываем состояние концевика X2 boolean koncY2State = digitalRead(konc_Y2); // считываем состояние концевика Y2 Далее нашел контакты ножного выключателя. Это получились 2 пина btn_kov_p и btn_kov_l. В коде я называл ее педаль, и далее по тексту тоже будет педаль. Оставалось дело за малым. Найти пины управления клапанами. Тут я решил не замарачиваться, и просто подавать низкий сигнал (ноль) на разные места на плате. Через некоторое время, я нашел все пины которые мне нужны были. При соединении их с землей (тот же ноль), отклонялись в разные стороны разные элементы. Каждый из пинов управлял отклонением элемента в определенную сторону. Принял для этих пинов следующие обозначения: kov_p - ковш право (управление педалью) Первый алгоритм который пришел в голову следующий: Считываем значение джойстиков, переводим их в диапазон значений 255-0 при помощи функции map, и передаем ШИМ значение 255-0 в порт управления того элемента стрелы, в какую сторону переместился джойстик. Но только при условии, что на порту концевика будет 0. Тоесть концевик зажат, это значит что джойстик действительно перемещен. Это я делал для безопасности. Первая проблема с которой я столкнулся и о которой уже упоминал, это значения джойстиков относительно их положений. Чтобы правильно все мапилось (обрабатывалось и преобразовывалось функцией map), мне нужно считать и записать значения каждого из джойстиков в каждом направлении в самом крайнем положении и в положении после сразу же сработавшего концевика. Так как технике 20+ лет, значения далеко не идеальны. Крайние значения уже не 0 а 40-150, а начальные положения джойстиков в которых срабатывает концевик так же не 512, а 350-500. Код
if (X1 > 530 && koncX1State == LOW) { if (X1 < 510 && koncX1State == LOW) { С новыми данными пришлось отредактировать код, внести новые значения с который начинать обработку положений чтобы правильно задавать значения ШИМ сигнала в порт управления клапаном. После первых тестов я смог полноценно управлять элементами экскаватора. Но эти движения не были плавными. Получилось так, что только едва отклонишь джойстик, элемент сразу приходит резко в движение. Проблема была в том что не было плавности набора скорости перемещения. Должно быть как, едва джойстик отклонил, определенный элемент начинает медленно двигаться, и чем дальше отклоняешь джойстик, тем быстрее начинается двигаться элемент. Я был уверен что мне в этом поможет функция ШИМ управления клапанами, поэтому я и отправлял в порт управления именно ШИМ сигнал. При тестах я обратил внимание, что код отрабатывает отлично. Через монитор порта, я увидел что в порты управления клапанами действительно отправляются значения от 255 до 0. Но элемент двигался исключительно на полной скорости в диапазоне значений 25-0. И тут уже сделал вывод что я не верно определил способ управления гидравлическими клапанами. Как мне позже подсказали, что для открытия клапанов частота не используется, а на самом деле они дискретные. Примерный принцип работы клапанов. Чтобы экскаватор заработал правильно, нужно сделать все по другому. Клапаны в данной технике не пропорциональные, а дискретные с обратной связью. После нескольких затраченных часов с осциллографом, выяснил где находятся пины обратной связи. Их оказалось 4. И тут уже я сделал вывод о том, что мне нужно использовать два пина управления клапаном и один пин обратной связи этого же клапана. Обратная связь нужно чтобы понимать в каком положении находится клапан чтобы мы смогли его остановить в нужно положении. Выполним это, мы сможем зафиксировать его так что через себя он будет пропускать определенный объем гидравлики, как раз для медленных движений. В коде добавил новые переменные обратной связи, а так же уже изменил назначение функции map. С ее помощью я преобразовал диапазоны значений джойстиков в простые цифры 0-100. Как проценты. Где 0 это медленно, 100 это полная скорость. Если перефразировать, то когда оба клапана включены - нейтраль, один включен - идет перемещение, два включены - фиксация в нужном положении по датчику обратной связи. Возьмем для примера элемент стрелы - ковш. Он может двигаться вверх в вниз. Чтобы им управлять мы отклоняем первый джойстик вверх или вниз. Начали отклонять джойстик вверх. Это пусть будет 1%. В этот момент мы отправляем в порт движения ковша вверх, считываем обратную связь (ее я кстати тоже маплю от 0 до 100), и когда значения на обратной связи будет так же 1% я зафиксирую клапан в этом положении отправив в порт ковша вниз ноль. Тоже самое если отклонили джойстик дальше, но уже на 25%. Читаем обратную связь и понимаем что нет на ней 25%. Отправляем в порт ковш вниз 1, тем самым отпуская его и когда значение обратной связи будет 25%. Отправляем в порт ковш вниз 0. Алгоритм я проверил, он практически работал безупречно. Но лишь на одном элементе. Тут уже действительно не хватило у меня знаний для того чтобы оптимизировать код, сделать его более правильным и так чтобы ничего не мешало друг другу. И скажем так, что именно на этом моменте пришлось остановить работу над проектом. К этому моменту уже прошло 3 месяца с начала работы. Да и честно, я сам понимал что просто не смогу его доделать, задача оказалось для меня сложной. Но все же, я попробовал свои силы, определенно получил новые знания. А так же понимание, что одному тащить даже такой проект на самом деле тяжело. Схема на самом деле не сложная. Она лишь для того, чтобы в последующей облегчить подключение экскаватора к новому контроллеру. Контакты от родных нерабочих мозгов подключаются к Arduino 2560 через винтовые клеммы которые впаиваются в плату. Каждое место под вход или выход подписано. Такой способ подключение гораздо удобнее пайки. Предполагалось использовать Arduino Mega 2560 в уменьшенной версии платы, чем стандартная Mega. Если есть желающие продолжить проект, Имея файлы gerber, вы можете заказать производство этой платы, отправив их в сервис PCBWay, которые я прилагаю к этой статье. А уже после того как вы ее получите, можете производить тесты и делиться вашими итогами на нашем сайте. Разработка и копирование печатных плат
Посмотрите еще эти статьи
Управляем вытяжкой на кухне пультом от телевизора на Arduino Вывод картинки на дисплей 128x64 Детектор микронаушников Ethernet shield w5100 таймер включения на веб странице Вывод различных данных на дисплей LCD 128x64 Подключение датчиков газа и дыма серии MQ к Arduino Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте. Так же у нас есть Telegram канал. Вам понравился наш материал? Поделитесь с коллегами! Просмотров: 7227. Оценка статьи: 4.0 из 5. Уже оценило 4 читателя |
Всего комментариев: 0 | |