Пишущая робо-рука на двух сервоприводах

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

  Никогда раньше не имел дело с микроконтроллерами, поэтому решил начать своё знакомство с Ардуино. Понадобились базовые знания С/C++ и немного электроники.

Цель: “При помощи Arduino Uno и двух сервоприводов (9g SG90 Mini Micro Servo) написать на листе бумаги любое словосочетание.”

 

 

 

 

 

 

 

 

Стояли такие задачи:

1) Установить среду разработки под Linux Fedora, получилось не сразу, но долго мучиться не пришлось. Был баг с поискам “Serial Port”, но гугл и терпение сделали свое дело.

2) Разобраться в том, что же такое за чудо сервопривод, в народе “серва”. Так как изначально у меня были сервы с вращением против часовой стрелки, весь код писался под них, но когда пришло время поменять их на новые “дешёвые” SG90, вдруг обнаружилось, что новые вращаются по часовой стрелке! Проблема решается просто: при помощи паяльника, меняются местами провода: на двигателе, и крайние (1ый и 3ий) провода на потенциометре.

3) Собрать техническую конструкцию “руки”, название “рука” звучит конечно громко, но главное чтобы отличалось от “плоттера”. Для этого:

  •  Обзавелся макетной платой и горсткой проводов из витой пары, на оба конца провода я припаял ножки от старых электронных компонентов, в моем случае я пожертвовал конденсаторами.
  • Выпилил из гетинакса, найденном на помойке радиозавода в 90-х, “плечо” и “предплечье”, их длина 80мм, а расстояние от крепления к серве до другого крепления и стержня 50мм.
  • Для выведения каракуль сначала использовал стержень от гелевой ручки, но за тонкой линией сложно было скрыть мелкие подёргивания серв, остановился на варианте с фломастером.
  • Закрепил первую “серву” в металлической банке. Всё, конструкция готова, но к сожалению без программной начинки она только немного вздрагивает при подаче питания на Ардуину.

4) Программирование:

  1. Как полагается, на бумажке, я вывел две небольшие формулы определения углов поворота для “серв” по заданной координате (X,Y). Точкой отсчета (0;0) - служит крепление плеча к первому сервоприводу. 
  2. После череды экспериментов, я понял, что до конца моей задумки еще далеко, а сервоприводы, с каждым моим багом, всё страдали и страдали от бестолковых значений переменных. Поэтому было принято решение писать сначала визуализированную модель в graphics.h старого доброго BorlandC. Кому интересно, что я там свизуализировал, пишите лично.
  3. Теперь, уже не опасаясь за сохранность имущества я продолжал писать код. С помощью миллиметровой бумаги откалибровал систему определения координат и перешел к рисованию прямых линий, так как задумывалось именно линиями создавать шрифт для букв. Выглядит это так:
     //Процедура для проведения линии из точки (x,y) в точку (x1,y1)
    void ServoLine::PrintLine(double x, double y, double x1, double y1 , int A, int C){   
            int i=0;
            int r1=50,r2=50;
            double a,b;
            a=(x1-x)/(A);
            b=(y1-y)/(A);
     
            while(i<=A){
                x=x+a;
                y=y+b;
                i++;
                servo1.attach(10); // Servo1 присоединен к 10 выводу
                servo2.attach(9);  // Servo2 присоединен к 9 выводу
                
                servo2.writeMicroseconds(FindBeta(x,y,r1,r2)*8.88889+700);
                servo1.writeMicroseconds(FindAlpha(x,y,r1,r2)*8.88889+700);
              delay(C);
            }    
        }
  4. Дальше я задался вопросом: ”Как бы оригинально разместить слова?”, придумал, что пользователем будет задаваться середина и угол наклона слова, что в итоге превратилось только в угол наклона. Вот и здорово, нечего лишними вводными данными мозг людям пудрить.
  5. Думал, как не изобретать велосипед и с помощью FreeType использовать метод вывода векторного текста на экран, но не хватило терпения разобраться в структуре библиотек шрифтов. В итоге написал собственную библиотеку Alphabet.h, которая создаёт шаблон из точек, а я уже по этим точкам строил прямые для каждой латинской буквы.
     
 // Печать буквы "А"
        void Alphabet::print_A (double X00, double Y00,int V,int S) {     
        // V - кол-во точек в 1 прямой
        // S - время ожидания между прорисовкой точек  
        ServoLine1.PrintLine(X00,Y00,X12,Y12,V,S );                            
        ServoLine1.PrintLine(X12,Y12,X24,Y24,V,S );
        ServoLine1.PrintLine(X24,Y24,X32,Y32,V,S );
        ServoLine1.PrintLine(X32,Y32,X12,Y12,V,S );
        ServoLine1.PrintLine(X12,Y12,X32,Y32,V,S );
        ServoLine1.PrintLine(X32,Y32,X40,Y40,V,S );
    }
