Повышение эффективности применения неадаптивных роботов на основе вероятностно-статистического моделирования процессов сборки и сварки маложёстких пространственных конструкций

Данная статья интересна именно с точки зрения программирования и управления по Bluetooth. Вопросы по сборке подробно освещены в предыдущей статье.

Первое, что необходимо сделать, это дополнить робота модулем HC-06 для общения по Bluetooth. Предварительно потребуется выполнить настройку HC-06. Можно использовать модуль HC-05, но он дороже, а его функционал окажется избыточным для данной задачи.

Следующий шаг – установить на телефон бесплатную программу Bluetooth RC Controller. Программа имитирует основные органы управления пульта и отправляет команды по Bluetooth в текстовом виде.

Как видно, интерфейс программы интуитино понятен. Левый верхний угол – это индикатор соединения с модулем HC-06 (зелёный говорит о том, что соединение установлено). По центру располагается “компас”, который показывает выбранное направление движения, а по переферии располагаются органы управления. Было рашено задействовать абсолютно все для нашего автомобиля. Перечисляем слева направло.

  • Передние фары – у нас как раз уже есть голубой светодиод, который и назвался фарой!
  • Задние фонари – у нас для этого использовался встроенный светодиод
  • Гудок – зуммер тоже имеется!
  • Аварийка – у нас это будет составной светодиод, который сигнализировал о “панике”
  • Кнопка с шестерёнкой – это вызов меню настройки самого пульта
  • Бегунок изменения скоростей – о, вот тут пришлось слегка напрячься, чтобы дополнить код автомобиля
  • Ну а ниже кнопки Вперёд / Назад / Влево / Вправо – можно удерживать одновременно две.

В итоге, почти все кнопки пульта сразу получили прямое соответствие имеющимся командам в машинке. Но вот кусок кода регулировки скоростей пришлось дописывать и отлаживать отдельно. Ещё нетривиально получилось с диагональными направлениями. Они реализованы через разницу скоростей на левом и правом борту.

Программа для прошивки приведена ниже. Опрос сонара в моём варианте отключен, но его можно вернуть. Удивительно, но вариант с остановкой вблизи препятствия мне показался невыносимым при ручном управлении.

*

// 4WD RoboCar
// Sonar + Bluetooth
// 2018-January-20
// v.11a (bluetooth)
// (c) 2018, Vladimir E. DRACH

// Global variables:
int Critical = 14; // Критическое расстояние до препятствия в [см]
int BT_Step = 10; // Время движения при получении одного СИМВОЛА по BT [мс]
byte randomNumber; // Случайное число
byte Cost = 60; // Штраф (назначается за неспособность ехать вперёд)
byte Profit = 180; // Очки, т.е. “прибыль”, которая плавно растёт при движении вперёд
byte velocity = 220; // Скорость моторов [1..255]
// Подобрать экспериментально:
const byte SPEED_MIN = 100; // минимальная скорость моторов, если меньше – моторы не смогут вращаться
const byte SPEED_MAX = 250; // максимальная скорость моторов

// для управления по Bluetooth
char btCommand = ‘S’;
// счетчики для определения потери связи с Bluetooth
unsigned long btTimer0 = 2000; //Stores the time (in millis since execution started)
unsigned long btTimer1 = 0; //Stores the time when the last command was received from the phone

// Описываем подключение драйвера двигателей
// A – правый борт
// В – левый борт

int enableB = 3; //~
int pinB2 = 4; //
int pinB1 = 5; //
int enableA = 6; //~
int pinA1 = 7; //~
int pinA2 = 8; //

#define illumination A0 // подключаем составной светодиод

// Подключаем ультразвуковой датчик
#define trigPin 9
#define echoPin 10

#define light 11 // На этот вывод подключены фары

int Buzzer = 12;// Подключаем зуммер 12 (!)

// Фоторезистор подключен к АЦП
#define PHOTO_SENSOR A5

#define Sweep 8000 // скорость нарастания и убывания частоты
#define Woo_wait_sec 2 // сколько с. длится гудение на макс. частоте

void setup() {
// Определяем направление работы линий
pinMode (enableA, OUTPUT);
pinMode (pinA1, OUTPUT);
pinMode (pinA2, OUTPUT);
pinMode (enableB, OUTPUT);
pinMode (pinB1, OUTPUT);
pinMode (pinB2, OUTPUT);
pinMode (13 , OUTPUT);
pinMode (light , OUTPUT);
pinMode (trigPin, OUTPUT);
pinMode (echoPin, INPUT) ;
pinMode (illumination, OUTPUT);
enableMotors();
SayBeep();
delay(2000);
bii();
digitalWrite(13, LOW); // Выключаем встроенный диод
Serial.begin(9600); // Инициализация последовательного порта
}

// Описываем варианты работы моторов
void motorAforward() {
digitalWrite (pinA1, HIGH);
digitalWrite (pinA2, LOW);
}
void motorBforward() {
digitalWrite (pinB1, LOW);
digitalWrite (pinB2, HIGH);
}
void motorAbackward() {
digitalWrite (pinA1, LOW);
digitalWrite (pinA2, HIGH);
}
void motorBbackward() {
digitalWrite (pinB1, HIGH);
digitalWrite (pinB2, LOW);
}
void motorAstop() {
digitalWrite (pinA1, HIGH);
digitalWrite (pinA2, HIGH);
}
void motorBstop() {
digitalWrite (pinB1, HIGH);
digitalWrite (pinB2, HIGH);
}
void motorAon() {
digitalWrite (enableA, HIGH);
}
void motorBon() {
digitalWrite (enableB, HIGH);
}
void motorAoff() {
digitalWrite (enableA, LOW);
}
void motorBoff() {
digitalWrite (enableB, LOW);
}

// Описываем варианты движения машины
void goForward (int duration) {
motorAforward();
motorBforward();
delay (duration);
}
void goBackward (int duration) {
motorAbackward();
motorBbackward();
delay (duration);
}
void rotateRight (int duration) {
motorAbackward();
motorBforward();
delay (duration);
}
void rotateLeft (int duration) {
motorAforward();
motorBbackward();
delay (duration);
}
void FullStop (int duration) {
motorAstop();
motorBstop();
delay (duration);
}
void disableMotors() {
motorAoff();
motorBoff();
}
void enableMotors() {
motorAon();
motorBon();
// SetVelocity(SPEED_MAX, SPEED_MAX); не очень работает 🙁
}

void SetVelocity(int A, int B)
{ analogWrite (enableA, A);
analogWrite (enableB, B); }

