• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z rx tx mini mp3 plater
#1
Witam,
robie duzy projekt na płytce arduino uno. Mam problem z biblioteką SOftwareSerial wysietla mi takie błedy podczas kompilacji. Porty z ktorych korzystam np.na expanderze jest spowodowane iż w innym kodzie wykorzystuje pozostało porty z arduino.  Proszę o pomoc w rozwiązaniu problemu. Wiem ze chodzi tu o jakieś przerwania.
Cytat:libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

(.text+0x0): multiple definition of `__vector_3'

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin)Sad.text+0x0): first defined here

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

(.text+0x0): multiple definition of `__vector_4'

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin)Sad.text+0x0): first defined here

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

(.text+0x0): multiple definition of `__vector_5'

libraries\PCF8574\PCF8574.cpp.o (symbol from plugin)Sad.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Błąd kompilacji dla płytki Arduino Uno.
Kod:
#include "Arduino.h"
#include <Servo.h>
#include <Wire.h>   

#include "DFRobot_LedDisplayModule.h"
//wspolna biblioteka z zakreckolem
#include "PCF8574.h"
#include "DFRobotDFPlayerMini.h"


PCF8574 expander; //dodatkowe 8 wejsc

Servo Predkosciomierz;
//Servo Opona;
int krok = 180;
int GAZ = 0;
int STOP = 1;
int przyspieszenie = 200;
int zwolnienie = 70;
unsigned long aktualnyCzas = 0;
unsigned long czasprzycisku = 0;
unsigned long czasprzycisku2 = 0;

#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266))   // Using a soft serial port
#include <SoftwareSerial.h>
//#include <AltSoftSerial.h>
SoftwareSerial softSerial(/*rx =*/2, /*tx =*/3);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup() {
   Serial.begin(9600);
     
  expander.begin(0x20);
  expander.pinMode(0, INPUT_PULLUP);
  expander.pinMode(1, INPUT_PULLUP);
  expander.pinMode(2, INPUT_PULLUP);
  expander.pinMode(3, INPUT_PULLUP);
  expander.pinMode(4, INPUT_PULLUP);
  expander.pinMode(5, INPUT_PULLUP);
  expander.pinMode(6, INPUT_PULLUP);
  expander.pinMode(7, INPUT_PULLUP); // inicializacja expandera 8 dodatkowych wejsc

  Predkosciomierz.attach(5);
  Predkosciomierz.write(krok);
// Opona.attach(3);
 
    #if (defined ESP32)
  FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
  FPSerial.begin(9600);
#endif

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(FPSerial, /*isACK = */true, /*doReset = */true)) {  //Use serial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  //----Set volume----
  myDFPlayer.volume(20);  //Set volume value (0~30).
  //myDFPlayer.volumeUp(); //Volume Up
  //myDFPlayer.volumeDown(); //Volume Down

  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);

  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);


 


}

void loop() {
  symulacjaauta();

}
void symulacjaauta()
{
  aktualnyCzas = millis();
   Serial.println("dzaialam");
   Serial.println(" ");
  if(expander.digitalRead(GAZ) == LOW && expander.digitalRead(STOP) == HIGH)// wlaczenie gazu
  {
    Serial.println("Gaz");
    myDFPlayer.playMp3Folder(9);
    if(krok <= 1) krok = 1;
    krok = krok - 1;
    Predkosciomierz.write(krok);
    delay(przyspieszenie);
    zwolnienie = 70;
    if(aktualnyCzas - czasprzycisku >= 300UL)
    {
      przyspieszenie = przyspieszenie - 10;
      if(przyspieszenie <= 0) przyspieszenie = 0;
      czasprzycisku = aktualnyCzas;
     
    }   
   
  }
  else
  {
    Serial.println("zwalniam");
    if(krok >= 180) krok = 179;
    if(expander.digitalRead(STOP) == HIGH)
    {     
    czasprzycisku = aktualnyCzas;
    czasprzycisku2 = aktualnyCzas;
    przyspieszenie = 100;
   
    krok = krok + 2;
    Predkosciomierz.write(krok);
   
    delay(400);
    }
  }
  if(expander.digitalRead(STOP) == LOW) //wlaczenie stop
  {
    Serial.println("stop");
    czasprzycisku = aktualnyCzas;
    if(krok >= 180) krok = 179;
    krok = krok + 1;
    Predkosciomierz.write(krok);   
    delay(zwolnienie);
    if(aktualnyCzas - czasprzycisku2 >= 100UL)
    {
      zwolnienie = zwolnienie - 10;
      czasprzycisku2 = aktualnyCzas;
    }
    if(zwolnienie <= 0) zwolnienie = 0;

  }
  //opona();

     

   
}
/*
void opona()
{
  int predkosc;
  predkosc = map(krok, 180, 40, 93, 20);
  Serial.print("predkosckola   ");
  Serial.println(predkosc);
  Opona.write(predkosc);
 
}*/
 
Odpowiedź
#2
Witam,
Znalazłem rozwiązanie tego problemu stosując inna bibliotekę dla PCF
Znajduje się pod tym linkiem
https://github.com/RobTillaart/PCF8574
 
Odpowiedź
#3
(29-11-2023, 21:31)Matmax89 napisał(a): Witam,
Znalazłem rozwiązanie tego problemu stosując inna bibliotekę dla PCF
Znajduje się pod tym linkiem
https://github.com/RobTillaart/PCF8574

PCF8574 to tak prosty układ, że w ogóle nie widzę sensu używania jakiejkolwiek bilbioteki. Po prostu wysyła się bajt (po I2C oczywiście) i piny są ustawione, czyta się bajt i jest to stan pinów. Wszystkie piny są open-drain ze słabiutkim źródłem prądowym do VCC (pullup), nie ma żadnego setupu czy innych ustawień. By pin był (mógł pracować jako) wejściem po prostu trzeba wysłać na niego HIGH. Układ teoretycznie może zgłaszać przerwania, ale ma do tego osobną nóżkę i trzeba ją podłączyć do procka, jak się tego nie zrobi nie ma takiej możliwości.
Może ta pierwsza biblioteka przewidywała taką możliwość, a druga nie. Miałeś konflikt nazw pomiędzy biblioteką SoftSerial a PCF - obie deklarowały analogiczne przerwania.
 
Odpowiedź
#4
To jaki masz pomysł na używanie PCF8574 bez biblioteki?
Wykorzystuje go głownie na dodatkowe przyciski. 
Chciałbym tez odczytać stan wysoki na którymś z pinów i tu mam problem bo tylko odczytuje stan niski. 
 
Odpowiedź
#5
(02-12-2023, 13:42)Matmax89 napisał(a): To jaki masz pomysł na używanie PCF8574 bez biblioteki?
Wykorzystuje go głownie na dodatkowe przyciski. 
Chciałbym tez odczytać stan wysoki na którymś z pinów i tu mam problem bo tylko odczytuje stan niski. 

Poprzez bezpośrednie wywołania I2C. Ponieważ tylko czytasz to najpierw wysłanie 0xFF, a potem odczyt stanu pinów i sprawdzenie poszczególnych bitów. Dokumentacja podaje coś takiego:
najpierw include - to jest w samym core arduino:
Kod:
#include <Wire.h>

W funkcji setup() trzeba ustawić wszystkie PINy na H.
Kod:
Wire.begin();                               //uruchamiam I2C
Wire.beginTransmission(PCF8574_ADRES);      //rozpocznij transmisję do urządzenia
Wire.write(0xFF);                           // wszystkie piny na H
Wire.endTransmission();                     //zakończ transmisję

A w funkcji loop() odczytać wejścia:
`
Kod:
  Wire.requestFrom(PCF8574,1);      //zażądaj od odczytania z PCF8574 1 bajtu


  pins = Wire.read();               // stan pinów

A potem trzeba sprawdzić stan poszczególnych bitów zmiennej pins - wciśnięty przycisk to L czyli
Kod:
if ((pins & 0x01) == 0)
{
     ...
}
Oczywiście dla kolejnych pinów zamiast 0x01 dajemy 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80;

Jeśli źle odczytujesz przyciski to pewnie są źle podłączone. Wejścia są typu PULLUP - czyli na niepodłączonym pinie jest H i przycisk powinien zwierać go do masy.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości