Как стать автором
Обновить

Автосэмплер — жизнь после жизни

Время на прочтение7 мин
Количество просмотров8.5K
Жил он долго и счастливо… а потом сломался.

Пролог


Году, кажется в 2009 для одного проекта был куплен прибор-анализатор воды. Ввиду того, что предполагалось его использовать для обеспечения работы технологического оборудования, прибор был куплен в комплектации с автосэмплером.



Это по сути ЧПУ-манипулятор, имеющий четыре степени свободы перемещений для автоматической подачи образцов в анализатор.

Отработал он около 10 лет и подал более тридцати тысяч образцов с некоторыми незначительными неприятностями, которые, впрочем, преодолевались «малой кровью».

В начале сего года он устал — отказала ось Z, вертикального перемещения.

То есть манипулятор просто перестал «видеть» её. В виду ряда обстоятельств официального обслуживания у измерительного комплекса не было никогда и мелкие проблемы (ремонт БП, перепрошивка после сбоя FLASH) решались самостоятельно. Тут уже пришлось искать официалов, от которых выяснились… Некоторые особенности:

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

Некоторые особенности, которые мне были известны:

  • прошивка изготовителя с анализатором не работает (хорошо, что был сделан бэкап),
  • видимо изменен также загрузчик прошивки, так как заводская прошивка «как есть » не принимается
  • возможности «перепрошить» загрузчик нет, так что покупать электронику за 6 k$ бесполезно
  • механика в отличном состоянии, так как я ее периодически обслуживал
  • датчики нулей (Холла) живы

Таким образом получилось два варианта:

  • покупка нового у производителя анализатора за 17k$ и непонятный срок поставки
  • переделка всей электроники и написание программ

Часть первая, хардверная


Для начала я решил убедиться в работоспособности механики при напряжении питания 12в (против 37 в оригинале). Понизить решил из-за того, что силовые полумосты управления ШД приводов прилично грелись. Потому были вытащены из тумбочки драйвера А4988, CNC шильд и Arduino NANO. все это было состыковано, прошито известным проектом grbl и с пристрастием допрошено. Были получены максимальные частоты хода ШД для каждого привода, коэффициенты деления шага, отрегулированы токи драйверов.

Оказалось, что XY вообще не греются, причем выдают вполне подходящую скорость. Ток для привода Z — пришлось вкручивать на максимум, по причине деления на 8 и приличного потребления при начале движения вверх, так как оно тянет нехилую массу из двух ШД и требухи, при этом микросхема драйвера грелась градусов до 50 даже с радиатором. Пришлось в конечной конструкции добавлять кулер на вдув напротив этого привода.

В итоге вместо этого



получилось это



Про Arduino Pro Micro будет отдельная песнь. На заднем плане панель с тумблерами выбора режима работы, кнопками пуск и ресет.

Теперь про требуху. Как я говорил все датчики Холла выжили. Из них XY интересны только разной логикой срабатывания. Если у Y датчик открывает ОК при приближении к магниту, то у X магнит постоянно напротив датчика, а в Zero-X и далее между ними оказывается магнито-мягкая заслонка, экранирующая датчик от магнита, при этом он закрывает ОК. В свете подобной неоднороднсти возникает потребность в понимании, куда ехать при поиске нулей. Для этого в оригинальной конструкции предусмотрена позиция парковки при окончании работы. Однако реализована она была никак: при выключении питания приходилось ловить рукой голову на оси Z и вручную препровождать ее в паркинг-позишн.

Про Z главное повествование. Там, в корпусе Z еще живет привод плунжера шприца, без датчика нуля, но со сдвоенным датчиком вращения — практически энкодер. А еще там есть датчик нажатия на виалу с пробой, реализованный винтовой передачей и также датчиком Холла. Эти оба датчика вращения представляют собой латунные шестерни, проходящие зубьями мимо датчиков Холла с подмагничиванием.

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

