роботы робототехника микроконтроллеры


 Страниц (3): « 1 [2] 3 »   

> Без описания
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



Спасибо, mihail!
Сейчас попробую сделать, как вы предлагаете.
У меня там еще несколько вопросов появилось, если не возражаете, задам их чуть позже.
(Добавление)
mihail, благодарю за помощь!
Теперь с этим кодом все в порядке! Идет, как и хотелось! высший восторг
(Добавление)
Теперь следующий вопрос.
Загрузил исправленный с помощью mihailа код в Arduino UNO, а сверху поставил L-motorShield.
Запускал систему с выходом на мотор-редуктор (желтый).

Проблема: мотор 2 вращается только в одну сторону, а мотор 1 крутится если второй провод вставлен в GND. Причем, все равно к какому выводу клемника подключать.

Вот и вопрос: В чем дело?
Так же было и раньше (до исправления кода).
Может погореть шилд?
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Неплохо было бы увидеть окончательную версию кода. И ссылка на ваш шилд не помешает. Лучше, конечно, сразу на схему Улыбка

Справедливости ради стоит заметить, такую программу лучше проверять на светодиодах. С моторами могут быть самые разные проблемы. Помехи. Кратковременное но сильное снижение напряжения. И т.д. и т.п.

Шилд также можно проверить светодиодиками. Если даже с ними не будет работать, тогда нужен новый шилд.

(Отредактировано автором: 16 Февраля, 2014 - 20:23:01)

 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 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 секунды, после чего идет следующее условие ниже.
}
 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



mihail пишет:

Справедливости ради стоит заметить, такую программу лучше проверять на светодиодах. С моторами могут быть самые разные проблемы. Помехи. Кратковременное но сильное снижение напряжения. И т.д. и т.п.

Шилд также можно проверить светодиодиками. Если даже с ними не будет работать, тогда нужен новый шилд.


У меня не получилось использовать Драйверы 2А. Причем разных два типа.
Склоняюсь к мысли сделать самодельный драйвер на L293DNE с использованием канальных усилителей на разнопроводимых транзисторах (n-p-n и p-n-p). Даже простой драйвер на L293DNE у меня работает нормально.

(Отредактировано автором: 17 Февраля, 2014 - 15:41:15)

 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



Показываю сам процесс тестирования данного кода. Правда, плоховато видно высвечивание светодиодов. Замешательство

[img][/img]

Могу прокоментировать, что по времени высвечивается.
Прикреплено изображение
Светодиодное тестирование 480.jpg

 
 Top
mihail Post Id



Гуру


Сообщений всего: 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)

 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



Спасибо, mihail!
Сейчас попробую ваш вариант.
Мои светодиоды в одном корпусе имеют три кристалла, которые я засвечиваю отдельно каждый. Тот момент, который изображен на снимке, показывает первый блок (горят IN1 и IN3). Ну и так далее. Все сходится по коду.
(Добавление)
mihail, попробовал ваш вариант с OUTPUTом.
Светодиоды светят гораздо лучше!
Сейчас одену шилд и подключу к нему мотор.
 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



Увы! Полный облом!
От шилда работает один мотор, и то, только в одну сторону.
Драйверы 2А не работают. Огорчительно!
За все мои телодвижения только один раз мотор 2 сделал робкую попытку реверснуть. А потом - ни разу.
Скорее всего, шилд "гавкнул", то есть сдох.
Далее шилд и работа светодиодов.
[img][/img]
(Добавление)
Надеюсь, видно, что горят IN1 и IN3.

Я подозреваю, что этот шилд я поджег при первом подключении элитных мотор-редукторов, у которых ток холостого хода был 450 мА.
Прикреплено изображение
Светодиоды с шилдом 480.jpg

 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Посмотрите http://www.youtube.com/watch?v=MJvRaZR82T0 В видео драйвером для двух двигателей служит модуль с четырьмя реле. На http://www.ebay.com/ находится как 4 channel relay module. Стоит около 150 рубей. Проще ничего не придумать. Правда нет ШИМ. Но может работать с током до 10 ампер.
 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



mihail, благодарю за идею использования модулей с релюшками!
Пару недель тому назад я заказал на ебее два модуля с двумя реле на каждом. Уже готовил печатку на 4 реле, которые нашел у себя. Они, правда, разные, но все срабатывают от 5 вольт.
Посмотрел ваши ссылки. Да, 4 реле лучше чем мне придут по две штуки. Грустный
Ну, ничего, попробую пока с ними, а позже закажу по вашим ссылкам. На заметку взял! Спасибо!
(Добавление)
А насчет ШИМ, это не беда! Поверхность ровная, моторы постоянного тока сглаживают броски напряжения.
 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 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)

 
 Top
mihail Post Id



Гуру


Сообщений всего: 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);
}
 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



Спасибо, mihail!
Скопировал, сейчас попробую.
(Добавление)
Записал ваш скетч на Ардуино UNO. Скомпилировалось и загрузилось без вопросов.

Сегодня попробую этот программный код на оджнодвижительном роботе.
Спасибо большое!
(Добавление)
Залил скетч в однодвижительный. Запустил его на кухне. Снял небольшое видео на 66 Мбайт. Интересные телодвижения у робота! Не знаю, как их вам показать. У меня дома выхода на ютуб для записи ролика нет. Придется ждать до понедельника, когда выйду на работу. А иначе ведь никак?

(Отредактировано автором: 21 Февраля, 2014 - 17:59:36)

 
 Top
mihail Post Id



Гуру


Сообщений всего: 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;
int flag = 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);
if (e == 90) flag = 0;
}
else // препятствие
{
if ( count == 2 ) servo1.write(170); // вправо
else servo1.write(10); // влево

if ( flag == 0 ) count += 1;
if ( count == 3 ) count = 0;
flag = 1;
}

motor.run(FORWARD);
delay(100);
}

Лучше?
 
 Top
Петр Киселев Post Id



Гуру


Сообщений всего: 2397
Дата рег-ции: Окт. 2012  



Испытал второй ваш, mihail, скетч. Действительно, лучше! По моему, больше появилось осмысленности в езде этого робота. Большое спасибо и признательность!

Сейчас я занимаюсь конструированием и изготовлением системы Робота-сапера 2 и Разведчиков. Разведчики будут, один - однодвижительный, другой - двухдвижительный. Вот как раз для однодвижительного Разведчика ваш скетч и подойдет!
 
 Top
Страниц (3): « 1 [2] 3 »
« Программирование микроконтроллеров »


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





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru