Мы тут в Валеркой открыли для себя Алиэкспресс )), и теперь заказываем всякие прикольные штуки, из которых собрали вот такого гусеничного робота. Управляется по bluetooth с планшета или смартфона. Также можно управлять пультом от телевизора или голосом. Можно установить смартфон и наблюдать и управлять удаленно через компьютер или планшет. Камера (смартфон) может поворачиваться и смотреть по сторонам.
Для тех, кто захочет повторить.
Бюджет проекта:
- Гусеничное шасси + редуктор Tamiya
https://market.yandex.ru/product--tamiya-educational-construction-70108-gusenichnoe-shassi/11034842 (~700р.)
- кусок фанеры для базы (0р.)
- детский металлический конструктор
https://www.votonia.ru/products/konstruktor-desyatoe-korolevstvo-metallicheskiy-samokat-12-det/ (~300р.)
-
плата Arduino UNO (235р.) Мозг дрона.
-
плата расширения Motor Shield (100р.) Для подключения двигателей.
-
аккумулятрный блок на 4 аккумулятора АА (40р.)
-
шаговый двигатель (100р.) Для поворота камеры.
- провода и пара светодиодов для фар можно добыть из какой-нибудь старой техники (0р.)
Итого 1475р.
Программа управления на Ардуино:
#include <AFMotor.h>
#include <IRremote.h>
#include <SoftwareSerial.h>
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_Stepper motor3(2048, 2);
IRrecv irrecv(2);
decode_results results;
SoftwareSerial BTSerial(A0, A1);
char vcmd;
String voice;
void setup() {
BTSerial.begin(9600);
pinMode(19, OUTPUT);
motor1.setSpeed(200);
motor2.setSpeed(200);
motor3.setSpeed(200);
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
while (BTSerial.available()){
delay(10);
char c = BTSerial.read();
// Вперед
if (c == 'F') {
motor1.run(FORWARD);
motor2.run(FORWARD);
Serial.println(c);break;
}
// Назад
if (c == 'B')
{
motor1.run(BACKWARD);
motor2.run(BACKWARD);
Serial.println(c);break;
}
// Влево
if (c == 'L')
{
motor1.run(BACKWARD);
motor2.run(FORWARD);
Serial.println(c);break;
}
// Вправо
if (c == 'R')
{
motor1.run(FORWARD);
motor2.run(BACKWARD);
Serial.println(c);break;
}
// Прямо и влево
if (c == 'G')
{
/*
motor3.step(1024, BACKWARD, INTERLEAVE);
motor3.release();
delay(1000);
Serial.println(c);break;
*/
}
// Прямо и вправо
if (c == 'I')
{ /*
motor3.step(1024, FORWARD, INTERLEAVE);
motor3.release();
delay(1000);
Serial.println(c);break;
*/
}
// Назад и влево
if (c == 'H')
{
motor3.step(1, BACKWARD, SINGLE);
Serial.println(c);break;
}
// Назад и вправо
if (c == 'J')
{
motor3.step(1, FORWARD, SINGLE);
Serial.println(c);break;
}
// Стоп
if (c == 'S')
{
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.release();
Serial.println(c);break;
}
if (c == 'X')
{
digitalWrite(19, HIGH);
Serial.println(c);break;
}
if (c == 'x')
{
digitalWrite(19, LOW);
Serial.println(c);break;
}
if (c == '#') {break;}
voice += c;
}
if (voice.length() > 0) {
Serial.println(voice);
if(voice == "*вперед")
{
motor1.run(FORWARD);
motor2.run(FORWARD);
delay(5000);
}
else if(voice== "*остановись")
{
motor1.run(RELEASE);
motor2.run(RELEASE);
}
else if(voice == "*налево")
{
motor1.run(BACKWARD);
motor2.run(FORWARD);
delay(1000);
}
else if(voice == "*направо") {
motor2.run(BACKWARD);
motor1.run(FORWARD);
delay(1000);
}
else if(voice == "*Включи свет") {digitalWrite(19, HIGH); }
else if(voice == "*Выключи свет") {digitalWrite(19, LOW); }
else if(voice == "*назад")
{
motor1.run(BACKWARD);
motor2.run(BACKWARD);
}
else if(voice == "*посмотри направо")
{
motor3.step(1024, FORWARD, INTERLEAVE);
}
else if(voice == "*посмотри налево")
{
motor3.step(1024, BACKWARD, INTERLEAVE);
}
//-----------------------------------------------------------------------//
voice="";}
//Reset the variable after initiating
/*
// Если есть данные
if (BTSerial.available())
{
// Читаем команды и заносим их в переменную. char преобразует код символа команды в символ
vcmd = (char)BTSerial.read();
// Отправляем команду в порт, чтобы можно было их проверить в «Мониторе порта»
Serial.println(vcmd);
// Вперед
if (vcmd == 'F') {
motor1.run(FORWARD);
motor2.run(FORWARD);
}
// Назад
if (vcmd == 'B')
{
motor1.run(BACKWARD);
motor2.run(BACKWARD);
}
// Влево
if (vcmd == 'L')
{
motor1.run(BACKWARD);
motor2.run(FORWARD);
}
// Вправо
if (vcmd == 'R')
{
motor1.run(FORWARD);
motor2.run(BACKWARD);
}
// Прямо и влево
if (vcmd == 'G')
{
}
// Прямо и вправо
if (vcmd == 'I')
{
}
// Назад и влево
if (vcmd == 'H')
{
}
// Назад и вправо
if (vcmd == 'J')
{
}
// Стоп
if (vcmd == 'S')
{
motor1.run(RELEASE);
motor2.run(RELEASE);
}
if (vcmd == 'X')
{
digitalWrite(19, HIGH);
}
if (vcmd == 'x')
{
digitalWrite(19, LOW);
}
}
*/
/*
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
//включить свет
if (results.value == 0xFFA857) {
digitalWrite(19, HIGH);
}
//выключить свет
if (results.value == 0xFFE01F) {
digitalWrite(19, LOW);
}
//повернуть голову направо
if (results.value == 0xFF30CF) {
motor3.step(1024, BACKWARD, INTERLEAVE);
}
//повернуть голову налево
if (results.value == 0xFF7A85) {
motor3.step(1024, FORWARD, INTERLEAVE);
}
//вперед
if (results.value == 0xFF18E7) {
motor1.run(FORWARD);
motor2.run(FORWARD);
}
//назад
if (results.value == 0xFF4AB5) {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
}
//стоп
if (results.value == 0xFF38C7) {
motor1.run(RELEASE);
motor2.run(RELEASE);
}
//налево
if (results.value == 0xFF10EF) {
motor1.run(BACKWARD);
motor2.run(FORWARD);
delay(500);
motor1.run(RELEASE);
motor2.run(RELEASE);
}
//направо
if (results.value == 0xFF5AA5) {
motor1.run(FORWARD);
motor2.run(BACKWARD);
delay(500);
motor1.run(RELEASE);
motor2.run(RELEASE);
}
irrecv.resume(); // Receive the next value
}
delay(100);
*/
}