Управление моторами Arduino UNO

Юрец
Offline
Зарегистрирован: 20.01.2016
Доброго всем дня. Ардуиной занимаюсь недавно и дошёл до того, чтобы запрограммировать своего первого робота. Робот шагающий с двумя простыми моторами.
Скетч взял из урока по ардуине, немного переделал его (недоделал пока). Но столкнулся с такой проблемой. Для движения вперёд-назад нужно, чтобы моторы
работали одновременно. Покурив форум, я узнал, что ардуино не поддерживает многозадачность. И для того, чтобы создать "непрерывность" движения, нужно 
последовательно подавать сигналы на оба мотора с коротким промежутком, при этом не используя delay. Вот как мне это сделать? Или всё таки можно как-то
одновременно моторы запускать? Вот скетч, который я пилю. Он рабочий, но недоделаный. Пока только один мотор старт-стоп.


//   16718055 и 16726215 - коды кнопок 2 и 5
#include <IRremote.h>
int motor_1 = 4; // определяем порт для 1-го мотроа
int motor_2 = 5; // определяем порт для 2-го мотора
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()  
{
  pinMode(motor_1, OUTPUT); //определяем выводы на моторы как "выходы"
  pinMode(motor_2, OUTPUT); //определяем выводы на моторы как "выходы"
  Serial.begin(9600);  // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}
void loop() {
  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value);  // выводим его на экран компьютера
    if (results.value ==  16718055) // если принятый код равен одному из запомненных нами
    {
      digitalWrite(motor_1,HIGH);  // то включаем первый мотор
        
     
    }
    if (results.value == 16726215)  // если принятый код равен второму из запомненных нами
    {
      digitalWrite(motor_1,LOW);   // то выключаем первый мотор
      }
    irrecv.resume(); // ждем прием следующего сигнала
  }
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Что мешает включать оба мотора?

digitalWrite(motor_1,HIGH);
digitalWrite(motor_2,HIGH);

Юрец
Offline
Зарегистрирован: 20.01.2016

Пробывал, не работает.

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

Юрец пишет:

Пробывал, не работает.

Как подключены моторы? Схему подключения в студию. Только полную.

Юрец
Offline
Зарегистрирован: 20.01.2016

Моторы подключены через драйвер моторов 800мА на основе двух чипов L9110S, который идёт в комплекте Артуино старт, драйвер запитан отдельно от 3В, через пины VCC и GND, управляющие пины заведены на ардуину пины 4 и 5. Ну и датчик света к 11 пину на ардуине и VCC 5В и GND на ардуине

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

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

следующий вариант

void loop() {
digitalWrite(motor_1,HIGH);
digitalWrite(motor_2,HIGH);
}

может нога чудит... и я не очень понял про VCC, у Вас 2 источника питания? +3 на моторы и +5 на ардуну, про GND(соединены же?) думаю не стоит спрашивать, т.к. один вроде как работает, а вот разница питания меня смущает, может драйверу не понравилось +5 с МК?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Юрец пишет:
драйвер запитан отдельно от 3В, через пины VCC и GND
Надо полагать питание драйверов взято со стабилизатора ардуины. При включении второго мотора происходит перегрузка стабилизатора.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Для одного мотора ваш драйвер должен получить  два  сигнала

Впрочем один можно посадить на + или - , но тогда не будет реверса.
Второй вход драйвера куда-то подключили?
Или это уже сделано на вашей плате?

https://brainy-bits.com/tutorials/l9110s/

Тут понятнее и проще нарисовано:

https://www.circuitlab.com/circuit/k5289t/conexion-de-prueba-l9110/

Поиграйтесь кнопочками ( пинцетом)
Кстати, если ваш "моторчик" действительно трёхвольтовый, такие обычно большой ток употребляют....

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

Юрец пишет:

Моторы подключены через драйвер моторов 800мА на основе двух чипов L9110S, который идёт в комплекте Артуино старт, драйвер запитан отдельно от 3В, через пины VCC и GND, управляющие пины заведены на ардуину пины 4 и 5. Ну и датчик света к 11 пину на ардуине и VCC 5В и GND на ардуине

Знаете в чём проблема всех новичков? Они не умеют читать.

Вот Вам ясно написали "схему в студию, причём полную". Вместо того, чтобы выложить схему, Вы написали что-то из чего многое осталось непонятным. И пошли вопросы: один источник или два? а может всё от ардуины? а соединены ли вместе Gnd? Видите, сколько вопросов? А всё потому, что Вы поленились выкладывать схему, как Вас попросили.

Я вот, не собираюсь угадывать сколько у Вас источников и соединены ли Gnd. Мне это не нужно. Вам, судя по лени выложить схему - тоже не особо нужно. Ну, и нафига тогда?

