Site Language

Translate

Danish Dutch English French German

CashBack Реальный возврат при покупках в интернете

Основные версии плат Arduino

Due — плата на базе 32-битного ARM микропроцессора Cortex-M3 ARM SAM3U4E;

Leonardo — плата на микроконтроллере ATmega32U4;

Uno — самая популярная версия базовой платформы Arduino;

Duemilanove — плата на микроконтроллере ATmega168 или ATmega328;

Diecimila — версия базовой платформы Arduino USB;

Nano — компактная платформа, используемая как макет. Nano подключается к компьютеру при помощи кабеля USB Mini-B;

Mega ADK — версия платы Mega 2560 с поддержкой интерфейса USB-host для связи с телефонами на Android и другими устройствами с интерфейсом USB;

Mega2560 — плата на базе микроконтроллера ATmega2560 с использованием чипа ATMega8U2 для последовательного соединения по USB-порту;

Mega — версия серии Mega на базе микроконтроллера ATmega1280;

Arduino BT — платформа с модулем Bluetooth для беспроводной связи и программирования;

LilyPad — платформа, разработанная для переноски, может зашиваться в ткань;

Fio — платформа разработана для беспроводных применений. Fio содержит разъем для радио XBee, разъем для батареи LiPo и встроенную схему подзарядки;

Mini — самая маленькая платформа Arduino;

Pro — платформа, разработанная для опытных пользователей, может являться частью большего проекта;

Pro Mini — как и платформа Pro, разработана для опытных пользователей, которым требуется низкая цена, меньшие размеры и дополнительная функциональность.

CashBack Все честно и без обмана

Создаем робота

Проект робот представляет собой движущуюся гусеничную платформу с внешним управлением через ИК-пульт. В автономном режиме робот будет двигаться по черной линии.

Ходовая часть

Для сборки ходовой части робота использовались:

 набор гусениц Tamiya;

перфорированная пластиковая панель с крепежом Tamiya 70098 Universal Plate Set;

 двойной редуктор Tamiya.

Комплектация набора гусениц Tamiya следующая:

 2 гусеницы по 30 траков;

 2 гусеницы по 10 траков;

 2 гусеницы по 8 траков;

 2 больших ведущих колеса;

 2 больших гладких колеса;

 6 роликов;

 1 вал 3×100 мм шестигранный;

 5 валов 3×100 мм.

Набор Tamiya 70098 Universal Plate Set  состоит из пластины со сквозными монтажными отверстиями, угловых скоб и крепежа, которые позволят смонтировать механические компоненты во множество позиций.

Двухмоторный редуктор Tamiya содержит два маленьких электродвигателя постоянного тока, которые вращают независимые 3-миллиметровые шестиугольные оси. Набор позволяет собрать 4 различных варианта сдвоенных редукторов с разными передаточными числами: 12.7:1, 38:1, 115:1 и 344:1.

 

