Problém při práci s SD kartou

Anty
Příspěvky: 6
Registrován: 21 úno 2018, 17:28
Reputation: 0

Problém při práci s SD kartou

Příspěvek od Anty » 21 úno 2018, 18:28

Zdravím ve spolek, můj problém spočívá nejspíš ve funkcích fileRead a fileWrite (viz code)

takže co to dělá a nedělá:
když použiju funkci listShow() stane se to co se má, vrátí mi seznam souborů, v mém případě 5 souborů
problém nastává při použití fileRead nebo fileWrite, za prvé, někdy mi to ten soubor vezme a někdy ne (záleží na názvu souboru, nwm proč)
a za druhé pokud tyto funkce udělají co mají, přestává pracovat listShow, teda ne že by nepracoval ale vrací méně souborů než na sd kartě obravdu je

takhle vypadá celý program a nahrávám ho na arduino uno s LCD TFT shieldem

Kód: Vybrat vše

#include <SD.h>
#include <EEPROM.h>

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;

#include <TouchScreen.h>
#define YP A1
#define YM 7
#define XM A2
#define XP 6
#define MINPRESSURE 10
#define MAXPRESSURE 1000


int TP_LEFT=EEPROM.read(0)+(EEPROM.read(1)<<8); //938;
int TP_TOP=EEPROM.read(2)+(EEPROM.read(3)<<8); //915;
int TP_RT=EEPROM.read(4)+(EEPROM.read(5)<<8); //567;
int TP_BOT=EEPROM.read(6)+(EEPROM.read(7)<<8); //245;
TouchScreen touchScreen = TouchScreen(XP, YP, XM, YM, 150);
TSPoint touchPoint;

void reset(void) {tft.fillScreen(0xffff); asm volatile ("  jmp 0");}
void TSinit(boolean maping=1) {touchPoint=touchScreen.getPoint();
  if (maping) {
    int tpy=touchPoint.y;
    touchPoint.y=map(touchPoint.x,TP_LEFT,TP_RT,tft.height()-10,10);
    touchPoint.x=map(tpy,TP_TOP,TP_BOT,10,tft.width()-10);
    } // bug!!! prohozene x a y (nula vlevo dole)
  pinMode(YP, OUTPUT); pinMode(XM, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT);
  }
boolean TStouch(void) {return (touchPoint.z > MINPRESSURE && touchPoint.z < MAXPRESSURE);}
boolean TSrect(int x1, int y1, int x2, int y2) {
  return (touchPoint.z > MINPRESSURE && touchPoint.z < MAXPRESSURE &&touchPoint.x>x1 && touchPoint.x<x2 && touchPoint.y>y1 && touchPoint.y<y2);}


class CON {
  public:
    String input="";
    String dir="/";
    String file="";
    File f;
  }; CON console;
  
  
void listShow(String fn) {
  console.f=SD.open(console.dir.c_str(),FILE_READ);
  while(true) {
    File entry =  console.f.openNextFile();
    if (!entry) {break;}
    String out=entry.name();
    if (entry.isDirectory()) {out=out+"/";}
    else {out=out+"  - "+entry.size()+" byte";}
    Serial.println(out);
    entry.close();
    }
  console.f.close();
  }
  
  
void cd(String dir="") {
  if (dir.length()!=0) {
    if (dir[0]=="/"[0]) {console.dir=dir;}
    else {console.dir=console.dir+dir;}
    if (dir[dir.length()-1]!="/"[0]) {console.dir=console.dir+"/";}
    }
  Serial.println(console.dir);
  }
  
  
void fileOpen(String fname) {
  fname=console.dir+fname;
  Serial.println(fname);
  console.file=fname;
  }
  
  
void fileRead() {
  console.f=SD.open(console.file.c_str(),FILE_READ);
  while (console.f.available()) {
    Serial.write(console.f.read());
    }
  console.f.close();
  }
  
  
void fileWrite(String txt) {
  console.f=SD.open(console.file.c_str(),FILE_WRITE);
  console.f.println(txt);
  Serial.println(txt);
  console.f.close();
  }
  
  
void setup() {
  Serial.begin(9600);
  tft.reset();
  tft.begin(0x4747);
  tft.setRotation(1);
  tft.fillScreen(0x0000);
  SD.begin(10);
  console.dir="/";
  Serial.println("Serial initialize");
  Serial.setTimeout(10);
  }


void loop() {
  while(1) {
    if (Serial.available()) {
      console.input=Serial.readString();
      break;
      }
    delay(30);
    }
    
  String command="";
  String argument="";
  int pos=0;
  for(int i;i<console.input.length();i++) {
    if (console.input.charAt(i)==32) {break;} else {pos+=1;}
    }
    
  command=console.input.substring(0,pos);
  argument=console.input.substring(pos+1,console.input.length());
  
  //translate start
    if (command=="print") {tft.print(argument);}
    else if (command=="println") {tft.println(argument);}
    else if (command=="ls") {listShow(argument);}
    else if (command=="fopen") {fileOpen(argument);}
    else if (command=="fread") {fileRead();}
    else if (command=="fwrite") {fileWrite(argument);}
    else if (command=="cd") {cd(argument);}
    else {Serial.println("prikaz \""+command+"\" nenalezen");}
  //translate end
  
  //console.print(command);
  //console.print(argument);
  
  console.input="";
  delay(500);
  }

Anty
Příspěvky: 6
Registrován: 21 úno 2018, 17:28
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od Anty » 21 úno 2018, 18:43

tady ještě nějáké dodatečné informace k sd kartě

Card type: SD2

Volume type is FAT16

Volume size (bytes): 501612544
Volume size (Kbytes): 489856
Volume size (Mbytes): 478

Files found on the card (name, date and size in bytes):
PGM_TEST 2000-01-01 01:00:00 340
TEST.TXT 2000-01-01 01:00:00 36
TEST 2000-01-01 01:00:00 6
POKUS 2000-01-01 01:00:00 10
PGM0 2017-11-09 22:19:46 29

Anty
Příspěvky: 6
Registrován: 21 úno 2018, 17:28
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od Anty » 22 úno 2018, 16:00

Vzhledem k vysokému zájmu o toto téma jsem to zalepil tak že při startu si arduino zmapuje všechny soubory na sd kartě a jejich názvy si uloží do souboru sdflist a potom funkce listFile jen čte z tohoto souboru
... vše už funguje jak má, ale mám špatný pocit z toho že jsem chybu neodstranil, jen jsem eliminoval podmínky které ji vyvolávaly
kdyby přecijen někdo zjistil kde je zakopaný pes, budu jen rád

Romulus
Příspěvky: 5
Registrován: 12 čer 2023, 21:07
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od Romulus » 12 čer 2023, 21:15