Написав цикл по считыванию символов, столкнулся с задачей: “Как же мне не сравнивать каждый ASKII-код символа IF-ом, а сделать сразу, чтобы считанная буква воспринималась функцией?”. Тут я полез задавать вопросы на ГИК форумы, пока ожидал на них регистрации, на авось понадеялся и выложил свой вопрос на “Вопрос и ответ” от Google, не успело пройти 15мин, проблема была решена массивом указателей на функции.  
 void (Alphabet::*fArray[26])(double X00, double Y00,int V ,int S)=
  {
     &Alphabet::print_A, &Alphabet::print_B, &Alphabet::print_C,
     &Alphabet::print_D, &Alphabet::print_E, &Alphabet::print_F,
     &Alphabet::print_G, &Alphabet::print_H, &Alphabet::print_I, etc...
  };

Не буду описывать, как создавал библиотеки, об этом хорошо написано на сайте. Скажу одно, что создавал их не зря, так как код уменьшился с 600 строк до 60, а это визуально приятней! Правда, созданием библиотек я увеличил вес скетча на 2Кб, 6% - ощутимо!

Компиляция прошла успешно! Боялся за память на Arduino и не зря, несмотря на то что в Uno 32Kb, скетч размером больше 29 не пройдет, так как 3Kb заняты загрузчиком:

Binary sketch size: 29972 bytes (of a 32256 byte maximum)

Немного переписав букву ”R” через “P”, и “Q” через “O”, уменьшил вес и все заработало как надо!

Binary sketch size: 28468 bytes (of a 32256 byte maximum)

Исходники библиотек качать ОТСЮДА >> "Alphabet.h", "Alphabet.cpp", "ServoLine.h", "ServoLine.cpp" и сам скетч "robo_arm.pde"

 

***ВИДЕО***

 



5) Финансовые затраты небольшие, всё заказывал на ebay.com: “Arduino Uno”(~30$) + 2x “Micro Servo SG90”(~3$) Итого: 36$ + риски, мало ли “Почта России” не донесёт! Макетную плату мне одолжили, она кое-где идет в комплекте с Arduino. Плата освобождает от пайки, но и без неё легко можно обойтись.

6) Вывод: Получился интересный девайс, которым можно: удивить гостей, портить похабными надписями важные документы, пугать кота, подписывать документы (добавив предварительно свою подпись в библиотеку), рисовать. Я познакомился с Arduino, увидел много креативных идей, понял, что надо бы изучить Assembler. Если не потеряю интерес, то закажу Arduino Ethernet Shield и сделаю, чтобы “рука” писала Твиттер-имя человека приславшего мне Reply.

7) Если бы я начинал что-то подобное сейчас, чтобы сделал по-другому?
1) Не парился бы с графической моделью руки в graphics.h, а использовал бы “Google Sketchup + plugin SketchyPhysics“2) Для создания конструкции модели использовал бы “поликапролактон”.


Надеюсь, мой опыт окажется кому-то полезным, ведь это так здорово, когда своим трудом и идеями оживляешь "неоживляемое"! Удачи!

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

Видео и gif, выложить не удалось! Вот ссылка на YouTube! 

leshak
Offline
Зарегистрирован: 29.09.2011

Jensanf пишет:

новые “дешёвые” SG90, вдруг обнаружилось, что новые вращаются по часовой стрелке! Проблема решается просто: при помощи паяльника, меняются местами провода: на двигателе, и крайние (1ый и 3ий) провода на потенциометре.

А помоему можно еще проще

double ConvertServoAngle(double oldAngle){
  return 180-oldAngle;
}

Пропускаем через эту функцию то что возвращают FindAlpha/FindBeta и получаем угл для "зеркальной сервы".

P.S. Но это, конечно, совсем не делает меньше ценность проделанной вами работы. Трудно найти все "идеальные" решения. Самое главное что вы, все-таки, нашли "рабочие" решения.

leshak
Offline
Зарегистрирован: 29.09.2011

Jensanf пишет:

1) Не парился бы с графической моделью руки в graphics.h, а использовал бы “Google Sketchup + plugin SketchyPhysics“2)

Было-бы супер-здорово, если бы, в том же замечательно-подробном стиле, вы показали как их можно было использовать для вашей задачи. Все-таки это типичная задача для "самодельщиков" и каждый изобретает свой велосипед. А знаний/сил/желания далеко не у каждого хватит на  graphics.h

