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

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, но где то тут я эту тему видел ,найти только надо.

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

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

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

Доброго времени суток. Вообщем получился у меня вот такой кодик - 


#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#define OE 7
SoftwareSerial BTSerial(0,1);
SoftwareSerial mySerial(14,2);
int latchPin = 12;
int  clockPin = 4;
int dataPin = 8;
int speed1 = 11;
int speed2 = 3;
int speed3 = 6;
int speed4 = 5;
int vspdLR ;
int vspd = 200;
int servoPin = 10;
int myAngle ;
int pulseWidth ;
char vcmd;

void setup(){
    pinMode(OE,OUTPUT);
    digitalWrite(OE,HIGH);
    BTSerial.begin(9600); 
    mySerial.begin (9600); 
	  mp3_set_serial (mySerial); 
	  mp3_set_volume (15); 
    pinMode(latchPin,OUTPUT);
    pinMode(clockPin,OUTPUT);
    pinMode(dataPin,OUTPUT);   
    pinMode(speed1,OUTPUT);
    pinMode(speed2,OUTPUT);
    pinMode(speed3,OUTPUT);
    pinMode(speed4,OUTPUT);  
    pinMode(servoPin, OUTPUT); 
    vspeed(255);
    
    
   
    
}
void loop(){
    BTSerial.listen();
    if(BTSerial.available()){
        vcmd = (char)BTSerial.read();
        Serial.println(vcmd);
        
        if(vcmd == 'F'){
            vforward();
        }
    if(vcmd == 'B'){
            vbackward();
        }   
    if(vcmd == 'G'){
            vforwardleft();
        } 
     if(vcmd == 'I'){
            vforwardright();
        }   
     if(vcmd == 'H'){
            vbackwardleft();
        }   
     if(vcmd == 'J'){
            vbackwardright();
        }  
     if(vcmd == 'S'){
            vrelease();
        }  
        if(vcmd=='V'){
            vmp3pl1();
            }
        if(vcmd=='v'){
            vmp3st();
        } 
        if(vcmd=='X'){
            vmp3pl2();            
        } 
        if(vcmd=='x'){
            vmp3st();           
        } 
        if(vcmd == '0'){
            vspeed(0);
        }   
     if(vcmd == '1'){
            vspeed(25);
        }   
       if(vcmd == '2'){
            vspeed(50);
        } 
         if(vcmd == '3'){
            vspeed(75);
        }   
         if(vcmd == '4'){
            vspeed(100);
        }   
         if(vcmd == '5'){
            vspeed(125);
        }   
         if(vcmd == '6'){
            vspeed(150);
        }   
         if(vcmd == '7'){
            vspeed(175);
        }   
         if(vcmd == '8'){
            vspeed(200);
        } 
         if(vcmd == '9'){
            vspeed(225);
        }   
         if(vcmd == 'q'){
            vspeed(255);
        }      
     
    }
}
             // СЕРВА!

void servoPulse(int servoPin, int myAngle) 
{
  pulseWidth = (myAngle * 11) + 500;  
  digitalWrite(servoPin, HIGH);       
  delayMicroseconds(pulseWidth);     
  digitalWrite(servoPin, LOW);        
  delay(20);                           
}
    
          // Вперед!
void vforward(){
     vspeed(vspdLR);
    pinMode(OE,OUTPUT);
    digitalWrite(OE,LOW);
     digitalWrite(latchPin, LOW);  
     shiftOut(dataPin, clockPin, MSBFIRST, 0b00100111);            
     digitalWrite(latchPin, HIGH);  
     servoPulse(10, 90); 
     
}
         // Назад!
void vbackward(){
    vspeed(vspdLR);
    pinMode(OE,OUTPUT);
    digitalWrite(OE,LOW);
    digitalWrite(latchPin, LOW);  
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11011000);            
    digitalWrite(latchPin, HIGH);  
    servoPulse(10, 90);  
    
}
         // Вперед и Влево!
void vforwardleft(){
    vspeed(vspdLR);
    pinMode(OE,OUTPUT);
    digitalWrite(OE,LOW);
     digitalWrite(latchPin, LOW);  
     shiftOut(dataPin, clockPin, MSBFIRST, 0b00100111);            
     digitalWrite(latchPin, HIGH);  
    servoPulse(10, 120); 
    
 }
         // Вперед и Вправо!
void vforwardright(){
    vspeed(vspdLR);
    pinMode(OE,OUTPUT);
    digitalWrite(OE,LOW);
     digitalWrite(latchPin, LOW);  
     shiftOut(dataPin, clockPin, MSBFIRST, 0b00100111);            
     digitalWrite(latchPin, HIGH); 
    servoPulse(10, 60);     
     
}
       //  Назад и Влево!
void vbackwardleft(){
    vspeed(vspdLR);
    pinMode(OE,OUTPUT);
    digitalWrite(OE,LOW);
    digitalWrite(latchPin, LOW);  
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11011000);            
    digitalWrite(latchPin, HIGH);  
    servoPulse(10, 120); 
     
}
       // Назад и Вправо!
