1i7 (1i7) wrote,
1i7
1i7

Categories:

Летняя школа по основам мехатроники - промежуточные итоги

Промежуточные итоги по летней школе по основам мехатроники, которую мы провели и еще продолжаем проводить в Нижегородском Техническом Университете этим летом.

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

На занятиях собрались студенты и преподаватели факультетов ИРИТ (Институт радиоэлектроники и информационных технологий - группа Прикладная математика и информатика), АМИ (Автомобильный институт), ИПТМ (Институт промышленных технологий машиностроения), ФАЭ (Факультет автоматики и электромеханики) и ФЭМИ (Факультет экономики, менеджмента и инноваций).

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

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














1) Первое упражнение - знакомство с программированием контроллеров на примере платы ChipKIT Uno32 и среды MPIDE (платформа Arduino) - вывод.

1.1. Подключить к контроллерной плате макетную (песпаячную) плату и традиционно моргнуть светодиодом.



1.2. Аналогично подключить 7мисегментный диодный дисплей, написать для него драйвер на языке С/С++ и выполнить с его помощью несколько простых упражнений:
1.2.1. Отображение произвольной цифры (задается из кода)
  1. /*
  2.   7-segment display driver
  3.  */
  4. int segments[] = {8, 9, 10, 0, 1, 2, 3};
  5. void setup() {               
  6.   // initialize the digital pin as an output.
  7.   for(int i = 0; i < 6; i++) {
  8.      pinMode(segments[i], OUTPUT);
  9.   }
  10. }
  11. void display(int val, boolean modeAnode) {
  12.   boolean on;
  13.   if(modeAnode) {
  14.     on = LOW;
  15.   } else {
  16.     on = HIGH;
  17.   }
  18.   switch(val) {
  19.     case 0:
  20.         digitalWrite(segments[0], on);
  21.         digitalWrite(segments[1], on);
  22.         digitalWrite(segments[2], on);
  23.         digitalWrite(segments[3], on);
  24.         digitalWrite(segments[4], on);
  25.         digitalWrite(segments[5], on);
  26.         digitalWrite(segments[6], !on);
  27.         break;
  28.     case 1:
  29.         digitalWrite(segments[0], !on);
  30.         digitalWrite(segments[1], !on);
  31.         digitalWrite(segments[2], on);
  32.         digitalWrite(segments[3], on);
  33.         digitalWrite(segments[4], !on);
  34.         digitalWrite(segments[5], !on);
  35.         digitalWrite(segments[6], !on);
  36.         break;
  37.   }
  38. }
  39. void loop() {
  40.   // display '0'
  41.   display(0, true);
  42.   // wait for a second
  43.   delay(1000);
  44.   // display '1' 
  45.   display(1, true);
  46.   // wait for a second
  47.   delay(1000);
  48. }



1.2.2. Бегущий счетчик от 0 до 9 (или обратно).
1.2.3. "Калькулятор" - то же, что и 1.2.1, но вместно заготовленной цифры в коде задается произвольная формула, результат которой уместится в промежуток от 0 до 9ти (чтобы не выйти за разрядность дисплея) - смысл данного упражнения оказался не очень понятен прикладным математикам, но оно оказалось очень полезным для автомобилистов, для которых эта простая произвольная формула оказалась следующим шагом-щелчком в понимание того, что вместо этой формулы вообще говоря можно забить в программу произвольную более сложную логику, которая точно также легко и непринужденно будет выводить результат на вполне ощутимый 7мисегментный диодный дисплей или куда-то еще (готовая забитая в код цифра сама по себе такой щелчок еще не осуществила).



2) Второе упражнение - ввод.

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