В наборе используются 3-вольтовые моторы Mabuchi FA-130 (#18100), которые могут быть легко заменены на более мощные моторы Pololu. Размеры корпуса редуктора 70×60×23 мм.

Характеристики редуктора следующие:

 номинальное напряжение — 3 В;

 передаточное отношение — 58:1 или 203:1;

 cкорость без нагрузки — 212 или 60 об/мин;

 ток без нагрузки — 150 мА;

 ток под нагрузкой — 2100 мА;

 крутящий момент — 2,0 или 7,3 кг/см;

 диаметр вала — 3 мм;

 размер (Д×Ш×В) — 75×56×23 мм;

 вес — 70 г;

 материал шестеренок — пластик.

Драйвер двигателей L293D

 

Необходимо реализовать следующие движения робота:

 движение вперед/назад — два мотора крутятся в одну сторону;

 движение влево/вправо — моторы крутятся либо в одну сторону с разной скоростью, либо в разные стороны;

 движение на месте по кругу — моторы крутятся в разные стороны с одной скоростью;

 остановка — оба мотора не крутятся.

 

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

Существует достаточно много самых различных схем для управления электродвигателями. Они различаются как мощностью, так и элементной базой, на основе которой они выполнены. В нашем роботе использовался самый простой драйвер управления двигателями, выполненный на полностью готовой к работе микросхеме. Эта микросхема называется L293D и является одной из самых распространенных микросхем, предназначенных для этой цели. 

 Микросхема L293D
Микросхема L293D
   
 Подключение микросхемы L293D  ePN Cashback - сервис, который возвращает часть денег с покупок, сделанных в интернет магазинах, представленных в ePN CashbackCashBack 1
 Подключение микросхемы L293D  

 

Микросхема L293D содержит сразу два драйвера для управления электродвигателями небольшой мощности (четыре независимых канала, объединенных в две пары). Она имеет две пары входов для управляющих сигналов и две пары выходов для подключения электромоторов. Кроме того, у L293D есть два входа для включения каждого из драйверов. Эти входы используются для управления скоростью вращения электромоторов с помощью широтно-модулированного сигнала (ШИМ). Микросхема L293D обеспечивает разделение электропитания для микросхемы и для управляемых ею двигателей, что позволяет подключить электродвигатели с большим напряжением питания, чем у самой микросхемы. Разделение электропитания микросхем и электродвигателей может быть также необходимо для уменьшения помех, вызванных бросками напряжения, связанными с работой моторов. 

К выходам OUTPUT1 и OUTPUT2 подключим электромотор MOTOR1. На вход ENABLE1, включающий драйвер, подадим сигнал (соединим с положительным полюсом источника питания +5 В). Если при этом на входы INPUT1 и INPUT2 не подаются сигналы, то мотор вращаться не будет.

 

Если вход INPUT1 соединить с положительным полюсом источника питания, а вход INPUT2 — с отрицательным, то мотор начнет вращаться. Теперь попробуем соединить вход INPUT1 с отрицательным полюсом источника питания, а вход INPUT2 — с положительным. Мотор начнет вращаться в другую сторону. Попробуем подать сигналы одного уровня сразу на оба управляющих входа INPUT1 и INPUT2 (соединить оба входа с положительным полюсом источника питания или с отрицательным) — мотор вращаться не будет. Если мы уберем сигнал с входа ENABLE1, то при любых вариантах наличия сигналов на входах INPUT1 и INPUT2 мотор вращаться не будет. Эти входы используются для управления скоростью моторов с помощью широтно- модулированного сигнала (ШИМ).

Микросхема L293D
Назначение выводов микросхемы L293D

 

Входы ENABLE1 и ENABLE2 отвечают за включение каждого из драйверов, входящих в состав микросхемы. Входы INPUT1 и INPUT2 управляют двигателем, подключенным к выходам OUTPUT1 и OUTPUT2. Входы INPUT3 и INPUT4 управляют двигателем, подключенным к выходам OUTPUT3 и OUTPUT4. Контакт Vs соединяем с положительным полюсом источника электропитания двигателей или просто с положительным полюсом питания, если питание схемы и двигателей единое. Проще говоря, этот контакт отвечает за питание электродвигателей. Контакт Vss соединяем с положительным полюсом источника питания. Этот контакт обеспечивает питание самой микросхемы. Четыре контакта GND соединяют с "землей" (общим проводом или отрицательным полюсом источника питания). Кроме того, с помощью этих контактов обычно обеспечивают теплоотвод от микросхемы, поэтому их лучше всего распаивать на достаточно широкую контактную площадку.

Характеристики микросхемы L293D следующие:

 напряжение питания двигателей (Vs) — 4,5–36 В;

 напряжение питания микросхемы (Vss) — 5 В;

 допустимый ток нагрузки — 600 мA (на каждый канал);

 пиковый (максимальный) ток на выходе — 1,2 A (на каждый канал);

 логический "0" входного напряжения — до 1,5 В;

 логическая "1" входного напряжения — 2,3...7 В;

 скорость переключений до 5 кГц;

 имеется защита от перегрева.

ПРИМЕЧАНИЕ

При использовании аналогичной микросхемы L293E допустимый ток нагрузки на каждый канал будет равен 1 А (а пиковый ток — 2 А), но придется использовать внешние защитные диоды, которые у L293D встроены в саму микросхему.

 

Возможные состояний моторов

 

Номера контактов (пинов), к которым подключены моторчики, хранится в структуре MOTOR

 

struct MOTOR // структура для хранения номеров pinов

{

int in1; // INPUT1 int in2; // INPUT2 int enable; // ENABLE1

};

// определяем порты, к которым подключены моторчики MOTOR MOTOR1 = { 13, 12, 5 };

MOTOR MOTOR2 = { 7, 8, 6 };

 

Контакты платы Arduino Контакты микросхемы L293D
5 9
6 1
7 2
8 7
12 10
13 15

 Подключение платы Arduino к драйверу двигателей L293D

 

Входы ENABLE1 и ENABLE2 используются для управления скоростью моторов с помощью широтно-модулированного сигнала (ШИМ):

 

analogWrite(MOTOR1.enable, speed);

где speed = 0 ... 254.

 

Экспериментально установлено, что при значении speed < 130 моторы не могут сдвинуть робота с места. Поэтому будем ориентироваться на минимальное значение speed = 150 (при этом значении робот сдвигается с места). Для увеличения/уменьшения скорости выберем значение шага, равное 20. Для удобства управления роботом создадим структуру текущего состояния моторов робота. Создадим также массив состояний моторов для всех возможных состояний робота . Здесь требуются некоторые пояснения.

 

Пусть состояние POZ12={m1,m2,d1}, т. е.:

 

 arrpoz[0][m1] — состояние входа in1 первого мотора;

 arrpoz[1][m1] — состояние входа in2 первого мотора;

 arrpoz[2][m1] — состояние входа enable первого мотора;

 arrpoz[3][m2] — состояние входа in1 второго мотора;

 arrpoz[4][m2] — состояние входа in2 второго мотора;

 arrpoz[5][m2] — состояние входа enable второго мотора.

 

Рассмотрим состояние POZ12={6,6,6} :

 

 arrpoz[0][6]=0; arrpoz[1][6]=0; arrpoz[2][6]=0;

 arrpoz[3][6]=0; arrpoz[4][6]=0; arrpoz[5][6]=0;

 

Рассмотрим состояние POZ12={10,10,10}:

 

 arrpoz[0][10]=1; arrpoz[1][10]=0; arrpoz[2][10]=210;

 arrpoz[3][10]=1; arrpoz[4][10]=0; arrpoz[5][10]=210.

 

В этом случае оба мотора крутятся в одну сторону — скорость 83 % (210/254) от максимальной, движение робота вперед.

 

Еще пример: состояние POZ12={10,7,10}:

 

 arrpoz[0][10]=1; arrpoz[1][10]=0; arrpoz[2][10]=210;

 arrpoz[3][7]=1; arrpoz[4][7]=0; arrpoz[5][7]=150.

 

Здесь первый мотор крутится вперед со скоростью 210, второй мотор крутится вперед со скоростью 150, т. е. обеспечивается поворот (достаточно крутой) вправо. Для увеличения крутизны нужно увеличивать разницу между значениями m1 и m2.

Для вращения робота на месте влево или вправо необходимо установить значения m1 и m2 на равном смещении от 6 в разные стороны — например, m1 = 2 и m2 = 10 (вращение вправо со скоростью 210) или m1 = 8 и m2 = 4 (вращение влево со скоростью 170). 

 

// состояние моторов робота

struct POZ // структура для хранения статусов моторов

{

int poz1; // позиция для 1 мотора int poz2; // позиция для 2 мотора

int direction12; // направление до поворота (позиция)

};

// массив возможных состояний моторов

// max down -> min down -> stop -> min up -> max up int arrpoz[9][15]={

// in1 первого мотора

{0,0,0,0,0,0,0,1,1,1,1,1,1},

// in2 первого мотора

{1,1,1,1,1,1,0,0,0,0,0,0,0},

// скорости (enable1) первого мотора

{250,230,210,190,170,150,0,150,170,190,210,230,250},

// in3 второго мотора

{0,0,0,0,0,0,0,1,1,1,1,1,1},

// in4 второго мотора

{1,1,1,1,1,1,0,0,0,0,0,0,0},

// скорости (enable2) второго мотора

{250,230,210,190,170,150,0,150,170,190,210,230,250},

// скорость++

{0,-1,-1,-1,-1,-1,0,1,1,1,1,1,0},

// скорость--

{-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,1},

// кружение влево-вправо

{12,10,8,6,4,2,0,-2,-4,-6,-8,-10,-12}

};

