Конфликт библиотек

Kraker
Offline
Зарегистрирован: 10.09.2017

        Доброго времени суток уважаемые знатоки.

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

 И так вот  начало кода

#include <AFMotor.h>
#include <Servo.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
SoftwareSerial BTSerial(15,16);
SoftwareSerial mySerial(14,2);

Конфликт между AFMotor.h и DFPlayer_Mini_Mp3.h, пока нет инициализации двигателей все работает, но кск только движки прописаны плеер перестает реагировать на команды блютуза. Пожалуйста подскажите куда смотреть и копать.Как я понимаю загвоздка в Serial.

Зарание благодарю.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Dfplayer прекрасно работает на аппаратном Serial (пины 0 и 1), поэтому SoftwareSerial.h можно выкинуть. Но при загрузке скетча возможно понадобится вытаскивать плеер или отсоединять от него пины 0 и 1.
Заработало?

Kraker
Offline
Зарегистрирован: 10.09.2017


Спасибо за ответ.

Проблемма не втом что Df плеер не работает, а в том что все вместе не работает.

Вот с этим кодом DF плеер молчит и не реагирует

#include <AFMotor.h>
#include <Servo.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#define rxPin 14
#define txPin 2 

AF_DCMotor motor1(1);  // Вот инициализация движков. 
AF_DCMotor motor2(2); // С этим плеер не работает, если убрать начнет реагировать.
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

SoftwareSerial BTSerial(15,16);
SoftwareSerial mySerial(14,2);
Servo vservo;
char vcmd;
int vspdL,vspdR;
int vspd = 200;

void setup(){
    
          BTSerial.begin(9600); 
          mySerial.begin (9600); // открываем софт-порт
	  mp3_set_serial (mySerial); // задаем порт для плеера
	  mp3_set_volume (15);   
          pinMode(13,OUTPUT); 
      
            }

void loop(){
     
    BTSerial.listen();
    if(BTSerial.available()) {
        vcmd = (char)BTSerial.read();
        Serial.println(vcmd);
        
        if(vcmd=='V'){
            
            mySerial.listen();
            mp3_play(2);
            mySerial.end();
                    
            }
            
     if(vcmd=='v'){
            
           
            mySerial.listen();
            mp3_stop();
            mySerial.end();    
           
        } 
  
        if(vcmd=='X'){
            
            mySerial.listen();
            mp3_play(3);
            mySerial.end();
            
            
        } 

          if(vcmd=='x'){
            
            mySerial.listen();
            mp3_stop();
            mySerial.end();
        
            
        } 
        if(vcmd=='F'){

            digitalWrite(13,HIGH);
           
        }
        if(vcmd=='B'){
            digitalWrite(13,LOW);
           
        }
        
    }
}
 




         

Сильно не ругайте за код ,как смог.

С удовольствием поучусь как надо , если поможите.

Заранее благодарю.

 

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

Kraker пишет:

 В освоении ардуино , я зеленый новичек,

.....

#include <AFMotor.h>
#include <Servo.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

Хрена-се!

Kraker
Offline
Зарегистрирован: 10.09.2017

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

Kraker пишет:

 В освоении ардуино , я зеленый новичек,

.....

#include <AFMotor.h>
#include <Servo.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

Хрена-се!

Сам в шоке , но хотелось бы подробней.

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

Kraker пишет:

хотелось бы подробней.

Подробнее вот здесь коллега другому наовичку ответил.

Kraker
Offline
Зарегистрирован: 10.09.2017

Предлагаете диодиками помигать ?

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

Спасибо.

nik182
Offline
Зарегистрирован: 04.05.2015

Софтовый порт может работать только с одним соединением одномоментно. Прочитайте описание софтового порта. Там есть команда активации - деактивации конкретного соединения. Перед общением надо активировать, после деактивировать. Тогда можно мнгого софт портов использовать, но только одно соединение может быть активно. 

Kraker
Offline
Зарегистрирован: 10.09.2017
            mySerial.listen();
            mp3_play(2);
            mySerial.end();
                    

Вот этими командами я  начинаю  запрашиваю порт плеера а потом закрывю его( ну мне так кажется что я это делаю), если это не так  , подскажите как будет правельно.

