два цикла одновременно

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

Здравствуйте!

Есть две соединённые пластины, типа нога...

На каждой пластине установлены двигатели и MPU6050 (акселерометр + гироскоп).

Мне нужно, когда пластина-"бедро" поднимается вверх (мотор1 крутит вперёд) до определённого угла на MPU6050, а пластина-"голень" (мотор2 крутит назад) до определённого угла на другом MPU6050, сделать так, чтобы оба двигателя крутили одновременно...

Как можно "заставить" два цикла работать одновременно?

Или есть иной способ?

rkit
Offline
Зарегистрирован: 23.11.2016

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

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

Perdimonocle пишет:

Как можно "заставить" два цикла работать одновременно?

а в чем проблема? Вы сами пробовали? Если да - показывайте код

-NMi-
Offline
Зарегистрирован: 20.08.2018

Perdimonocle пишет:

Как можно "заставить" два цикла работать одновременно?

Енто`ж елементарно, Ваццон: две дурдуины+синяя изолента.

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

rkit пишет:

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

А что с углом не так?

rkit
Offline
Зарегистрирован: 23.11.2016

Ну если всё так, то тему можно закрывать.

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

b707 пишет:

Perdimonocle пишет:

Как можно "заставить" два цикла работать одновременно?

а в чем проблема? Вы сами пробовали? Если да - показывайте код

Мне показалось, что я как раз и спрашиваю: можно ли "заставить" два цикла работать одновременно?

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

Perdimonocle пишет:

Мне показалось, что я как раз и спрашиваю: можно ли "заставить" два цикла работать одновременно?

конечно

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

Я в ветке для новичков создал тему и задал вопрос... А оказалось, что тут самородки-петросяны...

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

а я еще раз спрашиваю - в чем проблема то у вас? Формулируйте точнее.

Вы спрашивали "можно ли заставить исполнятся два цикла?" - да запросто:

for (int i =0; i<16; i++) {
 for (int j =0; j<i; j++) {
   // делаем что-то
 }
} 

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

707-й, ну жеж рано жеж исчо...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Perdimonocle пишет:

Мне показалось, что я как раз и спрашиваю: можно ли "заставить" два цикла работать одновременно?

Мне тоже так показалось и я уже был готов дать ответ: в чистом виде - нет, нельзя.

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

Правильный вопрос был бы: можно ли два сервомотора заставить крутиться одновременно. Вам ведь именно это надо, а не циклы, правда?

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

Я ответил на Ваш вопрос?

mixail844
Offline
Зарегистрирован: 30.04.2012
Perdimonocle , не обижайтесь на язвительные вызказывания , ваш вопрос и правда не верно поставлен (оно и ясно , вы новичек и это нормально) ,если проявите достаточто терпения и проявите желания научиться ,вам помогут и все обьяснят. 
 
заставить код и железо работать так ,что бы наблюдающему со стороны казалось что пластины (моторы) двигаються одновременно , при этом каждая на свой заданный угол : можно .
для этого надо реализовать фунцию поворота мотора на угол "А" не блокирующим(non-blocking) способом , то есть без использоваяния Delay() в теле функции , а так же определиться поворот будет всегда с постоянной скоростью или скорость поворота можно задавать при вызове функции
Perdimonocle
Offline
Зарегистрирован: 19.10.2012

ЕвгенийП пишет:

Правильный вопрос был бы: можно ли два сервомотора заставить крутиться одновременно. Вам ведь именно это надо, а не циклы, правда?

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

Я ответил на Ваш вопрос?

У меня не сервы, а двигатели постоянного тока с червячным редуктором...

 

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

mixail844 пишет:

заставить код и железо работать так ,что бы наблюдающему со стороны казалось что пластины (моторы) двигаються одновременно , при этом каждая на свой заданный угол : можно .
для этого надо реализовать фунцию поворота мотора на угол "А" не блокирующим(non-blocking) способом , то есть без использоваяния Delay() в теле функции , а так же определиться поворот будет всегда с постоянной скоростью или скорость поворота можно задавать при вызове функции

Не подскажете как? Хотя бы примерный скетч...

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Perdimonocle пишет:

 

Не подскажете как? Хотя бы примерный скетч...

Сделайте скетч для одной "ноги" сначала. А потом уже будем обсуждать как и вторую одновременно крутить.

rkit
Offline
Зарегистрирован: 23.11.2016

Perdimonocle пишет:

Не подскажете как? Хотя бы примерный скетч...

Если ты собрался заниматься робототехникой на базе IMU, не изучая самостоятельно теории, то бросай это дело. Ничего не получится.

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

Perdimonocle пишет:

Не подскажете как? Хотя бы примерный скетч...

Примерно так:

/*
  Blink without Delay

  Turns on and off a light emitting diode (LED) connected to a digital pin,
  without using the delay() function. This means that other code can run at the
  same time without being interrupted by the LED code.

  The circuit:
  - Use the onboard LED.
  - Note: Most Arduinos have an on-board LED you can control. On the UNO, MEGA
    and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN
    is set to the correct LED pin independent of which board is used.
    If you want to know what pin the on-board LED is connected to on your
    Arduino model, check the Technical Specs of your board at:
    https://www.arduino.cc/en/Main/Products

  created 2005
  by David A. Mellis
  modified 8 Feb 2010
  by Paul Stoffregen
  modified 11 Nov 2013
  by Scott Fitzgerald
  modified 9 Jan 2017
  by Arturo Guadalupi

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

// constants won't change. Used here to set a pin number:
const int ledPin =  LED_BUILTIN;// the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

На мой взгляд, правда, написано довольно криво, но это считается классикой, поэтому размещаю так, как есть.

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

asam пишет:

Perdimonocle пишет:

 

Не подскажете как? Хотя бы примерный скетч...

Сделайте скетч для одной "ноги" сначала. А потом уже будем обсуждать как и вторую одновременно крутить.

Ок. Сделаю. Но мне одной "ноги" будет достаточно...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Perdimonocle пишет:

ЕвгенийП пишет:

Правильный вопрос был бы: можно ли два сервомотора заставить крутиться одновременно. Вам ведь именно это надо, а не циклы, правда?

У меня не сервы, а двигатели постоянного тока с червячным редуктором...

Это многое меняет :-)

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

// бедро вперёд
      unsigned long StartTime = millis();
      while(millis() - StartTime < 500UL) {
        motorA.runForward(125); // бедро двигается вперёд

        // голень назад
        while(millis() - StartTime < 500UL) {
          motorB.runReverse(105); // бедро двигается вперёд
        }
        motorB.stop(); // остановка движения голени        
      }
      motorA.stop(); // остановка движения бедра

Как-то так...

rkit
Offline
Зарегистрирован: 23.11.2016

Perdimonocle пишет:

// бедро вперёд
      unsigned long StartTime = millis();
      while(millis() - StartTime < 500UL) {
        motorA.runForward(125); // бедро двигается вперёд

        // голень назад
        while(millis() - StartTime < 500UL) {
          motorB.runReverse(105); // бедро двигается вперёд
        }
        motorB.stop(); // остановка движения голени        
      }
      motorA.stop(); // остановка движения бедра

Как-то так...

Каша какая

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

rkit пишет:

Каша какая

А конкретнее?

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

Perdimonocle пишет:

А конкретнее?

ничего не изменилось с прошлого раза - вы опять пытаетесь запустить 2 цикла одновременно. Причем сейчас взяли для этого цикл while - худший вариант из того что можно выбрать. потому что он блокирующий. По сути ваш код аналогичен применению delay() со всеми вытекающими последствиями.

Вам же написали, что вашу задачу так не решить....

rkit
Offline
Зарегистрирован: 23.11.2016

Конкретнее этот код пишется вот так.

motorA.runForward(125);
motorB.runReverse(105);
delay(500);
motorA.stop();
motorB.stop();

И про "брось это дело" я не шутил. Тебе эта задача реально не по зубам в ближайшие 2 года.

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

rkit пишет:

Конкретнее этот код пишется вот так.

motorA.runForward(125);
motorB.runReverse(105);
delay(500);
motorA.stop();
motorB.stop();

Мне нужно ограничить работу моторов значениями датчиков...

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

Именно поэтому я и обратился в раздел для новичков!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Perdimonocle пишет:

rkit пишет:

Конкретнее этот код пишется вот так.

motorA.runForward(125);
motorB.runReverse(105);
delay(500);
motorA.stop();
motorB.stop();

Мне нужно ограничить работу моторов значениями датчиков...

Тогда убирайте delay и вместо этого следите за датчиками и, когда надо - выключайте моторы.

rkit
Offline
Зарегистрирован: 23.11.2016

И тебе в первом же ответе было сказано что делать, и чего ты не сделал до сих пор.

Morroc
Offline
Зарегистрирован: 24.10.2016

Perdimonocle пишет:

Именно поэтому я и обратился в раздел для новичков!

Попробуйте осилить. Вроде тут достаточно просто описано. Оно именно об этом и все вам понадобится, хотя может и не сразу. Обратите внимание, что цикл тут только один общий - loop(), именно так делается одновременно много разных действий.

http://wiki.amperka.ru/программирование:конечный-автомат

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

Morroc пишет:

Попробуйте осилить. Вроде тут достаточно просто описано. Оно именно об этом и все вам понадобится, хотя может и не сразу. Обратите внимание, что цикл тут только один общий - loop(), именно так делается одновременно много разных действий.

http://wiki.amperka.ru/программирование:конечный-автомат

Спасибо!