void CheckLight () {
int val = analogRead(PHOTO_SENSOR);
if (val < 500) {
// Темновато, включаем фары
digitalWrite(light, HIGH);
} else {
// Светло, выключаем фары
digitalWrite(light, LOW);
}
}

// Пользуемся УЗ датчиком расстояния
int distance() {
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1; // Переводим в сантиметры
return distance;
}

// Функция запуска автомобиля
void launch() {
int distance_measured;
distance_measured = distance();
// Serial.print(distance_0);
// Serial.println(” сантиметров. “);
SetVelocity (velocity, velocity);
// Движемся вперёд, пока расстояние до преграды > критического [cm]
while (distance_measured > Critical)
{
CheckLight (); // проверяем, не пора ли зажигать фары?
goForward(30); // Едем вперёд некоторое время
randomNumber = random(1,100); // передёрнули затвор генератора ПСЧ
if (Profit < 254 ) { Profit++; };
// Serial.print(Profit);
// Serial.println(” очков. “);
distance_measured = distance();
}
FullStop(100); // Останов, т.к. впереди помеха
}

void Woo(int freq, long duration){ // первый параметр частота, чем ниже он тем выше частота, второй длительность
long time = duration/2/freq;
for(long t = 0; t < time; t++)
{ digitalWrite(Buzzer, HIGH);
delayMicroseconds(freq);
digitalWrite(Buzzer, LOW);
delayMicroseconds(freq); }
}

void Syren() {
for(int i = 0; i <= 1; i++){ // делаем виу-виу 2 раза
for(int f = 2000; f >= 100; f=f-40){ // нарастание частоты
Woo(f, Sweep); }
// Woo(400, Woo_wait_sec*100); // сколько длится гудение на максимальной частоте
for(int f = 100; f <= 2000; f=f+40){ // убывание частоты
Woo(f, Sweep); }
}
}

void panic() {
int distance_tmp;
int distance_new = 32000;
int angle = 600; // угол поворота, измеряем в [мс]
FullStop(100); // Сначала останавливаемся
Profit = 255; // Забываем про старые штрафы!
// Serial.print(Profit);
// Serial.println(” очков. “);
digitalWrite(illumination, HIGH); // включаем мигалку
Syren ();
Syren ();
Syren ();
delay(1000); // пауза, для отдыха
// Выполняем манёвры на высокой скорости (ведь паника!)
analogWrite (enableA, velocity);
analogWrite (enableB, velocity);
// 0) Начинаем крутиться волчком в какую-то сторону:
randomNumber = random(1,100);
if (randomNumber < 50) { motorAbackward(); motorBforward(); }
else { motorBbackward(); motorAforward(); };
// Истерично продолжаем крутиться, пока гудит сирена:
Syren ();
delay (1000); // Ждём
FullStop(1000);
delay (100); // Ждём
// 1) Ищем хоть какое-то направление, куда вообще можно ехать
distance_tmp = distance();
do {
rotateRight(angle); // Крутимся
FullStop(1000); // Ждём и смотрим вдаль
distance_tmp = distance();
} while(distance_tmp < Critical); // повторяем поворот, если расстояние всё ещё мало

SayBeep();
// rotateLeft(angle); // Возвращаемся на один шаг

// 2) Пытаемся выбрать лучшее направление!

do {
distance_tmp = distance();
rotateRight(angle); // Крутимся и проверяем дистанцию
FullStop(900); // Ждём и смотрим вдаль
distance_new = distance();
delay (800); // Ждём и смотрим вдаль
} while( distance_new > distance_tmp );
// Не угадали, раньше было лучше,
rotateLeft(angle); // поэтому поворачиваемся обратно
FullStop(1000); // Восстанавливаем дыхание, успокаиваемся
digitalWrite(illumination, LOW); // успокоились, выключаем мигалку
delay (410); // Ждём
SayBeep();
}

void rollBack()
{
digitalWrite(13, HIGH); // Включаем встроенный диод!
// Сначала откатываемся назад на случайное количество шагов
randomNumber = random(700,2100);
//analogWrite (enableA, 150);
//analogWrite (enableB, 189);
goBackward(randomNumber);
FullStop(200); // Восстанавливаем дыхание, успокаиваемся

// Случайным образом выбираем направление поворота:
randomNumber = random(1,100);

do { // поворачиваемся в выбранную сторону на случайный угол
if (randomNumber < 50) { rotateRight(random(450,1300)); } else { rotateLeft(random(350,1400)); };
FullStop(1000); // Выключаем моторы
tone(Buzzer, 600, 333);
delay (700); // передышка!
} while( distance() < Critical ); // повторяем поворот, если расстояние всё ещё мало

analogWrite (enableA, velocity);
analogWrite (enableB, velocity);
FullStop(600); // Восстанавливаем дыхание, успокаиваемся
digitalWrite(13, LOW); // Выключаем встроенный диод
// SayBeep();
delay (200); // передышка!
}

void avoid() {
CheckLight (); // проверяем, не пора ли зажигать фары?
tone(Buzzer, 2100, 110);
delay (700); // передышка!
// Штрафуем сами себя:
if (Profit > Cost) {
Profit = Profit – Cost; // Ещё есть возможность оплатить штраф,
rollBack(); // тогда откат назад с разворотом
// Serial.print(Profit);
// Serial.println(” очков. “);
} else {
// Нельзя штрафовать, всё плохо, значит запутались – паникуем
panic();
}
}

void SayBeep(){
tone(Buzzer, 700, 109);
delay(200);
tone(Buzzer, 1200, 109);
delay(200);
tone(Buzzer, 2600, 240);
delay(350);
noTone(Buzzer);
}

void boo(){
tone(Buzzer, 600, 200);
delay (300);
tone(Buzzer, 410, 600);
delay (600);
}

void bii(){
tone(Buzzer, 1611, 90);
delay (150);
tone(Buzzer, 1611, 90);
delay (150);
tone(Buzzer, 2111, 400);
delay (440);
}

void SafeForward (int duration){
int distance_measured;
distance_measured = distance();
if ( distance_measured > Critical )
{goForward(duration);}
else {
FullStop(10);
boo(); }
}

void BluetoothControl() {
for(int i = 0; i <= 4; i++){
// digitalWrite(illumination, HIGH); // включаем мигалку
digitalWrite(13, HIGH); // Включаем встроенный диод!
FullStop(80);
// digitalWrite(illumination, LOW); // вЫключаем мигалку
digitalWrite(13, LOW); // Включаем встроенный диод!
FullStop(900);
velocity = SPEED_MIN + 10; // Выставлям скорость поменьше, т.к.
SetVelocity(velocity, velocity); // на Android будет миниальная скорость по умолчанию!
}
do{
// CheckLight (); // проверяем, не пора ли зажигать фары?
aquire();
}
while ( 1==1 );
}

