а можно как то сделать чтобы при обнаружении одним из датчиков линии робот останавливался ненадолго, потом делал небольшой разворот в нужную сторону и продолжал движение и т.д.?или это тоже не поможет?
тяжело так настраивать программу когда макета рядом нет и занимаешься телепатией. ну да ладно. поиграйтесь с параметрами sped turn pausa/ вам это быстрее и проще
yanbaev72 Вы меня извените, но не подскажите вы сделали робота по линии. А то я тоже не могу сделать. Взял скетч с поста 73 он не реагирует на линию тоже самое что и у Вас на видео едит сам куда-то. Детали использую как у Вас.
50мсек может оказаться слишком большой паузой, особенно для "библиотечных" методов управления. Понизьте скорость моторов до приемлемой величины и будет ехать "только так", если датчики работают верно. Пост №73 - вариация самого простого метода управления:
// читаем датчики в переменные. Тут читаем цифровые датчики.
// можно заменить на аналоговые, чуть сложнее но тоже в результате получаем белое/черное
sensorLeft = digitalRead(pinLeftSensor);
sensorRight = digitalRead(pinRightSensor);
if( sensorLeft == sensorRight ){
// оба датчика видят белое или черное одновременно
// оба черных - перекресток?
// Пофиг, едем прямо, тут сразу на максю скорости.
// Можно сделать сложнее, с плавным приростом или выравниванием скоростей моторов..
speedLeft = speedRight = MAX_SPEED;
} else if( sensorLeft == LINE_BLACK ){
// левый видит линию - тормозим ЛЕВЫМ же колесом..
// ещё можно ускорять правое колесо, если есть куда..
// или плавно изменять скорости внешнего и внутреннего колеса..
speedLeft = 0;
} else if( sensorRight == LINE_BLACK ){
// правый видит линию - тормозим правым колесом..
// аналогично можно ускорять левое колесо..
speedRight = 0;
}
// одновременно управляем обоими моторами,
// иначе один мотор будет всегда откликаться раньше другого,
// что приведет к неодинаковости поворотов вправо и влево..
// тут же: если скорость мотора нулевая - отключаем его нафиг вовсе.
setMotorsSpeed(speedLeft, speedRight);
Но мне больше нравится такой вариант:
// читаем датчики в глобальные переменные sensorLeft, sensorRight.
// Как функцию реализовали - так и читаем. Можем даже усреднять и блокировать
// ошибки срабатывания датчиков внутри..
getSensors();
if( sensorLeft == sensorRight ){
// оба датчика видят белое или черное одновременно:
// едем прямо, формируя глобальные переменные speedLeft,speedRight
moveForward();
} else {
// упс .. поворот: вычисляем скорости согласно датчикам:
moveRotate();
}
setMotorsSpeed(speedLeft, speedRight);
Его достоинство в том, что как реализуете функции - так оно и поедет. Хотите просто, сложно с ПИД регулятором, ещё как-то .. да не проблема. :)
#define LeftPWM1 9
#define LeftDIR1 8
#define RightPWM2 10
#define RightDIR2 11
#define encoder0pinA 2
#define encoder0pinB 3
byte Left = 0;
byte Right = 0;
byte PrewStateLeft = 0;
byte PrewStateRight = 0;
void setup()
{
pinMode(LeftDIR1, OUTPUT);
pinMode(RightDIR2, OUTPUT);
}
void loop()
{
Left = digitalRead(encoder0pinA);
Left = !Left;
Right = digitalRead(encoder0pinB);
Right = !Right;
if (Left){
if (Right){ // Движение вперед
Forward();
PrewStateLeft = 1;
PrewStateRight = 1;
}else{ // Поворот в ЛЕВО
TurnLeft();
PrewStateLeft = 1;
PrewStateRight = 0;
}
}else{
if (Right){ // Поворот в ПРАВО
TurnRight();
PrewStateLeft = 0;
PrewStateRight = 1;
}else{
if (PrewStateLeft){
if (PrewStateRight){
TurnLeft();
}else{
TurnLeft();
}
}else{
if (PrewStateRight){
TurnRight();
}else{
TurnRight();
}
}
}
}
delay(10);
}
void TurnLeft(){
digitalWrite(LeftDIR1, 1);
digitalWrite(RightDIR2, 1);
analogWrite(LeftPWM1, 60); //PWM Speed Control
analogWrite(RightPWM2, 128); //PWM Speed Control
}
void TurnRight(){
digitalWrite(LeftDIR1, 1);
digitalWrite(RightDIR2, 1);
analogWrite(LeftPWM1, 128); //PWM Speed Control
analogWrite(RightPWM2, 60); //PWM Speed Control
}
void Forward(){
digitalWrite(LeftDIR1, 1);
digitalWrite(RightDIR2, 1);
analogWrite(LeftPWM1, 80); //PWM Speed Control
analogWrite(RightPWM2, 80); //PWM Speed Control
}
Сенсор видит черную линию как "0", а поле как "1", по этому делаю инверсию сигнала для более удобной работы в коде. Сам код простой: два датчика возвращают "0" либо "1", где "1" - линия. Робот старается поворачиваться в сторону единицы. Если линия потеряна, то робот движется и поворачивает в сторону последнего положения линии, которое он запомнил:
Мне не очень нравится как он ездит. Во-первых, дергается. Каждый поворот, или выравнивание - это рывок. Надо как-то сделать плавное регулирование скоростью моторов.
Еще нюанс: при потере линии (или ее поиске) он движется по кругу, по четкой траектории, иногда это не лучший вариант, так как он может "наматывать круги" между линиями, так и не доезжая до них... Надо как-то сделать динамически меняющуюся траекторию движения.
+ Хочу добавить датчик расстояния HC-SR04, чтобы робот объезжал препятствия и/или останавливался перед ними.
Начал бороться с рывками во время поворотов. Вот скетч:
#define LeftPWM1 9
#define LeftDIR1 8
#define RightPWM2 10
#define RightDIR2 11
#define encoder0pinA 2
#define encoder0pinB 3
byte Left = 0;
byte Right = 0;
byte PrewStateLeft = 0;
byte PrewStateRight = 0;
byte SpeedL = 0;
byte SpeedR = 0;
#define SpeedMax 150
#define SpeedMin 70
byte SpeedMidl = 0;
void setup()
{
pinMode(LeftDIR1, OUTPUT);
pinMode(RightDIR2, OUTPUT);
SpeedMidl = (SpeedMax + SpeedMin)/2;
}
void loop()
{
Left = digitalRead(encoder0pinA);
Left = !Left;
Right = digitalRead(encoder0pinB);
Right = !Right;
if (Left){
if (Right){ // Движение вперед
Forward();
PrewStateLeft = 1;
PrewStateRight = 1;
}else{ // Поворот в ЛЕВО
TurnLeft();
PrewStateLeft = 1;
PrewStateRight = 0;
}
}else{
if (Right){ // Поворот в ПРАВО
TurnRight();
PrewStateLeft = 0;
PrewStateRight = 1;
}else{
if (PrewStateLeft){ // если потеряна линия
if (PrewStateRight){ // Поворот в ЛЕВО
TurnLeft();
}else{
TurnLeft();
}
}else{
if (PrewStateRight){ // Поворот в ПРАВО
TurnRight();
}else{
TurnRight();
}
}
}
}
delay(5);
}
void TurnLeft(){
if(SpeedL > SpeedMin){ // уменьшаем скорость левого колеса
SpeedL--;
}
if(SpeedR < SpeedMax){ // увеличиваем скорость правого колеса
SpeedR++;
}
digitalWrite(LeftDIR1, 1);
digitalWrite(RightDIR2, 1);
analogWrite(LeftPWM1, SpeedL); //PWM Speed Control
analogWrite(RightPWM2, SpeedR); //PWM Speed Control
}
void TurnRight(){
if(SpeedR > SpeedMin){ // уменьшаем скорость правого колеса
SpeedR--;
}
if(SpeedL < SpeedMax){ // увеличиваем скорость левого колеса
SpeedL++;
}
digitalWrite(LeftDIR1, 1);
digitalWrite(RightDIR2, 1);
analogWrite(LeftPWM1, SpeedL); //PWM Speed Control
analogWrite(RightPWM2, SpeedR); //PWM Speed Control
}
void Forward(){
if(SpeedL < SpeedMidl){ // выравнивание скорости
SpeedL++;
}else if(SpeedL > SpeedMidl){
SpeedL--;
}
if(SpeedR < SpeedMidl){
SpeedR++;
}else if(SpeedR > SpeedMidl){
SpeedR--;
}
digitalWrite(LeftDIR1, 1);
digitalWrite(RightDIR2, 1);
analogWrite(LeftPWM1, SpeedL); //PWM Speed Control
analogWrite(RightPWM2, SpeedR); //PWM Speed Control
}
Рывки стали более плавными, но робот постоянно норовит уехать с линии. Если раньше робот ехал более-менее ровно, то теперь он виляет, и постоянно съезжает с линии. Можете подсказать что не так в коде?
После 1000 и 1 теста выяснил, что добиться плавного движения имея только 2 датчика в принципе не возможно... Просто потому что робот не знает под каким углом он заходит на линию. А угол может быть как острым, почти соответствующим направлению движения, так и под 90 градусов... Определить это только двумя датчиками слишком сложно. Нужно жестко привязываться к скорости движения, времени, и рассчитывать пройденный путь. К тому же "въезд" может быть не на прямую линию, а на имеющую изгиб... В общем не вижу смысла изобретать искусственный интеллект, когда задача решается добавлением в схему еще 2-4 датчиков (чем больше, тем лучше).
Вопрос по дальномеру HC-SR04. Сделать остановку робота при обнаружении препятствия - не проблема. Вопрос в том как бы грамотно "обучить" робота объезжать препятствия?
залейте скетч из 5 поста. машинка должна просто туда сюда кататься
залейте скетч из 5 поста. машинка должна просто туда сюда кататься
С этим скетчем все впорядке, машинка плавно разгоняется вперед, потом также плавно назад..
Нашел у себя драйвер L293DNE, с этой микрухой с питанием тоже все нормально когда ее на шилде ставлю вместо родной L293D
пробуйте
залейте скетч из 5 поста. машинка должна просто туда сюда кататься
С этим скетчем все впорядке, машинка плавно разгоняется вперед, потом также плавно назад..
Можно и обойтись просто будет слышен писк. И дело совсем не в этом, а том что - посмотрите что у вас за микросхема по середине шилда... и все поймете.
...
Но все равнопосле его заливки ни чего не происходит почему то....
А должен крутиться на месте сначала в одну сторону, а затем в другую, значит не верно подключены двигатели.
поменяйте местами провода на правом двигателе
код поправил.
а машинка с кодом максима должна крутиться только
пробуйте
Таже беда...
залейте скетч из 5 поста. машинка должна просто туда сюда кататься
С этим скетчем все впорядке, машинка плавно разгоняется вперед, потом также плавно назад..
Можно и обойтись просто будет слышен писк. И дело совсем не в этом, а том что - посмотрите что у вас за микросхема по середине шилда... и все поймете.
...
Но все равнопосле его заливки ни чего не происходит почему то....
А должен крутиться на месте сначала в одну сторону, а затем в другую, значит не верно подключены двигатели.
Со стандартным драйвером шилда L293D не работало, поставил L293DNE и все заработало... я имею ввиду скетч из 5го поста...
по поводу того что должен крутится....в скетче была ошибка или не точность не знаю...
в строке 20-21 должно быть FORWARD на обоих моторах....
поэтому вчера перекидывал провода на правом моторе...
сейчас вернул все обратно
пробуйте
Таже беда...
не реагирует? попробуйте просто листок бумаги под датчики подносить. машинку держите в руках. будут изменения или нет
да насчет forward я заметил сейчас. поправил уже в 55 посте
да насчет forward я заметил сейчас. поправил уже в 55 посте
я немного изменил код
чтобы четко было видно реакцию....
сейчас скину видео
да насчет forward я заметил сейчас. поправил уже в 55 посте
вот видео
а это разве не вчерашнее видео?
Только все & нужно заменить на &&.
вот видео
Только все & нужно заменить на &&.
блин до сих пор делаю такие ошибки))) спасбио максим
= и == уже не путаю
поправил код. пробуй
вот видео
http://www.youtube.com/watch?v=gcusWkVdRz8&feature=youtu.be
Только все & нужно заменить на &&.
блин до сих пор делаю такие ошибки))) спасбио максим
= и == уже не путаю
поправил код. пробуй
работает, но такое ощущение что не успевает реагироватьи проскакивает линию
Снизьте скорость или увеличьте turn.
Снизьте скорость или увеличьте turn.
не помогает....
а можно как то сделать чтобы при обнаружении одним из датчиков линии робот останавливался ненадолго, потом делал небольшой разворот в нужную сторону и продолжал движение и т.д.?или это тоже не поможет?
+ вот вэтом видео http://www.youtube.com/watch?feature=player_embedded&v=y66X76bHlX8#t=9 робот ездит нормально
автор статьи утверждает что в скетче реализован игнор ошиок
как бы этот скетч скрестить с библиотекой <AFMotor.h>? такое возможно
попробуйте так
попробуйте так
все равно проскакивает....
если делаю скорость меньше 70 то робот не едет т.к. не хватает мощности тащить всю платформу....
меняется только скорость, а "поведение" остается тем же
в перевернутом виде реакция нормальная какая и должна быть, а в нормальном робот просто проскакивает линию и не успевает сделать какой то маневр..
в перевернутом? это в руках с поднесенными бумажками?
в перевернутом? это в руках с поднесенными бумажками?
под словосочетанием "в перевернутом состоянии" я как раз и имел ввиду что в руках поднося бумажку с черной линией
приложите видео в перевернутом виде, какой расстояноие от датчика до бумаги на полу и в руках?
приложите видео в перевернутом виде, какой расстояноие от датчика до бумаги на полу и в руках?
так на полу тоже реагирует, когда колеса чуть приподнять чтобы не катилась, но как отпускаешь она проскакивает линию...
датчики реагируют нормально, это видно по красным индикаторам которые загораются или тухнут..
тяжело так настраивать программу когда макета рядом нет и занимаешься телепатией. ну да ладно. поиграйтесь с параметрами sped turn pausa/ вам это быстрее и проще
Доброе время суток!
yanbaev72 Вы меня извените, но не подскажите вы сделали робота по линии. А то я тоже не могу сделать. Взял скетч с поста 73 он не реагирует на линию тоже самое что и у Вас на видео едит сам куда-то. Детали использую как у Вас.
50мсек может оказаться слишком большой паузой, особенно для "библиотечных" методов управления. Понизьте скорость моторов до приемлемой величины и будет ехать "только так", если датчики работают верно. Пост №73 - вариация самого простого метода управления:
Но мне больше нравится такой вариант:
Его достоинство в том, что как реализуете функции - так оно и поедет. Хотите просто, сложно с ПИД регулятором, ещё как-то .. да не проблема. :)
Спасибо! Буду пробывать.
Всем привет!
Продолжу тему. Что есть в наличии:
- UNO (но поставлю Pro Mini для уменьшения размера).
- Драйвер двух моторов с управлением через ШИМ: https://bit.ly/2XoILxN
- Шасси: https://bit.ly/34qwvy5
- Энкодер: https://bit.ly/2UVvF9E
Мой скетч:
Сенсор видит черную линию как "0", а поле как "1", по этому делаю инверсию сигнала для более удобной работы в коде. Сам код простой: два датчика возвращают "0" либо "1", где "1" - линия. Робот старается поворачиваться в сторону единицы. Если линия потеряна, то робот движется и поворачивает в сторону последнего положения линии, которое он запомнил:
Вот видео как он ездит: https://www.youtube.com/watch?v=1CL2ENXPybI
Мне не очень нравится как он ездит. Во-первых, дергается. Каждый поворот, или выравнивание - это рывок. Надо как-то сделать плавное регулирование скоростью моторов.
Еще нюанс: при потере линии (или ее поиске) он движется по кругу, по четкой траектории, иногда это не лучший вариант, так как он может "наматывать круги" между линиями, так и не доезжая до них... Надо как-то сделать динамически меняющуюся траекторию движения.
+ Хочу добавить датчик расстояния HC-SR04, чтобы робот объезжал препятствия и/или останавливался перед ними.
Начал бороться с рывками во время поворотов. Вот скетч:
После 1000 и 1 теста выяснил, что добиться плавного движения имея только 2 датчика в принципе не возможно... Просто потому что робот не знает под каким углом он заходит на линию. А угол может быть как острым, почти соответствующим направлению движения, так и под 90 градусов... Определить это только двумя датчиками слишком сложно. Нужно жестко привязываться к скорости движения, времени, и рассчитывать пройденный путь. К тому же "въезд" может быть не на прямую линию, а на имеющую изгиб... В общем не вижу смысла изобретать искусственный интеллект, когда задача решается добавлением в схему еще 2-4 датчиков (чем больше, тем лучше).
Добавь один или два датчика СЗАДИ робота. Таким образом ты можешь вычислять тренд влево или вправо.
Как вариант.
Вопрос по дальномеру HC-SR04. Сделать остановку робота при обнаружении препятствия - не проблема. Вопрос в том как бы грамотно "обучить" робота объезжать препятствия?
Матрица. Те-же тренды. Тут математики есть посильнее меня, у них алгоритм спрашивай.
В общем, вот то у меня получилось: https://youtu.be/CRBNUABEd-w
В общем, вот то у меня получилось: https://youtu.be/CRBNUABEd-w
Интересненько