Вместо этого



Стало это



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

Часть вторая, софтверная

Испытания на CNC шильде показали приличную скорость. НО! Если Вы попытаетесь предложить ШД сразу частоту STEP, соответствующую этой скорости, то кроме рычания на месте ничего не получите. Для выхода на приличные скорости перемещений ШД необходимо разгонять, равно как, если Вам дороги шестерни и рейки привода (ну или ШВП, или ремни) то и замедлять ПЛАВНО. Потому тривиальный код несколько разросся.

Поскольку приходить в раздел «Робототехника» со статьёй без кода почти неприлично, вот к примеру управление привода Z (для порицания). При выдаче частоты на STEP digitalWrite не успевает, приходится дергать портом напрямую. Задержки наверно можно было и delay, но код пришел из управления по XY, а там нужна одновременность.

//***************** ПЕРЕМЕЩЕНИЕ Z *************************
void movement_z (unsigned int  tz, int spd) {
long interval_z;
long spd_z  = 2000;
unsigned long cur_micros;
unsigned long prev_micros_z =0;
int half_z;
byte full_mask = mask_z;

int dz = tz - z;  
z=z+dz; 
if (dz <0) digitalWrite(pin_dir_z, HIGH); else digitalWrite(pin_dir_z, LOW);
dz = abs(dz);

half_z = int(dz/2);
interval_z = spd;

do {
if (dz>0){
cur_micros = micros();
if(cur_micros - prev_micros_z > spd_z) {
  if ( dz>half_z ) 
      {if (spd_z > interval_z) {spd_z = spd_z - 5;} else  spd_z = interval_z;}
  if ( dz<300 ) 
      {if (spd_z < 1000) spd_z = spd_z + 2; else  spd_z = 3000;}

  prev_micros_z = cur_micros; 
  if (dz>0) {PORTB =  PORTB | mask_z; dz--;}
}}
   delayMicroseconds(5);
    PORTB =  PORTB & B11110000;
   } while( dz != 0);
}
//*************************************************************

В наборе функции уровней:

  • низкого — поехать туда-сюда, найти то-не-знаю-что
  • среднего — откалиброваться в нули, набрать шприц, сделать закол образца
  • высокого — циклограмма обхода n-го количества виал на палетте

Программа начинается инициализацией портов, чтением заданной конфигурации с переключателей на задней панели и, после нажатия ПУСК отработка циклограммы, пока не встретится позиция на палетте, в которой нет виалы с образцом.

Главная циклограмма выглядит так:

inline void frame_1(){
for (unsigned int i=0; i<6; i++){                                                                        // 6
for (unsigned int j=0; j<9; j++){                                                                        // 9

for (unsigned int k=1; k < probe+1; k++){
for (unsigned int l=1; l < inj+1;   l++){
   sound1();
   delay(1000);
   if (inj == 2) {tone(tone_p,5000);delay(200);noTone(tone_p);delay(200);tone(tone_p,5000);delay(200);noTone(tone_p);}    
   if (inj == 1) {tone(tone_p,5000);delay(200);noTone(tone_p);}

Serial.print("going to x = ");Serial.print(j+1);Serial.print(" y = ");Serial.print(i+1); Serial.print(" probe = ");Serial.print(k); Serial.print(" inj = ");Serial.println(l);
   show_xyzp();  
   movement_z (0,450);
   movement_xy (prime_x-j*272, prime_y+i*372,500);
   movement_z(1800,300); 
   if (z>2500) ost();
   fill();
  while(sensor());
   if (inj == 1) {click_mouse();
                  Serial.println("mouse CLICKED for FLUSH and inj=1");}
   if (inj == 2  && l==1) {click_mouse();
                  Serial.println("mouse CLICKED for FLUSH and inj=2");}
 
   septa_pos();
   while(sensor());   
   sound2();
   inject();
   }
   delay(3000);
   click_mouse();
   Serial.println("mouse CLICKED for INJECT");
   find_zero_xy();
    movement_xy (3257, 1247,500);
    movement_z (6000,100);    
    movement_z (0,100);      
   
}
}
}
}

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