void SelfControl() {
do{
randomNumber = random(2,5); // вхолостую выбираем псевдо-случайное число
launch(); // запускаем автомобиль вперёд до встречи с преградой
avoid(); // откатываемся от препятствия и как-то поворачиваемся
CheckLight (); // проверяем, не пора ли зажигать фары?
}
while ( 1==1 );
}

void aquire ()
{
if (Serial.available() > 0) {
btTimer1 = millis();
btCommand = Serial.read();
switch (btCommand){
case ‘F’:
goForward(BT_Step); // Можно просто ехать вперёд наобум,
// SafeForward (BT_Step); // а можно включить сонар
break;
case ‘B’:
goBackward(BT_Step);
break;
case ‘L’:
rotateLeft(BT_Step);
break;
case ‘R’:
rotateRight(BT_Step);
break;
case ‘S’:
FullStop(BT_Step);
break;
case ‘G’: // Вперёд, подкручивая вправо
if (velocity < SPEED_MAX-99) {
SetVelocity((velocity+99), (velocity-99));}
else {SetVelocity(SPEED_MAX, SPEED_MIN);} // выставили дифференциал
goForward (BT_Step);
SetVelocity(velocity, velocity); // вернули скорость
break;
case ‘I’: // Вперёд, подкручивая влево
if (velocity < SPEED_MAX-99) {
SetVelocity((velocity-99), (velocity+99));}
else {SetVelocity(SPEED_MIN,SPEED_MAX);} // выставили дифференциал
goForward (BT_Step);
SetVelocity(velocity, velocity); // вернули скорость
break;
/*case ‘J’: //BR
if (velocity < SPEED_MAX-80) {
SetVelocity((velocity-80), (velocity+80));}
else {SetVelocity((velocity-80),SPEED_MAX);} // выставили дифференциал
goBackward(BT_Step);
SetVelocity(velocity, velocity); // вернули скорость
break;
case ‘H’: //BL
if (velocity < SPEED_MAX-80) {
SetVelocity((velocity+80), (velocity-80));}
else {SetVelocity(SPEED_MAX, (velocity-80));} // выставили дифференциал
goBackward(BT_Step);
SetVelocity(velocity, velocity); // вернули скорость
break;
*/
case ‘W’: // Зажгли фары
digitalWrite(light, HIGH);
break;
case ‘w’: // Погасили фары
digitalWrite(light, LOW);
break;
case ‘D’: // Everything OFF
FullStop(100);
break;
case ‘X’: // аварийка
digitalWrite(illumination, HIGH);
break;
case ‘x’: // аварийка
digitalWrite(illumination, LOW);
break;
case ‘U’: // Back ON
digitalWrite(13, HIGH); // Включаем встроенный диод
break;
case ‘u’: // Back OFF
digitalWrite(13, LOW); // Выключаем встроенный диод
break;
case ‘V’: // Пискнуть весело (в оригинале – гудок ВКЛ)
bii();
break;
case ‘v’: // Пискнуть грустно (в оригинале (гудок ВЫКЛ)
boo();
break;
default: // Get SPEED_CURRENT
if ( btCommand == ‘q’ ){
velocity = SPEED_MAX;
SetVelocity(velocity, velocity);
} else {
// Символы ‘0’ – ‘9’ эквивалентны кодам integer 48 – 57 соответственно
if ( (btCommand >= 48) && (btCommand <= 57) ) {
// Subtracting 48 changes the range from 48-57 to 0-9.
// Multiplying by 25 changes the range from 0-9 to 0-225.
velocity = SPEED_MIN + (btCommand – 48) * 15;
SetVelocity(velocity, velocity);
}
} // else
} // switch
} // if (Serial.available() > 0)
else {
btTimer0 = millis(); // Узнаём текущее время (millis since execution started)
//Check if it has been 500ms since we received last btCommand.
if ((btTimer0 – btTimer1) > 800) {
//More than 800 ms have passed since last btCommand received, car is out of range.
FullStop(1000);
digitalWrite(illumination, HIGH); // включаем мигалку
boo ();
FullStop(4000);
Syren();
FullStop(8000);
}
}
}

Смотрите про коптеры:  Регистрация квадрокоптеров в 2019 году в России и правила постановки на учет - PilotHub

void loop() {
CheckLight (); // проверяем, не пора ли зажигать фары?
// Serial.println(“System ready…”);
if ( distance() > Critical )
{ // Путь вперёд свободен,
SelfControl(); // робот отправляется в самостоятельное путешествие
} else {
BluetoothControl(); // Впереди преграда, отдаём управление водителю
}
}

*

Выбор режима (ручное управление или демо) выполняется в самом начале за счёт проверки расстояния до преграды. При включении машина смотрит в стену – ручное управление по Bluetooth. При включении нет преград перед машиной – самостоятельное движение (демо-режим).

Данная статья устарела 1 января 2018 года. Есть смысл рассматривать её только как инструкцию по сборке. Вопросы программирования гораздо лучше освещены в новой статье.

Возникла задача реализовать роботизированную машинку на колёсах. Обзор опубликованных в свободном доступе решений позволил сразу отказаться от рудиментов и выработать уникальные технические требования:

  • Для всей системы должен быть только один источник питания. Желательно, аккумуляторы. Любимый формат – 18650.
  • Простая и надёжная силовая часть. Никаких гипер-сложных “силовых шилдов“.
  • Поведение, целиком определяемое прошивкой
  • Отладка в результате натурных испытаний (смена режимов сопровождается звуковым сигналом).

Рассмотрим этапы решения.

В первую очередь был заказан набор для сборки механической части шасси из Китая. Через месяц пришёл хорошо укомплектованный набор.

Далее пришлось открывать верхний ящик стола и на ощупь искать дополнительные комплектующие. Нам пригодятся:

В качестве микроконтроллерного модуля был выбран один из клонов платформы Arduino на базе Atmel ATmega 328/P. После долгих размышлений и взглядов в сторону Raspberry Pi или “голого” PIC16 с аскетичным ассемблером решено было остановиться именно на этой платформе, т.к. она обеспечивает простоту сопряжений с другими блоками, имеет массу примеров кода, опубликованных в свободном доступе, унифицирована с колоссальным количеством датчиков – другими словами, развязывает руки разработчику и позволяет сосредоточиться на воплощении задумки.

Более того, неоспоримый дополнительный плюс – это масштабируемость.

Исполнение выбиралось с точки зрения дизайна: я постарался выдержать всю конструкцию в жёлто-чёрной палитре.

