• 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
Arduino nie działa raz na około 10 włączeń
#1
Witam,

mam projekt, w którym jest arduino + 4 czytniki RFID + dfp mp3 player + elektromagnes.

Wszystko działa dobrze - jak przykładam tag do rfid to odtwrza mp3 i jak przyłoży się wszystkie poprawnie to otwiera się elektromagnes.

Problem jest taki, że raz na jakiś czas (około raz na 10 włączeń) po przyłożeniu tagu odtwarza raz i przestaje, tak jakby się zwiesiło arduino, ale też nie do końca bo elektromagnes trzyma. Po resecie od razu działa poprawnie.

Dodam, że w pomieszczeniu jest sporo magnesów, które można przez przypadek przyłożyć do rfid lub głośnika - czy to może mieć na to wpływ?  Ponowne uruchomienie następuje przez wyłączenie i włączenie prądu, gdyż do samego arduino jest trudny dostęp.
 
Odpowiedź
#2
Jeśli po włączeniu działa dobrze przez 1 dzień, a przestaje po 10 użyciach karty to wina jest w programie - tak mówi moja magiczna kula.
 
Odpowiedź
#3
A na ile jest to możliwe że np. robi się jakieś zwarcie od elektromagnesu lub przy przyłożeniu zwykłego magnesu do głośnika lub czytników RFID. Czy to by się jakoś inaczej objawiało np. zwarcie by paliło arduino.
 
Odpowiedź
#4
Magiczną kulę mam tylko od programów, zamierzasz wrzucić kod, schemat, zdjęcia czy będziemy sobie tak gdybać?
 
Odpowiedź
#5
Moja magiczna kula się zepsuła, Wróżbita Maciej wyjechał na wakacje i nie wiem jaki jest typ czytników RFID u was. Pomoże mi ktoś?
 
Odpowiedź
#6
Zobacz ile ram zostaje po kompilacji, jak mniej niż 3/4 to proszę usunąć kilka czytników i sprawdzić ponownie zachowanie. Jeśli pomoże rozwiązanie jest oczywiste.
 
Odpowiedź
#7
Dzięki Irvin za pomysł. Po kompilacji mam takie wyniki, więc chyba niestety to nie od tego:

Szkic używa 9702 bajtów (30%) pamięci programu. Maksimum to 32256 bajtów.
Zmienne globalne używają 478 bajtów (23%) pamięci dynamicznej, pozostawiając 1570 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów.

Chyba że są jeszcze jakieś inne parametry do sprawdzenia?


Zastanawiam się jeszcze jaki wpływ może mieć zbyt szybkie uruchamianie dźwięków np. ktoś przykłada 4 rfid naraz i dźwięki zaczynają się wówczas odtwarzać jeden po drugim w dość szybkim tempie.
 
Odpowiedź
#8
(22-09-2018, 11:29)Wowas napisał(a): Zastanawiam się jeszcze jaki wpływ może mieć zbyt szybkie uruchamianie dźwięków np. ktoś przykłada 4 rfid naraz i dźwięki zaczynają się wówczas odtwarzać jeden po drugim w dość szybkim tempie.

Pewnie brakuje ram, który jest allokowany dynamicznie ale bez kodu programu można tylko gdybać.
 
Odpowiedź
#9
Poczytaj sobie o heap i stack, np. tu: https://learn.adafruit.com/memories-of-a...o?view=all . Jak podejrzewasz elektromagnes to testuj bez niego z jakąś led lub przekaźnikiem, jak magnesy to sam sobie zbliż i sprawdź, czy ma to wpływ. Jak możesz to sobie weź inne Arduino, może akurat masz wyjątkowego pecha i jest wadliwe. Jeśli kod programu jest tajemnicą to musisz sobie poradzić sam, takie gdybanie nie ma sensu.
 
Odpowiedź
#10
Przeprowadziłem serię testów na różnych konfiguracjach (raz bez elektromagnesu, innym razem bez DFPlayera itd.) i okazało się, że problem jest z DFPlayerem (bez niego wszystko działa jak należy). Czy ktoś z Was pracował z nim i napotkał podobny problem - zwiesza się raz na jakiś czas, losowo, statystycznie raz na jakieś 50 odtworzeń mp3.

Poniżej kod, z którego korzystam:
Kod:
//początek MP3
#include "SoftwareSerial.h"
SoftwareSerial mySerial(7, 8);
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]
# define ACTIVATED LOW
boolean isPlaying = false;
/// koniec mp3

void setup() {

mySerial.begin (9600);
delay(100);
playFirst();

}

// void od mp3
void playFirst()
{
execute_CMD(0x3F, 0, 0);
delay(500);
setVolume(25);
pause();
}

void pause()
{
execute_CMD(0x0E,0,0);
delay(500);
}

void play()
{
execute_CMD(0x0D,0,1);
delay(500);
}

void playNext()
{
execute_CMD(0x01,0,1);
delay(500);
}

void playPrevious()
{
execute_CMD(0x02,0,1);
delay(500);
}

void setVolume(int volume)
{
execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
delay(2000);
}

void konkretnamuzykagra (int numer){
execute_CMD(0x03, 0, numer);
}

void execute_CMD(byte CMD, byte Par1, byte Par2)
// Excecute the command and parameters
{
// Calculate the checksum (2 bytes)
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
// Build the command line
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
//Send the command line to the module
for (byte k=0; k<10; k++)
{
mySerial.write( Command_line[k]);
}
}
// koniec void od mp3

i jak chcę odtworzyć konkretny utwór to w pętli korzystam z tej formuły, którą dodałem czyli:
  konkretnamuzykagra(numer utworu);
Kod:
    delay(1000);  //taką długość odtwarzania mp3 akurat potrzebuję
         pause();
         delay(200);
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości