Помогите со скетчем. Управление двигателем.

zagrooz
Offline
Зарегистрирован: 09.10.2017
Два датчика (оптический датчик) следят за смещением ленты, как только один из датчиков сработал включается двигатель и смещает ленту в противоположную сторону, когда лента выпрямилась, оба датчика в норме, двигатель в исходное положение (третий оптический датчик положения). 
Был код изначально такой, без третьего положения.
[code]
[== C++ ==]
int photoPin1 = 10;  // левый фоторезистор 
int photoPin2 = 11;  // правый фоторезистор
int motor1 = 8;   // мотор влево
int motor2 = 9;   // мотор вправо
int val1 = 0;       // переменные для хранения значения входного напряжения 
int val2 = 0;       // 
 
void setup() 
{
  Serial.begin(9600);
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
}
 
void loop() 
{
  val1 = digitalRead(photoPin1);  // считываем значение с фоторезисторов
  val2 = digitalRead(photoPin2); 
  Serial.print("values: ");      // выводим их в COM-порт
  Serial.print(val1);
  Serial.print(" : ");
  Serial.println(val2);
  val1 = val1;                 // 
  val2 = val2;                 // 
  if(val1==val2)                 // если равны - стоп двигатель
  {
     digitalWrite(motor1, LOW);
     digitalWrite(motor2, LOW);
     Serial.println("waiting");
  }
  else
  {
    if(val1>val2)                 
    { 
      digitalWrite(motor1, HIGH);
      digitalWrite(motor2, LOW);
      Serial.println("left");
    }
    else
    {
      digitalWrite(motor2, HIGH);
      digitalWrite(motor1, LOW);
      Serial.println("right");
    }
  }
  delay(500);
}
[/code]
 
Все было просто до этого "нулевого" положения, подскажите решение с новыми данными.

 

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Для начала научитесь правильно постить код.

zagrooz
Offline
Зарегистрирован: 09.10.2017

Спасибо за спроведливое замечание, но я был уверен что сайт построен по на той же платформе как и на другом сайте, с телефона у меня не видно подсветку синтаксиса((( и я просто скопировал с похожего форума. Там все красиво получилось)

zagrooz
Offline
Зарегистрирован: 09.10.2017

inspiritus пишет:

Для начала научитесь правильно постить код.


А у вас есть решение?

kasper007
Offline
Зарегистрирован: 23.05.2016

разместите код, согласно правил данного форума

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

И вот даже не смотря на весь остальной код, подскажите, а что вы хотели реализовать следующими строками:

  val1 = val1;                 // 
  val2 = val2;                 //
zagrooz
Offline
Зарегистрирован: 09.10.2017

Чтоб код стартовал с параметром = 0
А по поводу размещения кода, к сожалению писал все с телефона. А там html редактора невидно.(
Я перепишу все с ноутбука, сразу после обеда!

b707
Offline
Зарегистрирован: 26.05.2017

zagrooz пишет:
Чтоб код стартовал с параметром = 0

А как вам в этом поможет то, что val1 останется тем же, каким был? У вас хоть капля логики есть? тут даже не надо уметь программировать. чтобы понять. что операция x=x; не делает абсолютно ничего.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

тут даже не надо уметь программировать. чтобы понять. что операция x=x; не делает абсолютно ничего.

Так на то у нас и канпиляторы есть, у которых мозгов больше чем у пограммиста, выкинет

zagrooz
Offline
Зарегистрирован: 09.10.2017

Согласен, удаляем)
Логика кода понятна Вам, так как это Вам интересно... а мне особо вникать не зачем, взял из уроков немного того, немного сего... все заработало и вот оно счастье! Но когда появилась необходимость третьего положения каретки, тут увы или все сначала, но времени нет снова читать литературу или просить помощи...)

zagrooz
Offline
Зарегистрирован: 09.10.2017

А этот кусок кода не нарушает логики, компилятор пропустил...

b707
Offline
Зарегистрирован: 26.05.2017

zagrooz пишет:
Согласен, удаляем) Логика кода понятна Вам, так как это Вам интересно... а мне особо вникать не зачем, взял из уроков немного того, немного сего... все заработало и вот оно счастье! Но когда появилась необходимость третьего положения каретки, тут увы или все сначала, но времени нет снова читать литературу или просить помощи...)

с таким настроем не советую вам постить в форум. Если не хотите вникать и читать литературу, идите в раздел "Ищу исполнителя", платите деньги и вам все сделают. Тут помогают тем, кто хочет вникнуть сам.  А над такими, кому "некогда читать" - жестоко глумятся.

zagrooz
Offline
Зарегистрирован: 09.10.2017

Спасибо за совет, сижу вникаю))) так как понимаю что никому не интересно помогать или обьяснять. Сюда написал в надежде кто подскажет куда смотреть или концепцию иную подскажет...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Дак ты даже код правильно не вставил, что разбирать, как подсказывать? Ашыпка в хз какой строке? Или самому строки считать, водя бородавчатым пальцем, щурясь и шевеля губами?

