Диаметр робота 30 сантиметров, высота 9 сантиметров. Корпус сделал из вспененного ПВХ толщиной 6 мм. ПВХ легко режется ножом, гнется над паром, или феном, клеится обычным суперклеем намертво. В бампере у робота установил 4 инфракрасных датчика препятствия и два переключателя на случай столкновения, а так-же наклеил резиновые утеплители для окон, чтобы при столкновении с углами мебели, не превратил ее в труху. Контейнер для пыли и мусора сделан из 4 мм. ПВХ. Фильтр из двух слоев тряпичной салфетки (продается в любом магазине, где торгуют чистящими средствами для дома) и вклеил их в рамку из плотного картона. Крышка контейнера держится на магнитах. Турбина склеена из тонкого пластика, компакт-дисков и ПВХ. Контейнер со снятым фильтром. Видны лопасти турбины. Турбину сделал неразборной поэтому не смогу показать ее внутренности. Верхняя крышка склеена супер-клеем. Сердце, кишки и прочие внутренности робота-пылесоса. Контроллер инфракрасных датчиков с регуляторами расстояния до препятствия. Имеет 4 выхода для подключения к Ардуино. В обычном режиме выдает на выходе логическую единицу, если срабатывает любой из четырех датчиков, выдает ноль. Выключатели столкновения были безжалостно вырваны из старой микроволновки. Когда пылесос упирается в препятствие (не срабатывают инфракрасные датчики) то бампер нажимает выключатель и пылесос отъезжает на несколько сантиметров назад, поворачивает и продолжает уборку. Выключатели поставил мощные, чтобы они возвращали бампер в исходное положение. Мотор для передней щетки выдрал из старого принтера и подключил к Ардуино через Мосфет. Когда пылесос движется щетка крутится медленно, чтобы не разбрасывала мусор, а направляла его прямо к жерлу. Когда пылесос подъезжает к стене, или мебели щетка вращается быстро, чтобы хорошо смести мусор, который обычно скапливается вдоль стен и в углах. Инфракрасные датчики заклеил сзади черным картоном и покрасил черным маркером, а то они иногда срабатывали от мигания светодиодов на драйвере мотора. Турбину вращает высокооборотистый моторчик. Маркировки на нем нет и откуда вытащил не помню. Питается все это хозяйство от четырех литий-ионных аккумуляторов формата 18650, через понижающий DC-DC преобразователь. Подключены две пары последовательно. В белой трубке находится контроллер заряда - разряда аккумуляторов. Когда АКБ подходит к минимально допустимому разряду, контроллер отключает пылесос, когда заряжается и достигает полной зарядки, то отключает зарядное устройство. Колеса и мотор-редукторы всем знакомы. Пришлось их немного подшаманить. Разобрал редукторы, промыл от силиконовой смазки, обильно намазал солидолом и собрал обратно. Мне показалось, что на пластмассовых осях выглядит это не надежно и как-то совсем по китайски. Пришлось укреплять. Основание робота сделал из водостойкой фанеры, а точнее из разделочной доски. Третье колесико пришлось углублять на 2,5 сантиметра. Надо было сразу заказывать шариковое колесико. Но как говорится, если бы бабушке бороду, то она будет дедушкой. Щетку сделал из лески. Список деталей: Arduino Pro Mini - мозги. L298N - драйвер моторов. Понижающий DC -DC преобразователь. Модуль с Мосфетом для управления передней щеткой. 4 инфракрасных датчика препятствия с контроллером. Два переключателя для бампера. Два колеса с мотор-редукторами. Третье колесо, лучше шариковое не высокое. Мотор для щетки. Высокооборотистый мотор для турбины. 4 аккумулятора 18650 и контроллер для них. Фанера, ПВХ, куча проводов, выключатель, гнездо для зарядки, магнитики, шурупы. А главное иметь желание и кучу нервов
Вот код: Код (Text): #define in1 4 //пин правого мотора #define in2 5 //пин правого мотора #define in3 7 //пин левого мотора #define in4 8 //пин левого мотора #define lev_vik 2 //пин левого выключателя #define pra_vik 3 //пин правого выключателя boolean lev = true; //переменная состояния левого выключателя boolean pra = true; //переменная состояния правого выключателя boolean ir1 = true; //переменная состояния первого ик датчика boolean ir2 = true; //переменная состояния второго ик датчика boolean ir3 = true; //переменная состояния третьего ик датчика boolean ir4 = true; //переменная состояния четвертого ик датчика void setup() { randomSeed(analogRead(19)); // пины для левого и правого моторов на выход pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); //--------------------------------------------- //пин веника на выход pinMode(11, OUTPUT); //-------------------- //пины левого и правого выключателя на вход pinMode(lev_vik, INPUT); pinMode(pra_vik, INPUT); //----------------------------------------------- //пины ик датчиков на вход pinMode(14, INPUT); pinMode(15, INPUT); pinMode(16, INPUT); pinMode(17, INPUT); //------------------------------------------ venikmin(); // выключение веника delay(4000); vpered(); // езда вперед } void loop() { lev = digitalRead(lev_vik); //считывание состояния левого выключателя if (!lev) { //если срабатывает левый выключатель то stopm();//стоп venikmax(); // включение веника delay(300); nazad(); //едем назад delay(300); stopm();//стоп delay(300); vpravo(); //поворот на месте вправо delay(random(500, 1000)); stopm();//стоп delay(300); vpered(); // езда вперед venikmin(); // выключение веника } pra = digitalRead(pra_vik); //считывание состояния правого выключателя if (!pra) { //если срабатывает правый выключатель то stopm();//стоп venikmax(); // включение веника delay(300); nazad(); //едем назад delay(300); stopm();//стоп delay(300); vlevo(); //поворот на месте влево delay(random(500, 1000)); stopm();//стоп delay(300); vpered(); // езда вперед venikmin(); // выключение веника } //------------------------------ ir1 = digitalRead(14); // считывание показания первого ик датчика if (!ir1) { // если срабатывает первый ик датчик то stopm();//стоп venikmax(); // включение веника delay(300); vpravo(); //поворот на месте вправо delay(random(400, 900)); stopm();//стоп delay(300); vpered(); // езда вперед venikmin(); // выключение веника } //----------------------------- //------------------------------ ir2 = digitalRead(15); // считывание показания второго ик датчика if (!ir2) { // если срабатывает второй ик датчик то stopm();//стоп venikmax(); // включение веника delay(300); vpravo(); //поворот на месте вправо delay(random(400, 900)); stopm();//стоп delay(300); vpered(); // езда вперед venikmin(); // выключение веника } //----------------------------- //------------------------------ ir3 = digitalRead(16); // считывание показания третьего ик датчика if (!ir3) { // если срабатывает третий ик датчик то stopm();//стоп venikmax(); // включение веника delay(300); vlevo(); //поворот на месте влево delay(random(400, 900)); stopm(); //стоп delay(300); vpered(); // езда вперед venikmin(); // выключение веника } //----------------------------- //------------------------------ ir4 = digitalRead(17); // считывание показания четвертого ик датчика if (!ir4) { // если срабатывает четвертый ик датчик то stopm(); //стоп venikmax(); // включение веника delay(300); vlevo(); //поворот на месте влево delay(100); // ------------------------ stopm(); //стоп delay(300); vpered(); // езда вперед venikmin(); // выключение веника } //----------------------------- } //функция езды вперед void vpered() { //вращение левого мотора вперед digitalWrite(in4, LOW); digitalWrite(in3, HIGH); //----------------------------- //вращение правого мотора вперед digitalWrite(in1, HIGH); digitalWrite(in2, LOW); //----------------------------- } //функция езды назад void nazad() { //вращение левого мотора назад digitalWrite(in4, HIGH); digitalWrite(in3, LOW); //----------------------------- //вращение правого мотора назад digitalWrite(in2, HIGH); digitalWrite(in1, LOW); //---------------------------- } //функция езды на месте влево void vlevo() { //вращение левого мотора назад digitalWrite(in4, HIGH); digitalWrite(in3, LOW); //----------------------------- //вращение правого мотора вперед digitalWrite(in1, HIGH); digitalWrite(in2, LOW); //----------------------------- } //функция езды на месте вправо void vpravo() { //вращение правого мотора назад digitalWrite(in2, HIGH); digitalWrite(in1, LOW); //---------------------------- //вращение левого мотора вперед digitalWrite(in4, LOW); digitalWrite(in3, HIGH); //----------------------------- } //функция стоп void stopm() { //стоп правого мотора назад digitalWrite(in2, HIGH); digitalWrite(in1, HIGH); //---------------------------- //стоп левого мотора вперед digitalWrite(in4, HIGH); digitalWrite(in3, HIGH); //----------------------------- } //функция вращения веника медленно void venikmin() { // digitalWrite(11, LOW); //медленное вращение веника analogWrite(11, 90); // скорость вращения веника } //функция вращения веника быстро void venikmax() { // digitalWrite(11, HIGH); //включение вращения веника analogWrite(11, 220); // скорость вращения веника }
Бывает так, что остаются не пройденные участки? Или за 40 минут хоть раз, но попадает в каждую точку? Следующим шагом можно снизу валики присобачить как у румбы и можно выходить на рынок
На первом видео видно, что пылесос прошел полностью весь балкон за 15 минут и все подобрал. А зачем валики, если он и без валиков нормально убирает.