// начальная позиция робота

// 1,2 мотор - выключены POZ POZ12={6,6,6};

 

Разработка программы движений робота

 

Приступим к разработке программы движений робота по командам (при получении кодов) с ИК-пульта. Процедура loop() проверяет, получен ли код с ИК-пульта. Если получен, вызывается процедура ir_go(). Процедура изменяет значения переменных в структуре текущего состояния моторов робота POZ. На данной стадии, для отладки, будем выводить в монитор последовательного порта текущие действия робота.

Рассмотрим назначение переменной direction12 структуры POZ. При выборе движения робота вперед или назад (клавишами ↑ и ↓) по прямой и при увеличении/уменьшении скорости значение переменной direction равно значениям poz1 и poz2.

 

// обработка кода нажатия void ir_go(long kod)

{

switch(kod)

{

case FORWARD : // направление вперед Serial.print("forward\n"); POZ12.direction12=max(POZ12.direction12,8); POZ12.poz1=POZ12.direction12; POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case BACK : // направление назад Serial.print("back\n"); POZ12.direction12=min(POZ12.direction12,6); POZ12.poz1=POZ12.direction12; POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case SPEED_UP : // скорость++ Serial.print("speed++\n");

POZ12.direction12=POZ12.direction12+arrpoz[6][POZ12.direction12]; POZ12.poz1=POZ12.direction12;

POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case SPEED_DOWN : // скорость-- Serial.print("speed--\n");

POZ12.direction12=POZ12.direction12-arrpoz[7][POZ12.direction12]; POZ12.poz1=POZ12.direction12;

POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case LEFT : // влево Serial.print("left\n"); if(POZ12.direction12>6)

{

POZ12.poz1=POZ12.poz1-1;POZ12.poz1=max(POZ12.poz1,0);

POZ12.poz2=POZ12.direction12;

}

 

else

{ POZ12.poz1=POZ12.poz1+1;POZ12.poz1=min(POZ12.poz1,14);

POZ12.poz2=POZ12.direction12;

} go12(POZ12.poz1,POZ12.poz2);

break;

case RIGHT : // вправо Serial.print("right\n"); if(POZ12.direction12>6)

{

POZ12.poz2=POZ12.poz2-1;POZ12.poz2=max(POZ12.poz2,0);

POZ12.poz1=POZ12.direction12;

}

else

{ POZ12.poz2=POZ12.poz2+1;POZ12.poz2=min(POZ12.poz2,14);

POZ12.poz1=POZ12.direction12;

} go12(POZ12.poz1,POZ12.poz2);

break;

case CIRCLE_RIGHT : // кружение вправо Serial.print("circle_right\n"); POZ12.poz1=POZ12.direction12; POZ12.poz2=POZ12.direction12+arrpoz[8][POZ12.direction12]; go12(POZ12.poz1,POZ12.poz2);

break;

case CIRCLE_LEFT : // кружение влево Serial.print("circle_left\n"); POZ12.poz1=POZ12.direction12+arrpoz[8][POZ12.direction12]; POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case STOP : // стоп Serial.print("stop\n"); POZ12.poz1=0; POZ12.poz2=0;

POZ12.direction12=0; go12(POZ12.poz1,POZ12.poz2);

break; default: break;

}

}

 

