Простой робот из китайских игрушек на базе CraftDuino


Думаю, в это замечательное весеннее время, многие задумывались о создании собственного робота (ведь проводится конкурс КиберВесна 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”»

  1. Привет!

    Подскажи, на ибээ фенольный танк можно купить? Загорелся прямо идеей)) Раньше не видел возможностей недорого собрать базу с колесами, а сейчас уже хочу-хочу))

    • На ebay не искал — тогда сама идея несколько теряется 🙂
      Лучше посмотреть в магазинах — причём не обязательно ведь именно такие — сейчас китайских игрушек любого качества и количества более чем хватает 🙂
      Успехов!

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение