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

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

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

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

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

01int d_S; // поправка на компенсацию вращения правого двигателя
02int S_auto; // задается скорость движения вперед
03int del; // переменная задержки перед движением вперед
04const int IN1 = 2; // определяем пины управления двигателями правый
05const int IN2 = 4; // правый
06const int IN3 = 7; // левый
07const int IN4 = 8; // левый
08const int EN1 = 5; // шим левого двигателя
09const int EN2 = 6; // шим правого двигателя
10const int ik_center = 11; // пин центрального ик-датчика
11const int ik_left = 10; // пин левого ик-датчика
12const int ik_right = 12; // пин правого датчика
13int v_left; // переменные сработки датчиков
14int v_center;
15int v_right;
16 
17void setup()
18{
19  pinMode(IN1, OUTPUT);
20  pinMode(IN2, OUTPUT);
21  pinMode(IN3, OUTPUT);
22  pinMode(IN4, OUTPUT);
23  pinMode(EN1, OUTPUT);
24  pinMode(EN2, OUTPUT);
25  pinMode(ik_left, INPUT);
26  pinMode(ik_center, INPUT);
27  pinMode(ik_right, INPUT);
28   
29  S_auto = 95; // скорость движения вперед
30  d_S = 5;  // поправка для компенсации правого двигателя
31  del = 300; // значение функции делей
32  
33}
34 
35void loop(){
36   v_left = digitalRead( ik_left );
37     if( v_left == LOW ) { // если сработал левый датчик
38     Back_Right(); // отъезжаем назад вправо
39     delay(del);
40   }
41   else { // если нет, едем вперед
42   Forward();
43    
44   }
45  v_center = digitalRead( ik_center );
46   if( v_center == LOW ) { // если сработал центральный датчик
47     Back_Left(); // едем назад влево
48     delay(del);
49   }
50   else { // если нет - вперед
51   Forward();
52   }
53 v_right = digitalRead( ik_right );
54   if( v_right == LOW ) { // если сработал правый датчик
55     Back_Left(); // едем назад влево
56     delay(del);
57   }
58   else { // если нет - вперед
59   Forward();
60   }    
61}
62 
63   
64void Forward(){ // функция движения вперед
65     digitalWrite (IN1, LOW);
66      digitalWrite (IN2, HIGH);
67      digitalWrite (IN3, LOW);
68      digitalWrite (IN4, HIGH);
69      analogWrite(EN1, S_auto);
70      analogWrite(EN2, S_auto + d_S);
71}
72void Back_Left(){ // функция движения назад влево
73      digitalWrite (IN1, HIGH);
74      digitalWrite (IN2, LOW);
75      digitalWrite (IN3, HIGH);
76      digitalWrite (IN4, LOW);
77      analogWrite(EN1, 160);
78      analogWrite(EN2, 90);
79}
80void Back_Right(){ // функция движения назад вправо
81      digitalWrite (IN1, HIGH);
82      digitalWrite (IN2, LOW);
83      digitalWrite (IN3, HIGH);
84      digitalWrite (IN4, LOW);
85      analogWrite(EN1, 90);
86      analogWrite(EN2, 160);
87}

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

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

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

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

02  #1 мотор
03  #2 датчики
04*/
05//#1 мотор
06#include "Cl_Motor.h"
07Cl_Motor Motor; // создать мотор
08const byte IN1_pin = 2; // определяем пины управления двигателями правый
09const byte IN2_pin = 4; // правый
10const byte EN1_pin = 5; // шим левого двигателя
11const byte IN3_pin = 7; // левый
12const byte IN4_pin = 8; // левый
13const byte EN2_pin = 6; // шим правого двигателя
14 
15//#2 датчики
16#include "Cl_IK.h"
17Cl_IK IK_L, IK_C, IK_R;
18const byte IK_L_pin = 10; // пин левого ик-датчика
19const byte IK_C_pin = 11; // пин центрального ик-датчика
20const byte IK_R_pin = 12; // пин правого датчика
21 
22void setup() {
23  //#1 мотор
24  Motor.setup(IN1_pin, IN2_pin, EN1_pin, IN3_pin, IN4_pin, EN2_pin);
25  //#2 датчики
26  IK_L.setup(IK_L_pin);
27  IK_C.setup(IK_C_pin);
28  IK_R.setup(IK_R_pin);
29}
30 
31void loop() {
32  //#1 мотор
33  Motor.loop();
34  //#2 датчики
35  IK_L.loop();
36  IK_C.loop();
37  IK_R.loop();
38  if (! IK_L.IK || ! IK_C.IK )  Motor.Back_Right();
39  else if (! IK_R.IK) Motor. Back_Left();
40  else Motor.FORWARD();
41}

 

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

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