В данной статье мы рассмотрим создание на основе платы Arduino вакуумного пылесоса, который сможет объезжать препятствия и одновременно при этом пылесосить пол.
За идею для данного проекта был взят чистящий робот-пылесос Roomba, который показан на следующем рисунке.
Необходимые компоненты
Для создания задуманного нами автоматического вакуумного робота-пылесоса мы должны определиться со следующими вещами:
- тип микроконтроллера;
- необходимые датчики;
- необходимые двигатели;
- материалы для шасси робота;
- батарейка.
Далее рассмотрим эти пункты более подробно. Мы уделим этому так много внимания потому что описанные далее моменты помогут вам при создании не только этого робота, но и других роботов, которые вы захотите сделать в дальнейшем.
Тип микроконтроллера
Выбор микроконтроллера является весьма важной задачей, поскольку микроконтроллер будет "мозгами" робота. Большинство проектов из разряда "сделай сам" (DIY projects) в настоящее время делается на основе плат Arduino и Raspberry Pi. Но они не всегда будут наилучшими конкретно для вашего проекта.
При выборе микроконтроллера для своего проекта следует принимать во внимание следующие вещи:
- В первую очередь необходимо учесть требования к количеству необходимых контактов ввода/вывода, объема флэш памяти, числу/типам коммуникационных протоколов и другим специальным требованиям.
- На следующем этапе необходимо произвести селекцию микроконтроллеров согласно их требуемым техническим характеристикам.
- На этом этапе необходимо произвести заключительный отбор микроконтроллеров основываясь на их стоимости и доступности.
Но в этом проекте мы не тратили много времени на эти изыскания и просто выбрали Arduino. Также на нашем сайте вы можете посмотреть примеры других роботов на основе платы Arduino:
- робот, следующий вдоль линии;
- робот, управляемый с помощью DTMF сигналов;
- робот, управляемый с компьютера;
- робот, управляемый с помощью жестов рук и акселерометра;
- робот, управляемый по Bluetooth;
- робот, управляемый по WiFi.
Необходимые датчики
В сегодняшнем мире существует достаточно много разнообразных датчиков, которые являются как бы "глазами" и "ушами" робота. В этом проекте задачей нашего робота будет обнаружение и огибание препятствий, поэтому мы будем использовать инфракрасный датчик (IR sensor) (купить на AliExpress) и ультразвуковой датчик (Ultrasonic sensor), которые и будут обеспечивать видимость нашему роботу-пылесосу. Внешний вид этих датчиков показан на следующем рисунке.
Ультразвуковой датчик состоит из двух круглых "глаз", один из которых используется для передачи ультразвуковых сигналов, а другой – для их приема. Ультразвуковые сигналы излучаются, отражаются от препятствия и возвращаются обратно к ультразвуковому датчику. Поскольку время между передачей и приемом сигналов, а также скорость распространения звука известны, то расстояние до препятствия можно рассчитать по следующей формуле:
Distance = Time x Speed of Sound / 2
Делить на 2 необходимо потому что лучи распространяются до препятствия и обратно, то есть одну и ту же дистанцию проходят два раза. Более подробно обо всех этих процессах можно прочитать в статье про определение расстояний с помощью Arduino.
Необходимые двигатели
В настоящее время в настоящее время производится достаточно много разнообразных электродвигателей. При конструировании роботов наиболее часто используются шаговые и серводвигатели. Но поскольку наш проект не требует каких то сложных исполнительных механизмов или углового кодера, то мы будем использовать обычные электродвигатели постоянного тока. Так как наш робот будет достаточно тяжелым, то целесообразно использовать 4 одинаковых электродвигателя. Но когда вы успешно примените в данном проекте электродвигатели, то вы можете в дальнейшем сделать его более продвинутым с помощью использования шаговых и серводвигателей.
Материалы для шасси робота
Подготовка шасси робота часто представляет значительную проблему для начинающих радиолюбителей. Наилучшим материалом для изготовления шасси робота является акриловая смола, однако она требует для работы с ней сверлильного станка и других необходимых инструментов. Поэтому мы для данного проекта выбрали самый простой путь – использование деревянного шасси робота как можно видеть из фото робота в начале статьи.
Но будем надеяться что в ближайшее время проблема изготовления шасси робота перестанет быть актуальной в связи со все более широким распространением 3D-принтеров, на которых можно будет напечатать шасси робота любой формы.
Емкость батареи
Выбор емкости батареи для робота необходимо производить на заключительном этапе поскольку она будет зависеть от выбранных шасси и двигателей. Вакуумный пылесос будет потреблять ток 3-5A и еще необходимо запитывать 4 электродвигателя, поэтому потребуется достаточно тяжелая батарея. Мы для нашего проекта выбрали батарею 12V 20Ah SLAB (Sealed lead acid battery – запаянная свинцово-кислотная батарея).
В результате наш чистящий робот-пылесос будет состоять из следующих компонентов:
- лист дерева в качестве шасси робота;
- инфракрасный и ультразвуковой датчики;
- вакуумный пылесос, работающий от постоянного тока;
- плата Arduino Uno;
- батарея 12V 20Ah;
- микросхема драйвера двигателей L293D;
- соединительные провода.
Вакуумный пылесос, работающий от постоянного тока
Поскольку мы используем батарею 12V 20Ah, то и наш вакуумный пылесос должен работать от 12V. Возможный вариант подобного пылесоса показан на ниже приведенном рисунке. Я думаю, подобный пылесос можно без проблем приобрести на Aliexpress или Amazon.
Драйвер двигателей L293D
Драйвер двигателей представляет собой промежуточное устройство между платой Arduino и электродвигателями. Необходимость его использования обусловлена тем, что плата Arduino не может обеспечить на своих контактах достаточный ток для питания электродвигателей.
Микросхема драйвера двигателей L293D способна обеспечивать на своих выводах ток до 1A, что вполне достаточно для управления электродвигателями в нашем проекте.
Конструирование робота
Вакуумный пылесос – это наиболее сложный компонент (из используемых нами) для размещения на шасси робота. Его нужно установить под определенным углом на шасси (как показано на рисунке) чтобы он корректно функционировал. Вакуумный пылесос не будет управляться с платы Arduino, его будет необходимо включать и выключать вручную.
В листе дерева, который и будет являться шасси робота, необходимо просверлить ряд отверстий для того чтобы разместить на нем компоненты робота.
Вначале желательно протестировать работу робота (когда вы установите на него двигатели и драйвер мотора) с помощью приведенного ниже кода программы перед тем как подключать к нему датчики.
void setup()
{
Serial.begin(9600);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
}
void loop()
{
delay(1000);
Serial.print("forward");
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
delay(500);
Serial.print("backward");
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
}
Если все работает без проблем, то вы можете подсоединять датчики согласно представленной схемы и использовать полный код программы, приведенный в конце статьи. Как можно видеть из представленных рисунков, мы разместили ультразвуковой датчик спереди робота и два инфракрасных датчика по бокам робота. Радиатор размещен сверху микросхемы L293D поскольку она будет достаточно сильно нагреваться во время работы робота.
Также вы можете установить на робота и дополнительные компоненты (щетки по бокам) как показано на следующих рисунках.
Также вы можете изготовить уменьшенную версию вакуумного чистящего робота-пылесоса как показано на следующих рисунках.
Эта уменьшенная версия робота изготовлена на основе картонной коробки и макетной платы ATMega16. Роль вакуумной всасывающей части здесь играет вентилятор постоянного тока, помещенный внутрь коробки. Этот робот будет работать, но чистящий эффект от него, как вы понимаете, будет минимальным.
Схема устройства и исходный код программы
Схема устройства представлена на следующем рисунке.
Все необходимые соединения, я думаю, интуитивно понятны.
Далее приведен полный текст программы с комментариями.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
// инициализация необходимых контактов #define trigPin 12 #define echoPin 13 #define ir1 7 #define ir2 6 void setup() { Serial.begin(9600); // инициализация последовательного порта на скорость 9600 бод/с // задание режима работы (на ввод или вывод) для используемых контактов pinMode(8,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ir1, INPUT); pinMode(ir2,INPUT); } void loop() { int duration, distance; int flag,val1,val2; val1=digitalRead(ir1); val2=digitalRead(ir2); Serial.println(val1); Serial.println(val2); digitalWrite(trigPin, HIGH); delayMicroseconds(1000); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; // расчет дистанции до препятствия if (distance >= 200 || distance <= 0){ Serial.println("Out of range"); } else { Serial.print(distance); Serial.println(" cm"); } delay(500); if (distance >=20) { delay(100); Serial.println("forward"); digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); delay(150); Serial.println("STOP"); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); } if (distance<=20) { if (val1==1 ) { Serial.print("turn right"); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); delay(2000); } if (val2==1) { Serial.print("turn left"); digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(500); } } if(distance<=10) { Serial.print("rearrange back"); digitalWrite(8,LOW); digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,HIGH); delay(1000); Serial.print("rearranged left"); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); delay(100); } if (distance<=20) { Serial.print("Algorithum"); Serial.print("free right"); digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); if(val2==0) { Serial.print("smart adjust"); digitalWrite(8,LOW); digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(500); } } } |