zagrooz
Offline
Зарегистрирован: 09.10.2017

DetSimen пишет:

Дак ты даже код правильно не вставил, что разбирать, как подсказывать? Ашыпка в хз какой строке? Или самому строки считать, водя бородавчатым пальцем, щурясь и шевеля губами?


Я думаю это выглядит немного жутковато со стороны... поэтому с работы попаду домой, сразу все подправлю!

zagrooz
Offline
Зарегистрирован: 09.10.2017
int photoPin1 = 10;  // левый фоторезистор 
int photoPin2 = 11;  // правый фоторезистор
int motor1 = 8;   // мотор влево
int motor2 = 9;   // мотор вправо
int val1 = 0;       // переменные для хранения значения входного напряжения 
int val2 = 0;       // 
 
void setup() 
{
  Serial.begin(9600);
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
}
 
void loop() 
{
  val1 = digitalRead(photoPin1);  // считываем значение с фоторезисторов
  val2 = digitalRead(photoPin2); 
  Serial.print("values: ");      // выводим их в COM-порт
  Serial.print(val1);
  Serial.print(" : ");
  Serial.println(val2);
  if(val1==val2)                 // если равны - стоп двигатель
  {
     digitalWrite(motor1, LOW);
     digitalWrite(motor2, LOW);
     Serial.println("waiting");
  }
  else
  {
    if(val1>val2)                 
    { 
      digitalWrite(motor1, HIGH);
      digitalWrite(motor2, LOW);
      Serial.println("left");
    }
    else
    {
      digitalWrite(motor2, HIGH);
      digitalWrite(motor1, LOW);
      Serial.println("right");
    }
  }
  delay(500);
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
//также надо указать для фоторезистор 
pinMode(photoPin1, INPUT);//ЗДЕСЬ НЕ ПОНЯТНО С ПОДТЯЖКОЙ
pinMode(photoPin2, INPUT)

И делай надо убрать - он блокирует считывание с датчиков поэтому и не останавливается, хотя все зависит от скорости двигателя - если 1 мм в минуту или меньше догда да

 

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

   Код в работе не проверял

/**/
unsigned long mill;
typedef void (*handler)() ;
//---------------------------------------------
class Cl_Motors {
  protected:
    const byte pin1;
    const byte pin2;
  public:
    Cl_Motors(byte _pin1, byte _pin2): pin1(_pin1), pin2(_pin2) {}
    void init() {
      pinMode(pin1, OUTPUT); //настраиваем пины на выход
      pinMode(pin2, OUTPUT);
      stop();
    }
    void stop() {
      digitalWrite(pin1, LOW);
      digitalWrite(pin2, LOW);
    }
    void left() {
      digitalWrite(pin1, HIGH);
      digitalWrite(pin2, LOW);
    }
    void right() {
      digitalWrite(pin1, LOW);
      digitalWrite(pin2, HIGH);
    }
};
//-------------------------------------------
class Cl_Sens {
  protected:
    const byte pin1;
    const byte pin2;
    handler stop, left, right;
    bool val1, val2;
    unsigned long past = 0;
  public:
    Cl_Sens(byte _pin1, byte _pin2, handler _stop, handler _left, handler _right)
      :     pin1(_pin1), pin2(_pin2), stop(_stop), left(_left), right(_right) {}
    void init() {
      pinMode(pin1, INPUT); //настрaиваем пины на вход
      pinMode(pin2, INPUT);
    }
    void run() {
      if (mill - past > 100) {
        past = mill;
        val1 = digitalRead(pin1);  // считываем значение с фоторезисторов
        val2 = digitalRead(pin2);
        if (!val1 && !val2) {
          stop();
          Serial.println("waiting");
        }
        if (!val1 && val2) {
          left();
          Serial.println("left");
        }
        if (val1 && !val2) {
          right();
          Serial.println("right");
        }
      }
    }
};
//-----компоновка---------------------------
Cl_Motors Motors(/*левый пин*/8,/*правый пин*/9);
void stopSens() {
  Motors.stop();
}
void leftSens() {
  Motors.left();
}
void rightSens() {
  Motors.right();
}
Cl_Sens Sens(/*левый пин*/10,/*правый пин*/11,/*обработчик*/&stopSens,/*обработчик*/&leftSens,/*обработчик*/&rightSens);
//-------main()--------------------------------------
void setup() {
  Serial.begin(9600);
  Motors.init();
  Sens.init();
}

void loop() {
  mill = millis();
  Sens.run();
}
/*
  Скетч использует 2382 байт (7%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 224 байт (10%) динамической памяти, оставляя 1824 байт для локальных переменных. Максимум: 2048 байт.
*/

 

zagrooz
Offline
Зарегистрирован: 09.10.2017

Я бы хотел продолжить беседу в не сайта, обсудить ньюансы и закончить проект. Немного не то что я хотел.