«Роборыба гниёт с Arduino»
В то время, когда на улице широкой поступью гуляет весна, а наш весенний конкурс КиберВесна 2014, наоборот, что-то притих — возникло желание сделать чего-нибудь эдакое. Чисто Just for Fun 🙂
Думать долго не пришлось и на свет появился проект биоинспирированнго робота, а именно — робо-рыба.
Идея простая — берём первый попавшийся контроллер Arduino Nano, маленькую сервомашинку типа SG-90 и загружаем тестовый скетч библиотеки Servo — Sweep.
Удивительным образом — сервомашинка машет качалкой из стороны в сторону.
Собственно, это и стало основой из которой за 3 дня, при помощи технологии 3D-печати и «выросла» робо-рыба.
Взяв в руки OpenSCAD, я, первым делом, начертил держатель сервомашинки:
Распечатываем и любуемся:
Теперь, переходим к самому интересному — хвосту нашего робота-рыбы.
К этому важному делу я подошёл обстоятельно 🙂 Залез в поиск яндекса по картинкам и стал вбивать все названия рыб, которые приходили в голову.
Поначалу, мне очень понравился хвост тунца:
Такие хищные обводы хвоста никого бы не оставили равнодушным 🙂
Загрузив хвост в Gimp и выполнив пороговое преобразование, я получил прекрасный шаблон хвоста:
Далее, нагуглилась технология, позволяющая загружать шаблон в OpenSCAD:
подробнее можно почитать здесь: OpenSCAD Tip: Scan into SCAD
Суть простая: сначала картинку нужно импортировать в Inkscape, там векторизовать, далее упростить, потом привести кривые к последовательности прямых, а потом сохранить в *.dxf -файл, который можно загрузить в OpenSCAD командой:
linear_extrude(file = "tuna_tail_threshold.dxf", height = 2.5, center = false, convexity = 10, twist = 0);
Хвост получился так себе, поэтому я вспомнил про более привычную рыбу — обычного карася:
И быстренько освоив команду hull() начертил хвост самостоятельно:
Результат (сверху и снизу — хвосты тунца):
Теперь, чтобы прикрепить хвост к сервомашинке, нам нужна этакая качалка:
Печатаем:
Вклеиваем хвост в качалку, которую прикручиваем к родной качалке сервомашинки:
Остаётся нарисовать голову/туловище рыбы. У меня получилась вот такая лопата:
Долго печатаем и получаем:
А если накрыть крышкой:
Вот такой большой робот-карасик получился:
Как я уже говорил, программировать роботов — очень здорово и весело. Согласитесь, что программировать что-нибудь жужжащее и шевелящееся — это, как минимум, очень забавно 🙂
Вот, какой код у меня получился для робота-рыбы; он позвояет рыбе плыть прямо и периодически пытаться повернуть вправо или влево:
/* * fish_sweep v 0.2 * роборыба: плаваем прямо и переиодически пытаемся поворачивать * * https://robocraft.ru */ // отладка #define MY_DEBUG 1 // задерка по-умолчанию (определяет скорость) #define DEFAULT_DELAY 10 #include <Servo.h> // типа класс робота struct RoboFish { // у робота есть серва, которая машет хвостом Servo tail; // переменная для хранения положения сервомашинки int pos; // положения сервомашинки между которыми нужно "махать хвостом" int pos_0; int pos_1; int speed; void setup(int servo_pin) { pos = 0; speed = 100; pos_0 = 1; pos_1 = 180; tail.attach(servo_pin); } int set_speed(int _speed=0) { int res = DEFAULT_DELAY; if(_speed > 0) { res = 1000/_speed; } return res; } void swim(int _speed=0) { int del = set_speed(_speed); // переделываем пример Sweep for(pos = pos_0; pos < pos_1; pos++) { tail.write(pos); delay(del); } #if MY_DEBUG Serial.println("<"); #endif for(pos = pos_1; pos >= pos_0; pos--) { tail.write(pos); delay(del); } #if MY_DEBUG Serial.println(">"); #endif } void forward(int _speed=0) { #if MY_DEBUG Serial.println("forward"); #endif pos_0 = 45; pos_1 = 125; swim(_speed); } void left(int _speed=0) { #if MY_DEBUG Serial.println("left"); #endif pos_0 = 20; pos_1 = 60; swim(_speed); } void right(int _speed=0) { #if MY_DEBUG Serial.println("right"); #endif pos_0 = 120; pos_1 = 160; swim(_speed); } }; RoboFish robot; // наш робот int randnum = 0; bool leftflag = false; bool rightflag = false; void setup() { #if MY_DEBUG Serial.begin(9600); #endif robot.setup(9); robot.speed = 100; // инициализация ГПСЧ randomSeed(analogRead(0)); } void loop() { #if 0 // тестирование robot.left(50); delay(1000); robot.forward(100); delay(1000); robot.right(50); delay(1000); #endif #if 0 // плаваем только прямо (подбор оптимальных углов) robot.pos_0 = 55;//65 robot.pos_1 = 115;//105 robot.swim( robot.speed+40 ); #endif #if 1 // плаваем прямо и периодически пытаемся поворачивать randnum = random(400); if(randnum > 380) { randnum = random(400); if(randnum > 200 && !rightflag) { leftflag=true; robot.left(robot.speed); } else { rightflag=true; robot.right(robot.speed); } } else { leftflag = false; rightflag = false; //robot.forward( robot.speed ); robot.pos_0 = 70; robot.pos_1 = 100; robot.swim( robot.speed+100 ); } #endif }
Запрограммировав робота-рыбу, его нужно вывесить.
Как помним из школьного курса физики, на погруженное тело в жидкости действует сила Архимеда, которая вычисляется по формуле:
Fa = ro*g*V;
Запустим, например, SciLab и очень приблизительно прикинем силу, действующую на нашего робо-карасика:
Fa = 1000 * 9.8 * (90e-3 * 90e-3 * 28e-3) = 2.2 (H)
Чтобы получить массу в кг, силу нужно, соответственно, разделить на g (ускорение свободного падения), равное 9.8.
Получаем, что для того чтобы получить нейтральную плавучесть нам понадобится около 220 грамм груза.
Разумеется, из этой массы нужно вычесть массу самого робота (корпус+электроника+батарейка).
Но, всё равно, становится приблизительно понятно — сколько свинцовых грузиков придётся покупать в ближайшем рыболовном магазине 🙂
Следующей задачей является герметизация нашего робота.
Самым простым является дополнительная кожа, которую, например, можно соорудить из обычного целлофанового пакета.
Фото с испытаний робота-рыбы (она же рыба-пакет) в корыте:
Итак, за три дня, наша биоинспирированная робот-рыба научилась плавать 🙂
Получен опыт работы с OpenSCAD и возникла куча идей и мыслей, которые нужно будет учесть при постройке следующих биоинспирированных роботов.
Видео с испытаний:
продолжение следует…
Ссылки
Этот проект на Thingiverse
Скачать STL-файлы.
http://www.openscad.org
OpenSCAD User Manual/The OpenSCAD Language
OpenSCAD Tip: Scan into SCAD
http://www.scilab.org
По теме
Будущее за бионическими роботами?
Такие разные робо-рыбы
Роборыба на базе Arduino
Плавник для робота-рыбы
Робот-рыбка на топливных элементах
Робот-рыба
Обнаружен общий принцип движения плавников у рыб
Изучение движения рыб
0 комментариев на «“Робот-рыба с использованием 3D-печати и Arduino”»
Здорово, когда есть 3д принтер. А рыбка на первой картинке то поматерей будет)
Согласен с обоими тезисами 🙂
Ух ты! У робокрафта 3d принтер есть!?
Если возникнет необходимость можно у вас что-нибудь напечатать?
Судя по всему это UP! 3D Printer Mini? 😉
вы по качеству печати способны узнать модель?!?! ) Гениально )
Гы, нет, не по качеству печати 🙂
По коменту автора на хабре к статье про этот принтер что у него такой же 😉
именно 🙂
Так что, можно будет напечатать что-нибудь при необходимости?
За деньги, конечно же 🙂
Это принтер наших друзей изLAB409 . Если возникнет необходимость — приходите, договоримся 🙂
Понял. Спасибо.