Главная » 2016 » Июнь » 26 » Картонный робот-пылесос на Arduino
22:07
Картонный робот-пылесос на Arduino

    

Введение

Имея в наличии все детали и инструменты такого робота можно собрать всего за 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
}

 

 

Пример работы пылесоса:

     
 
Просмотров: 2137 | Добавил: mikrobord | Теги: пыль, Arduino, Робот пылесос, робот на Arduino, Робот, пылесос | Рейтинг: 0.0/0
Всего комментариев: 0
avatar