Думаю, в это замечательное весеннее время, многие задумывались о создании собственного робота (ведь проводится конкурс КиберВесна 2014 😉 ).
Как же собрать чего-нибудь этакое ползающее и жужжащее?
Подойдём к вопросу крайне бюджетно и прогуляемся до ближайшего газетного киоска, в которых, кроме всего прочего, продаются всякие китайские игрушки.
Нам подойдут два самых ужасных колёсных танка по 150р. за штуку.
Идея их использования не нова и во всю обсуждалась на робофоруме в теме:
Они выделяли фенол! Или в помощь начинающему 🙂
Эти машинки ужасно дешёвые, вонючие и отвратительного качества, но они вполне годятся для изготовления простейшего робота 🙂
Как и советуется на робофоруме, эти игрушки лучше сразу разобрать и выкинуть корпус куда-нибудь подальше 🙂
В одном танке содержится один моторчик с редуктором, поэтому, из двух этих мотор-редукторов мы сможем собрать одного робота 🙂
Итак, разбираем игрушки, выкидываем корпус, удаляем пару лишних шестерёнок, которые не имеют отношения к колёсам, а отвечают за движение «ракеты с лампочкой» и оставляем их где-нибудь на балконе, чтобы они как следует проветрились.
Далее, для создания нашего простейшего робота нам потребуются:
Механика:
1. Пара китайских игрушечных танков
2. Шестигранные металлические стойки для печатных плат:
2.1. 4 латунных стойки M3 50мм
2.2. 6 латунных стойки M3 20мм
2.3. 11 латунных стоек M3 10мм
4. 7 гаек M3 для стоек
5. 7 болтиков M3 для стоек
6. немного оргстекла/стеклотекстолита или другого листового материала (я использовал вспененный ПВХ)
Электроника:
1. CraftDuino — 1 шт.
2. L-Motor Shield — 1 шт.
3. Servo SG-90 — 1 шт. (опционально)
4. Ультразвуковой дальномер HC-SR04 — 1 шт.
5. монтажный провод
6. элементы питания (батарейки или аккумулятор)
7. Батарейки или аккумуляторы для питания.
Инструменты:
* паяльник (+ моток припоя и ваш любимый флюс (например, канифоль)),
* развёрка (или дрель),
* отвёртка (крестовая и плоская),
* маленькая крестовая отвёртка (для закручивания болтиков в стойки).
Начинаем 🙂
При помощи пары болтов и гаек М3, соединяем два корпуса игрушек в один (разумеется, можно и склеить 😉
Вырезаем пару пластин из заготовленного листового материала (как я уже говорил — я использовал вспененный ПВХ).
У меня размеры пластины получились где-то 90 х 95.
Ради интереса, я даже попробовал напечатать такую пластину на 3D-принтере.
Код для OpenSCAD и результат:
// плашка для китайского танкобота module plate() { width= 90 ; length = 95 ; height = 3 ; difference() { // пластина translate([0,0,0]) { cube([length, width, height]); } // крепёжные отверстия translate([5,15,0]) { cylinder(h=5, r=1.75, $fs=0.1); } translate([6,74,0]) { cylinder(h=5, r=1.75, $fs=0.1); } translate([88,14,0]) { cylinder(h=5, r=1.75, $fs=0.1); } translate([88,74,0]) { cylinder(h=5, r=1.75, $fs=0.1); } } } plate();
— не самый лучший вариант, но вполне рабочий, хотя для подобных задач лучше всё же подойдёт лазерная резка 😉
Вворачиваем стойки на которые прикручиваем первую пластину, к которой так же на стойки прикручивает CraftDuino с установленным L-Motor Shield-ом.
Вворачиваем 50-мм стойки, к которым прикручиваем вторую пластину, на которой двумя стойками крепим сервомашинку SG-90 (опционально).
К качалке сервомашинки, прикрепляем ультразвуковой дальномер HC-SR04.
Это можно сделать при помощи того же вспененного ПВХ или, опять же, напечатать на 3D-принтере.
Я использовал вот эту модель:
Servo Mount for Ultrasonic Sensor (Single)
Подключаем моторчики и сервомашинку к L-Motor Shield-у, а HC-SR04 к CraftDuino (Trig — 12, Echo — 13).
И всё, платформа готова!
Для тестирования можно написать код, в котором робот просто катается туда-обратно (а в промежутке — вращает «головой»).
Для работы с L-Motor Shield-ом используем библиотеку RoboCraft-LMotorShield,
а для работы с ультразвуковым дальномером HC-SR04 — библиотеку ultrasonic-HC-SR04.
/* * robot_lmotorshield v 0.1 * катаемся туда-обратно * * https://robocraft.ru */ #include <Servo.h> #include <LMotorShield.h> LMotorShield lms; int pos = 0; void setup() { lms.begin(LMS_MOTORS | LMS_SERVOS); lms.servoWrite(1, 90); // looking forward } void loop() { lms.motorSpeed(1, 50); lms.motorDirection(1, LMS_FORWARD); lms.motorSpeed(2, 50); lms.motorDirection(2, LMS_FORWARD); lms.motorRun(1); lms.motorRun(2); delay(2000); lms.multipleMotorStop(LMS_MOTORS); for(pos=90; pos > 1; pos--) { lms.servoWrite(1, pos); delay(15); } for(pos=0; pos < 180; pos++) { lms.servoWrite(1, pos); delay(15); } for(pos=180; pos > 90; pos--) { lms.servoWrite(1, pos); delay(15); } delay(1000); lms.motorBackward(1); lms.motorBackward(2); lms.motorRun(1); lms.motorRun(2); delay(2000); }
Супер! Он катается 🙂
Напишем прошивку для избегания препятствий и случайного блуждания:
/* * robot_lmotorshield_usonic v 0.2 * отъезд и разворот от препятствий * * https://robocraft.ru */ // отладка #define MY_DEBUG 1 // положение сервы чтобы смотреть вперёд #define SERVO_FORWARD_POS 90 // число отсчётов дистанции #define DIST_NUMBER 5 // порог срабатывания датчика #define SENSOR_THRESHOLD 20 #include <Servo.h> #include <LMotorShield.h> #include <Ultrasonic.h> // sensor connected to: // Trig - 12, Echo - 13 Ultrasonic ultrasonic(12, 13); // типа класс робота struct RCLMbot { // у робота есть L-MotorShield LMotorShield lms; int speed; // калибровка int pos; // настройка void setup() { pos = SERVO_FORWARD_POS; lms.begin(LMS_MOTORS | LMS_SERVOS); lms.servoWrite(1, pos); // looking forward } void stop() { lms.multipleMotorStop(LMS_MOTORS); } void forward(int speed) { lms.motorSpeed(1, speed); lms.motorDirection(1, LMS_FORWARD); lms.motorSpeed(2, speed); lms.motorDirection(2, LMS_FORWARD); lms.motorRun(1); lms.motorRun(2); } void back(int speed) { lms.motorSpeed(1, speed); lms.motorDirection(1, LMS_BACKWARD); lms.motorSpeed(2, speed); lms.motorDirection(2, LMS_BACKWARD); //lms.motorBackward(1); //lms.motorBackward(2); lms.motorRun(1); lms.motorRun(2); } void left(int speed) { lms.motorSpeed(1, speed); lms.motorDirection(1, LMS_BACKWARD); lms.motorSpeed(2, speed); lms.motorDirection(2, LMS_FORWARD); lms.motorRun(1); lms.motorRun(2); } void right(int speed) { lms.motorSpeed(2, speed); lms.motorDirection(2, LMS_BACKWARD); lms.motorSpeed(1, speed); lms.motorDirection(1, LMS_FORWARD); lms.motorRun(1); lms.motorRun(2); } void rotate(int speed) { lms.motorSpeed(1, speed); lms.motorDirection(1, LMS_FORWARD); lms.motorSpeed(2, speed); lms.motorDirection(2, LMS_BACKWARD); lms.motorRun(1); lms.motorRun(2); } float update_sensor() { float dist_average = 0; for(int i=0; i200 && !rightflag) { leftflag=true; robot.left(robot.speed); #if MY_DEBUG Serial.println("left"); #endif } else { rightflag=true; robot.right(robot.speed); #if MY_DEBUG Serial.println("right"); #endif } } else { leftflag = false; rightflag = false; robot.forward( robot.speed/2 ); #if MY_DEBUG Serial.println("forward"); #endif } delay(100); }
Работает!
Вот мы и собрали простенького робота.
Программировать роботов — одно удовольствие; а этого танко-бота осталось научить смотреть по сторонам, но это уже в следующий раз 😉
Полистайте тему робофорума про фенольных ботов и посмотрите каких «красавцев» делают другие:
продолжение следует…
Ссылки
Они выделяли фенол! Или в помощь начинающему 🙂
L-Motor Shield
Ультразвуковой датчик измерения расстояния HC-SR04
OpenSCAD
Модель крепления на сервомашинку (для печати на 3D-принтере)
Библиотеки
RoboCraft-LMotorShield,
ultrasonic-HC-SR04
0 комментариев на «“Простой робот из китайских игрушек на базе CraftDuino”»
Привет!
Подскажи, на ибээ фенольный танк можно купить? Загорелся прямо идеей)) Раньше не видел возможностей недорого собрать базу с колесами, а сейчас уже хочу-хочу))
На ebay не искал — тогда сама идея несколько теряется 🙂
Лучше посмотреть в магазинах — причём не обязательно ведь именно такие — сейчас китайских игрушек любого качества и количества более чем хватает 🙂
Успехов!