Если Вам нужна помощь, так не мешайте людям Вам её оказать.

Юрец
Offline
Зарегистрирован: 20.01.2016

Не получается выложить схему. Ардуино на данный момент запитано через USB. К ардуине подключён датчик света (пин 11) и питание к нему (5в и GND) тоже к ардуине. Оба мотора подключены к драйверу мотора и драйвер запитан от пары батареек ААА отдельно от ардуины. Драйвер мотора связан с ардуиной только сигнальными кабелями к пинам 4 и 5. Позже будут ещё 2 сигнальных кабеля от драйвера к ардуине (например пины 6 и 7). В мойм скетче после void loop описан сценарий для первого мотора на 4-м пине старт-стоп, он рабочий. Мне нужно, чтобы в идеале на 4 и 5 пине было одновременно HIGH или LOW, когда приходит код с ик-пульта. Не могу понять почему схема не выкладывается, на сервер кинул, ссылка сформировалась, жму ОК, нет эффекта, жму ОТМЕНА то же самое. Приходится перезаходить.

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

Судя из описания gnd не соединены. Начните с этого )

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Юрец пишет:

 Драйвер мотора связан с ардуиной только сигнальными кабелями к пинам 4 и 5. Позже будут ещё 2 сигнальных кабеля от драйвера к ардуине (например пины 6 и 7).

Опять, впрочем как обычно, никто про "землю" даже  и не вспоминает.....

Юрец
Offline
Зарегистрирован: 20.01.2016

Гы-гы на общей "земле" всё зажило как надо. Большое всем спасибо, пойду дальше скетч допиливать.

Юрец
Offline
Зарегистрирован: 20.01.2016
#include <IRremote.h>
int motor_1 = 4; // определяем порт для 1-го мотора
int motor_2 = 5; // определяем порт для 2-го мотора
int motor_3 = 6; // определяем порт для 1-го мотора назад
int motor_4 = 7; // определяем порт для 2-го мотора назад
int RECV_PIN = 11; // назначаем 11-ый вывод для подключения фотоприемника
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()  
{
  pinMode(motor_1, OUTPUT); //определяем выводы на моторы как "выходы"
  pinMode(motor_2, OUTPUT); //определяем выводы на моторы как "выходы"
  pinMode(motor_3, OUTPUT); //определяем выводы на моторы как "выходы"
  pinMode(motor_4, OUTPUT); //определяем выводы на моторы как "выходы"
  Serial.begin(9600);  // устанавливает скорость обмена данными с компьютером
  irrecv.enableIRIn(); // функция начала приема
}
void loop() {
  if (irrecv.decode(&results)) { // если сигнал принят
    Serial.println(results.value);  // выводим его на экран компьютера
    if (results.value ==  16718055) // если принятый код равен одному из запомненных нами
    {
      digitalWrite(motor_1,HIGH);  // то включаем первый мотор
      digitalWrite(motor_2,HIGH);  // и включаем второй мотор
     
    }
    if (results.value == 16726215)  // если принятый код равен второму из запомненных нами
    {
      digitalWrite(motor_1,LOW);   // то выключаем первый мотор
      digitalWrite(motor_2,LOW);   // то выключаем первый мотор
      digitalWrite(motor_3,LOW);   // то выключаем первый мотор назад
      digitalWrite(motor_4,LOW);   // то выключаем первый мотор назад
      }
    if (results.value ==  16716015) // если принятый код равен одному из запомненных нами
      {
      digitalWrite(motor_1,HIGH);  // то включаем первый мотор
      digitalWrite(motor_2,LOW);  // и включаем второй мотор
      digitalWrite(motor_3,LOW);   // то выключаем первый мотор назад
      digitalWrite(motor_4,LOW);   // то выключаем первый мотор назад
      }
    if (results.value ==  16734885) // если принятый код равен одному из запомненных нами
      {
      digitalWrite(motor_1,LOW);  // то включаем первый мотор
      digitalWrite(motor_2,HIGH);  // и включаем второй мотор
      digitalWrite(motor_3,LOW);   // то выключаем первый мотор назад
      digitalWrite(motor_4,LOW);   // то выключаем первый мотор назад
      }
    if (results.value ==  16730805) // если принятый код равен одному из запомненных нами
    {
      digitalWrite(motor_3,HIGH);  // то включаем первый мотор
      digitalWrite(motor_4,HIGH);  // и включаем второй мотор
    }  
    irrecv.resume(); // ждем прием следующего сигнала
  }
}

Вот, что у меня получилось. Робот управляется с ИК-пульта кнопками 2, 8 вперёд-назад, 4,6 влево-вправо, 5 стоп. Спасибо всем за помощь.