Робот застрял в углу

denis_n73
Offline
Зарегистрирован: 24.07.2015
вот тебе для фронта накатал функцию. Использовать так: if(press(номер пина)) {} // сработает при изменении состояния 0 -> 1 на указаном пине
 
boolean last_state[20];
boolean press(byte _pin) {
  boolean _front = false;
  if(digitalRead(_pin)) {
    if(!last_state[_pin]) {
      last_state[_pin] = true;
      _front = true;
    }
  }
  else {
    if(last_state[_pin]) {
      last_state[_pin] = false;
    }
  }
  return _front;
}
Joiner
Offline
Зарегистрирован: 04.09.2014

denis_n73 пишет:

вот тебе для фронта накатал функцию. Использовать так: if(press(номер пина)) {} // сработает при изменении состояния 0 -> 1 на указаном пине
 
boolean last_state[20];
boolean press(byte _pin) {
  boolean _front = false;
  if(digitalRead(_pin)) {
    if(!last_state[_pin]) {
      last_state[_pin] = true;
      _front = true;
    }
  }
  else {
    if(last_state[_pin]) {
      last_state[_pin] = false;
    }
  }
  return _front;
}

А попроще нельзя? Просто нужно фиксировать какая кнопка (датчик) нажималась последней и сколько времени прошло с того момента.

denis_n73
Offline
Зарегистрирован: 24.07.2015

Вот именно С ТОГО МОМЕНТА. Нужен фронт, по нему сохраняешь значение millis() в переменную. 

millis() - переменная = время с момента нажатия кнопки

mrbin
Offline
Зарегистрирован: 01.02.2015

А вот это не тоже самое?

void loop()
{
  // если нажали кнопку и до этого она была не нажата
  if(digitalRead(ButtonPin)==HIGH&&ButtonFlag==0)
  {
    ButtonFlag = 1;
    ButtonReleaseTime = 0;
    // запоминаем время начатия
    ButtonPressTime = millis();
    // включаем первый светодиод
    digitalWrite(LED1Pin, HIGH);    
  }
  // если кнопку отпустили
  if(digitalRead(ButtonPin)==LOW&&ButtonFlag==1)
  {
    ButtonFlag = 2;
    ButtonPressTime = 0;
    // запоминаем время отпускания
    ButtonReleaseTime = millis();    
  }
  // если кнопка нажата
  if(ButtonFlag==1)
  {
    // ждём заданное время и зажигаем второй светодиод
    if(millis() - ButtonPressTime > LED2StartDelay)
      digitalWrite(LED2Pin, HIGH);
  }
  // если отпустили кнопку
  if(ButtonFlag==2)
  {
    // ждем заданное время и гасим первый светодиод
    if(millis() - ButtonReleaseTime > LED1StopDelay)
    {
      digitalWrite(LED1Pin, LOW);
      // если второй светодиод еще не успел загореться то флаг в начальное значение сбрасываем
      if(digitalRead(LED2Pin)==LOW)
      {
        ButtonReleaseTime=0;
        ButtonFlag=0;
      }
    }
    // ждем заданное время и гасим второй светодиод и сбрасываем флаги
    // типа начальное состояние готовы к новому циклы работы
    if(millis() - ButtonReleaseTime > LED2StopDelay)
    {
      digitalWrite(LED2Pin, LOW);
      ButtonReleaseTime=0;
      ButtonFlag=0;
    }
  }
}

 

zhenious
Offline
Зарегистрирован: 03.07.2014

Энкодеры на колеса.

Даем газ - не едет, значит уперся в стену, в угол и т.д. 

Даем газ в другую сторону.

Если снова не едет, значит встали намертво, зовем на помощь.

(упрощение - проскальзывания колес нет)

 

mrbin
Offline
Зарегистрирован: 01.02.2015

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

void loop()
{
 
  vpered();  // езда вперед 
  analogWrite(LeftMotorSpeed,120);
  analogWrite(RightMotorSpeed,120);

// если сработал левый бампер 
 if(digitalRead(LeftBumper)==HIGH)//если кнопка нажата ...
{  
 // запоминаем время начатия
  LeftBumperPressTime = millis();
  vpravo();
  analogWrite(LeftMotorSpeed,140);
  analogWrite(RightMotorSpeed,140);
  delay(100); 
}
  
   if(digitalRead(RightBumper)==HIGH) 
  {
   RightBumperPressTime = millis();
  }
   if(LeftBumperPressTime-RightBumperPressTime <=INTERVAL)
   {
   nazad();
   analogWrite(LeftMotorSpeed,140);
   analogWrite(RightMotorSpeed,140);
   delay(100); 
   
   }
}

 

mrbin
Offline
Зарегистрирован: 01.02.2015

Всем спасибо! За внимание,за помощь,функцию собрал работает как и хотел,вот код может пригодится кому

//левая сторона
const int LeftMotor1 = 4;
const int LeftMotor2 = 5;
const int LeftMotorSpeed = 9;
const int LeftBumper = A0;

//правая сторона
const int RightMotor3 = 6;
const int RightMotor4 = 7;
const int RightMotorSpeed = 10;
const int RightBumper = A1;
///////////////////////////////////////////////////////////////

unsigned long LeftBumperPressTime = 0; // время нажатия кнопки
unsigned long RightBumperPressTime = 0; //время нажатия кнопки
#define INTERVAL 5000UL

void setup()
{
  pinMode(LeftBumper , INPUT);
  pinMode (LeftMotorSpeed, OUTPUT);
  pinMode (LeftMotor1, OUTPUT);
  pinMode (LeftMotor2, OUTPUT);
  
  pinMode(RightBumper, INPUT);
  pinMode (RightMotorSpeed, OUTPUT);
  pinMode (RightMotor3, OUTPUT);
  pinMode (RightMotor4, OUTPUT); 
}

void loop()
{
 
  vpered();  // езда вперед 
  analogWrite(LeftMotorSpeed,120);
  analogWrite(RightMotorSpeed,120);

// если сработал левый бампер 
 if(digitalRead(LeftBumper)==HIGH)//если кнопка нажата ...
{  
 // запоминаем время начатия
  LeftBumperPressTime = millis();
  vpravo();
  analogWrite(LeftMotorSpeed,140);
  analogWrite(RightMotorSpeed,140);
  delay(100); 
}
   if(digitalRead(RightBumper)==HIGH) 
  {
   RightBumperPressTime = millis();
   if(RightBumperPressTime-LeftBumperPressTime <=INTERVAL)
   {
    nazad();
   analogWrite(LeftMotorSpeed,140);
   analogWrite(RightMotorSpeed,140);
   delay(100); 
   
   }
  }
}







 //---------------------------------------------------------
//функция езды вперед----------------------------------------
void vpered() {
  //вращение левого мотора вперед
  digitalWrite(LeftMotor1, HIGH);
  digitalWrite(LeftMotor2, LOW); 
  //-----------------------------
  //вращение правого мотора вперед
  digitalWrite(RightMotor3, HIGH);
  digitalWrite(RightMotor4, LOW); 
  //-----------------------------  
}

//функция езды назад
void nazad() {
  //вращение левого мотора назад
  digitalWrite(LeftMotor1,LOW );
  digitalWrite(LeftMotor2, HIGH); 
  //----------------------------- 
  //вращение правого мотора назад
  digitalWrite(RightMotor3,LOW );
  digitalWrite(RightMotor4, HIGH); 
 
  //----------------------------
}

//функция езды на месте влево
void vlevo() {
  //вращение левого мотора назад
  digitalWrite(LeftMotor1, LOW);
  digitalWrite(LeftMotor2,HIGH ); 
  //-----------------------------
  //вращение правого мотора вперед
  digitalWrite(RightMotor3, HIGH);
  digitalWrite(RightMotor4,LOW ); 
  //-----------------------------  
}

//функция езды на месте вправо
void vpravo() {
  //вращение правого мотора назад
  digitalWrite(LeftMotor1,HIGH);
  digitalWrite(LeftMotor2,LOW  );
  //----------------------------
  //вращение левого мотора вперед
  digitalWrite(RightMotor3,LOW);
  digitalWrite(RightMotor4,HIGH  ); 
  //-----------------------------
}

//функция стоп
void stopm() {
  //стоп правого мотора назад
  digitalWrite(LeftMotor1, HIGH);
  digitalWrite(LeftMotor2, HIGH);
  //----------------------------
  //стоп левого мотора вперед
  digitalWrite(RightMotor3, HIGH);
  digitalWrite(RightMotor4, HIGH); 
  //-----------------------------
}  
  

 

Joiner
Offline
Зарегистрирован: 04.09.2014

mrbin пишет:

Всем спасибо! За внимание,за помощь,функцию собрал работает как и хотел

Молодчина! Вот видишь, сам разобрался.