Движение робота по линии в автономном режиме

 

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

<1> и <3> на ИК-пульте.

 

Для этого добавим в скетч две константы:

 

#define EXT 16 // "1" – переход в режим внешнего управления

#define LOCAL 1040 // "3" – переход в автономный режим

 

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

В автономном режиме робот будет пока непрерывно двигаться по черной линии, нарисованной на поверхности движения. Для обеспечения движения робота по этой линии применим датчики "черное-белое" типа OR-BWSENS

 

Датчики устанавливаются на робота. Высота датчиков от поверхности — 15 мм.

 

Для работы с датчиками используем Arduino-библиотеку PololuQTRSensors, которую можно скачать со страницы https://github.com/pololu/qtr-sensors-arduino. 

 

Итак, подключаем библиотеку к проекту:

 

// датчики черное-белое

#include <QTRSensors.h>

#define NUM_SENSORS 4 // кол-во сенсоров

#define TIMEOUT 2500 // 2500 мс

#define EMITTER_PIN QTR_NO_EMITTER_PIN

 

Прописываем константы: количество датчиков, время ожидания разрядки конденсаторов, параметр EMITTER_PIN.

 

Далее создаем экземпляр объекта.

Для цифровых:

QTRSensorsRC qtrrc((unsigned char[]) {B1,...,Bn},NUM_SENSORS, TIMEOUT,EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

где:

 B1, ..., Bn — пины Arduino для подключения сенсоров;

 NUM_SENSORS — количество сенсоров;

 TIMEOUT — время ожидания разрядки конденсатора датчика.

 

Примечание

"Принцип работы датчика: замыкаем на 500 мкс (для версии 1 датчика — на 2500 мкс) сигнальную линию датчика на землю, разряжая конденсатор. Делаем сигнальную линию входом для МК (т. е. перестаем ее подтягивать к «земле» или к питанию) и ждем сколько-то времени, пока через открытый, в зависимости от отражающей способности поверхности в спектре ИК-излучения и расстояния до поверхности, оптодатчик зарядится конденсатор; замеряем, что на выходе с датчика: 0 или 1" (из инструкции для датчиков OR-BWSENS).

 

 EMITTER_PIN — QTR_NO_EMITTER_PIN.

 

Далее в процедуре setup() — калибровка датчика:

for (i = 0; i < 400; i++)

{

qtrrc.calibrate();

}

 

И в основном цикле — считывание показаний датчиков:

 

unsigned char i;

for (i = 0; i < NUM_SENSORS; i++)

{

Serial.print(sensorValues[i] * 10 / 1001); Serial.print(' ');

}

 

Черная линия выдавала показания — 24 (sensorValues[i] * 10 / 1001), белый лист — 0–2.

 

Остается только реализовать движение по черной линии. Создаем два режима работы робота:

 внешнее управление;

 автономный (движение по линии).

 

Для этого добавляем для ИК-пульта две клавиши:

 

#define EXT 16 //"1" - переход во внешнее управление

#define LOCAL 1040 //"3" - автономный режим

 

И два псевдокода (при наезде на черную линию передним левым и передним правым датчиком):

 

#define LOCAL_LEFT 9997 // для поворота по QTR

#define LOCAL_RIGHT 9998 // для поворота по QTR

 

При срабатывании датчиков выдаем в основной цикл программы срабатывание псевдокодов, и программа ir_go() переводит их в движения.

 

Sketch code

 

// подключение библиотеки irremote

#include <IRremote.h>

//вход ИК-приемника int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN); decode_results results; unsigned long ir_dt, old_ir; long ir_kod;

unsigned long ir_time1, ir_time2;

// коды клавиш ИК-пульта (marmitek)

#define FORWARD 1936

#define BACK 3984

#define SPEED_UP 144 //ch+

#define SPEED_DOWN 2192 //ch-

#define LEFT 3472

#define RIGHT 1424

#define CIRCLE_LEFT 3216 //vol+

#define CIRCLE_RIGHT 1168 //vol-

#define STOP 2320 //0

#define EXT 16 //1

#define LOCAL 1040 //3

#define LOCAL_LEFT 9997 // для поворота по QTR

#define LOCAL_RIGHT 9998 // для поворота по QTR

 int local=0;

// состояние моторов робота

struct POZ // структура для хранения статусов моторов

{

int poz1; // позиция для 1 мотора int poz2; // позиция для 2 мотора

int direction12; // направление до поворота int qtr[4]; //

long millis1[4]; // для датчиков черное-белое фиксация появления белого

};

// моторы

struct MOTOR // структура для хранения номеров pin-ов, к которым подключены моторчики

{

int in1; // INPUT1 int in2; // INPUT2 int enable; // ENABLE1

};

// определяем порты, к которым подключены моторчики MOTOR MOTOR1 = { 13, 12, 5 };

MOTOR MOTOR2 = { 7, 8, 6 };

// начальная позиция робота

// 1,2 мотор - выключены

POZ POZ12={7,7,7,{0,0,0,0},{0,0,0,0}};

// массив возможных состояний моторов

// max down -> min down -> stop -> min up -> max up int arrpoz[9][17]={

// in1 первого мотора

{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},

// in2 первого мотора

{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},

// скорости (enable1) первого мотора

{250,230,210,190,170,150,130,0,130,150,170,190,210,230,250},

// in3 второго мотора

{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},

// in4 второго мотора

{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},

// скорости (enable2) второго мотора

{250,230,210,190,170,150,130,0,130,150,170,190,210,230,250},

// скорость++

{0,-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,1,0},

// скорость--

{-1,-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,1,1},

// кружение влево-вправо

{14,12,10,8,6,4,2,0,-2,-4,-6,-8,-10,-12,-14}

};

 