3) Третее упражнение - знакомство с конечными автоматами на примере простой стейт-машины.



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

  1. /****************************/
  2. // Inner states
  3. const int STATE_RED = 0;
  4. const int STATE_YELLOW1 = 1;
  5. const int STATE_GREEN = 2;
  6. const int STATE_YELLOW2 = 3;
  7. int state;
  8. /****************************/
  9. // Display states
  10. const int DISPLAY_STATE_RED = 0;
  11. const int DISPLAY_STATE_YELLOW = 1;
  12. const int DISPLAY_STATE_GREEN = 2;
  13. /****************************/
  14. // Output constants
  15. int light_red = 10;
  16. int light_yellow = 11;
  17. int light_green = 12;
  18. /****************************/
  19. void setup() {
  20.   pinMode(light_red, OUTPUT);    
  21.   pinMode(light_yellow, OUTPUT);
  22.   pinMode(light_green, OUTPUT);
  23. }
  24. /**
  25.  * Detect next state depending on the current state and other info
  26.  */
  27. int getNextState(int current_state) {
  28.   int next_state;
  29.   switch(current_state) {
  30.     case STATE_RED:
  31.        next_state = STATE_YELLOW1;
  32.        break;
  33.     case STATE_YELLOW1:
  34.        next_state = STATE_GREEN;
  35.        break;
  36.     case STATE_GREEN:
  37.        next_state = STATE_YELLOW2;
  38.        break;
  39.     case STATE_YELLOW2:
  40.        next_state = STATE_RED;
  41.        break;
  42.     default:
  43.        next_state = current_state;    
  44.   }
  45.   return next_state;
  46. }
  47. /**
  48.  * Convert inner state to display state.
  49.  */
  50. int getDisplayState(int inner_state) {
  51.   int display_state;
  52.   switch(inner_state) {
  53.     case STATE_RED:
  54.        display_state = DISPLAY_STATE_RED;
  55.        break;
  56.     case STATE_YELLOW1:
  57.     case STATE_YELLOW2:
  58.        display_state = DISPLAY_STATE_YELLOW;
  59.        break;
  60.     case STATE_GREEN:
  61.        display_state = DISPLAY_STATE_GREEN;
  62.        break;
  63.   }
  64.   return display_state;
  65. }
  66. /**
  67.  * Display state machine state with outer interfaces depending
  68.  * on it current state;
  69.  */
  70. void displayState(int display_state) {
  71.   // handle display state
  72.   switch(display_state) {
  73.     case DISPLAY_STATE_RED:
  74.        digitalWrite(light_red, HIGH);
  75.        digitalWrite(light_yellow, LOW);
  76.        digitalWrite(light_green, LOW);
  77.        
  78.        delay(3000);              // wait for 3 seconds
  79.        break;
  80.     case DISPLAY_STATE_YELLOW:
  81.        digitalWrite(light_red, LOW);
  82.        digitalWrite(light_yellow, HIGH);
  83.        digitalWrite(light_green, LOW);
  84.        
  85.        delay(1000);              // wait for 1 second
  86.        break;
  87.     case DISPLAY_STATE_GREEN:
  88.        digitalWrite(light_red, HIGH);
  89.        digitalWrite(light_yellow, LOW);
  90.        digitalWrite(light_green, LOW);
  91.        
  92.        delay(3000);              // wait for 3 seconds
  93.        break;
  94.   }
  95. }
  96. void loop() {
  97.   // detect next state
  98.   state = getNextState(state);
  99.   // detect display state
  100.   int display_state = getDisplayState(state);
  101.   // show system with outer interfaces
  102.   displayState(display_state);
  103. }
3.2. Оживили Робота Черепаху (которая ранее работала на ПЛИС) при помощи обычного контроллера.





В общем на этом вводная часть и заканчивается - изучать платформу Arduino глубже (типа расширений ввода-вывода и прочих упрощенных интерфейсов программирования) далее не имеет смысла, т.к. для более тяжеловесных задач возможностей MPIDE с ее однодокументным интефейсом и API самой платформы все равно уже будет нехватать, а продвинутые инструменты разработки и интерфейсы программирования типа gnu make, gcc, gdb, MPLAB, RTOS и т.п. - это тема совершенно другого специального курса, который вполне подойдет например для прикладных математиков, но уже окажется совсем не по специальности для автомобилистов или некоторых машиностроителей. При этом полученных практических навыков уже вполне достаточно для того, чтобы заняться другими не менее интересными и более ощутимыми вещами типа управления простыми электрическими моторами, шаговыми двигателями, сервомоторами, работой с датчиками, а также, чтобы написать пробную логику управления простыми роботами, которые из этих моторов (и других запчастей, о которых отдельно) будут состоять.

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



4) Автомобилисты Денис Зезюлин и Владимир Макаров показали выборки из их обширных материалов о всевозможных колесных механизмах.











В качестве пробного быстрого проекта решили сделать самую простую версию платформы на колесиках, но с 4мя независимыми моторчиками на каждое колесо и специальным местом для установки платы ChipKIT Uno32 - это уже гораздо интереснее платформ, которые я доставал из 100рублевых корейских машинок, на которые были посажены Робот Таракан, Робот Скорпион и Робот Черепаха, т.к. возможность установки платы на платформу обеспечивает большую мобильность решения (останется только избавиться от USB-провода с питанием), а независимые приводы на каждом колесе позволят реализовывать широкий класс алгоритмов управления машинкой против вперед-назад с тем, что у нас уже было. Ну и самое главное, создав чертежи модели нужной нам платформы в CAD-системы, мы сможем клонировать ее в любом количестве при помощи 3д-принтера и фрезерных станков, а эта возможность имеет неоценимую важность для нашего учебного процесса.

5) Андрей Томилов из машиностроительного института и Вячеслав Балабанов (радиоэлектроника) присоединились к проекту Федора Чихалина RRaptor по созданию доступного домашнего 3d-принтера, на котором мы такие машинки сможем печатать. Андрей взял на себя создание корпуса принтера и управление шаговыми моторами, а Вячеслав - вопросы программного обеспечения.



5) Работа с простыми датчиками - т.к. они дают сигнал вкл/выкл, технически упражнение мало чем отличается от упражнения с кнопкой, но с датчиком интереснее.





