Думаю, в это замечательное весеннее время, многие задумывались о создании собственного робота (ведь проводится конкурс КиберВесна 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; i 200 && !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 не искал — тогда сама идея несколько теряется 🙂
Лучше посмотреть в магазинах — причём не обязательно ведь именно такие — сейчас китайских игрушек любого качества и количества более чем хватает 🙂
Успехов!