// датчики черное-белое

#include <QTRSensors.h>

#define NUM_SENSORS 4 // кол-во сенсоров

#define TIMEOUT 2500 // 2500 мс

#define EMITTER_PIN QTR_NO_EMITTER_PIN //

// выводы для датчиков

// перед левый 9, перед правый 4, зад левый 11, зад правый 10 QTRSensorsRC qtrrc((unsigned char[]) {4,9,10,11}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

void setup()

{

Serial.begin(9600); delay(500);

int i;

pinMode(13, OUTPUT);

digitalWrite(13, HIGH); // turn on LED to indicate we are in calibration mode for (i = 0; i < 400; i++) // make the calibration take about 10 seconds

{

qtrrc.calibrate(); // reads all sensors 10 times at 2500 us per read

(i.e. ~25 ms per call)

}

digitalWrite(13, LOW); // turn off LED to indicate we are through

with calibration

for (i = 0; i < NUM_SENSORS; i++)

{

Serial.print(qtrrc.calibratedMinimumOn[i]);

}

// print the calibration maximum values measured when emitters were on for (i = 0; i < NUM_SENSORS; i++)

{

Serial.print(qtrrc.calibratedMaximumOn[i]); Serial.print(' ');

}

Serial.println(); delay(1000);

// включить приемник irrecv.enableIRIn();

// прерывания для ИК ir_time1=0;ir_time2=0; attachInterrupt(0, get_ir_kod, FALLING);

// настраиваем выводы для моторов pinMode(MOTOR1.in1, OUTPUT); pinMode(MOTOR1.in2, OUTPUT); pinMode(MOTOR2.in1, OUTPUT); pinMode(MOTOR2.in2, OUTPUT);

 

// начальная позиция - робот стоит go12(POZ12.poz1,POZ12.poz2);

}

void loop()

{

// обработка кода нажатия if(ir_kod>0)

{

ir_go(ir_kod);

//Serial.println(ir_kod); ir_kod=0;

}

// если управление local - проверка датчиков if(local==1)

{

unsigned int position = qtrrc.readLine(sensorValues); qtrrc.read(sensorValues);

for (int i = 0; i < NUM_SENSORS; i++)

{

int qtrv=0; if(sensorValues[i]*10/1001==24) qtrv=1; if(POZ12.qtr[i]!=qtrv)

{POZ12.qtr[i]=qtrv;POZ12.millis1[i]=millis();}

} if(POZ12.qtr[0]==1)

ir_kod=LOCAL_RIGHT; else if(POZ12.qtr[1]==1) ir_kod=LOCAL_LEFT;

else ir_kod=LOCAL; if(ir_kod>0)

{detachInterrupt(0);local=0; ir_go(ir_kod);

local=1;attachInterrupt(0, get_ir_kod, FALLING);}

}

delay(100);

}

// получить код, переданный с ИК-пульта void get_ir_kod()

{

detachInterrupt(0); // отключить прерывание 0 if (irrecv.decode(&results))

{

if (results.value > 0 && results.value < 0xFFFFFFFF)

{

ir_dt = results.value;

 

ir_time2=millis(); ir_kod=ir_dt; Serial.println(ir_kod);

}

irrecv.resume();

}

attachInterrupt(0, get_ir_kod, FALLING);

}

// переустановка моторов void go12(int poz1,int poz2)

{

digitalWrite(MOTOR1.in1, arrpoz[0][poz1]); digitalWrite(MOTOR1.in2, arrpoz[1][poz1]); analogWrite(MOTOR1.enable, arrpoz[2][poz1]); digitalWrite(MOTOR2.in1, arrpoz[3][poz2]); digitalWrite(MOTOR2.in2, arrpoz[4][poz2]); analogWrite(MOTOR2.enable, arrpoz[5][poz2]);

}

// обработка кода нажатия void ir_go(long kod)