6) Управление простым электрическим моторчиком при помощи драйвера L293D






7) Первое упражнение, который подготовил Андрей Томилов - управление простым шаговым двигателем, который он достал из дисковода.







8) Александр Рассадин, Станислав Яркин и Антон Нестеров с прикладной математики взялись за воспроизведение классических Робота Паука и Робота Манипулятора. Основной проблемой оказалось достать не просто подходящий, а вообще любой сервоматор с вменяемым сроком доставки. Для старта был выбран HXT900 - его отличает крайне привлекательная цена (100руб) и крайне долгий срок доставки (от одного месяца - посылка собирается и доставляется из Гонконга). С воспроизведением деталей.

Образцы для подражания (фотки пока не наши):







9) Антон Томилов спаял плату-драйвер для непростого шагового двигателя (для примера был взят ДШИ-200-1-3), печатная плата создана при помощи куска текстолита, распечатки дорожек схемы на лазерном принтере и утюга, запчасти куплены на радиорынке, в состав драйвера в том числе входит контроллер PIC16, который пришлось также научиться прошивать при помощи программатора PICkit 3.








10) Научились управлять скоростью вращения электрических моторчиков при помощи ШИМ. Предварительную теоретическую лекцию по ШИМ провел Александр Сергеевич Плехов - преподаватель факультета автоматики и электромеханики (управление системами электроснабжения, управление электроприводами, управление печами, управление электрообеспечением автономных объектов и т.п.).







Александру Сергеевичу очень понравился формат нашей школы - в первую очередь практический подход, когда мы с первого занятия раздали всем живые платы и сразу начали на них что-то делать, а потом сразу продолжили конкретными проектами. Он также изъявил желание организовать тестовую лабораторию на своем факультете, где бы в том числе использовались платы типа как наши ChipKIT Uno32 - у них есть куча интересных практических задач, которые было бы очень хорошо на них реализовать и запустить - например на одном из занятий мы написали на С реализацию какого-то интеграла с обратной связью, который является одним из важных механизмов в теории управления.

11) Управление 12ти вольтными электрическими моторчиками помощнее - ипользуется все тот же драйвер L293D, но питание мотора осуществляется от внешнего источника, а не от платы - получилось оживить машинку Яша Шарма из Тех-Самарты, которую он недавно привез к нам из Индии.



12) В гости зашел Алексей Романов - преподаватель факультета материаловедения и высокотемпературных технологий (ФМВТ), расспросил, чем мы занимаемся и когда узнал, что мы в том числе занимаемся созданием 3d-принтера и планируем его использовать для печати разных запчастей, сразу отвел всех к себе на кафедру, где у них похожая штука уже стоит и используется для печати разных моделек для учебного процесса в том числе например для физиков-экологов.








14) Андрей Томилов нарисовал предварительные трехмерные модели запчастей для корпуса 3d-принтера - осталось материализовать их в физическое воплощение.







15) Сходили на экскурсию в соседний корпус на машиностроительный факультет в лабораторию к разным древним станкам для работы по металлу - явно внезапную для себя экскурсию провел Савельев Вадим Константинович.














Далее в посте Федора Чихалина.

Оригинал взят у chihalin_ted в Летняя школа прототипирования НГТУ



Уже совсем скоро начала августа, во всю идет сезон отпусков и каникул… а в НГТУ им.Р.Е. Алексеева студенты-энтузиасты во всю работают над проектами по робототехнике в «Летней школе прототипирования и робототехники и НГТУ».


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

По проекту «RRaptor-3D принтер нового поколения» тоже удалось хорошо продвинуться. На радиорынке для отработки алгоритма управления шаговыми  двигателями мы купили шаговик ДШИ-200-1-3 1989 года выпуска (семейство NEMO 23. по своим характеристикам нам подходящий). Мы сами сделали первый драйвер шагового двигателя по технологии «ЛУТ» , однако на деле оказалось что можно делать более крутые вещи с большей точностью, над чем мы сейчас и запарились. Уже совсем скоро начнем делать экструдер, проанализировав то, что лежит в свободной сети, мы решили взять модель QU-BD, немного ее доработав.

Кстати, в НГТУ оказывается уже как год в одной лаборатории по теплофизике ФМВТ стоит «домашний» (модернизация RepRap, как бы следующее поколения за ними) 3D принтер компании bitsfrombytes и в ту пятницу нам провели экскурсию к нему и мы в живую посмотрели на его устройство и на него в действий .

И на последок - студенты кафедры прикладной математики оживили платформу на колесиках Яши Шарма (TechSAMARTA).


Нам этом пока все, впереди еще много работы, о всех интересных моментах и результатах читайте уже совсем скоро)


Tags: mips, rraptor, techsamartha, Индия, датчики, летняя школа, машиностроение, производство, роботы, студенческий бизнес-инкубатор НГТУ
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments