Собираем роботпылесос на Arduino Основные алгоритмы движения
Собираем робот-пылесос на Arduino
Шаг первый. Создаем поворотную платформу для робота
Для своей первой самоделки автор использовал танк из игры «Танковый бой», из игрушки были выброшены все лишние детали, остался только корпус, а также двигатели и колеса. После этого был установлен Arduino UNO, драйвер двигателей и ультразвуковой дальномер. В качестве источника питания использовались три литиевые батареи по 3.7 В.
Такая конструкция имела ряд минусов. К примеру, из-за того, что колеса находились сзади платформы, у робота возникали проблемы при повороте, робот часто буксовал.
Также из-за очень большой скорости передвижения робот порой не успевал реагировать на сигналы дальномера и врезался.
Все проблемы были решены путем сборки новой платформы из картона. Для этого нужно вырезать 2 круга диаметром 30 см, а затем склеить их поперек волокон. В итоге получается довольно прочная конструкция на изгиб. Что касается моторчиков и редукторов, то они были взяты из предыдущей самоделки.
Шаг второй. Создаем сенсоры
Изначально робот ориентировался за счет дальномеров, но автору их работа не понравилась и в итоге было решено от их избавиться. На их смену пришли контактные бампера, при этом робот стал вести себя адекватнее, да и вложений при этом требуется меньше.
Контактные бампера изготавливаются очень просто. Нужно взять картон и на одну его сторону приклеить фольгу, это будет первым контактом. К этой фольге нужно подать напряжение +5 В. Напротив платформы нужно установить изогнутый проводок от витой пары, он подключается через резистор, благодаря этому ложных срабатываний будет меньше. Когда робот будет во что-то врезаться, то будут замыкаться контакты, и затем электроника будет разворачивать робота в другом случайном направлении.
Шаг третий. Делаем пылесос и пылесборник
Благодаря таким материалам как картон и скотч можно быстро собрать практически любой макет. Для работы турбины используется источник питания в 18 Вольт, напрямую от батареи. При такой нагрузке кулеры греются, но работают.
Для изготовления турбины берется кулер от компьютера и затем от него отламываются все лопасти. Далее на кулер крепится турбина от пылесоса, ее нужно приклеить суперклеем. Самое главное здесь — приклеить точно, не должно быть дисбаланса. Без нагрузки и питании 18 Вольт кулер выдает порядка 2600 RPM, что создает отличную тягу. В заключении вся конструкция собирается так, как можно увидеть на фото и после этого робота можно испытывать.
Что касается алгоритма работы, то он очень простой. Если робот во что-то врезается, он затем разворачивается на случайный угол.
В будущем автор планирует сделать платформу из фанеры, чтобы она была прочнее. Еще в планах установка двух щеток спереди для более эффективной сборки мусора. Выдуваемый воздух можно направить под платформу, чтобы пыль собиралась эффективнее.
Источник
Робот, ездящий по линии под управлением Arduino
В данной статье будет описан процесс создания робота, ездящего по линии. Эта задача является классической, идейно простая, она может решаться много раз, и каждый раз вы будете открывать для себя что-то новое. Решение этой задачи и реализация полученного решения позволяют приобрести необходимые начальные навыки для дальнейшего совершенствования в робототехнике.
Существует множество подходов для решения задачи следования по линии. Выбор одного из них зависит от конкретной конструкции робота, от количества сенсоров, их расположения относительно колёс и друг друга.
В нашем примере будет собран робот на лёгкой платформе с двумя колёсами и двумя датчиками линии, расположенными на днище робота перед колёсами.
В результате выглядеть он будет так:
Что понадобится
Для нашего примера понадобятся следующие детали:
Вообще говоря, лучше было бы использовать NiMH-аккумуляторы: они лучше отдают ток и значительно дольше держат напряжение, но для целей этого проекта одной батарейки на 9 В вполне хватило.
Собираем робота
Сначала соберём робота, установим всю механику и электронику.
Собираем платформу
Для начала прикрепим колёса к моторам.
Затем с помощью пластиковых П-образных креплений прикручиваем моторчики к платформе. Обратите внимание на взаимное расположение крепления и моторчики: в креплении есть небольшие углубления, так что если всё соединить правильно, то моторчики будут крепко держаться и никуда не выскочат.
Теперь крепим балансировочный шар.
Отлично! Платформа собрана. Если вам кажется, что колёсам отведено слишком мало места и они трутся о платформу, то скорее всего вам нужно посильнее надавить на колёса, чтобы они плотнее сели на вал мотора.
Крепим сенсоры
Закрепим их, как показано на фото:
Можно было бы выбрать и другое место. Это могло бы сделать контроль проще или сложнее, а самого робота более или менее эффективным. Оптимальное расположение — вопрос серии экспериментов. Для этого проекта просто был выбран такой способ крепления.
Крепим Arduino
Arduino закрепим с противоположной стороны двумя винтиками и гайками.
Опять же, можно выбрать и другое место. Например над колёсами, если приподнять Arduino на латунных стойках. Это изменило бы положение центра масс и повлияло бы на эффективность робота в лучшую или худшую сторону.
Крепим Motor Shield и соединительные провода
Установим Motor Shield на Arduino и подсоединим соединительные провода. Обратите внимание, чтобы соотвествовать программному коду из примера ниже, моторчики соединены с Motor Shield так: правый — к клеммам M1 с прямой полярностью (плюс к плюсу), а левый — к M2 с обратной (плюс к минусу).
В этом проекте, для экономии времени концы соединительных проводов просто скручены с контактами моторов. При работе «начисто» стоит жёстко припаять провода к моторам.
Крепим Troyka Shield
Присоединяем сверху Troyka Shield и подключаем датчики к 8 и 9 цифровым контактам. В итоге получаем следующую конструкцию:
Программирование
Теперь напишем программу, которая заставит собранную конструкцию двигаться по нарисованной линии. В проекте мы будем использовать чёрную линию, напечатанную на белых листах бумаги.
Основная идея алгоритма
Пусть у нас усть белое поле, и на нём чёрным нарисован трек для нашего робота. Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое.
На прямой робот должен пропускать трек между сенсоров, то есть оба сенсора должны показывать единички.
При повороте траектории направо, правый сенсор наезжает на трек и начинает показывать логический ноль. При повороте налево, ноль показывает левый сенсор.
Таким образом получаем простую систему с тремя состояниями:
На вход системы поступает информация с сенсоров. Получаем следующую логику переходов:
Реализация на Arduino
Проблема инертности и её решение
Однако если выставить скорость моторов побольше, мы столкнёмся со следующей проблемой: наш робот будет вылетать с трека, не успевая отреагировать на поворот. Это связано с тем, что наши моторчики не умеют тормозить мгновенно.
В этом легко убедиться поставив следующий эксперимент: с заданной скоростью робот будет двигаться по поверхности, и в некоторый момент будет установлена нулевая скорость и измерен тормозной путь робота. Пусть робот разгоняется по монотонной поверхности и тормозится при фиксировании импровизированной стоп-линии.
Эксперимент проведём для разных скоростей. Код программы для эксперимента таков:
На той поверхности, на которой проводился эксперимент, были получены следующие результаты:
Таким образом, начиная с некоторого момента у нашего робота нет никакой возможности успеть среагировать и остаться на треке.
Что можно сделать?! После того, как сенсоры улавливают поворот, можно остановиться и вернуться назад на некоторое расстояние, зависящее от скорости перед остановкой. Однако мы можем отдать команду роботу ехать с какой-то скоростью, но не можем приказать ему проехать какое-то расстояние.
Для того, чтобы понять зависимость расстояния при заднем ходе от времени, был проведён ещё один замер:
На скорости 50, например, робот проделывал путь, зависящий от времени следующим образом:
Полученные две зависимости были линейно аппроксимированы, затем была выведена формула зависимости времени, которое надо двигаться назад, от скорости перед остановкой.
Обратим внимание на то, что у вас значения могут оказаться другими: из-за особенностей сборки либо из-за поверхности, поэтому в общем случае лучше провести все измерения самостоятельно.
Адаптивное поведение
Перед финальным экспериментом произведём ещё несколько поправок.
Во-первых, нам необязательно давать команду ехать назад перед каждым поворотом, как мы помним, на маленькой скорости робот прекрасно справляется и без этого. К тому же лучше ему двигаться не прямо назад, а немного поворачивая, всё-таки робот находится перед поворотом.
Во-вторых, нам стоит различать состояния робота: когда он движется по прямой, и ничто ему не мешает ускоряться; и когда робот входит в поворот. В первом случае действительно будем увеличивать скорость робота для более динамичного прохождения трека, во втором случае будем сбрасывать скорость до значения, достаточного для успешного прохождения поворота, и будем держать эту скорость ещё какое-то время.
В итоге наш код будет выглядит следующим образом:
Результат
Что дальше?
Представленный алгоритм оставляет множество возможностей для улучшения и оптимизации. Скорость поворота можно так же менять адаптивно. Можно добавить контроль заноса. Можно поиграть с расположением сенсоров и центром масс. В конце концов можно получить непобедимого на треке робота.
Нет ничего лучше, чем обставить оппонента на секунду-другую.
DIY: Несложный робот пылесос под Arduino своими руками. Пошаговая инструкция по изготовлению
Популярность автоматизированных домашних уборщиков с каждым днем возрастает. Не исключение, роботы-пылесосы для сухой уборки, способные поддерживать чистоту пола без вашего вмешательства. Принцип работы этих устройств очень прост и схож на прицип работы ручного пылесоса, главным отличием является наличие микроконтроллера, набора датчиков для самостоятельной работы, подзарядки и ориентировании в пространстве. Об этом мы ранее описывали в целой статье, специально посвященной роботизированным уборщикам полов.
Если вы хотите узнать, как он устроен и построить его собственными руками, представляем вашему вниманию инструкцию по сборке простейшего робота-пылесоса из подручных средств.
Материалы и компоненты:
Для создания робота-уборщика необходимы:
- плата Arduino;
- плата контроля электромоторов Arduino motor shield;
- два двигателя с коробкой передач (3 вольта, приблизительно 100 оборотов в минуту);
- два колеса или две алюминиевые банки;
- турбина-кулер компьютерного охлаждения (5 В или 12 Вольт);
- аккумулятор для питания 5 вольт;
- пластина для сбора радиоэлементов и провода;
- большой круглый пластиковый контейнер — для корпуса;
- небольшой пластиковый контейнер — для мусоросборника;
- картон;
- термоклей;
- магниты.
Шаг 1: Программный код и скетч:
Для правильной и точной работы в роботе-пылесосе существует «сердце» в виде микроконтроллера Arduino, программируемого с помощью домашнего ПК и необходимого программного обеспечения.
Скетч для работы робота-пылесоса загружается на плату с помощью программы Arduino IDE. Ниже программный код.
/*
Program for controlling a robot with two motors.
The robot turns when motors changes their speed and direction.
Front bumpers on left and right sides detect obstacles.
Ultrasonic sonars can be connected to analog inputs (tested on LV-MaxSonar-EZ1):
— put pins in array sonarPins in following order: left, right, front, others..
Examples:
1. only left and right sonars connected to pins 2 and 3: sonarPins[] = <2,3>
2. left, right and front sonars connected to pins 2, 3 and 5: sonarPins[] = <2,3,5>
3. only front sonar connected to pin 5: sonarPins[] = <-1,-1,5>
4. only left sonar connected to pin 2: sonarPins[] = <2>
5. only right sonar connected to pins 3: sonarPins[] = <-1,3>
6. 5 sonars connected to pins 1,2,3,4,5: sonarPins[] = <1,2,3,4,5>
Motor shield is used to run motors.
*/
const int Baud = 9600; //UART port speed
//Sonar properties
int sonarPins[] = <1, 2>;//Analog Pin Nums to sonar sensor Pin AN
const long MinLeftDistance = 20; //Minimum allowed left distance
const long MinRightDistance = 20; //Minimum allowed right distance
const long MinFrontDistance = 15; //Minimum allowed front distance
const int SamplesAmount = 15;//more samples — smoother measurement and bigger lag
const int SonarDisplayFrequency = 10; //display only one of these lines — not all
int sonarDisplayFrequencyCount = 0;
const long Factor = 2.54 / 2;
long samples[sizeof(sonarPins)][SamplesAmount];
int sampleIndex[sizeof(sonarPins)];
//right side
const int pinRightMotorDirection = 4; //this can be marked on motor shield as «DIR A»
const int pinRightMotorSpeed = 3; //this can be marked on motor shield as «PWM A»
const int pinRightBumper = 2; //where the right bumper is connected
//left side
const int pinLeftMotorDirection = 7; //this can be marked on motor shield as «DIR B»
const int pinLeftMotorSpeed = 6; //this can be marked on motor shield as «PWM B»
const int pinLeftBumper = 8; //where the right bumper is connected
//uncomment next 2 lines if Motor Shield has breaks
//const int pinRightMotorBreak = PUT_BREAK_PIN_HERE; //this can be marked on motor shield as «BREAKE A»
//const int pinLeftMotorBreak = PUT_BREAK_PIN_HERE; //this can be marked on motor shield as «BREAKE B»
//fields
const int turnRightTimeout = 100;
const int turnLeftTimeout = 150;
//set in counter how long a motor is running back: N/10 (in milliseconds)
int countDownWhileMovingToRight;
int countDownWhileMovingToLeft;
//Initialization
void setup() <
Serial.begin(Baud);
initPins();
//uncomment next 4 lines if Motor Shield has breaks
// pinMode(pinLeftMotorBreak, OUTPUT);
// pinMode(pinRightMotorBreak, OUTPUT);
// digitalWrite(pinLeftMotorBreak, LOW); //turn off breaks
// digitalWrite(pinRightMotorBreak, LOW); //turn off breaks
runRightMotorForward();
runLeftMotorForward();
startMotors();
>
//Main loop
void loop() <
delay(10);//repeat every 10 milliseconds
>
//—————————————————
void initPins() <
pinMode(pinRightMotorDirection, OUTPUT);
pinMode(pinRightMotorSpeed, OUTPUT);
pinMode(pinRightBumper, INPUT);
pinMode(pinLeftMotorDirection, OUTPUT);
pinMode(pinLeftMotorSpeed, OUTPUT);
pinMode(pinLeftBumper, INPUT);
for(int i = 0; i MinRightDistance //checks if the minimum allowed right distance is not reached
&& measureDistance(2, ‘F’) > MinFrontDistance)//checks if the minimum allowed front distance is not reached
return;
if(checkCounterIsNotSet(countDownWhileMovingToRight))//if the counter is not yet counting down
runRightMotorBackward();//run the right motor backward
countDownWhileMovingToRight = turnRightTimeout;//set the counter to maximum value to start it counting down
>
void verifyAndSetLeftSide() <
if(checkBumperIsNotPressed(pinLeftBumper) //checks if left bumper has NOT been pressed
&& measureDistance(0, ‘L’) > MinLeftDistance //checks if the minimum allowed left distance is not reached
&& measureDistance(2, ‘F’) > MinFrontDistance)//checks if the minimum allowed front distance is not reached
return;
if(checkCounterIsNotSet(countDownWhileMovingToLeft))//if the counter is not yet counting down
runLeftMotorBackward();//run the right motor backward
countDownWhileMovingToLeft = turnLeftTimeout;//set the counter to maximum value to start it counting down
>
bool checkCounterIsNotSet(int counter) <
return counter = sizeof(sonarPins) — 1 || sonarPins[pinIndex] = SamplesAmount)
sampleIndex[pinIndex] = 0;
samples[pinIndex][sampleIndex[pinIndex]] = value;
return true;
>
long calculateAvarageDistance(int pinIndex) <
long average = 0;
for(int i = 0; i
Шаг 2: Монтирование деталей:
Для крепления сервоприводов с колесами, кулера, плат управления, аккумулятора и другого используется картонная основа. Турбина и пластиковый контейнер (мусоросборник), с проделанным предварительно отверстием, прочно склеивается между собой и крепится на картон. Контейнер имеет отверстие для выдуваемого воздуха, на которое наклеена специальная синтетическая ткань, служащая фильтром.
Последовательно склеиваем кулер с сервоприводами, затем на сервоприводы клеим картонную площадку, на которой располагаются платы Arduino и батарея питания. Чтобы сделать колеса, необходимо отрезать нижнюю и верхнюю часть алюминиевых банок, склеить их между собой, а затем прочно закрепить на валу сервопривода.
В передней части монтируются металлические пластины (функция подвижного бампера), при замыкании которых сигнал поступает в плату управления электродвигателями Arduino motor shield, после чего сервоприводы начинают вращаться в другую сторону, изменяя направление движения робота.
Шаг 3: Установка корпуса:
При установке аккумуляторной батареи и подключении всех элементов конструкции с помощью проводов, необходимо обеспечить устройство прочным корпусом. Как раз таки для этого используется большой круглый контейнер. Для действия контактов, предотвращающих столкновение и застревание, делаем в контейнере специальные надрезы. Чтобы корпус был легкосъемным и прочно держался на механической части, используем восемь магнитов (при желании можно больше), по четыре приклеенных на самом контейнере и на внутренней части пылесоса соответственно.
Прекрасный прототип робота-пылесоса, сделанного своими руками. Не беря во внимание отсутствие дополнительных датчиков навигации и базы автоматической подзарядки, данный аппарат за пол часа работы вполне самостоятельно может собрать мусор, пыль и грязь на вашей кухне или в небольшой комнате. Его конструкция не представляет большой сложности, а стоимость и доступность деталей не вызывает сомнения. Все дело в творческом подходе. Вы можете менять элементы конструкции по вашему усмотрению, добавлять или убирать лишние элементы, модернизируя свой аппарат. Желаем приятно провести время, создавая свой робот для сухой уборки полов у вас дома.
Самодельный Робот Пылесос На Ардуино
самодельный робот пылесос на ардуино
Робот пылесос — Часть1: Механика
Наверное, каждый, кто только начинает по-настоящему увлекаться робототехникой, электроникой или программирование, проходя сложный путь изучения сопутствующих технологий, надеется в будущем применить накопленные знания для работы над серьёзным и интересным проектом.
Я вот, например, почитав робофорум. решил собрать робот пылесос. Причина такого выбора не столько в полезности данного устройства, сколько в том что, разрабатывая его, можно сконцентрироваться на конкретной задаче: робот способный автономно убирать мусор при минимальном обслуживании.
Данная статья не является подробным описанием по сборке и настройке робота. В ней я, главным образом, хотел бы изложить свой опыт, полученный во время выполнения данной работы.
Из всей механики робота пылесоса особую сложность в проектировании и изготовлении представляет мусороуборочный узел.
-Занимать как можно меньше места, но при этом иметь вместительный контейнер для мусора.
-Хорошо убирать загрязнения на любых поверхностях, но при этом обладать низким энергопотреблением и уровнем шума.
Прежде чем удалось добиться выполнения всех этих запросов, было перепробовано множество различных вариаций компоновки узла.
Макеты мусороуборочных узлов.
В конце — концов, остановился на схеме: широкая боковая щётка + пылесос. Радиальная щётка, расположенная с правой стороны, загребает мусор к жерлу пылесоса, расположенному по центру. Горизонтально-цилиндрическую щётку, как у Румбы, решил не ставить, так – как она лишь незначительно увеличивает качество уборки, но при этом сильно осложняет конструкцию жерла пылесоса. Устройство пылесосящего узла представлено на фото ниже.
Однако возникает вопрос: Где взять турбину и двигатель для пылесоса?
Можно спаять турбину из стеклотекстолита и жести
Турбина из жести.
Можно взять готовую турбину от большого пылесоса, предварительно обрезав её на токарном станке.
Готовая турбина, обрезанная на токарном станке до нужного диаметра(вентилятор от компьютера для сравнения).
А ещё её можно купить, в виде дешёвого китайского автомобильного пылесоса.
Не сочтите за рекламу, но рекомендую брать именно этот пылесос(kioki), так как в нём гарантировано правильная турбина с мощным двигателем и удобным краплением (при цене, в среднем, 500р). Хотя, что касается двигателя – то его лучше заменить. У стандартного потребление порядка 3А, при замене на двигатель QX-RS-385-2073 с потреблением 1.2А, мощность всасывания падает незначительно, зато робот начинает меньше шуметь и дольше бегает без подзарядки. Что касается самодельных турбин, они хоть и хорошо всасывают, но их довольно сложно отцентрировать так чтобы не было вибрации.
Боковая щётка собрана из двигателя от магнитофона, подключённого к оси с трещоткой (вынул из игрушечного шуруповёрта) через червячную передачу. Кисточки вынуты из половой швабры, и закреплены на диске из стеклотекстолита с помощью секундного клея.
В качестве приводных моторов служат два 25милиметровых моторредуктора, наверное, здесь нужно что-то более подходящее, например переделанные под постоянное вращение сервоприводы, но я поставил то что было под рукой.
Готовых колёс нужного размера не нашлось, поэтому пришлось вырезать их 10милеметровой фанеры и обклеить теплоизоляционной лентой, для лучшего сцепления с поверхностью. Отверстия в колесе – для энкодеров, хотя в конечном счёте я отказался от их применения из-за низкой точности.
Мотоблоки желательно ставить на независимую подвеску. В данной модификации робота я решил проверить, действительно ли она нужна, установив двигатели без подвески, в результате возникли проблемы при заезде на толстый ковёр. Оси двигателей должны совпадать диаметром окружности робота, так будет проще реализовать развороты на месте.
Датчик соударений(далее бампер), сделан из двух переключателей и подвешенной на них полоске из пластмассы согнутой полукругом.
По нормальному бампер должен закрывать собой всю морду робота снизу доверху, но так-так вся мебель у меня одной высоты, то я с этим заморачиваться не стал.
Механика робота в собранном виде.
Для проверки механической части робота была собрана следующая, простая, схема управления:
Робот пылесос — Часть2: Электроника и программа
В конце первой части статьи была представлена электронная схема простого управляющего алгоритма. В этой части будет рассмотрена электронная и программная составляющая системы управления робота, на основе микроконтроллера.
Плата управления построена на микроконтроллере atmega16, изначально она разрабатывалась, как универсальный модуль, поэтому оказалось плохо защищена от помех электродвигателя турбины. Проблема решилась экранированием проводов двигателя и установкой на него конденсатора в 0.1мкф, также необходимо кинуть вывод RESET контроллера прямо (без резистора) на +5v, это позволяет избавиться от произвольно сброса.
Драйвер двигателей собран на микросхеме L298, по стандартной схеме.
Плата драйвера двигателей.
Остальная электроника и органы управления собраны на макетной плате.
Общая электронная схема.
Как вы можете видеть, на схеме нет устройства для контроля заряда аккумулятора и сенсоров для поиска зарядной станции. Всё это было в прошлой модификации робота и достаточно неплохо работало, но так-так получилось всё немного кривовато и требует доработки, то описывать в данной статье эти недостающие элементы я не буду. Однако, чтобы не быть голословным, вот вам видео поиска ЗС, роботом прошлой модификации.
Наверное, самая интересная часть всей работы – это создание алгоритма и написание программы управления роботом.
Алгоритм уборки разделён на 4 режима:
•Движение вдоль стены
Разберём каждый из них по отдельности.
Здесь всё просто, приводные двигатели выключены, турбина и щётка тоже, индикатор мигает с низкой частотой, никакой реакции на срабатывание бампера, по нажатию кнопки — переход на следующий режим.
Данный алгоритм хорош для комнат с минимальным количеством мебели. После обнаружения препятствия робот переходит на следующий режим, так как этим препятствием, скорее всего, окажется стена, логично было бы сделать переход на режим движения вдоль стены.
На блок-схеме, проверка наличия препятствий дана условно, в программе же она производится постоянно, а не один раз за итерацию.
Движение вдоль стены
По-моему это самый нужный алгоритм в роботе уборщике, так как большая часть мусора и пыли скапливается именно около стен. На первом этапе робот двигается вперед, до тех пор, пока не обнаружит препятствие, а затем переходит к движению возле него. Так как этим препятствием может оказаться не только стена, а вообще что угодно (например ножка стула), то работа режима, дабы исключить зацикливание, должна быть ограничена по времени.
Алгоритм был предложен на робофоруме и опробован в среде logo. Является хорошей заменой случайному блужданию, в чём можно убедиться, прогнав алгоитм в logo на модели своей комнаты:
Конечно, в реальных условиях всё не так идеально, но зато из сенсоров, для данного алгоритма уборки, нужны только датчики соударений.
Приводить блок-схему этого алгоритма не буду, на робофоруме, есть код на logo.
Программа писалась на чистом С без asm вставок.
Код распилен на несколько частей:
main.c -документ с main функцией и главным циклом.
Periphery.с -аппаратные зависимости, настройка периферии контролера.
Action.c -функциональная часть программы
util/drivers.c -функции управления устройствами
util/timer.c -служба таймеров
Содержит только одну функцию — Periphery() в которой прописывается настройка периферии контроллера. Функция вызывается единожды, из главной функции программы.
Содержит макросы для управления уборочным узлом:
А также функцию управления приводными двигателями:
*_vector – направление вращение двигателя: 1-вперед, 0-стоп, -1-назад
*_speed – скорость вращения, число от 0 до 10
Внутри две функции:
Функция управления временными задержками. Вызывается только по прерыванию с таймера-счётчика2, каждую 1/1000сек.
Единственным параметром передаётся указатель на переменную, от которой будет отсчитываться время. Переменная должна быть заранее инициализирована некоторым, отличным от нуля значением. Как только значение переменной станет равно нулю указатель на неё будет удалён из очереди таймеров. Длину очереди таймеров можно задать с помощью макроса SIZE_ARRAY_HOURS. Обратите внимание что функция Timer_Task не является аналогом функции _delay(), так-как отдаёт управление сразу же, проверять дотикал ли таймер необходимо вручную. Например, вот так выглядит организация задержек в функции управления индикатором:
Функциональная часть кода разбита на модули, для каждого физического или программного устройства пишется свой модуль. Физические устройства:
-Управление циклом уборки.
Модули выполняют разную работу в зависимости от текущего режима. Программа внутри них организована по типу конечного автомата, с помощью конструкции switch – case. Модули могут взаимодействовать с помощью глобальных переменных или изменяя счётчики конечного автомата друг друга.
Вызов функций модулей производится из главного цикла программы:
Не буду описывать работу каждого модуля, в коде достаточно комментариев, кто захочет тот разберётся.
В Action.c так же есть функция util_mode(char _mode), она используется для смены режима работы. Помимо присваивания нового значения переменной Mode, в определении функции прописано обнуление счётчиков конечных автоматов и переменных-таймеров.
Проект собирается с помощью компилятора avrGCC, Makefile присутствует.