Фактически, вся сборка начинается с модуля драйвера моторов на базе L298N и крутится вокруг него. На мой взгляд, именно этот модуль следовало бы назвать ядром всей системы. Фактически, это умощнённая версия выпускаемой ранее микросхемы/платы L293D. Совместимость сохранена.

Важно отметить, что входы ENABLE A/B отвечают за возможность вращения моторов, причём на них можно подавать как логические уровни (“низкий” – запрет, “высокий” – разрешено), так и аналоговые сигналы (например, посредством ШИМ) для регулировки скорости вращения. Разработчики предусмотрели два пятивольтовых вывода рядом с ENABLE A/B – они позволяют установить “намертво” перемычки на плату, тогда всегда будет разрешена полная скорость вращения; таким образом можно сэкономить две выходные линии микроконтроллера. Подавать отдельно +5В на эти вспомогательные выводы не требуется!

Ещё одна перемычка видна вблизи колодки питания, в глубине платы: она должна быть установлена, если питание модуля L298N будет превышать +12В. Можно запитывать модуль L298N и большим напряжением (вплоть до 30 вольт), тогда придётся снять данный джампер, а также придётся дополнительно подводить к модулю +5В. В моём случае планируется применение аккумуляторов на 7-8 вольт, поэтому я смело оставил джампер установленным и радостно воспользовался имеющимися пятью вольтами для питания логики.

Сборка робота начинается с подготовки модуля L298N: он с трудом влезает на шасси, а очень хочется установить его по центру. Кроме того, клеммы выходов на моторы оказываются расположены совершенно впритык к корпусам моторов, как туда впихнуть провода – остаётся загадкой. Было принято решение всё же зафиксировать драйвер строго по центру (радиатор будет смотреть назад), для чего пришлось выпаивать колодки, заменяя их проводами. В итоге вся силовая часть оказалась пропаяна, что лично меня весьма устраивает.

Стойки для драйвера оказались слишком высоки (радиатор не влезал), поэтому пришлось изготовить собственные низкопрофильные стоечки.

Все тонкости пайки показаны на рисунке выше. Моторы запаиваем крест-накрест между собой, затем припаиваем выходные (красные) провода от драйвера.

Собираем первый этаж. Никаких приключений, только винты, гайки и отвёртка. Ну вот только с запайкой клемм двигателей пришлось повозиться.

И, да, не забываем, что редукторы у нас не железные, колёса придётся насаживать нежно! Есть смысл капнуть каплю клея на оси, так как практика показала, что колёса имеют тенденцию отваливаться на поворотах по ковру.

Теперь выполняем соединения. Самое главное правило: присоединить шлейф красиво к драйверу – то есть все шесть проводов выстраиваются в ряд. Это очень важно, ибо туда мы больше не полезем, скорее всего.

Сведём все коммуникации в один понятный рисунок.

Собираем второй этаж.

Теперь заложим в нашего робота простой алгоритм, который позволит машине самостоятельно перемещаться, избегая соударения с препятствиями.

Суть алгоритма:

  • При подаче питания исполняем патриотические ноты
  • Выполняем тестовые движения: вперёд, назад, разворот через правое плечо, разворот через левое плечо
  • Едем вперёд, пока не увидим перед собой препятствие на расстоянии 12 см или меньше
  • Меняем траекторию: немного откатываемся назад (на случайное расстояние) и выполняем разворот в случайную сторону на случайный угол.
  • см. (3)

Листинг программы для прошивки.

// 4WD RoboCar
// With Sonar
// 2017-July-24

long randomNumber;

// Описываем подключение драйвера к микроконтроллеру
// A – правый борт
// В – левый борт

Фрагмент реального заезда на видео прекрасно иллюстрирует поведение подопытного.

В результате имеем работающую машинку, которая способна самостоятельно избегать соударения!

Хотелось бы отметить, что очень тщательно выбиралась пара переменных: критическое расстояние Distance и время движения вперёд, т.е. параметр для Forward(). Дело в том, что от пары этих переменных будет очень сильно зависеть поведение робота вблизи препятствий. Я постарался сделать максимально точный аппарат, который будет тормозить в самый последний миг, останавливаясь в миллиметрах от преграды. С другой стороны, ударов тоже допускать нельзя (домашнюю мебель жалко).

Для программирования и прошивки использовалась интегрированная среда разработки UECIDE. Крайне рекомендую данную ИСР, т.к. во-первых, она бесплатна. Во-вторых, она обладает развитым функционалом текстового редактора кода, после которого тяжело перейти на любой другой пакет. Иллюстрирую феноменальную разметку с помощью одного скриншота:

Не прошло и полгода, а уже захотелось доработать поделку.

Ниже приведён листинг доработанной программы для прошивки. Добавлен фотосенсор, теперь в темноте зажигаются фары, а скорость моторов немного снижена, чтобы машинка была не такой резвой. Встроенный светодиод теперь сигнализирует об обнаружении препятствия и о движении назад или развороте.

// 4WD RoboCar
// Sonar (NO Servo) + fara + LED13
// 2017-December-10
// v.0.4 (хорошая версия)

// Global variables:
long randomNumber;
int velocity = 220;

int light = 0; // Сюда подключены фары

// Описываем подключение драйвера к микроконтроллеру
// A – правый борт
// В – левый борт

int pinB1 = 1;
int pinB2 = 2;
int enableB = 3;
int pinA2 = 4;
int pinA1 = 5;
int enableA = 6;

// Подключаем ультразвуковой датчик
#define trigPin 8
#define echoPin 9

// Фоторезистор висит на А0
#define PHOTO_SENSOR A0

// Подключаем зуммер
int tonePin = 12;

void setup() {

// Определяем направление работы линий
pinMode (enableA, OUTPUT);
pinMode (pinA1, OUTPUT);
pinMode (pinA2, OUTPUT);
pinMode (enableB, OUTPUT);
pinMode (pinB1, OUTPUT);
pinMode (pinB2, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(13 , OUTPUT);

// Warming-up
midi();
enableMotors();
pisk();
delay(2000);
digitalWrite(13, LOW); // Выключаем встроенный диод
// Serial.begin(9600); // Отправляем данные на ПЭВМ
}

// Описываем варианты работы моторов
void motorAforward() {
digitalWrite (pinA1, HIGH);
digitalWrite (pinA2, LOW);
}
void motorBforward() {
digitalWrite (pinB1, LOW);
digitalWrite (pinB2, HIGH);
}
void motorAbackward() {
digitalWrite (pinA1, LOW);
digitalWrite (pinA2, HIGH);
}
void motorBbackward() {
digitalWrite (pinB1, HIGH);
digitalWrite (pinB2, LOW);
}
void motorAstop() {
digitalWrite (pinA1, HIGH);
digitalWrite (pinA2, HIGH);
}
void motorBstop() {
digitalWrite (pinB1, HIGH);
digitalWrite (pinB2, HIGH);
}
void motorAon() {
digitalWrite (enableA, HIGH);
}
void motorBon() {
digitalWrite (enableB, HIGH);
}
void motorAoff() {
digitalWrite (enableA, LOW);
}
void motorBoff() {
digitalWrite (enableB, LOW);
}

// Описываем варианты движения машины
void forward (int duration) {
motorAforward();
motorBforward();
delay (duration);
}
void backward (int duration) {
motorAbackward();
motorBbackward();
delay (duration);
}
void right (int duration) {
motorAbackward();
motorBforward();
delay (duration);
}
void left (int duration) {
motorAforward();
motorBbackward();
delay (duration);
}
void FullStop (int duration) {
motorAstop();
motorBstop();
delay (duration);
}
void disableMotors() {
motorAoff();
motorBoff();
}
void enableMotors() {
motorAon();
motorBon();
}

Смотрите про коптеры:  Радиоуправляемые машины HSP - купить недорого в магазине р/у моделей Rc-Like

// Пользуемся УЗ датчиком расстояния
int distance() {
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1; // Переводим в сантиметры
return distance;
}

// Функция запуска автомобиля
void launch() {
int distance_0;
distance_0 = distance();
// Debugging:
// Serial.print(distance_0);
// Serial.println(” сантиметров. “);

// Движемся вперёд, пока расстояние до преграды > 12 cm
while(distance_0 > 12)
{
// motorAon();
// motorBon();
analogWrite (enableA, velocity);
analogWrite (enableB, velocity);
forward(10); // Сколько ехать вперёд?
distance_0 = distance();
}
FullStop(0);
}

void avoid()
{
digitalWrite(13, HIGH); // Включаем встроенный диод!
// Сначала откатываемся назад на случайное количество шагов
tone(tonePin, 999, 400);
delay (1000);
randomNumber = random(2,3);
backward(randomNumber);
tone(tonePin, 900, 400);
delay (400);
// Случайным образом выбираем направление и угол поворота:
randomNumber = random(1,10);
if (randomNumber < 5) { right(random(50,460)); } else { left(random(50,460)); };
digitalWrite(13, LOW); // Выключаем встроенный диод
}

void pisk(){
tone(tonePin, 700, 350);
delay(350);
tone(tonePin, 900, 350);
delay(350);
tone(tonePin, 1100, 750);
delay(550);
noTone(tonePin);
}

void midi() {

tone(tonePin, 174, 249.99975);
delay(277.7775);
tone(tonePin, 233, 499.9995);
delay(555.555);
tone(tonePin, 174, 374.999625);
delay(416.66625);
tone(tonePin, 195, 124.999875);
delay(138.88875);
tone(tonePin, 220, 499.9995);
delay(555.555);
tone(tonePin, 146, 249.99975);
delay(277.7775);
tone(tonePin, 146, 249.99975);
delay(277.7775);
tone(tonePin, 195, 499.9995);
delay(555.555);
tone(tonePin, 174, 374.999625);
delay(416.66625);
tone(tonePin, 155, 124.999875);
delay(138.88875);
tone(tonePin, 174, 499.9995);
delay(555.555);
tone(tonePin, 116, 249.99975);
delay(277.7775);
tone(tonePin, 116, 249.99975);
delay(277.7775);
tone(tonePin, 130, 499.9995);
delay(555.555);
tone(tonePin, 130, 374.999625);
delay(416.66625);
tone(tonePin, 146, 124.999875);
delay(138.88875);
tone(tonePin, 155, 499.9995);
delay(555.555);
tone(tonePin, 155, 374.999625);
delay(416.66625);
tone(tonePin, 174, 124.999875);
delay(138.88875);
tone(tonePin, 195, 499.9995);
delay(555.555);
tone(tonePin, 220, 374.999625);
delay(416.66625);
tone(tonePin, 233, 124.999875);
delay(138.88875);
tone(tonePin, 261, 749.99925);
delay(833.3325);
}

void fara () {
int val = analogRead(PHOTO_SENSOR);
if (val < 500) {
// Светло, выключаем фары
digitalWrite(light, HIGH);
} else {
// Темновато, включаем фары
digitalWrite(light, LOW);
}
}

void loop() {
randomNumber = random(2,5); // вхолостую выбираем псевдо-случайное число
launch(); // запускаем автомобиль вперёд
avoid(); // откатываемся от препятствия и как-то поворачиваемся
fara (); // проверяем, не пора ли зажигать фары?
}

В результате движения стали более плавными и точными, зажигаются фары (т.е. светодиоды) в соответствии с показаниями датчика освещённости, но их можно и не подключать. Моторы работают в чуть более щадящем режиме. Обо всех действиях сообщает писк зуммера.

Комплектующие

  • Arduino Uno — https://bit.ly/2P3rCI5​
  • драйвер моторов L298N — https://bit.ly/3dvbDMg​
  • Bluetooth модуль HC-06 или HC-05 или подобный — https://bit.ly/3x4nhFX​
  • моторы постоянного тока с редуктором и с колёсами — 4 шт — https://bit.ly/2P4e9Qr​
  • провода папа-папа, мама-мама, папа-мама 10-30 см — https://bit.ly/3n3z0jl​
  • аккумулятор 9В, я использовал с разъёмом micro-USB для зарядки — https://bit.ly/2QeFbF6​
  • зажим для аккумулятора 9В — https://bit.ly/32rmwZi​
  • тумблер — 1 шт — https://bit.ly/3artZfr

Для изготовления рамы машинки можно использовать разнообразные материалы:

  • листовой лёгкий материал, который легко обрабатывать — оргстекло, фанера, текстолит, оргалит и т.п.
  • третье колесо, которое будет опорным — оно должно уметь ехать во всех стороны (хорошо подходят мебельные колёсики);
  • крепёжные элементы — болты, гайки, шурупы.

Схема подключения

Питание платы берётся от «Кроны» и подаётся на Arduino через пины VIN и GND. Также подаётся отдельно на драйвер двигателей через порты +12V и GND.

Blutooth модуль HC-06 получает питание в 3,3 вольта от Arduino. Если подключить к 5 вольтам, то тоже работает нормально. Выход RX модуля подключается к TX на Arduino, а TX — в RX, то есть наоборот.

На драйвере двигателей нужно снять две боковые перемычки — Enable. Пины под ними позволят нам управлять скоростью вращения двигателей. И эти пины подключаются к Arduino обязательно к ШИМ-портам (обозначенные знаком ~). На схеме это порты 3 и 5.

Питание моторов подаётся на Input драйвера от Arduino с портов 2 и 4, 6 и 7. А сами моторы подключаются к Output A и Output B драйвера.

Если после сборки и прошивки, вы подаёте на машинку сигнал двигаться вперёд, а оба колеса при этом вращаются в разных направления, то нужно поменять местами провода на одном из моторов в выходе Output.

Если при движении вперёд машинка едет назад, то нужно поменять местами провода Output обоих двигателей (хотя, кто знает, где у ней перед, а где зад…).

Если при повороте налево, машинка едет направо, то нужно поменять местами Output A и Output B.

Если подключить всё по схеме, то скетч переделывать не нужно будет.

Скетч

Перед прошивкой обаятельно отключите питание у Blutooth модуля. Для этого надо просто отсоединить один из его проводов питания.

В скетче прописанные необходимые поясняющие комментарии.

Движение и остановка колёс осуществляется за счёт функций. А в дальнейшем нужные комбинации функций просто вызываются в нужных местах кода одной строкой. Получается просто и компактный код. Ниже фрагмент кода примером двух таких функций:

Со смартфона приложение по Bluetooth посылает сигналы в виде латинских букв (W, S, E и т.д.). В зависимости от пришедшей команды, с помощью оператора if, вызываются комбинации тех или иных функции. Если вы будете использовать другое приложение, не то, которое я предоставлю ниже, то оно будет посылать другие команды, другие буквы. Соответственно, придётся переписать их в скетче.

Например, когда по Bluetooth приходит ‘ W ‘ вызываются две функции rightWheelForward (); и leftWheelForward (); что заставит оба мотора крутится вперёд.

А если приходит ‘E’, то вызываются функции rightWheelStop (); и leftWheelForward (); что заставит остановиться правый мотор и вращаться вперёд только левый, от чего машинка поведет вперёд вправо.

Есть три вида скорости, которые включаются, когда приходят команды ‘1’, ‘2’ и ‘3’. Скорость можно задавать от 0 до 250. На каждую и трёх команд в скетче прописаны скорости 120, 170 и 250, соответственно.

Если у вас уровень заряда аккумулятора уже на исходе, то при скорости 120 может не поехать или поехать, но не стабильно. Тогда лучше увеличить значение для первой скорости.

Скорость приходит в виде переменной motorSpeed в функцию analogWrite() и запускает двигатель с заданными оборотами.

Приложение

Так как я не владею навыком написания приложение под Anroid, то для создания пульта управления использовать уже известный у многих начинающих разработчиков инструмент визуального программирования — App inventor.

Что-то подсмотрел у других в интернете, что доработал, и получилось такое простое приложение.

Сначала нужно включить машинку и сделать сопряжение по Bluetooth со смартфоном. Пароль модуля 0000 или 1234. После этого откройте приложение и нажмите «Подключиться к машинке». Подключитесь к модулю HC-06. Светодиод на нём должен перестать мигать.

Если сразу начать нажимать на стрелки направлений движения, то не поедет. В первую очередь нужно нажать на одну из трёх скоростей, а уже потом на стрелки направления. Тогда поедет.

И, так как я не публиковал это приложение в Google Play, смартфон может ругаться на его безопасность. Но можно смело устанавливать. В нём всё работает безопасно.

Сборка

Можно купить готовое шасси для машинки сразу вместе с моторами и колёсами. Останется только установить электронику и всё подключить.

Но намного интереснее создать это самому. Для изготовления подойдёт любой листовой материал, который вам будет легко обрабатывать, и который достаточно лёгкий. Например, оргалит, текстолит, фанера. Я выбрал оргстекло, что сделало мою машинку даже очень похожей на шасси из магазина.

Из инструментов могут понадобиться:

  • Ручной или электрический лобзик (я пользовался ручным), чтобы отрезать нужные куски от материала.
  • Дрель или шуроповёрт, свёрла.
  • Крепёжные элементы — болты, гайки и саморезы любого подходящего диаметра.

Получилось дёшево и сердито. А главное работает.

Паять я тоже ничего не стал, чтобы потом можно было бы легко разобрать эту машинку и модернизировать. Припаивал только провода к моторам.

В магазинном наборе для крепления моторов используются специальный кронштейны, к которым сам мотор прикручивается болтами диаметром 3 мм. Но болтов нужного диаметра и длины у меня не оказалось, хоть и можно было изготовить аналогичный кронштейн. Поэтому пришлось изощряться и использоваться даже детали детского конструктора, чтобы надёжно прикрепить моторы. На видео крепление моторов рассмотрено лучше.

Платы в идеале лучше прикручивать короткими болтами с диаметром 3 мм. Но и таких у меня не оказалось. Поэтому пришлось делать в оргстекле отверстия 2 мм и прикручивать платы саморезами. Держится вполне нормально.

У модуля Bluetooth особая проблема крепления — там отверстий для крепления нет вообще. Пришлось прижимать плату к раме другой деталью из оргстекла. Тут главное не сжать слишком сильно, чтобы не повредить.

Аккумулятор крепится аналогично Bluetooth модулю, только снизу.

И обязательно прикручиваем мебельное поворотное колесо, которое станет опорным, и не будет приводным. Следите за тем, чтобы вся конструкция была в горизонтальном положении, когда стоит на всех трёх колёсах.

Видео

Комплектующие

Электроника:

  • Arduino Uno — https://bit.ly/2P3rCI5​
  • драйвер моторов L298N — https://bit.ly/3dvbDMg​
  • Bluetooth модуль HC-06 или HC-05 или подобный — https://bit.ly/3x4nhFX​
  • моторы постоянного тока с редуктором и колёсами — 4 шт — https://bit.ly/2P4e9Qr​
  • сервомотор SG90 — https://bit.ly/2QeE20g​
  • провода папа-папа, мама-мама, папа-мама 10-30 см — https://bit.ly/3n3z0jl​
  • аккумулятор 9В, я использовал с разъёмом micro-USB для зарядки — https://bit.ly/2QeFbF6​
  • зажим для аккумулятора 9В — https://bit.ly/32rmwZi​
  • выключатель — https://bit.ly/3sATelw

И ещё разные мелочи для сборки:

  • болты 3 х 30 мм — 4 шт;
  • гайки 3 мм — 4 шт;
  • болты 4 х 6 мм — 10 шт;
  • болты 4 х 10 мм — 2 шт;
  • гайки 4 мм — 10 шт;
  • болты 5 х 25 мм — 4 шт;
  • гайки 5 мм — 6 шт;
  • саморезы — 2 х 7 мм — 8 шт;
  • подшипники — 5 х 16 х 5 мм — 4 шт.
Смотрите про коптеры:  Средства борьбы с квадрокоптерами

Схема подключения

Аккумулятор на 9В питает Arduino через порт VIN и драйвер моторов через порт 12V. Модуль Bluetooth питается от Arduino через порт 3,3V. Параллельно портам питания этого модуля подключается конденсатор для стабилизации напряжения. В ином случае Bluetooth может отключаться и терять подключение. Сервомотор также питается от микроконтроллера через порт 5V. Он управляет поворотными колёсами.

Если на драйвере мотора установлена перемычка Enable, то её нужно снять. Этот порт необходим для управления скоростью моторов. Он должен подключаться обязательно к ШИМ порту, обозначенном на Arduino знаком ~. На схеме выше это порт 3. Управление моторами осуществляется через порты 2 и 4 Arduino, они подключаются к портам Input 3 и Input 4 на драйвере моторов. Таким образом порт Enable драйвера управляет скоростью вращения, а логическая единица на Input 3 или Input 4 — направлением.

Если после сборки вы нажимаете на пульте управления кнопку для движения вперёд, а машинка едет назад, то поменяйте местами провода на портах Out3 и Out4.

А если моторы вращаются в разные стороны, то поменяйте местами провода на любом из моторов.

Пины RX и TX Bluetooth модуля подключаются к портам TX и RX на Arduino, то есть наоборот. К сожалению, из-за несовместимости библиотеки RemoteXY.h с библиотекой SoftwareSerial.h запрограммировать другие порты Arduino для последовательной передачи данных не получится. Поэтому при прошивке микроконтроллера придётся каждый раз отключать питание Bluetooth модуля.

Сервомотор управляется портом 5 на Arduino программируется библиотекой Servo.h.

Скетч

Скетч можно скачать на Github. Предлагайте ваши исправления и доработки, если есть интересные идеи. Для компиляции вам понадобятся две библиотеки:

  • RemoteXY.h — https://remotexy.com/ru/library/
  • Servo.h — https://github.com/arduino-libraries/Servo

Перед компиляцией отключите Bluetooth модуль от питания, чтобы освободить порт передачи данных. После компиляции подключите его снова.

Скетч достаточно прокомментирован пояснениями. Но если останутся вопросы, задавайте в комментариях к статье.

Приложение для пульта управления

Приложение для пульта можно скачать на сайте Remote XY. Там есть версия для Android и iOs. Это универсальная платформа для создания дистанционного пульта. Интерфейс пульта задаётся в самом скетче, в директиве #pragma pack(push, 1).

Вы можете увидеть и изменить проект пульта здесь. Скетч для Arduino, соответственно, тоже нужно будет изменить. Если поменяйте только дизайн пульта, то изменить нужно будет лишь содержимое директивы #pragma pack(push, 1). А если измените функциональность, то нужно будет шаманить глубже.

Сборка

Для сборки я смоделировал шасси для печати на 3D принтере. Готовые модели вы можете скачать на сайте Thingiverse. Если есть идеи для ремиксов, то загружайте на Thingiverse. Лично я вижу, что шасси далеко не идеально и в нём есть, что доработать.

Печатать можно пластиком PLA с разрешением 0,2 и заполнением 20%. Но элементы поворотного механизма лучше напечатать с заполнением 70%. Нужны поддержки.

При сборке подшипники должны плотно вставляться в посадочные места. Если не вставляются, то допилите посадочные места напильником. А если плохо держатся и вылетают, то можно приклеить. Также элементы каркаса должны друг в друга плотно вставляться, но может потребоваться допиливание или клей.

Процесс сборки и поездки на этом Ардумобиле показаны в этом видео.

Автор: • Апрель 21, 2020 • Курсовая работа • 3,708 Слов (15 Страниц) • 288 Просмотры

Страница 1 из 15

Наверх

Название проекта: Робот на Arduino, управляемый с помощью жестов
Платформа: Arduino

Любительская робототехника развивается весьма быстрыми темпами. Все больше и больше людей хотят сделать своего робота, пусть даже небольшого, простого и обладающего минимальным набором функций.

При разработке робота встает вопрос о его управлении. Робот, управляемый джойстиком или клавиатурой, вполне обычное явление среди радиолюбителей. Куда интереснее сделать робота с необычным управлением, например, с жестовым управлением с помощью акселерометра.

Потребуется:

  • Плата Arduino
  • Два двигателя постоянного тока
  • Акселерометр ADXL335
  • Кодер HT12D
  • Декодер HT12E
  • Радиопередатчик и радиоприёмник
  • Драйвер двигателей L293D
  • Батарейка 9 В
  • Разъем для батарейки
  • USB-кабель
  • Шасси робота

Пульт управления, состоящий из акселерометра и радиопередатчика, крепится на руке и позволяет перемещать робота вперёд, назад, влево, вправо и останавливать.

Акселерометр ADXL335 имеет по аналоговому выходу на каждую ось (X-OUT, Y-OUT, Z-OUT) и питается напряжением 5 В.

Робот совершает перемещения на основе положения руки. Если наклонить руку вперёд, робот начнёт движение прямо и будет продолжать, пока не будет дана другая команда. Отклонение руки назад позволит роботу двигаться назад. Наклоны руки вправо или влево заставит робота поворачивать направо или налево соответственно. Для остановки робота нужно держать руку в горизонтальном положении.

На представленном ниже видео показано функционирование простого робота с жестовым управлением с помощью акселерометра:

Проект робота состоит из двух частей: передающей части и принимающей части. В передающей части основными элементами являются акселерометр и радиопередатчик. Поскольку акселерометр передаёт аналоговые сигналы, их необходимо преобразовать в цифровые. Для этой цели вместо АЦП используется 4-канальный компаратор. С помощью опорного напряжения мы получаем необходимые цифровые сигналы, которые впоследствии подводим к шифратору HT12E для получения последовательных данных для последующей их отправки по радиоканалу.

В принимающей части данные, принятые от радиоприёмника, поступают на дешифратор HT12D. Он преобразует информацию в параллельные сигналы, которые заводятся на Arduino. На основе этих данных робот осуществляет движение. Следует учитывать, что для питания двигателей используется дополнительный источник в виде батарейки 9 В.

Таблица состояний для управления роботом:

Код для Arduino:

//определяем выходные пины для двигателей
#define FD 16
#define BD 17
#define LD 18
#define RD 19
#define m11 3
#define m12 4
#define m21 5
#define m22 6
void forward()
{
digitalWrite(m11, HIGH);
digitalWrite(m12, LOW);
digitalWrite(m21, HIGH);
digitalWrite(m22, LOW);
}
void backward()
{
digitalWrite(m11, LOW);
digitalWrite(m12, HIGH);
digitalWrite(m21, LOW);
digitalWrite(m22, HIGH);
}
void left()
{
digitalWrite(m11, HIGH);
digitalWrite(m12, LOW);
digitalWrite(m21, LOW);
digitalWrite(m22, LOW);
}
void right()
{
digitalWrite(m11, LOW);
digitalWrite(m12, LOW);
digitalWrite(m21, HIGH);
digitalWrite(m22, LOW);
}
void Stop()
{
digitalWrite(m11, LOW);
digitalWrite(m12, LOW);
digitalWrite(m21, LOW);
digitalWrite(m22, LOW);
}
//определяем направления для пинов
void setup()
{
pinMode(FD, INPUT);
pinMode(BD, INPUT);
pinMode(LD, INPUT);
pinMode(RD, INPUT);
pinMode(m11, OUTPUT);
pinMode(m12, OUTPUT);
pinMode(m21, OUTPUT);
pinMode(m22, OUTPUT);
}
void loop()
{
//считываем входы
int temp1=digitalRead(FD);
int temp2=digitalRead(BD);
int temp3=digitalRead(LD);
int temp4=digitalRead(RD);
if(temp1==1 && temp2==0 && temp3==0 && temp4==0)
backward();
else if(temp1==0 && temp2==1 && temp3==0 && temp4==0)
forward();
else if(temp1==0 && temp2==0 && temp3==1 && temp4==0)
left();
else if(temp1==0 && temp2==0 && temp3==0 && temp4==1)
right();
else
Stop();
}

Использованные компоненты: Плата Arduino, Два двигателя постоянного тока, Акселерометр ADXL335, Кодер HT12D, Декодер HT12E ,Радиопередатчик и радиоприёмник, Драйвер двигателей L293D, Батарейка 9 В, Разъем для батарейки, USB-кабель, Шасси робота

Сайт проекта: http://circuitdigest.com/microcontroller-projects/accelerometer-based-hand-gesture-controlled-robot-using-arduino, http://digitrode.ru/computing-devices/mcu_cpu/296-robot-na-arduino-upravlyaemyy-s-pomoschyu-zhestov.html

Перейти в каталог DIY-проектов роботов

Как добавить робопроект в каталог?

Машинка на Arduino, управляемая через Bluetooth

Машинка, управляемая через Bluetooth, стоимостью чуть менее $100. Поставляется в разобранном виде. Помимо корпуса, мотора, колес, литиевой батарейки и зарядного устройства, получаем плату Arduino UNO328, контроллер мотора, Bluetooth адаптер, пульт дистанционного управления и прочее.

Видео с участием этого и еще одного робота:

Более подробное описание игрушки и возможность купить на сайте интернет-магазина DealExtreme.

Аналогичный набор на Aliexpress чуть дороже. Аналогичные роботы с тремя колесами дешевле. Например, можно купить за $59.

Робот-черепаха Arduino

Комплект для сборки робота-черепахи стоимостью около $90. Не хватает только панциря, все остальное, необходимое для жизни этого героя, в комплекте: плата Arduino Uno, сервоприводы, датчики, модули слежения, ИК-приемник и пульт, батарея.

Черепаху можно купить на сайте DealExtreme, аналогичный более дешевый робот на Aliexpress.

Гусеничная машина на Arduino, управляемая с сотового телефона

Гусеничная машина, управляемая по Bluetooth с сотового телефона, стоимостью $94. Помимо гусеничной базы получаем плату Arduino Uno и плату расширения, Bluetooth плату, аккумулятор и зарядное устройство.

Гусеничную машину также можно купить на сайте DealExtreme, там же подробное описание. Может быть, более интересный железный Arduino-танк на Aliexpress.

Arduino-автомобиль, проезжающий лабиринты

Автомобиль, проезжающий лабиринты, стоимостью $83. Помимо моторов, платы Arduino Uno и прочего необходимого cодержит модули слежения и модули обхода препятствий.

Видео с этим роботом:

http://youtu.be/vct-eBO7-Hg

Страница машины на сайте DealExtreme, такой же робот на Aliexpress стоит чуть дороже.

Arduino насекомое

Оригинальный мини-робот насекомое на базе Arduino-совместимой схемы стоимостью менее $50. Помимо Arduino-совместимой платы имеет микросервоприводы и датчик для обнаружения препятствий.

Подробный обзор этого проекта на Arduino мы выполнили здесь. Приобрести можно на сайте DealExtreme или Aliexpress.

Готовый робот или каркас для робота

Помимо рассмотренного в обзоре варианта использования готовых комплектов для создания роботов Arduino, можно купить отдельно каркас (корпус) робота — это может быть платформа на колесиках или гусенице, гуманоид, паук и другие модели. В этом случае начинку робота придется делать самостоятельно. Обзор таких корпусов приведен в нашей статье.

Где еще купить готовых роботов

В обзоре мы выбрали наиболее дешевых и интересных на наш взгляд готовых Arduino-роботов из китайских интернет-магазинов. Если нет времени ждать посылку из Китая — большой выбор готовых роботов в интернет-магазинах Амперка и DESSY. Низкие цены и быструю доставку предлагает интернет-магазин ROBstore. Список рекомендованных магазинов здесь.

Возможно вас также заинтересуют наши обзоры проектов на Arduino:

  • Arduino робот-художник;
  • arduino-робот Sparki;
  • деревянный робот-машинка KAKU.
  • робот-насекомое.

Обучение Arduino

Не знаете, с чего начать изучение Arduino? Подумайте, что вам ближе — сборка собственных простых моделей и постепенное их усложнение или знакомство с более сложными, но готовыми решениями?

Учебный курс “Arduino для начинающих”: главная страница.

Посты по урокам:

  • Первый урок: Светодиод.
  • Второй урок: Кнопка.
  • Третий урок: Потенциометр.
  • Четвертый урок: Сервопривод.
  • Пятый урок: Трехцветный светодиод.
  • Шестой урок: Пьезоэлемент.
  • Седьмой урок: Фоторезистор.
  • Восьмой урок: Датчик движения (PIR) на Arduino. Автоматическая отправка E-mail.
  • Девятый урок: Подключение датчика температуры и влажности DHT.

Все посты сайта “Занимательная робототехника” по тегу Arduino.

Все цены приведены по состоянию на 30.03.14. Фото с сайта DealExtreme.

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector