В мире с каждым днем все больше растет популярность среди роботов-уборщиков. Благодаря таким маленьким помощникам в доме становится гораздо чище, а усилий на уборку при этом прикладывается гораздо меньше. Существует огромное множество различных модификаций роботов, все они отличаются по функционалу, размерам и другим параметрам.
Конкретно в данной статье будет рассмотрен пример, как своими руками можно сделать простого робота, который сам будет пылесосить помещение, когда это нужно. В качестве «мозга» здесь используется контроллер Arduino.
Материалы и инструменты для изготовления робота:
— плата, контролирующая работу двигателей (Arduino motor shield);
— плата Arduino;
— два моторчика с редукторами (моторчики на 3 вольта и скоростью вращения около 100 об/мин.);
— колеса (можно сделать из алюминиевых банок;
— кулер от компьютерного блока питания (можно как на 5В, так и на 12В);
— источник питания 5В (аккумулятор);
— провода и пластина для установки радиоэлементов;
— чтобы сделать корпус понадобится пластиковый контейнер;
— еще один небольшой контейнер для создания мусоросборника;
— термоклей;
— магниты;
— картон.
Процесс изготовления робота:
Шаг первый. Программная часть робота и скетч:
Сердцем робота является контроллер 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() {
verifyAndSetRightSide();
verifyAndSetLeftSide();
processRightSide();
processLeftSide();
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 < sizeof(sonarPins); i++)
pinMode(sonarPins[i], INPUT);
}
void startMotors(){
setMotorSpeed(pinRightMotorSpeed, 255);
setMotorSpeed(pinLeftMotorSpeed, 255);
}
void waitWhileAnyBumperIsPressed(){
while(checkBumperIsNotPressed(pinRightBumper)
&& checkBumperIsNotPressed(pinLeftBumper)){
delay(20);//check every 20 milliseconds
}
}
void processRightSide(){
if(countDownWhileMovingToRight 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 = SamplesAmount)
sampleIndex[pinIndex] = 0;
samples[pinIndex][sampleIndex[pinIndex]] = value;
return true;
}
long calculateAvarageDistance(int pinIndex){
long average = 0;
for(int i = 0; i < SamplesAmount; i++)
average += samples[pinIndex][i];
return average / SamplesAmount;
}
Шаг второй. Подготовка основных элементов робота
Для крепления всех компонентов робота, включая аккумулятор, платы управления и двигатели, в качестве основы используется картон.
Турбину нужно хорошенько приклеить или иным образом зафиксировать на малом пластиковом контейнере, в котором нужно проделать отверстие для всасывания грязи. Впоследствии эта конструкция приклеивается к картонной основе. Помимо этого контейнер должен иметь дополнительное отверстие, через которое будет выходить воздух. Здесь должен быть фильтр, автор решил использовать для этих целей синтетическую ткань.
На следующем этапе кулер нужно склеить с сервоприводами, ну а затем эта конструкция устанавливается на картонную основу.
Шаг третий. Изготавливаем колеса для робота
Чтобы сделать колеса нужно взять алюминиевые банки и отрезать от них верхнюю и нижнюю часть. Затем эти элементы склеиваются между собой. Теперь лишь останется хорошенько прикрепить колеса к серводвигателям при помощи термоклея. Здесь важно понимать, что колеса должны быть зафиксированы четко по центру валов сервоприводов. Иначе робот будет ездить криво, и будет перерасходовать энергию.
Шаг четвертый. Заключительный процесс сборки робота
После того как будет установлена батарея и будут подключены все элементы робота, останется поместить конструкцию в прочный корпус. Для этих целей отлично подходит большой пластиковый контейнер. В первую очередь в носовой части корпуса робота нужно проделать отверстия, через них будут выводиться контакты, которые будут подавать сигнал электронике при столкновении робота с препятствием.
Для того чтобы корпус можно было быстро и легко снимать для его фиксации применяются магниты, в данном случае их восемь. Магниты приклеиваются на внутреннюю часть пылесоса и на сам контейнер по 4 штуки.
Вот и все. Теперь робот собран, и его можно испробовать на деле. Не смотря на то, что робот не способен самостоятельно подзаряжаться и у него довольно ограниченный возможности в плане навигации, за полчаса он вполне сможет убрать мусор на кухне или небольшой комнате. Достоинства робота в том, что все компоненты можно легко найти и они не особо дорогие. Несомненно, самоделку можно дорабатывать, добавляя новые датчики и иные элементы.
Источник (Source)
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
Источник: