Простой робот на ИК-датчиках препятс

Iguana
Offline
Зарегистрирован: 22.02.2016

Тема в общем то заезженная, но я повторюсь)).

В ардуино я достиг больших высот, т.е. какие мне были нужны на данном этапе. Работает три метеостанции в разных местах (правда они на esp8266))), на даче тарахтит радиолюбительский телеграфный QRPpp маячек на 20 метров. Маяк автономный, заряд акб 18650 от солнечных панелей. А так же работает дачная сигнализация. Хорошо работает. За дачный сезон даже лопату с участстка не спи... не сперли)). Поэтому даже забыл, как arduino правильно пишется. И тут вижу, что дочка прикручивает проволочками к 2WD робоплатформе куколи пытается их катать. На этой платформе далалась машинка управляемая по блютуз. Но это не интересно было. Радиоуправляемых автошек полно. У старшего такая, что младшую на санках за собой таскает без проблем. Поэтому не долго думаю решили собрать автобота, который сам бы объезжал препятствия и ездил по комнате автономно катая кукол)). Платформа с двумя двигателями есть, Nano есть, драйвер двигателей L298 есть, три ИК-датчика препятствий есть. В качестве питания два акб 18650. У меня из них констуктив с переключателем для получения 7,4 и 3,7 в. 

Соединили все быстро. Дальше открываем интернет и ищем скетч. И тут пролетает мимо розовая птица обломинго. Неее, конечно скетчи были и даже назывались типа "простой робот ...... и т.д." Но там такооооооеееее! Без пузыря не разобраться. А поскольку новогодние праздники прошли и начался тверезый период жизни пришлось писАть скетч самому. Вспомнил, как пишется arduino и вот накатал:

int d_S; // поправка на компенсацию вращения правого двигателя
int S_auto; // задается скорость движения вперед
int del; // переменная задержки перед движением вперед
const int IN1 = 2; // определяем пины управления двигателями правый
const int IN2 = 4; // правый
const int IN3 = 7; // левый
const int IN4 = 8; // левый
const int EN1 = 5; // шим левого двигателя
const int EN2 = 6; // шим правого двигателя
const int ik_center = 11; // пин центрального ик-датчика
const int ik_left = 10; // пин левого ик-датчика
const int ik_right = 12; // пин правого датчика
int v_left; // переменные сработки датчиков
int v_center;
int v_right;

void setup()
{
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(EN1, OUTPUT);
  pinMode(EN2, OUTPUT);
  pinMode(ik_left, INPUT);
  pinMode(ik_center, INPUT);
  pinMode(ik_right, INPUT);
  
  S_auto = 95; // скорость движения вперед
  d_S = 5;  // поправка для компенсации правого двигателя
  del = 300; // значение функции делей
 
}

void loop(){
   v_left = digitalRead( ik_left ); 
     if( v_left == LOW ) { // если сработал левый датчик
     Back_Right(); // отъезжаем назад вправо
     delay(del);
   }
   else { // если нет, едем вперед
   Forward();
   
   } 
  v_center = digitalRead( ik_center );
   if( v_center == LOW ) { // если сработал центральный датчик
     Back_Left(); // едем назад влево
     delay(del);
   }
   else { // если нет - вперед
   Forward();
   } 
 v_right = digitalRead( ik_right );
   if( v_right == LOW ) { // если сработал правый датчик
     Back_Left(); // едем назад влево
     delay(del);
   }
   else { // если нет - вперед
   Forward();
   }     
} 

  
void Forward(){ // функция движения вперед
     digitalWrite (IN1, LOW);
      digitalWrite (IN2, HIGH); 
      digitalWrite (IN3, LOW);
      digitalWrite (IN4, HIGH);
      analogWrite(EN1, S_auto); 
      analogWrite(EN2, S_auto + d_S);
}
void Back_Left(){ // функция движения назад влево
      digitalWrite (IN1, HIGH);
      digitalWrite (IN2, LOW); 
      digitalWrite (IN3, HIGH);
      digitalWrite (IN4, LOW);
      analogWrite(EN1, 160); 
      analogWrite(EN2, 90);
}
void Back_Right(){ // функция движения назад вправо
      digitalWrite (IN1, HIGH);
      digitalWrite (IN2, LOW); 
      digitalWrite (IN3, HIGH);
      digitalWrite (IN4, LOW);
      analogWrite(EN1, 90); 
      analogWrite(EN2, 160);
}