Zdravím lidičky, mám takový problém s inicializací SD karty. Pořídil jsem SD modul s napeťovým regulátorem a propojil s mým Arduino Mega 2560 (piny 50-53.

Za boha se mi však nedaří SD kartu inicializovat. Zkoušel jsem to pouze přes příklad co je k dispozici v IDE ohledně načtení informací o kartě.

Podařilo se mi zjistit, že to vrací erro kód 1, ale víc nic. Původně jsem si myslel, že by to mohl být HW problém modulu, tak jsem koupil ještě jeden, ale výsledek je stejný. SD karta naformátovaná dle náodů. Zapisovat na ni v PC normálně jde.

Nesetkal se s tím někdo? Na netu jsem hledal a řešilo to více lidí na Arduinu Mega, ale nenašel jsem žádné řešení.

Předem všem děkuji za odpoveď

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od ondraN » 13 čer 2023, 09:26

Jestli není problém v tom, že je karta na 3,3V a arduino jede na 5V. Vzhledem k SPI rozhraní je to hazard pro kartu i arduino. Na všechny datové vodiče by to chtělo převodníky úrovně a nebo modul pro kartu s těmito převodníky.

Uživatelský avatar
kiRRow
Příspěvky: 1147
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Problém při práci s SD kartou

Příspěvek od kiRRow » 13 čer 2023, 18:59

Mno ... ten regulátor sice z pěti udelá tři celá tři pro napájení, ale po SPI to arduino pošle pět. Zkus kartu v počítači, nejlépe přes nějaký USB adaptér - mohla by být odstřelená a raději odvařit USB adaptér, než slot v počítači, nebo v mobilu. Zřejmě odešla do křemíkového nebe.

Romulus
Příspěvky: 5
Registrován: 12 čer 2023, 21:07
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od Romulus » 14 čer 2023, 06:55

No SD karta kdekoliv jinde funguje bez problémů. Na PC do ní v pohodě zapíšu soubory, otevřu je. Vše se tváří funkční. Mám tento modul https://www.hwkitchen.cz/modul-ctecka-m ... dhc-karet/ který má už v sobě napěťový regulátor a co jsem viděl návody na netu, mělo by to normálně fungovat.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od ondraN » 14 čer 2023, 08:01

Tak tenhle modul je OK, protože má i převodníky úrovně. Úplně ten samý modul jsem před pár lety použil taky na ATMega2560 a fungovalo to naprosto bez problémů na první zapojení. Takže je problém v zapojení nebo programu a nebo ten modul může být vadný. A taky doporučuji zkusit jinou kartu, protože to s nějakými nechodilo. Určitě to ale fungovalo se 4GB Kingstonem.

Romulus
Příspěvky: 5
Registrován: 12 čer 2023, 21:07
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od Romulus » 15 črc 2023, 20:53

Zdravím lidičky. Už jsem zoufalý. Za boha se mi nedaří rozhodit tu SD kartu.

Konfigurace je Arduino mega 2560
Modul viz předešlý příspěvek včetně regulátoru napětí. Koupil jsem ještě jeden se stejným výsledkem.

Končí to chybou 1 což by měl být timeout. Zkoušel jsem i více karet. Od nějakých noname po Kingston SDHC o velikostech 512MB, 2GB, 16GB a 32GB. V jiných zařízeních SD karty fungují v pohodě (PC, telefon, 3D tiskárna...)

Zkoušel jsem i nějaké věci, co jsem našel na netu, jako ručně nastavit PIN 53 na OUTPUT a podobně... Nic nepomohlo.

Když si vypíšu konstanty pinů pro SPI rozhraní, tak odpovídají tomu, jak to mám zapojené.

Program jsem zkoušel jen ty ukázkové na zapsání souboru, nebo jen info o kartě. Tedy že by to byl problém v samotném programu by se tím měl vyloučit. Ono neprojde ani SD.begin() bez parametrů o rychlosti a pinů SS. (V tento moment by to mělo brát vyloženě ty konstanty)

Na Ali jsem našel ještě jeden modul na SD karty, který by měl komunikovat přes UART, tedy jen za využití Tx a Rx, ale nikde jsem nesehnal žádný manuál, ani ukázku použití. Kdyby náhodou někdo k tomuto něco měl a poskytl by mi to, tak bych byl moc vděčný.

Případně nějaké rady, například, něco změřit a tak?

Romulus
Příspěvky: 5
Registrován: 12 čer 2023, 21:07
Reputation: 0

Re: Problém při práci s SD kartou

Příspěvek od Romulus » 15 črc 2023, 21:06

Ještě dodám. Zkoušel jsem i zda ty piny na arduinu nejsou mrtvé. Vstupní přes tlačítko a výstupní pomocí diod. Vše fungovalo v pohodě. Tedy Arduino by také nemělo být mrtvé, ale prostě to nejde...

Je to vlastně jediná věc, kterou mi chybí k dořešení, abych dokončil svůj projekt zavlažovacího systému. Potřebuji tam ukládat nastavení jednotlivých okruhů zavlažování, aby se to nemuselo nastavovat po každém vypnutí a zapnutí.

Pak bych vám to tu i představil. Třeba by se tato myšlenka někomu zalíbila. Je to zavlažovací systém pomocí dešťové vody v nádrži. Včetně snímání hlaniny vody, senzory vlhkosti s možností ovládání přes rest-api po WiFi. Ovládá to i zapnutí a vypnutí čerpadla, aby to neběželo stále... Nastavení je pak možné provádět přes 4, tlačítka a 4 řádkový display, nebo provoláním příslušné metody pomocí restoveho apicka, třeba z telefonu, PC...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti