Без описания |
Поиск в теме | Версия для печати |
Петр Киселев |
Отправлено: 16 Февраля, 2014 - 17:43:17
|
Гуру
Сообщений всего: 2397
Дата рег-ции: Окт. 2012
|
Спасибо, mihail!
Сейчас попробую сделать, как вы предлагаете.
У меня там еще несколько вопросов появилось, если не возражаете, задам их чуть позже.
(Добавление)
mihail, благодарю за помощь!
Теперь с этим кодом все в порядке! Идет, как и хотелось!
(Добавление)
Теперь следующий вопрос.
Загрузил исправленный с помощью mihailа код в Arduino UNO, а сверху поставил L-motorShield.
Запускал систему с выходом на мотор-редуктор (желтый).
Проблема: мотор 2 вращается только в одну сторону, а мотор 1 крутится если второй провод вставлен в GND. Причем, все равно к какому выводу клемника подключать.
Вот и вопрос: В чем дело?
Так же было и раньше (до исправления кода).
Может погореть шилд? |
|
|
Петр Киселев |
Отправлено: 17 Февраля, 2014 - 01:07:22
|
Гуру
Сообщений всего: 2397
Дата рег-ции: Окт. 2012
|
Согласен, mihail, что лучше всего увидеть, а не услышать или прочитать.
Завтра зафотографирую и дам ссылку на тот мотор-шилд с двумя МС, одна из которых L293DNE. А проверку я делал вначале с помощью светодиодов, а уже потом подключал мотор.
(Добавление)
А код в точности, как вы мне подсказали.
int IN1 = 2;
int IN2 = 3;
int IN3 = 4;
int IN4 = 5;
void setup()
{
pinMode(IN1, INPUT);
pinMode(IN2, INPUT);
pinMode(IN3, INPUT);
pinMode(IN4, INPUT);
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW
digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW
digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW
delay(5000); // Это условие выполняется 5 секунды, после чего идет следующее условие ниже.
}
void loop()
{
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW
digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH
digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW
delay(3000); // Это условие выполняется 3 секунды, после чего идет следующее условие ниже.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW
digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW
digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW
delay(2000); // Это условие выполняется 2 секунды, после чего идет следующее условие ниже.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW
digitalWrite(IN2,HIGH); // Двигатель А назад ДА - HIGH
digitalWrite(IN3,LOW); // Двигатель Б вперед ДА - LOW
digitalWrite(IN4,HIGH); // Двигатель Б назад ДА - HIGH
delay(3000); // Это условие выполняется 3 секунды, после чего идет следующее условие ниже.
digitalWrite(IN1,LOW); // Двигатель А в перед НЕТ - LOW
digitalWrite(IN2,LOW); // Двигатель А назад НЕТ – LOW
digitalWrite(IN3,HIGH); // Двигатель Б вперед НЕТ - LOW
digitalWrite(IN4,LOW); // Двигатель Б назад ДА - HIGH
delay(4000); // Это условие выполняется 4 секунды, после чего идет следующее условие ниже.
} |
|
|
mihail |
Отправлено: 17 Февраля, 2014 - 18:17:51
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
В setup замените
pinMode(IN1, INPUT);
pinMode(IN2, INPUT);
pinMode(IN3, INPUT);
pinMode(IN4, INPUT);
на
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Со светодиодами работать будет. С драйвером двигателя Одна L293DNE управляется через 6 ножек (enable1, input1, input2, enable2, input3, input4). Но, не все из них могут быть подключены к микроконтроллеру. Надо смотреть шилд.(Отредактировано автором: 17 Февраля, 2014 - 18:20:00) |
|
|
Петр Киселев |
Отправлено: 18 Февраля, 2014 - 14:09:50
|
Гуру
Сообщений всего: 2397
Дата рег-ции: Окт. 2012
|
mihail, благодарю за идею использования модулей с релюшками!
Пару недель тому назад я заказал на ебее два модуля с двумя реле на каждом. Уже готовил печатку на 4 реле, которые нашел у себя. Они, правда, разные, но все срабатывают от 5 вольт.
Посмотрел ваши ссылки. Да, 4 реле лучше чем мне придут по две штуки.
Ну, ничего, попробую пока с ними, а позже закажу по вашим ссылкам. На заметку взял! Спасибо!
(Добавление)
А насчет ШИМ, это не беда! Поверхность ровная, моторы постоянного тока сглаживают броски напряжения. |
|
|
Петр Киселев |
Отправлено: 20 Февраля, 2014 - 21:03:24
|
Гуру
Сообщений всего: 2397
Дата рег-ции: Окт. 2012
|
mihail, у меня к вам просьба, помочь в изменении кода.
Вот скетч для моего однодвижительного.
// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
#include <AFMotor.h>
#include <Servo.h>
AF_DCMotor motor(1);
Servo servo1;
int inputPin=13; // Echo
int outputPin=7; // Trig
//int ledpin=13;
int nTurn = 0;
int i;
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Motor test!"
pinMode(inputPin, INPUT);
//pinMode(inputPin, OUTPUT);
//digitalWrite(inputPin, LOW);
pinMode(outputPin, OUTPUT);
servo1.attach(9);
motor.setSpeed(255);
servo1.write(90);
motor.run(RELEASE);
delay(2000);
}
void loop() {
//Serial.println("tick"
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
int distance = pulseIn(inputPin, HIGH);
//Serial.print("inputPin "
//Serial.println(inputPin);
distance= distance/58;
Serial.println(distance);
if (distance == 0 || distance > 50)
{
int e = servo1.read();
if (e < 90)
servo1.write(e+10);
}
else //препятствие
{
servo1.write(10);
}
motor.run(FORWARD);
delay(100);
}
Он нормально работает, но поворачивает только влево при встрече препятствия.
Вопрос:
Нельзя ли сделать так, чтобы робот поворачивал бы, например, два раза влево, а потом один раз вправо?
Если это возможно, помогите, пожалуйста!
(Добавление)
Извините, тут лишние смайлики появились.
Если они мешают, я скопирую скетч с платы Ардуино.(Отредактировано автором: 20 Февраля, 2014 - 23:18:43) |
|
|
mihail |
Отправлено: 21 Февраля, 2014 - 07:31:50
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
Петр Киселев пишет:сделать так, чтобы робот поворачивал бы, например, два раза влево, а потом один раз вправо
#include <AFMotor.h>
#include <Servo.h>
AF_DCMotor motor(1);
Servo servo1;
int inputPin=13; // Echo
int outputPin=7; // Trig
int count = 0;
void setup()
{
Serial.begin(9600);
Serial.println("Motor test!");
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
servo1.attach(9);
motor.setSpeed(255);
servo1.write(90);
motor.run(RELEASE);
delay(2000);
}
void loop()
{
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
int distance = pulseIn(inputPin, HIGH);
distance = distance / 58;
Serial.println(distance);
if (distance == 0 || distance > 50)
{
int e = servo1.read();
if (e < 90) servo1.write(e+10);
if (e > 90) servo1.write(e-10);
}
else // препятствие
{
if ( count == 2 ) servo1.write(170); // вправо
else servo1.write(10); // влево
count += 1;
if ( count == 3 ) count = 0;
}
motor.run(FORWARD);
delay(100);
} |
|
|
|
Поиск в теме | Версия для печати |
Страниц (3): « 1 [2] 3 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|