Имея в наличии все детали и инструменты такого робота можно собрать всего за 2 часа. Конечно, такой робот не заменит вам настоящий пылесос, но вы будете приятно удивлены сколько пыли он может собрать с вроде бы чистого пола.
Материалы: - Arduino - Модуль управления двигателем Motor-shield (H-Bridge) - Два мотора с редукторами - Пара колес - Power-bank 5 вольт, или другой источник питания - Турбинка охлаждения для компьютера 5 вольт (не вентилятор) - Сильные магниты - USB кабель - Кабель с разъемом питания для Arduino - Провода для соединения контактов Arduino - Картон плотный - Клеевой пистолет - Кусочек жести (например, от консервной банки) - Пластиковая коробка (служит емкостью для пыли)
Сборка:
На картоне определяется примерно расположение деталей, и вырезается круг подходящего размера (шасси пылесоса).
На дне будущего робота вырезают отверстия под колёса, и под турбинку. Моторы крепят к картону с помощью пластиковых стяжек.
Далее, термоклеем к шасси закрепляют турбину.
Получается так, что турбина на верхней части картона, моторы - внизу.
На нижней стороне помечается контур пластиковой коробки (которая будет собирать пыль), вокруг этого контура автор делает сквозные отверстия и отмечает расположение магнитов. Магниты будут удерживать коробку на шасси.
На верхней стороне шасси магниты приклеивают на ранее помеченных местах.
Теперь, с магниты прикладывают с нижней стороны, предварительно подложив лист бумаги под них.
Коробку для сбора пыли устанавливают между магнитами и приклеивают к ним.
Далее, уже на верхней стороне картона приклеивается аккумулятор и крепления для Arduino. В качестве креплений автор использует куски деревянных шпажек.
Теперь можно установить motor-shield и Arduino в крепления. Провода питания и Arduino отрезают до нужного размера. Провода питания рекомендовано спаять и изолировать. После чего их подключают к Arduino, турбине, аккумулятору и motor-shield.
Из полосок имеющегося картона сгибают и склеивают бамперы полукругом.
Бамперы крепят клеем к с боков шасси. Также шасси предварительно немного подрезали так чтоб установленные бамперы могли придавится к нему при столкновении.
Далее, берут два проводника и соединяют их с кусочками жести термоклеем.
Куски жести приклеивают к бамперам, а их провода подключат к Arduino (к контактам 5 и 8). Вдобавок напротив них клеем закрепляют контакты еще двух проводников, которые присоединяют к контактам GND Arduino.
В качестве фильтра пыли используют вырезанный прямоугольник из кухонной салфетки. Фильтр кладут снизу шасси и закрепляют его коробкой с магнитами.
В коробке проделывают длинное отверстие с краями выгнутыми наружу. К коробке дополнительно приклеивают округлую опору (кусок пластика) так чтобы край отверстия был на расстоянии 1 мм над полом когда робот будет стоять на колесах и опираться на опору. Высота этой опоры регулирует проходимость робота.
Высокие стенки коробки можно укоротить переклеиванием магнитов.
Программа:
//right side
const int pinRightMotorDirection = 4;//"Dir A" on motor-shield
const int pinRightMotorSpeed = 3;//"PWM A" on motor-shield
const int pinRightBumper = 5;
//left side
const int pinLeftMotorDirection = 7;//"Dir B" on motor-shield
const int pinLeftMotorSpeed = 6;//"PWM B" on motor-shield
const int pinLeftBumper = 8;
//timeouts - they are different to avoid robot stuck in a corner
const int turnRightTimeout = 150;
const int turnLeftTimeout = 200;
//set in counter how long a motor is running back: N/10 (in milliseconds)
int countDownWhileMovingToRight;
int countDownWhileMovingToLeft;
//Initialization
void setup() {
initPins();
runRightMotorForward();
runLeftMotorForward();
startMotors();
}
//Main loop
void loop() {
verifyAndSetRightSide();
verifyAndSetLeftSide();
processRightSide();
processLeftSide();
delay(10);//repeat every 10 milliseconds
}
//---------------------------------------------------
void initPins(){
pinMode(pinRightMotorDirection, OUTPUT);
pinMode(pinRightMotorSpeed, OUTPUT);
pinMode(pinRightBumper, INPUT_PULLUP);
pinMode(pinLeftMotorDirection, OUTPUT);
pinMode(pinLeftMotorSpeed, OUTPUT);
pinMode(pinLeftBumper, INPUT_PULLUP);
}
void startMotors(){
runRightMotorForward();
runLeftMotorForward();
}
void processRightSide(){
if(countDownWhileMovingToRight <= 0)//checks if counter was NOT ran when bumper had been pressed
return;
//otherwise - counter is counting down (as a delay) while the right motor is moving backward
countDownWhileMovingToRight--;//decrease the counter if it WAS ran when bumper had been pressed
if(countDownWhileMovingToRight <= 0)//if the running counter got down to zero
runRightMotorForward();//run the right motor forward
}
void processLeftSide(){
if(countDownWhileMovingToLeft <= 0)
return;
countDownWhileMovingToLeft--;
if(countDownWhileMovingToLeft <= 0)
runLeftMotorForward();
}
void verifyAndSetRightSide(){
if(checkBumperIsNotPressed(pinRightBumper) //checks if right bumper has NOT been pressed
)
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
)
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 <= 0;
}
bool checkBumperIsNotPressed(int pinBumper){
return digitalRead(pinBumper) == HIGH;
}
void runRightMotorForward(){
runMotorForward(pinRightMotorDirection, pinRightMotorSpeed);
}
void runLeftMotorForward(){
runMotorForward(pinLeftMotorDirection, pinLeftMotorSpeed);
}
void runRightMotorBackward(){
runMotorBackward(pinRightMotorDirection, pinRightMotorSpeed);
}
void runLeftMotorBackward(){
runMotorBackward(pinLeftMotorDirection, pinLeftMotorSpeed);
}
void runMotorForward(int pinMotorDirection, int pinMotorSpeed){
digitalWrite(pinMotorDirection, true); //set direction forward
analogWrite(pinMotorSpeed, 255); //set max speed forward
}
void runMotorBackward(int pinMotorDirection, int pinMotorSpeed){
digitalWrite(pinMotorDirection, false); //set direction backward
analogWrite(pinMotorSpeed, 255); //set max speed backward
}