roboforum.ru

Технический форум по робототехнике.

Не пашет датчик края ринга с Ардуино

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 22 авг 2016, 07:26

ol82 писал(а):Еще не очень нравится, что далеко заскакивает за границу. Чем можно поправить, чтоб сразу назад драпал?

Бот ждет, что оба датчика "засветятся". Можно отскакивать при срабатывании не обоих, а любого из пары.
Меняем условие (Правый_черный И Левый_черный)
на условие (Правый_белый ИЛИ Левый_белый)

Код: Выделить всёРазвернуть
if (R_Sensor<100 || L_Sensor<100)

и меняем блоки действий местами.

Заодно, можно поправить реакцию бота.
Код: Выделить всёРазвернуть
     {
     go_stop();      //Стоп!
     delay(100);     //Джем 100 мс
     go_back();      //Движемся назад
     delay(1000);    //1 секунду.
// При анализе края  возможна ситуация, что потом, при поиске цели, бот будет рыскать
// налево-направо. Поэтому можно ввести дополнительную переменную, и записывать
// в нее предыдущий поворот. Я назвал её turn, добавив перед setup() строчку   byte turn = 0;
     if (L_Sensor<=100) {
         go_right();     //Поворачиваем направо если последним сработал левый
         turn=1;
     } else {
         go_left();                   //иначе поворачиваем налево
         turn=2;
     }
     delay(300);     //300 мс
     go_forward();   //Движемся вперед
     delay(300);     //300 мс
     }
     else
     {
     if (dist_cm>40) //Если дистанция до объекта больше 40 см то
         {
           // поиск цели
           if (turn==1) {
             go_right();     //Поворачиваем направо если сработал левый
           } else {
             go_left();                   //иначе поворачиваем налево
           }
         }
         else
         {
           go_forward(); //если поймана цель атакуем
         }
     }


Можно еще добавить реакцию на потерю преграды, чтобы он менял направление поворота на обратное, но это, думаю, вы уже сами сможете сделать. :wink:
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 22 авг 2016, 08:20

Спасибо, вечером попробую.
На схеме 2 светодиода. Ничего не делают. Можно сделать, чтоб каждый срабатывал по своему сенсору края? Например, светодиод с пин7 справа, пин8 слева. Легче налаживать.
И можно ли использовать динамик, хватит ли мозгов, чтоб ездил, да еще пищал что-нибудь? Не "Звездные войны" конечно, а хоть звуком захват цели обозначал например?
2 задних сенсора я не разводил на плате.
Вложения
Серводроид-минисумо.jpg
Аватара пользователя
ol82
 
Сообщения: 44
Зарегистрирован: 19 авг 2016, 08:04
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 22 авг 2016, 14:10

Фототранзисторы подключены к аналоговым портам, их можно использовать в прежнем режиме даже не разводя, навесной монтаж рулит. А цифровые порты 7 и 8 можно только в паре с формирователем уровня HIGH и LOW. Например, таким датчиком:
Изображение

А пищалкой можно пользоваться. Есть команда TONE().
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

Re: Не пашет датчик края ринга с Ардуино

Сообщение Angel71 » 22 авг 2016, 16:05

для упрощённого обучения программированию есть скретч https://scratch.mit.edu/. вариант сретча для ардуины живёт тут http://s4a.cat/
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 22 авг 2016, 20:50

Eruman писал(а):Можно еще добавить реакцию на потерю преграды, чтобы он менял направление поворота на обратное, но это, думаю, вы уже сами сможете сделать. :wink:

Нет, не осилил даже Ваш готовый кусок кода. В скобках запутался. If где-то не хватает. И куда byte turn = 0; писать, наверх после Ультрасоника?

На что меня хватило - сигналит при атаке на цель и зажигает красный светодиод, при поиске светит желтым. Вот так я прикопипастил. Блин, работает! :crazy:

Код: Выделить всёРазвернуть
pinMode(7, OUTPUT); //LED1 Захват
pinMode(8, OUTPUT); //LED2 Поиск



Код: Выделить всёРазвернуть
         {
           go_forward(); //если поймана цель атакуем
           tone(10, 300, 250); //
           digitalWrite(7, HIGH);
           digitalWrite(8, LOW);
         }
   }
    else
     {
     go_stop();      //Стоп!
     delay(100);     //Джем 100 мс
     digitalWrite(8, HIGH);
     digitalWrite(7, LOW);
     go_back();      //Движемся назад

Аватара пользователя
ol82
 
Сообщения: 44
Зарегистрирован: 19 авг 2016, 08:04
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 23 авг 2016, 07:58

И куда byte turn = 0; писать, наверх после Ультрасоника?

Да. Туда, где глобальные, т.е. доступные из любого участка кода, переменные объявлены.

Нехватающую скобку можно выявить курсором. ИДЕ подсвечивает парную, нужно только курсор к ней подогнать стрелками или мышкой кликнуть. Ну или свой полный нерабочий код публикуйте, разберемся.
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 23 авг 2016, 20:42

Добрый вечер!. Вот, в хвосте что-то не так:
Код: Выделить всёРазвернуть
// Подключение модуля ультрозвукового сенсора
#include <Ultrasonic.h>


//объявление глобальных переменных
int L_Sensor=0; //Левый сенсор
int R_Sensor=0; //Правый сенсор
float dist_cm=0; // Значение расстояния
Ultrasonic ultrasonic(4, 2); // Назначение портов УЗ сенсора. Trig, Echo
byte turn = 0; // переменная Eruman


void setup()// Модуль инициализации
{
pinMode( 15 , INPUT); // Вход правого сенсора
pinMode( 17 , INPUT); // Вход левого сенсора
pinMode(3, OUTPUT); //B-B     Назад  - Левый мотор
pinMode(5, OUTPUT); //B-1A    Вперед - Левый мотор
pinMode(6, OUTPUT); //A-B     Назад  - Правый мотор
pinMode(9, OUTPUT); //A-1A    Вперед - Правый мотор
pinMode(7, OUTPUT); // LED1 Захват
pinMode(8, OUTPUT); // LED2 Откат
Serial.begin(9600); // Активация передачи данных через терминал
delay(5000); // Задержка старта 5 сек.
}

void go_forward()  //Атакуем движение вперед
{
    analogWrite(3, 0);    //LEFT MOTOR
    analogWrite(5, 255);  //LEFT MOTOR
    analogWrite(6, 0);    //RIGHT MOTOR
    analogWrite(9, 255);  //RIGHT MOTOR
}

void go_left() // поиск цели или движение налево
{     
    analogWrite(3, 0);   //LEFT MOTOR
    analogWrite(5, 100); //LEFT MOTOR
    analogWrite(6, 100); //RIGHT MOTOR
    analogWrite(9, 0);   //RIGHT MOTOR
}

void go_back () //двидение назад
{
    analogWrite(3, 255); //LEFT MOTOR
    analogWrite(5, 0);   //LEFT MOTOR
    analogWrite(6, 255); //RIGHT MOTOR
    analogWrite(9, 0);   //RIGHT MOTOR
}
void go_right () //поиск цели или движение направо
{
    analogWrite(3, 100);  //LEFT MOTOR
    analogWrite(5, 0);    //LEFT MOTOR
    analogWrite(6, 0);    //RIGHT MOTOR
    analogWrite(9, 100);  //RIGHT MOTOR
}

void go_stop() //остановка
{
    analogWrite(3, 255); //LEFT MOTOR
    analogWrite(5, 255); //LEFT MOTOR
    analogWrite(6, 255); //RIGHT MOTOR
    analogWrite(9, 255); //RIGHT MOTOR
}

void check_sensor() // Подпрограмма проверки сенсоров.
{
  R_Sensor=analogRead(15); // считываем показания с правого сенсора
  delay(10); // Ожидание преобразования АЦП
  L_Sensor=analogRead(17);// считываем показания с левого сенсора
  delay(10); // Ожидание преобразования АЦП
  dist_cm = ultrasonic.Ranging(CM);
  delay(10);// Ожидание преобразования
}


void loop()
{
  check_sensor(); // Проверяем сенсоры

 
  if (R_Sensor>150 and L_Sensor>150)
   {
     if (dist_cm>40) //Если дистанция до объекта больше 40 см то
         {
           go_left(); // поиск цели
         }
         else
         {
           go_forward(); //если поймана цель атакуем
          tone(10, 300, 250); // сигналим
          digitalWrite(7, HIGH); //зажигаем
          digitalWrite(8, LOW); 
         }
   }
    else
     {
     go_stop();      //Стоп!
     delay(100);     //Ждем 100 мс
     go_back();      //Движемся назад
     delay(1000);    //1 секунду.
// При анализе края  возможна ситуация, что потом, при поиске цели, бот будет рыскать
// налево-направо. Поэтому можно ввести дополнительную переменную, и записывать
// в нее предыдущий поворот. Я назвал её turn, добавив перед setup() строчку   byte turn = 0;
     if (L_Sensor<=150) {
         go_right();     //Поворачиваем направо если последним сработал левый
         turn=1;
     } else {
         go_left();                   //иначе поворачиваем налево
         turn=2;
     }
     delay(300);     //300 мс
     go_forward();   //Движемся вперед
     delay(300);     //300 мс
     }
     else
     {
     if (dist_cm>40) //Если дистанция до объекта больше 40 см то
         {
           // поиск цели
           if (turn==1) {
             go_right();     //Поворачиваем направо если сработал левый
           } else {
             go_left();                   //иначе поворачиваем налево
           }
         }
         else
         {
           go_forward(); //если поймана цель атакуем
         }
     }
Последний раз редактировалось ol82 23 авг 2016, 23:30, всего редактировалось 1 раз.
Аватара пользователя
ol82
 
Сообщения: 44
Зарегистрирован: 19 авг 2016, 08:04
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 23 авг 2016, 22:45

Операция ИЛИ - это две вертикальные черты, клавиша между плюсом и BackSpace, что над Enter.

В тексте вашей программы, присмотритесь, в главной программе loop есть оператор if, после которого скобки открылись и закрылись. Это первый блок команд. Скобка закрывается. Далее else и снова открывается скобка, далее идет альтернативный блок команд, и скобка закрывается. А затем идет опять else и третий блок, а это уже косяк. Должно быть так:
Код: Выделить всёРазвернуть
// Подключение модуля ультразвукового сенсора
#include <Ultrasonic.h>


//объявление глобальных переменных
int L_Sensor = 0; //Левый сенсор
int R_Sensor = 0; //Правый сенсор
float dist_cm = 0; // Значение расстояния
Ultrasonic ultrasonic(4, 2); // Назначение портов УЗ сенсора. Trig, Echo
byte turn = 0; // переменная Eruman


void setup()// Модуль инициализации
{
  pinMode( 15 , INPUT); // Вход правого сенсора
  pinMode( 17 , INPUT); // Вход левого сенсора
  pinMode(3, OUTPUT); //B-B     Назад  - Левый мотор
  pinMode(5, OUTPUT); //B-1A    Вперед - Левый мотор
  pinMode(6, OUTPUT); //A-B     Назад  - Правый мотор
  pinMode(9, OUTPUT); //A-1A    Вперед - Правый мотор
  pinMode(7, OUTPUT); // LED1 Захват
  pinMode(8, OUTPUT); // LED2 Откат
  Serial.begin(9600); // Активация передачи данных через терминал
  delay(5000); // Задержка старта 5 сек.
}

void go_forward()  //Атакуем движение вперед
{
  analogWrite(3, 0);    //LEFT MOTOR
  analogWrite(5, 255);  //LEFT MOTOR
  analogWrite(6, 0);    //RIGHT MOTOR
  analogWrite(9, 255);  //RIGHT MOTOR
}

void go_left() // поиск цели или движение налево
{
  analogWrite(3, 0);   //LEFT MOTOR
  analogWrite(5, 100); //LEFT MOTOR
  analogWrite(6, 100); //RIGHT MOTOR
  analogWrite(9, 0);   //RIGHT MOTOR
}

void go_back () //движение назад
{
  analogWrite(3, 255); //LEFT MOTOR
  analogWrite(5, 0);   //LEFT MOTOR
  analogWrite(6, 255); //RIGHT MOTOR
  analogWrite(9, 0);   //RIGHT MOTOR
}
void go_right () //поиск цели или движение направо
{
  analogWrite(3, 100);  //LEFT MOTOR
  analogWrite(5, 0);    //LEFT MOTOR
  analogWrite(6, 0);    //RIGHT MOTOR
  analogWrite(9, 100);  //RIGHT MOTOR
}

void go_stop() //остановка
{
  analogWrite(3, 255); //LEFT MOTOR
  analogWrite(5, 255); //LEFT MOTOR
  analogWrite(6, 255); //RIGHT MOTOR
  analogWrite(9, 255); //RIGHT MOTOR
}

void check_sensor() // Подпрограмма проверки сенсоров.
{
  R_Sensor = analogRead(15); // считываем показания с правого сенсора
  delay(10); // Ожидание преобразования АЦП
  L_Sensor = analogRead(17); // считываем показания с левого сенсора
  delay(10); // Ожидание преобразования АЦП
  dist_cm = ultrasonic.Ranging(CM);
  delay(10);// Ожидание преобразования
}


void loop()
{
  check_sensor(); // Проверяем сенсоры

  if (R_Sensor < 150 || L_Sensor < 150)   // Если белое поле
  {
    go_stop();      //Стоп!
    delay(100);     //Ждем 100 мс
    go_back();      //Движемся назад
    delay(1000);    //1 секунду.
    // При анализе края  возможна ситуация, что потом, при поиске цели, бот будет рыскать
    // налево-направо. Поэтому можно ввести дополнительную переменную, и записывать
    // в нее предыдущий поворот. Я назвал её turn, добавив перед setup() строчку   byte turn = 0;
    if (L_Sensor <= 150) {
      go_right();     //Поворачиваем направо если последним сработал левый
      turn = 1;
    } else {
      go_left();                   //иначе поворачиваем налево
      turn = 2;
    }
    delay(300);     //300 мс
    go_forward();   //Движемся вперед
    delay(300);     //300 мс
  }
  else  // Если поле черное
  {
    if (dist_cm > 40) //Если дистанция до объекта больше 40 см то
    {
      // поиск цели
      if (turn == 1) {
        go_right();     //Поворачиваем направо если ранее сработал левый
      } else {
        go_left();                   //иначе поворачиваем налево
      }
    }
    else
    {
      go_forward(); //если поймана цель атакуем
      tone(10, 300, 250); // сигналим
      digitalWrite(7, HIGH); //зажигаем
      digitalWrite(8, LOW);
    }
  }
}



Есть возможность сворачивать код между скобками, так можно получше понять, что как работает. В меню "Файл/Настройки/Включить сворачивание кода" галочку поставьте, и можно пользоваться.
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 24 авг 2016, 20:27

Благодарю, все замечательно работает. Только назад уменьшил на полсекунды (ринг маленький, времянка). Кажется, я что-то уже понимаю, глядя в скетч. Вопросов куча, но они все смешные, наверное.
Например, почему скобки на разном расстоянии от начала строки?
Почему комментарии написаны то вплотную к точке с запятой, то через множество пробелов.
Откуда взялись: go_back, go_stop, go left и другие, это подпрограммы и названия придуманы автором? Я таких в справочнике Ардуины не нашел.
Да и в описании функций: "delay()Останавливает выполнение программы на заданное в параметре количество миллисекунд". Как же останавливает, бот же едет? светодиод зажжен? АЦП считает? Должно все встать, судя по описанию. Извиняюсь за глупость, занялся не знай чем. :oops:
В планах развести новую плату, добавить задние сенсоры и доработать под них скетч. И сделать звук через транзистор, боюсь порт сжечь.

Добавлено спустя 1 минуту 42 секунды:
Трехвыводные датчики (типа как на фото выше) тоже хорошо работают.
Аватара пользователя
ol82
 
Сообщения: 44
Зарегистрирован: 19 авг 2016, 08:04
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 24 авг 2016, 23:58

ol82 писал(а):Например, почему скобки на разном расстоянии от начала строки?
Можно и не отступать, но так взгляду легче структуру программы ухватить.
Почему комментарии написаны то вплотную к точке с запятой, то через множество пробелов.
Как рука зашла :)
Откуда взялись: go_back, go_stop, go left и другие, это подпрограммы и названия придуманы автором? Я таких в справочнике Ардуины не нашел.
Это подпрограммы, названия даются программистом, в т.ч. осмысленные имена для понятности. В данном случае по-английски. Можно было назвать vpered, nazad, nalevo, indikacija ...
Да и в описании функций: "delay()Останавливает выполнение программы на заданное в параметре количество миллисекунд". Как же останавливает, бот же едет? светодиод зажжен? АЦП считает? Должно все встать, судя по описанию.
Представьте, водитель в авто заснул на пару секунд, а мотор урчит, фары горят, поплавок в бензобаке плавает, и стрелки в комбинации указывают куда нужно. Водитель не реагирует и не рулит, но то, что включили - включено, что должно тикать - тикает, и т.д.
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

Пред.

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11