mat
mat аватар
Offline
Зарегистрирован: 05.07.2012

 Зачем Вы в ролики музыку добавляете ? Из- за неё мне не дают смотреть, мол, SONY не разрешает для Германии...

leshak
Offline
Зарегистрирован: 29.09.2011

mat пишет:

 Зачем Вы в ролики музыку добавляете ? Из- за неё мне не дают смотреть, мол, SONY не разрешает для Германии...

"— Обратитесь во Всемирную лигу сексуальных реформ, — сказал Бендер. — Может быть, там помогут".

Блин. Как же уже надоело это нытье. "Не так музыку включают, не так объяснили, не тот шилд дали, не тот пример показали, не.., не..., не...". Каждые два из трех ваших постов содержат жалобы что кто-то сделал не так как вам хотелось или не сделал, что по вашему мнению должен(?) был сделать.

Может пора взрослеть?

Ну разве проблема "SONY не разрешает" является непроходимой? Анонимайзеры, TOR, VPN, VPS и т.п. Нужно только захотеть и понять, что никто вам ваши проблемы решать не должен.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Где-то натыкался на "часы на ардуине". Настенные :) Там тоже "рука" на стене писала время, каждую минуту стирала старое и писала новое. Очень прикольно. Только шумно :) 

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

to @leshak А как же разобрать сервую, разогреть паяльник?! А так, да, идея полезная.

mat
mat аватар
Offline
Зарегистрирован: 05.07.2012

leshak, уймись.

leshak
Offline
Зарегистрирован: 29.09.2011

Jensanf пишет:

to @leshak А как же разобрать сервую, разогреть паяльник?! А так, да, идея полезная.

Просто я програмер, а не железячник. Поэтому что-то делать в железе мне приходит в последнюю очередь. Вот с энкодером уже две недели бъюсь. И знаю что можно просто поставить конденсатор, но нет.... мне програмно нужно :)

Но на самом деле, и ваш "грязнохак" может быть полезен. Например есть устройство, закрытое. И прошивку в нем поменять не можешь. А серва - сгорела. А под руками есть только "зеркальная". Вот тут уж ваше решение будет манной небесной.

P.S. Я вообще первый раз задумался о том что бывают сервы разного направления :)

leshak
Offline
Зарегистрирован: 29.09.2011

mat пишет:

leshak, уймись.

Чесно слово. Без вас было-бы скучно. Спасибо :)  Опять _кто-то_  другой должен что-то сделать/осознать ;)

Хорошо, "унимаюсь", буду продолжать молча хихать в кустах. И так сколько недель держался. Молча наблюдал.

Ну не выдержал, простите. Был не прав. Продолжайте в том же духе. 

"Тебя я понял, умолкаю, не то по шее получу и подвиг свой не совершу."

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

leshak пишет:

...

"Тебя я понял, умолкаю, не то по шее получу и подвиг свой не совершу."

   _
 __| |
(__) |
(__) |
(__) |
(__)_|

 

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

AlexFisher пишет:

Где-то натыкался на "часы на ардуине". Настенные :) Там тоже "рука" на стене писала время, каждую минуту стирала старое и писала новое. Очень прикольно. Только шумно :) 


Видел этот проект на ютубе, мне тоже понравилось! Вообще из всего увиденного больше порадовали шахматы по сети. 

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

leshak пишет:

P.S. Я вообще первый раз задумался о том что бывают сервы разного направления :)

Сам не ожидал! Казалось бы, пусть все по часовой стрелке крутят, и царил бы мир во всем мире!

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

К Вашей робо-руке нужно еще 2 сервы: поднимать карандаш над бумагой и хватать карандаш из подставки - тогда можно цветные картинки рисовать :)

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

 Полноценный манипулятор! =) Буди потихонечку её модифицировать, сначала научу карандаш поднимать)

 

alice.minkina
Offline
Зарегистрирован: 30.11.2012

Jensanf,не подскажешь,а код у тебя в библиотаках правильный,потому что у меня Arduino пишет ошибку в алфалите?

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

Могут быть некоторые несовместимости в кодировки,так как код под Windows, пришлось редактировать! Если очень надо, могу откомпилировать и прислать рабочий код!

alice.minkina
Offline
Зарегистрирован: 30.11.2012

безумно нужно,пришли пожалуйста,если не сложно.

а если у меня Мас то на нем пойдет код?

Jensanf
Jensanf аватар
Offline
Зарегистрирован: 05.09.2012

Раз безумно, вот моя почта jensanf@gmail.com, пришли мне ошибку, будем разбираться!