Главная проблема составления программы заключалась в том, что в оригинале анализатор выдаёт автосэмплеру куда ехать и что делать. Все это происходит по COM-порту и по протоколу, который взять неоткуда. Потому пришлось выкручиваться.

У анализатора есть ручной режим для тех кто не купил белку автосэмплер. При этом на экране анализатора возникает темная кнопка «sample ready» и, когда сделан закол оператор, должен ткнуть в неё мышью (трекером на панели анализатора). Когда измерение завершено возникает темная кнопка «start flushing» и, если у оператора есть еще один образец, он нажимает ее мышью, для подготовки анализатора к следующему измерению. После клика мышкой кнопка пропадает и остается белое (яркое) поле. Я решил эту разницу в яркости поймать фотосенсором. Возникновение темной кнопки я проверяю фоторезистором, вклеенным в присоску. Не нашёл черной присоски и, когда солнце в окно, датчик кнопки приходится прикрывать чем-то.



Но ведь надо и кликать чем-то? К счастью у анализатора оказался порт USB и достаточно необрезанный RedHat розлива начала 2000, чтобы цеплять воткнутое в этот порт автоматически. Именно для эмуляции мыши на новой главной плате автосэмплера стоит Arduino Pro Micro. она получает PINок от NANO в момент, когда анализатор необходимо кликнуть. Писать перемещение было лень, потому перед началом работы мышь надо выставить на кнопку заранее.

О СЧАСТИЕ, что отягощенный опытом, я развязал мышиную часть от прочей управленческой гальванически, копеечным оптроном. ИБО к концу второго дня отладки на натуре, когда всё уже совсем работало и я настраивал биппер для подачи звуков, похожих на оригинальные, один из драйверов выпустил волшебный дым и соединил 12в силовой части с 5в логической. Ну ничего, половина дня замены на извлечённое из бездонной тумбочки это не ремонт анализатора за 100к$. Правда потом оказалось, что купленный взамен забытого дома новый БП REXANT в какой-то момент стал выдавать вместо 12в почти 50, что и вызвало досадную задержку.

Часть третья, калибровка и проверка на надёжность

После сборки и первичной отладки возникла проблема отсчетов позиций по реальному расположению виал. Пришлось делать клавиатуру и писать к ней простенький интерфейс в сериале. Портов не осталось совсем, но на самый крайний случай были припасены пины, отвечающие за i2c. На них бы л повешен народный расширитель PCF8574 с подтянутыми к плюсу микро-кнопками, которыми можно двигать XY, выбирать умножитель шага для ускорения процесса и менять XY на ZP. После каждого нажатия в сериал выводится новая позиция. Благодаря такому нехитрому приёму удалось быстро и точно получить все актуальные координаты и приращения. Вне процедуры калибровки на входы расширителя заведены тумблеры выбора режимов и кнопка запуска циклограммы. На видео, примерно в середине, видны и кнопки и тумблеры.

Шприцы для подачи образца не дешевы — 100$ за штуку. Ошибка в позиционировании стоит согнутой иглы и бесповоротно запоротого шприца. Посему был вставлен битый шприц со вклеенной швейной иглой и аппарат в течение почти пол-суток молотил по четырем точкам на листе бумаги с целью выявить предполагаемые сбои позиционирования. Но их не оказалось, я даже удивился. Однако, поскольку между заколом образца и набором нового есть достаточно времени, я его использовал для поиска нулей, так, на всякий случай. На видео этот момент виден ближе к концу ролика.

Эпилог


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

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

PostScriptum


По просьбе интересующихся — видео.
Теги:
Хабы:
+36
Комментарии16

Публикации

Изменить настройки темы

Истории

Ближайшие события