{

if(kod!=EXT && local==1) return;

switch(kod)

{

case LOCAL : // внешнее управление включить POZ12.direction12=10;POZ12.poz1=10;POZ12.poz2=10; go12(10,10);local=1;

break;

case LOCAL_LEFT : // POZ12.direction12=8;POZ12.poz1=7;POZ12.poz2=8; go12(POZ12.poz1,POZ12.poz2);

break;

case LOCAL_RIGHT : // по датчику вправо POZ12.direction12=8;POZ12.poz1=8;POZ12.poz2=7; go12(POZ12.poz1,POZ12.poz2);

break;

case EXT : // внешнее управление включить local=0;

break;

case FORWARD : // направление вперед POZ12.direction12=max(POZ12.direction12,8); POZ12.poz1=POZ12.direction12; POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

 

case BACK : // направление назад POZ12.direction12=min(POZ12.direction12,6); POZ12.poz1=POZ12.direction12; POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case SPEED_UP : // скорость++ POZ12.direction12=POZ12.direction12+arrpoz[6][POZ12.direction12]; POZ12.poz1=POZ12.direction12;

POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case SPEED_DOWN : // скорость-- POZ12.direction12=POZ12.direction12-arrpoz[7][POZ12.direction12]; POZ12.poz1=POZ12.direction12;

POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case LEFT : // влево if(POZ12.direction12>7)

{

POZ12.poz1=POZ12.poz1-1;POZ12.poz1=max(POZ12.poz1,0);

POZ12.poz2=POZ12.direction12;

}

else if(POZ12.direction12<7)

{ POZ12.poz1=POZ12.poz1+1;POZ12.poz1=min(POZ12.poz1,14);

POZ12.poz2=POZ12.direction12;

} go12(POZ12.poz1,POZ12.poz2);

break;

case RIGHT : // вправо if(POZ12.direction12>7)

{

POZ12.poz2=POZ12.poz2-1;POZ12.poz2=max(POZ12.poz2,0);

POZ12.poz1=POZ12.direction12;

}

else if(POZ12.direction12<7)

{ POZ12.poz2=POZ12.poz2+1;POZ12.poz2=min(POZ12.poz2,14);

POZ12.poz1=POZ12.direction12;

} go12(POZ12.poz1,POZ12.poz2);

break;

case CIRCLE_RIGHT : // кружение вправо POZ12.poz1=POZ12.direction12; POZ12.poz2=POZ12.direction12+arrpoz[8][POZ12.direction12];

 

go12(POZ12.poz1,POZ12.poz2);

break;

case CIRCLE_LEFT : // кружение влево POZ12.poz1=POZ12.direction12+arrpoz[8][POZ12.direction12]; POZ12.poz2=POZ12.direction12; go12(POZ12.poz1,POZ12.poz2);

break;

case STOP : // стоп POZ12.poz1=7; POZ12.poz2=7;

POZ12.direction12=7; go12(POZ12.poz1,POZ12.poz2);

break; default: break;

}

}

 

Плата расширения L293D, ИК-датчик VS1838B, TFT LCD, Модем M590E GSM GPRS, "монитор TFT LCD, датчик движения HC-SR501, ИК-пульт дистанционного управления, Радиомодуль NRF24L01, SD Card Module, Звуковой модуль, 5-axis stepper motor driver, Шаговый двигатель, Модем M590E GSM GPRS, 5-axis stepper motor driver, Часы реального времени DS 3231/DS 1307, терморегулятор W1209 DC, Релейный модуль, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, датчик движения HC-SR501, Передатчик и приемник в диапазоне RF 433 Mhz, Блок питания, L293D, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, Датчики контроля температуры, Радиомодуль NRF24L01, OKI 120A2, Rotary Encoder, SD Card Module, Беспроводной пульт дистанционного управления, Микросхема контроллера коллекторного электродвигателя, Модуль Bluetooth HC-06,, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Mini 360 на схеме LM2596, MP3-TF-16P, L293D, Модуль LCD монитора, Инфракрасные датчики расстояния, Часы реального времени, USB Host Shield, HC-SR501, Cветочувствительный датчик сопротивления, блок питания Mini 360 на схеме LM2596, ЖК-дисплей TFT дисплей, Контроллер L298N, HC-SR501, Модуль MP3 Player WTV020, GSM GPRS, Сервоприводы, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Модуль Wi-Fi ESP8266-12E, Инфракрасные датчики расстояния, Card Module, Ультразвуковые дальномеры HC-SR04, Блок питания, Карта памяти SD, Mini 360, Ethernet shield, L293D, блок питания Mini 360 на схеме LM2596, Радиомодуль, датчик температуры DS18B20, ИК-пульт дистанционного управления, USB конвертер UART, ИК-пульт, Антена для модуля WiFi, Ethernet shield, Модуль блока питания XL6009, Микросхема контроллера коллекторного электродвигателя, Модуль качества воздуха MQ-135, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, SD Card Module, Радиомодуль NRF24L01, двигатель OKI, 5-axis stepper motor driver, L293D, TB6560, Драйвер шагового двигателя TB6600, Шаговый двигатель, Модуль камеры, Блок питания, L293D, блок питания Mini 360 на схеме LM2596, 5axis mach3 interface, Карта памяти SD, Ethernet shield, Контроллер L298N, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, Модуль LCD монитора LCD1602, Шаговый двигатель OKI 120A2, Шаговый двигатель, Шаговый двигатель.