void vbackwardright(){
    vspeed(vspdLR);
    pinMode(OE,OUTPUT);
    digitalWrite(OE,LOW);
    digitalWrite(latchPin, LOW);  
    shiftOut(dataPin, clockPin, MSBFIRST, 0b11011000);            
    digitalWrite(latchPin, HIGH);   
    servoPulse(10, 60);   
      
}
         // Стоп!
void vrelease(){
    pinMode(OE,OUTPUT);
    digitalWrite(OE,LOW);
    digitalWrite(latchPin, LOW);  
    shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000);            
    digitalWrite(latchPin, HIGH);    
    servoPulse(10, 90);
}
void vmp3pl1(){
    
    mp3_play(3);
    
}
void vmp3pl2(){
    
    mp3_play(2);
}
void vmp3st(){
    
    mp3_stop();
    
}
void vspeed(int spdLR){
    
        vspdLR = spdLR;
       
    analogWrite(speed1,vspdLR);
    analogWrite(speed2,vspdLR);
    analogWrite(speed3,vspdLR);
    analogWrite(speed4,vspdLR);
   
}

 

Буду презнателен если поможите причесать или покрайне мере ткнуть где надо подумать или исправить. Но есть и еще 1проблемка с сервой -дергается зараза (плавает длительность импульсов) и что с этим делать совсем не пойму ,может посоветуете.

Спасибо.

 

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

Kraker пишет:
если поможите причесать
ПоможИм, а чего не помочь-то?

Вот, первое. что бросилось в глаза сразу:

1.       Вся байда в строках 80-109 заменяется на вот такую конструкцию

if (isdigit(vcmd)) vspeed(25 * (vcmd – ‘0’));

согласитесь одна строка вместо 29 – это куда как приятнее и читать и сопровождать.

2.       В строка 47-112 ВСЕ “if’ы” проверяются каждый раз, независимо, ни от чего. Например, если vcmd равна ‘F’, отработает строка 48, но затем все “if’ы” в строках 50-112 будут аккуратно проверяться. Зачем? Если она уже равна ‘F’ не может же она быть равна чему-нибудь ещё. Здесь нужно либо поставить слово else перед каждым if в строках 50-112, либо использовать конструкцию switch.

4.       В строке 35 у Вас вызывается функция, которая объявлена гораздо ниже (в строке 216). Это работает в некоторых версиях IDE, а в некоторых нет. Если не хотите неприятных сюрпризов при смене версий, привыкайте писать правильно – любая сузность должна быть объявлена ДО использования.

3.       Переменная vcmd используется только в функции loop. Ну, и зачем Вы её объявили глобальной? Строку 18 нужно удалить, а строку 44 переписать как

const char vcmd = (const char)BTSerial.read();

4.       Переменная pulseWidth используется только в функции servoPulse. Ну, и зачем Вы её объявили глобальной? Строку 17 нужно удалить, а строку 120 переписать как

const int pulseWidth = (myAngle * 11) + 500;

5.       Переменные, объявленные в строках 14 и 16 нигде не используется. Эти строки следует удалить;

6.       Переменные, объявленные в строках 6-12 и 15 на самом деле являются не переменными, а константами, надо добавить слово const в описание. Кроме того, тип int для них явно избыточен, надо сократить до байта.

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

Спасибо  .

Не могли бы вы подробне объяснить ,для начало вот это :

4.       В строке 35 у Вас вызывается функция, которая объявлена гораздо ниже (в строке 216). Это работает в некоторых версиях IDE, а в некоторых нет. Если не хотите неприятных сюрпризов при смене версий, привыкайте писать правильно – любая сузность должна быть объявлена ДО использования.

Другие функции тоже объявлены ниже, или я что то упускаю? И как ее правельно нужно обявить до того.

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

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

К моему п.6 дополнение: кроме слова const, там ещё лучше и static добавить. Тогда эти переменные скорее всего вообще не будут занимать никакую память.

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

Попробовал сваять б но видимо что то не так понимаю и делаюю

#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#define OE 7
SoftwareSerial BTSerial(0,1);
SoftwareSerial mySerial(14,2);
const int latchPin = 12;
const int  clockPin = 4;
const int dataPin = 8;
const int speed1 = 11;
const int speed2 = 3;
const int speed3 = 6;
const int speed4 = 5;
int vspdLR ;
const int servoPin = 10;
int pulseWidth ;
   

void setup(){
    pinMode(OE,OUTPUT);
    digitalWrite(OE,HIGH);
    BTSerial.begin(9600); 
    mySerial.begin (9600); 
	  mp3_set_serial (mySerial); 
	  mp3_set_volume (25); 
    pinMode(latchPin,OUTPUT);
    pinMode(clockPin,OUTPUT);
    pinMode(dataPin,OUTPUT);   
    pinMode(speed1,OUTPUT);
    pinMode(speed2,OUTPUT);
    pinMode(speed3,OUTPUT);
    pinMode(speed4,OUTPUT);  
    pinMode(servoPin, OUTPUT);    
    vspeed(255);
      
}

void loop(){
    BTSerial.listen();
    if(BTSerial.available()){
        const char vcmd = (const char)BTSerial.read();
        Serial.println(vcmd);
        
    if(vcmd == 'F'){
            vforward();
        }
   else if(vcmd == 'B'){
            vbackward();
        }   
   else  if(vcmd == 'G'){
            vforwardleft();
        } 
   else  if(vcmd == 'I'){
            vforwardright();
        }   
   else if(vcmd == 'H'){
            vbackwardleft();
        }   
   else  if(vcmd == 'J'){
            vbackwardright();
        }  
   else  if(vcmd == 'S'){
            vrelease();
        }  
   else if(vcmd=='V'){
            vmp3pl1();
            }
   else if(vcmd=='v'){
            vmp3st();
        } 
   else if(vcmd=='X'){
            vmp3pl2();            
        } 
   else if(vcmd=='x'){
            vmp3st();           
        } 
        if (isdigit(vcmd)) vspeed (25 * (vcmd – ‘0’));
        
        if(vcmd == 'q'){

            vspeed(255);

        }         
    }
}

Выдает ошибку компиляции 

ino:76:8: error : stray ' \' in program

ino: in function "void lop()':

ino:76:47:error : exected ' ) 'before 'u2013'

ino:76:68: error : expected ' ) ' before " ; " token

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

Я писал текст в Word и он наверняка заменил одинарные кавычки на типографские апострофы. Убедитесь, что в '0' - честные одинарные кавычки, а не что-нибудь "вумное".

А чего на поставили else в строка 76 и 78?

А в строках 6 - 15 добавьте static в самое начало.

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

Заменить const на static ?

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

Заменил   но ошибка осталась  хотя на строчку меньше

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

Kraker пишет:

Заменить const на static ?

Нет. просто добавить static. И не только туда, где const, а в во все строки.

Про ошибку, (если она та же) дело в апострофах. Поставьте нормальные или копипастите сюда текущий код.

Kraker
Offline
Зарегистрирован: 10.09.2017
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#define OE 7
SoftwareSerial BTSerial(0,1);
SoftwareSerial mySerial(14,2);
static const int latchPin = 12;
static const int  clockPin = 4;
static const int dataPin = 8;
static const int speed1 = 11;
static const int speed2 = 3;
static const int speed3 = 6;
static const int speed4 = 5;
int vspdLR ;
static const int servoPin = 10;
int pulseWidth ;
   

void setup(){
    pinMode(OE,OUTPUT);
    digitalWrite(OE,HIGH);
    BTSerial.begin(9600); 
    mySerial.begin (9600); 
	  mp3_set_serial (mySerial); 
	  mp3_set_volume (25); 
    pinMode(latchPin,OUTPUT);
    pinMode(clockPin,OUTPUT);
    pinMode(dataPin,OUTPUT);   
    pinMode(speed1,OUTPUT);
    pinMode(speed2,OUTPUT);
    pinMode(speed3,OUTPUT);
    pinMode(speed4,OUTPUT);  
    pinMode(servoPin, OUTPUT);    
    vspeed(255);
      
}

void loop(){
    BTSerial.listen();
    if(BTSerial.available()){
        const char vcmd = (const char)BTSerial.read();
        Serial.println(vcmd);
        
    if(vcmd == 'F'){
            vforward();
        }
   else if(vcmd == 'B'){
            vbackward();
        }   
   else  if(vcmd == 'G'){
            vforwardleft();
        } 
   else  if(vcmd == 'I'){
            vforwardright();
        }   
   else if(vcmd == 'H'){
            vbackwardleft();
        }   
   else  if(vcmd == 'J'){
            vbackwardright();
        }  
   else  if(vcmd == 'S'){
            vrelease();
        }  
   else if(vcmd=='V'){
            vmp3pl1();
            }
   else if(vcmd=='v'){
            vmp3st();
        } 
   else if(vcmd=='X'){
            vmp3pl2();            
        } 
   else if(vcmd=='x'){
            vmp3st();           
        } 
   else  if (isdigit(vcmd)) vspeed (25 * (vcmd – '0'));
        
   else  if(vcmd == 'q'){

            vspeed(255);

        }         
    }
}

(vcmd – '0')); если смотреть на 0 то он ,как бы, не активен (не подсвечивается) в отличии от 'q' 

не совсем понял где еще нужно вставить  static

 

 


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

А все вроде нашел, дело было не в кавычках а в   - .

Теперь компилируется.

И, если не трудно, объясните ,как предобъявить функцию - тоже не совсем понял

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

Ага, ну он н етолько апострофы, но и минус заменил на типографский дефис. Word - он такой Word. Я поставил нормальный минус и всё стало компилироваться

else if (isdigit(vcmd)) vspeed (25 * (vcmd - '0'));

Kraker пишет:

А все вроде нашел, дело было не в кавычках а в   - .

И в том, и в другом. Посмотрите на кавычки в Вашем утреннем посте - они разные - левая и правая.

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

Да , вижу. Спасибо

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

Эти изменения скажутся на дергании сервы или это отдельный вопрос ?