mrbin
Offline
Зарегистрирован: 01.02.2015

РАБОТАЕ ТЕПЕРЬ ЧЕТКО,ТАМ ГДЕ ЗАСТРЕВАЛ БОЛЬШЕ НЕ ЗАСТРЕВАЕТ,ДЕЛАЕТ ДОВОРОТ И ВЫХОДИТ

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

РАБОТАЕ ТЕПЕРЬ ЧЕТКО,ТАМ ГДЕ ЗАСТРЕВАЛ БОЛЬШЕ НЕ ЗАСТРЕВАЕТ,ДЕЛАЕТ ДОВОРОТ И ВЫХОДИТ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mrbin пишет:

Да по русски описать не проблема,а вот на си некоторые функции сделать проблема

Поверьте, основная проблама именно в том, чтобы записать. На любом языке. А перевести на любой другой (для нас с русского на С) - никаких проблем.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

zhenious пишет:

Энкодеры на колеса.

Даем газ - не едет, значит уперся в стену, в угол и т.д. 

Даем газ в другую сторону.

Если снова не едет, значит встали намертво, зовем на помощь.

(упрощение - проскальзывания колес нет)

 

А при чем здесь энкодеры? Я понимаю, сказали бы "акселерометры"...

А энкодеры Вам ничего не покажут:

Вот характеристики конкретного робота, с которым я сейчас вожусь:

- масса 600г. (0.6кг).

- 2 колеса, диаметр 41 мм (радиус 2.1 см), момент 5 кГс/см,

- по ГОСТ сцепление шины с сухим асфальтом 0.8,

- у нас не асфальт, а паркет, следовательно, сцепление меньше, пусть будет 0.7.

Итого:

максимальная сила трения 0.6х0.7=0.42 кГс,

максимальное усилие на колесах: 2х5/(2.1)=4.76 кГс.

Вывод: при более чем десятикратном запасе колеса будут крутиться вхолостую, преодолевая силу трения.

Примечание: вывод не изменится, даже если мы поставим моторы с минимальным коэффициентом редукции и моментом 1.1 кГс/см.

mrbin
Offline
Зарегистрирован: 01.02.2015

Puhlyaviy Здравствуйте! опять у меня проблема,вот код

  if(digitalRead(LeftBumper)==HIGH)// если сработал левый бампер 
   {
  LeftBumperPressTime = millis(); //запоминаем время включения 
  vpravo();//поворачиваем направо
  delay(300);  
   }
  if(digitalRead(RightBumper)==HIGH)//если сработал правый датчик 
  {
  RightBumperPressTime = millis();// запоминаем время начатия
  
  if(RightBumperPressTime-LeftBumperPressTime <=INTERVAL)//сравниваем
  {
   vpravo();//поворачиваем направо
   delay(300);   
  }
  }
}

это кусочек для левого бампера,тоесть если каснулся левым бампером,поворачивает на право,и если в течении5 секунд косается правым до доворачивает на право,код работает но не правильно,если включил робота и сразу каснулся правого бампера то он и без левого касания доворачивает на право,а после пяти секунд,на правый,без касания левого не реагирует,и еще ели написать аналогично для правого бампера,то получается что попало,работает как попало,что я делаю не так,где я ошибаюсь,вроде все верно должно работать

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Во блин. Вы будете убегать как только вам покажется что вы решили что то. А я типа должен помнить о чем там речь шла.
Давайте вы попробуете каждую строчку кода снабдить коментариями , напишете что там делаете и зачем.

mrbin
Offline
Зарегистрирован: 01.02.2015

Puhlyaviy пишет:
Во блин. Вы будете убегать как только вам покажется что вы решили что то. А я типа должен помнить о чем там речь шла. Давайте вы попробуете каждую строчку кода снабдить коментариями , напишете что там делаете и зачем.

вроде все закоментировал

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

Puhlyaviy пишет:
Во блин. Вы будете убегать как только вам покажется что вы решили что то. А я типа должен помнить о чем там речь шла. Давайте вы попробуете каждую строчку кода снабдить коментариями , напишете что там делаете и зачем.

вроде все закоментировал

теперь попробуйте нарисовать на листике порядок как это работает сейчас и как это должно работать по вашему замыслу.

я например не вижу причин почему он должен что то делать при касании правым бампером... про это вообще ничего не сказано... исключая начало пока не коснулось левым бампером. там любое касание правым будет всегда меньше интервала...

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