При срабатываении центрального дачтика захотелось сделать выбор, чтобы он ехал назад или вправо или влево, но оказалось, что для этого надо погрызть гранит с++ или усиленно покурить интернет, но это уже лишний труд, поэтому отказался от этой мысли)).

Думаю, что получился именно простой без заморочек робот объезжающий препятствия и при наличии всех деталюшек собираемый за полчаса. За подсказки по оптимизации кода и т.д. заранее спасибо)).

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Переписал скетч ТС. Не проверял. https://yadi.sk/d/4XbgIaTp3CyoMa Он здесь. Главный файл выкладываю.

/*robot_IK.ino https://yadi.sk/d/4XbgIaTp3CyoMa
  #1 мотор
  #2 датчики
*/
//#1 мотор
#include "Cl_Motor.h"
Cl_Motor Motor; // создать мотор
const byte IN1_pin = 2; // определяем пины управления двигателями правый
const byte IN2_pin = 4; // правый
const byte EN1_pin = 5; // шим левого двигателя
const byte IN3_pin = 7; // левый
const byte IN4_pin = 8; // левый
const byte EN2_pin = 6; // шим правого двигателя

//#2 датчики
#include "Cl_IK.h"
Cl_IK IK_L, IK_C, IK_R;
const byte IK_L_pin = 10; // пин левого ик-датчика
const byte IK_C_pin = 11; // пин центрального ик-датчика
const byte IK_R_pin = 12; // пин правого датчика

void setup() {
  //#1 мотор
  Motor.setup(IN1_pin, IN2_pin, EN1_pin, IN3_pin, IN4_pin, EN2_pin);
  //#2 датчики
  IK_L.setup(IK_L_pin);
  IK_C.setup(IK_C_pin);
  IK_R.setup(IK_R_pin);
}

void loop() {
  //#1 мотор
  Motor.loop();
  //#2 датчики
  IK_L.loop();
  IK_C.loop();
  IK_R.loop();
  if (! IK_L.IK || ! IK_C.IK )  Motor.Back_Right();
  else if (! IK_R.IK) Motor. Back_Left();
  else Motor.FORWARD();
}

 

zzaassxx
Offline
Зарегистрирован: 07.02.2017

Новыи скеч ругаеться на #include "Cl_Motor.h"

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну да. Скачивать надо с яндекс диска, а здесь только первый файл.

Iguana
Offline
Зарегистрирован: 22.02.2016

ЗдОрово, спасибо, вроде понял все. Завтра испытаем на модели)).

demonk
Offline
Зарегистрирован: 09.02.2017

Iguana, в таких ИК датчиках препятствия надо непрозрачную ширмочку между свето и фото диодами поставить.  А учитывая что у вас их много рядом, то и трубочки. Или у вас и так работают?

Недавно сам такие осваивал и без загородки постоянное срабатывание - видимо в бок тоже знатно светит.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А развитие темы будет? Кукол возить мало, надо озвучить ещё, внучки подрастают )))

deflavr
Offline
Зарегистрирован: 01.05.2018

Всем привет. Может кто-то помочь в росписании схемы подключения?

По фото невидно как подключать.

NikShel
Offline
Зарегистрирован: 21.01.2018

deflavr пишет:

Всем привет. Может ...

невидно как подключать.

const int IN1 = 2; // определяем пины управления двигателями правый
const int IN2 = 4; // правый
const int IN3 = 7; // левый
const int IN4 = 8; // левый
const int EN1 = 5; // шим левого двигателя
const int EN2 = 6; // шим правого двигателя
const int ik_center = 11; // пин центрального ик-датчика
const int ik_left = 10; // пин левого ик-датчика
const int ik_right = 12; // пин правого датчика

неужели не понятно?

С Праздником!

deflavr
Offline
Зарегистрирован: 01.05.2018

Не разгледел. Спасибо.