Делаю робота. От простого к "посложнее".
- Войдите на сайт для отправки комментариев
Всем привет!
Решил сделать робота который-бы ездил по дому и охранял его.
Я - новичок, оговорюсь. По=этому буду потихо свои достижения тут выкладывать и слушать советы "бывалых" и отвечать на вопросы интересующихся. Ибо, если я буду делать без компании, то очень быстро мне это надоест, а так и мне веселее и может, кому пригодится моя работа. Собираюсь поставить на тележку PIR детекторы и ультразвуковые датчики расстояния. Тележка имеется, датчики заказал на аукционе (они в пути). Драйвер моторов имеется L293DNE.
Для начала на макетку поставил два двухцветовых светодиода и написал тестовую программу. По ней робот должен двигаться в цикле вперёд, назад, влево, вправо. Скетч прилагаю, а также видео. Если кому-то это интересно, то буду рад компании! Итак, ВПЕРЁД!!!
// Определяем какие пины за что отвечают
const int RUN = 37; // ШИМ для моторов
const int LM1 = 11; // Левый мотор 1 контакт
const int LM2 = 10; // Левый мотор 2 контакт
const int RM1 = 9; // Правый мотор 1 контакт
const int RM2 = 8; // Правый мотор 2 контакт
void setup() {
pinMode(LM1, OUTPUT);
pinMode(LM2, OUTPUT);
pinMode(RM1, OUTPUT);
pinMode(RM2, OUTPUT);
pinMode(RUN, OUTPUT);
}
//------------------STOP---------------------
void stop_motors() // Функция остановки моторов
{
digitalWrite(LM1, LOW);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, LOW);
}
//---------------FORWARD-----------------------
void forward() // Функция движения ВПЕРЁД
{
digitalWrite(LM1, LOW);
digitalWrite(LM2, HIGH);
digitalWrite(RM1, LOW);
digitalWrite(RM2, HIGH);
}
//----------------BACK------------------------
void back() // Функция движения НАЗАД
{
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
}
//----------------LEFT------------------------
void left() // Функция поворота ВЛЕВО
{
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, HIGH);
}
//----------------RIGHT------------------------
void right() Функция поворота ВПРАВО
{
digitalWrite(LM1, LOW);
digitalWrite(LM2, HIGH);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
}
//-------------------------------------------
void loop()
{
forward(); // ВПЕРЁД
delay(1000);
back (); // НАЗАД
delay(1000);
left(); // В ЛЕВО
delay(1000);
right(); // В ПРАВО
delay(1000);
stop_motors(); // СТОП
delay(2000);
}
Вот видео без драйвера: http://www.youtube.com/watch?v=XK_b3bJ1TPQ
А вот уже с драйвером: http://www.youtube.com/watch?v=aRylWQwvSY0&context=C3fe4e09ADOEgsToPDskLkv4-01fw8Nb1rEkKhbZG9
Дальше планирую сделать управление через ШИМ, что б робот плааавно двигался. Я года два назад соорудил тележку с фотодатчиками. Она двигалась на свет. Так дети мои поначалу её как огня боялись, ибо она при обнаружении света от фонарика, как дурная рвала с места, на свет. Чуть не прыгала. Детвора отрывалась по-полной, играли, как с собачкой.
Здорово. А какие моторчики будут?
[quote=polk]
Здорово. А какие моторчики будут?
Платформа такая. На моторчиках ничего не написано. Китай.
Сделал ШИМ на начало движения вперёд:
// Определяем какие пины за что отвечают const int RUN = 3; // ШИМ для моторов const int LM1 = 11; // Левый мотор 1 контакт const int LM2 = 10; // Левый мотор 2 контакт const int RM1 = 9; // Правый мотор 1 контакт const int RM2 = 8; // Правый мотор 2 контакт int SPEED = 0; // Переменная задающая скорость движения (ШИМ) void setup() { pinMode(LM1, OUTPUT); pinMode(LM2, OUTPUT); pinMode(RM1, OUTPUT); pinMode(RM2, OUTPUT); pinMode(RUN, OUTPUT); } //------------------STOP--------------------- void stop_motors() // Функция остановки моторов { analogWrite (RUN, 0); } //---------------FORWARD----------------------- void forward() // Функция движения ВПЕРЁД { for(SPEED = 0 ; SPEED <= 250; SPEED +=3) // цикл ПЛАВНОГО старта { analogWrite (RUN, SPEED); digitalWrite(LM1, LOW); digitalWrite(LM2, HIGH); digitalWrite(RM1, LOW); digitalWrite(RM2, HIGH); delay(20); } } //----------------BACK------------------------ void back() // Функция движения НАЗАД { analogWrite (RUN, SPEED); digitalWrite(LM1, HIGH); digitalWrite(LM2, LOW); digitalWrite(RM1, HIGH); digitalWrite(RM2, LOW); } //----------------LEFT------------------------ void left() // Функция поворота ВЛЕВО { analogWrite (RUN, SPEED); digitalWrite(LM1, HIGH); digitalWrite(LM2, LOW); digitalWrite(RM1, LOW); digitalWrite(RM2, HIGH); } //----------------RIGHT------------------------ void right() //Функция поворота ВПРАВО { analogWrite (RUN, SPEED); digitalWrite(LM1, LOW); digitalWrite(LM2, HIGH); digitalWrite(RM1, HIGH); digitalWrite(RM2, LOW); } //------------------------------------------- void loop() { forward(); // ВПЕРЁД delay(1000); back (); // НАЗАД delay(1000); left(); // В ЛЕВО delay(1000); right(); // В ПРАВО delay(1000); stop_motors(); // СТОП delay(2000); }Вот видео:
http://www.youtube.com/watch?v=jEF8MX02m7c&list=UUnrcjWJbcYI_G7uu9_dXnTQ...
[quote=AVL4ARDUINO]
Всем привет!
Решил сделать робота который-бы ездил по дому и охранял его.
Я - новичок, оговорюсь. По=этому буду потихо свои достижения тут выкладывать и слушать советы "бывалых" и отвечать на вопросы интересующихся. Ибо, если я буду делать без компании, то очень быстро мне это надоест, а так и мне веселее и может, кому пригодится моя работа. Собираюсь поставить на тележку PIR детекторы и ультразвуковые датчики расстояния. Тележка имеется, датчики заказал на аукционе (они в пути). Драйвер моторов имеется L293DNE.
Для начала на макетку поставил два двухцветовых светодиода и написал тестовую программу. По ней робот должен двигаться в цикле вперёд, назад, влево, вправо. Скетч прилагаю, а также видео. Если кому-то это интересно, то буду рад компании! Итак, ВПЕРЁД!!!
#include <AFMotor.h> AF_DCMotor motor(4); int ledPin=13; //фары int ser=0; void setup() { pinMode(ledPin,OUTPUT); Serial.begin(9600); } void loop () { uint8_t i; ser = Serial.read();//читаем полученное значение if (ser == '5') //если это 5 { digitalWrite(ledPin,HIGH); //зажигаем диод } if (ser =='6') //если 6 { digitalWrite(ledPin, LOW);//диод выключаем } ser = Serial.read();//читаем полученное значение if (ser == '1') //если это 1 { motor.run(BACKWARD); //ехать вперед да-да вперед полярность менять не охото motor.setSpeed(100); //скорость 100 и так стоит редуктор } ser = Serial.read();//читаем полученное значение if (ser == '2') //если это 2 { motor.run(FORWARD); //едем назад motor.setSpeed(100); //скорость 100 } ser = Serial.read();//читаем полученное значение if (ser == '0') //если это 0 { motor.run(RELEASE); //стоп } }