РУБИКОН Группа «Мозаика», ИЕРОГЛИФ ГРУППА «ПИКНИК», В ПОЛЁТ ГРУППА «ТЯЖЕЛЫЙ ДЕНЬ», Группа «Алиса», Бенни Гудмен, Равноденствие ГРУППА «АКВАРИУМ», Элтон Джон Твоя песня, Демон Группа «Август», Deep Purple – The House Of Blue Light, «Лед Зеппелин» Led Zeppelin, «Акцепт», Doors, «Металлика», АНСАМБЛЬ „UB 40", группа «Зоопарк», рок-группа «ЗОДИАК», «Браво», «Кино», Rolling Stones «Роллинг стоунз», РОК-ГРУППА «МАШИНА ВРЕМЕНИ»,«Кокто твинз», Группа «ДИАЛОГ», Bill Evans, Джимми Лансфорд, Флетчера Хендерсона, Дюк Эллингтон, Каунт Бейси, АНСАМБЛЬ "THE MOODY BLUES", Элвис Пресли, "Юнона" и "Авось" , Дж. Верди Реквием G.Verdi Requiem Mass, Элтон Джон, Реджинальд Кеннет Дуайт, АББА, ABBA, “Deep Purple”, «ЧЕЛОВЕК С БУЛЬВАРА КАПУЦИНОВ», “Rolling Stone”, Instrumrutal rock group Zodiac,‘‘Long Tall Ernie and The Shakers”, “The Beatles”, "Tom Fcgerty and The Blue Velvets", "Creedruce Clearwater Revival","Greru River" "Bayou Country", "Willy and The Poorboys", Varnishing Day Songs on Ilya Reznik's lirics , Leo Sayer ЛЕО СЕЙЕР, Boney M,"Waiting For The Sun", Doors «ДОРЗ», "Piper At The Gates Of Dawn", Led Zeppelin ? «ЛЕД ЗЕППЕЛИН», Rolling Stones , "Юнона" и "Авось" Опера Либретто, «РОЛЛИНГ СТОУНЗ», Modern talking,"Aftermath", «ДОМ ГОЛУБОГО СВЕТА», "Out Of Our Heads", Ricchi E Poveri, PINK FLOYD «Пинк Флойд», Vladimir Kuzmin, ПОЛ МАККАРТНИ Paul McCartney, «TWruTY FLIGHT ROCK», Creedruce Clearvater revival Traveling band,«LAWDY. MISS CLAWDY», «BRING IT ON HOME TO ME», Light My Fire,«DON'T GET AROUND MUCH ANY MORE», МУЗЫКАЛЬНЫЙ ТЕЛЕТАЙП-3,«I'М GONNA BE A WHEEL SOME DAY», МОДЕРН ТОКИНГ,«AINT THAT A SHAME», «THAT'S ALL RIGHT (МАМА)», АНСАМБЛЬ UB 40, «JUST BECAUSE», МИГЕЛЬ РАМОС, «SUMMERTIME», "АНСАМБЛЬ "THE MOODY BLUES", «CRACKIN UP», ТНЕ СОММОDORES, «MIDNIGHT SPECIAL», АННА ГEРМАН, Deep Purple «ДИП ПЁРПЛ», „Deep Purple in Rock", Андрей Миронов, Олег Табаков, Михаил Боярский, Николай Караченцов, Альберт Филозов, Олег Анофриев, Игорь Кваша, Леонид Ярмольник, ИЛЬЯ РЕЗНИК , Резанов Николай Петрович, ВЛАДИМИР ВЫСОЦКИЙ, Роджер Уотерс, АЛЕКСАНДР РОЗЕНБАУМ, Ричард Райт и Ник Мэйсон, ВЛАДИМИР КУЗЬМИН, Элвис Аарон Пресли, Leo Sayer, АДРИАНО ЧЕЛЕНТАНО, Билл Эванс, Клаудия Мори....

и это еще не конец.

С уваженим Dron!