Делаю робота. От простого к "посложнее".

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

Всем привет!

Решил сделать робота который-бы ездил по дому и охранял  его.

Я - новичок, оговорюсь. По=этому буду потихо свои достижения тут выкладывать и слушать советы "бывалых" и отвечать на вопросы интересующихся.  Ибо, если я буду делать без компании, то очень быстро мне это надоест, а так и мне веселее и может, кому пригодится моя работа. Собираюсь поставить на тележку 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);
}

 

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

Вот видео без драйвера: http://www.youtube.com/watch?v=XK_b3bJ1TPQ 

А вот уже с драйвером: http://www.youtube.com/watch?v=aRylWQwvSY0&context=C3fe4e09ADOEgsToPDskLkv4-01fw8Nb1rEkKhbZG9

Дальше планирую сделать управление через ШИМ, что б робот плааавно двигался. Я года два назад соорудил тележку с фотодатчиками. Она двигалась на свет. Так дети мои поначалу её как огня боялись, ибо она при обнаружении света от фонарика, как дурная рвала с места, на свет. Чуть не прыгала. Детвора отрывалась по-полной, играли, как с собачкой.

polk
Offline
Зарегистрирован: 13.03.2011

Здорово. А какие моторчики будут?

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

[quote=polk]

Здорово. А какие моторчики будут?

Платформа  такая. На моторчиках ничего не написано. Китай.

 

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

 Сделал ШИМ на начало движения вперёд:

// Определяем какие пины за что отвечают
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...

usmanov-danil1
Offline
Зарегистрирован: 07.11.2012

[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);  //стоп
       
  }
}