CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Простой робот из китайских игрушек на базе 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
 * катаемся туда-обратно
 *
 * http://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
 * отъезд и разворот от препятствий
 *
 * http://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<DIST_NUMBER; i++) {
      float dist_cm = ultrasonic.Ranging(CM); 	// get distance
      dist_average += dist_cm;
#if MY_DEBUG  
      Serial.print(dist_cm);
      Serial.print(" : ");
#endif
      delay(10);
    }
    dist_average /= (float)DIST_NUMBER;
#if MY_DEBUG      
    Serial.println(dist_average);
#endif
    return dist_average;
  }

};

RCLMbot robot; // наш робот

int randnum = 0;
bool leftflag = false;
bool rightflag = false;

void setup()
{
#if MY_DEBUG
  Serial.begin(9600);
#endif  

  robot.setup();
  robot.speed = 90;

  // инициализация ГПСЧ
  randomSeed(analogRead(0));
}

void loop()
{
  float dist_cm = robot.update_sensor();
  if( dist_cm < SENSOR_THRESHOLD)
  {
    robot.stop();
    // отъедем назад
    robot.back( robot.speed );
    delay(1000);

    randnum = random(400);
    if(randnum > 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
  • 11 апреля 2014, 16:10
  • noonv

Комментарии (2)

RSS свернуть / развернуть
+
0
Привет!

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

romanvl

  • 13 апреля 2014, 04:10
+
0
На ebay не искал — тогда сама идея несколько теряется :)
Лучше посмотреть в магазинах — причём не обязательно ведь именно такие — сейчас китайских игрушек любого качества и количества более чем хватает :)
Успехов!
avatar

noonv

  • 14 апреля 2014, 10:55

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.