Спасибо.

nik182
Offline
Зарегистрирован: 04.05.2015

Да. Всё правильно. Но вот зачем end? В святцах https://www.arduino.cc/en/Reference/SoftwareSerial нет такой команды.

Kraker
Offline
Зарегистрирован: 10.09.2017

Ну я вот нашол, но опять таки может чейто не так понял https://www.arduino.cc/en/Serial/End

Kraker
Offline
Зарегистрирован: 10.09.2017

Хотя я так понимаю  к SoftwareSerial  это не относится. Тогда вопрос как закрыть соединение ? И нужно ли это делать?

Ведь вопрос в том , что оно даже не открывается при инициализации двигателей

nik182
Offline
Зарегистрирован: 04.05.2015

Закрывать не нужно. Больше того. Если вы не принимаете байты то и listen лишнее. Она нужна для приема. Если залезть в библиотеку MP3 то видно, что выши команды используют только send. Попробуйте оставить только команды. Listen потребуется, если надо будет принять статус плеера. 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Если у Вас без строк 08-11 как Вы написали действительно всё работает, то и конфликт скорее всего нужно искать не в двух сериалах, а между SoftwareSerial и AFMotor, а дальше там ещё и Servo есть... Я так навскидку не скажу, используют они общие ресурсы или нет. Но судя по Вашим проблемам используют. Какие - надо код смотреть.

Kraker
Offline
Зарегистрирован: 10.09.2017

Спасибо за отзывчивость .

Без LISTEN  плеер не работает.

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

Kraker пишет:

Предлагаете диодиками помигать ?

Нет, не предлагаю, просто охреневаю слегка.

Kraker
Offline
Зарегистрирован: 10.09.2017

kalapanga пишет:

Если у Вас без строк 08-11 как Вы написали действительно всё работает, то и конфликт скорее всего нужно искать не в двух сериалах, а между SoftwareSerial и AFMotor, а дальше там ещё и Servo есть... Я так навскидку не скажу, используют они общие ресурсы или нет. Но судя по Вашим проблемам используют. Какие - надо код смотреть.

Я не правельно  озвучил мысль , именно SofwareSerial и имел в виду.

Но  блютуз работает именно на SoftwareSerial и у него конфликтов нет, а как токо добавляется еще 1 то вот тут и проблема.

К сожалению я совсем не силен в програмировании,6 поэтому мне сложно понять куда лезть.

Спасибо.

Kraker
Offline
Зарегистрирован: 10.09.2017

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

Kraker пишет:

Предлагаете диодиками помигать ?

Нет, не предлагаю, просто охреневаю слегка.

 Ну я рад что вызвал у вас такие ( надеюсь положительные) эмоции. 

Набираюсь ума разума ,как могу

nik182
Offline
Зарегистрирован: 04.05.2015
// Arduino pin names for interface to 74HCT595 latch
#define MOTORLATCH 12
#define MOTORCLK 4
#define MOTORENABLE 7
#define MOTORDATA 8

В github AF_DCMotor эти пины прописаны, да ещё timer2 используется. У вас какие прописаны в библиотеке?  

Kraker
Offline
Зарегистрирован: 10.09.2017

Kraker пишет:

Спасибо за отзывчивость .

Без LISTEN  плеер не работает.

Упс ошибся извините, без listen работает.

Kraker
Offline
Зарегистрирован: 10.09.2017
#define MOTORLATCH 12
#define MOTORCLK 4
#define MOTORENABLE 7
#define MOTORDATA 8

такие же.

nik182
Offline
Зарегистрирован: 04.05.2015

Осцилограф есть? Посмотреть сигналы на ногах ТХ софтсериалов. Если нет, то одно, если есть, но искажённые, то другое.

 

Kraker
Offline
Зарегистрирован: 10.09.2017

Я так понимаю смотреть нужно на TX плеера в варианте когда он не работает ? Постараюсь глянуть

Kraker
Offline
Зарегистрирован: 10.09.2017

nik182 пишет:

Осцилограф есть? Посмотреть сигналы на ногах ТХ софтсериалов. Если нет, то одно, если есть, но искажённые, то другое.

 

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

nik182
Offline
Зарегистрирован: 04.05.2015

А попробовать перенести софтсериал на другие ноги? 

Kraker
Offline
Зарегистрирован: 10.09.2017

Пробовал, сечас так и есть перенес и блютуз и плеер, раньше блютуз сидел на RX,TX ардуинки. поведение идентично.

Kraker
Offline
Зарегистрирован: 10.09.2017

Сейчас опозорюсь совсем ,но знания важнее. 

И так если у меня тут всю малину портит AFMotor ( хотя очень хотца разобратбся в чем тут дело)то почему бы не поработать со сдвиговым регистром на прямую,без библиотеки.Попытался, вроде понял как работает, но опят таки с библиотекой Shifty595, что меня опять таки не устраивает, а вот запустить чисто ручками почему то не получается. Если кому не сложно киньте ссылку где можно почитать ,посмотреть. Потому как то что я находил у меня  не идет.

Ну и последний вариант -это дрыгать ножками плеера и ардуинки( он это предусматривает)

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014
Kraker
Offline
Зарегистрирован: 10.09.2017
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
 
 
 
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
 
void loop() {
    // устанавливаем синхронизацию "защелки" на LOW
    digitalWrite(latchPin, LOW);
    // передаем отсчет для вывода на зеленые светодиоды
    shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);   
    //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    digitalWrite(latchPin, HIGH);
    // пауза перед следующей итерацией
    delay(500);
  }

Так должен загореться один светодиод, правельно ?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

ПравИльно.

Kraker
Offline
Зарегистрирован: 10.09.2017

Доберусь до регистра попробую еще разок,  но кажется мне ,что я это уже пробовал и было у меня глухо.Будем надеяться ,что я ошибаюсь.

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

Kraker пишет:

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

Самый оптимальный вариант работы с 595 регистром - аппартный SPI (почему-то об этом почти не пишут). Максимально просто и на максимально достижимой скорости. Единственный недостаток - только на фиксированных (выделенных для SPI) ногах. Читать, соответственно, об SPI.

 

И еще одно замечание: SoftwareSerial - это, скорее, затычка для отладки, когда нужно работать с портом и одновременно вести отладку в консоли. После завершения отладки от SoftwareSerial лучше вообще отказаться. А если в Вашем проекте рисутствует необходимость сразу в двух SoftwareSerial, нужно переходить на платформу помощнее, где присутствуют не менее 3-х аппаратных последовательных портов, например, MEGA 2560.

Kraker
Offline
Зарегистрирован: 10.09.2017

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

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

Большое всем спасибо!

 

Kraker
Offline
Зарегистрирован: 10.09.2017

 

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

Спасибо.

Kraker
Offline
Зарегистрирован: 10.09.2017
//Пин подключен к ST_CP входу 74HC595
int latchPin = 4;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 2;
//Пин подключен к DS входу 74HC595
int dataPin = 11;

Методом перебора подобрал другие пины, с ними все заработало.Подскажите пожалуйста почему?

//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
 

 Если подключать так ,то не работает. Платка arduino nano(китай)

Спасибо.

 

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

Kraker пишет:

Методом перебора подобрал другие пины, с ними все заработало.Подскажите пожалуйста почему?

По одной из двух причин (или по обеим сразу):

1. Физически Вы подключитли к одним пинам, а в скетче - к другим.

2. Те пины, что фигурируют в нерабочем варианте, уже используются для каких-то других целей.

Ну и нельзя забывать про то, что аппаратура иногда бывает неисправна.

Kraker
Offline
Зарегистрирован: 10.09.2017

Приношу извинения! Дело оказалось в IDE , дело в том, что я заливал через планшет. Видимо он периодически дает сбои +аозможно что то совпало так ,как монтаж был навесной без пайки. Дома собрал собрал на макетки с пайкой +залил через комп, все работает.

В скетче с которым я изначально мучился ,убрал библиотеку AFMotor , и стал работать напрямую с регистром - все заработало.

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

Доведу до ума выложу .

Спасибо всем.