Skocz do zawartości

Nie można połączyć się z kartą microSD.


Danielos01

Pomocna odpowiedź

Witam, zakupiłem moduł SD ale z racji tego że nie mam jednak karty SD wsadziłem do modułu przez adapter kartę microSD 1GB. Po wgraniu przykładowego kodu(CardInfo) wyświetla mi że nie można połączyć się z kartą.

Initializing SD card...initialization failed. Things to check:

* is a card inserted?

* is your wiring correct?

* did you change the chipSelect pin to match your shield or module?

Moduł połączony z ICSP, a pin CS podłączyłem do pinu 4 w Arduino(jak w kodzie). Karta była wcześniej formatowana.

Czy winą jest wsadzenie karty microSD zamiast SD? Czy konieczne jest zastosowanie modułu microSD lub zmiana karty na SD?

Link do komentarza
Share on other sites

Moduł taki jak ten: http://allegro.pl/modul-czytnik-kart-pamieci-sd-arm-avr-pic-arduino-i6767430731.html?snapshot=MjAxOC0wNC0wM1QxMTo1Mzo1Ny4yNTBaO2J1eWVyOzljOWMxZDNkNTU1ZTc3NzA4ZDNkN2JmNTJjODY1ZjJlYTM4MDRiZGQxNjE1MzExZmYxOThjNTYwYTI2Y2JjYzk%3D

Połączenie:

zasilanie 5V

złącze ICSP

CS-obecnie pin 4 (próbowałem na innych)

Karta SD sprawna, formatowana, FAT 32.

[ Dodano: 01-05-2018, 14:40 ]

Temat zamknięty, podłączyłem dodatkowo zasilania 3,3V i zaczęło działać.

Mam teraz trochę inny problem, mianowicie robię alarm i posiadam do niego wyświetlacz nakładany na Arduino, zegar czasu, diody i czujniki(PIR,magnetyczny). Wszystko działa dobrze lecz chciałem dodać zapisywanie zdarzeń na karcie SD. I tu robi się problem. Gdy do tego wszystkiego podłącze wyżej podany moduł SD to układ zaczyna szaleć, albo karta nic nie zapisuje. Wygląda to tak jak by był jakiś problem z pinami, bo na niektórych wolnych pinach cały czas mam 5V, nawet jak w void setup dam im LOW.

Czy ktoś wie w czym może być problem?

#include <Wire.h>     //biblioteka komunikacji dla zegara
#include <DS3231.h>   //biblioteka zegara DS3231

#include <SPI.h>
#include <SD.h>
File plik;

//ustawienia wyświetlacza LCD + biblioteka wyświetlacza
#include <LiquidCrystal.h>
const int rs = 8, en =9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//przyciski wyświetlacza i zmienne ich obsługi
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

DS3231 clock;     //zegar czasu rzeczywistego
RTCDateTime dt;

#define PIR         12
#define led1        1
#define buzzer      2
#define odbiornik   3
#define czujnik     11

boolean alarm_uzbrojony=false;  //zmnienna sygnalizująca uzbrojenie alarmu

int read_LCD_buttons()  //funkcja odczytu wciśniętego przycisku
{
  adc_key_in = analogRead(0);      
  if (adc_key_in > 1000) return btnNONE; 
  if (adc_key_in < 50)   return btnRIGHT;  
  if (adc_key_in < 250)  return btnUP; 
  if (adc_key_in < 450)  return btnDOWN; 
  if (adc_key_in < 650)  return btnLEFT; 
  if (adc_key_in < 850)  return btnSELECT;  

  return btnNONE;
}

void menu()       //wyświetlanie funkcji MENU
{
 lcd.clear();
 lcd.print("Centralka alarmu"); 
}

void czas()         //wyświetlanie czasu z DS3231
{
 lcd.clear();
 do
 {
   dt = clock.getDateTime();   //pobieranie danych z zegara

   lcd.setCursor(0,0);
   lcd.print(dt.year);lcd.print("-");
   if(dt.month<10)
   {
     lcd.print("0");lcd.print(dt.month);lcd.print("-");  
   }
   else
     lcd.print(dt.month);
   if(dt.day<10)
   {
     lcd.print("0");lcd.print(dt.day);
   }
   else 
     lcd.print(dt.day);

   lcd.setCursor(0,1);
   if(dt.hour<10)
   {
     lcd.print("0");lcd.print(dt.hour); lcd.print(":");
   }
   else
     lcd.print(dt.hour);lcd.print(":");
   if(dt.minute<10)
   {
     lcd.print("0");lcd.print(dt.minute);lcd.print(":");
   }
   else
     lcd.print(dt.minute);lcd.print(":");
   if(dt.second<10)
   {
     lcd.print("0");lcd.print(dt.second);  
   }
   else
     lcd.print(dt.second);

   delay(400);
   lcd_key = read_LCD_buttons();    
  } while(lcd_key!=btnDOWN);

 menu();

}

void alarm()    //działanie ukłądu w trybie uzbrojonym
{
 digitalWrite(odbiornik,HIGH);
 zapis_SD("WŁAMANIE");
 lcd.clear(); lcd.print("    Wlamanie");
 for(int i=0;i<=35;i++)
   dzwiek(150,4300,3500);
 noTone(buzzer);
 digitalWrite(odbiornik,LOW);
}

boolean uzbrajanie()   //proces uzbrajania alarmu, sprawdzanie czujników
{
   lcd.clear();lcd.print("UZBRAJANIE");lcd.setCursor(0,1);lcd.print("Opusc dom");
   miganie_led();
   if(digitalRead(czujnik)==HIGH&&digitalRead(PIR)==LOW)
   {
      zapis_SD("uzbrojenie alarmu");
      return alarm_uzbrojony=true;     
   }
   else
      {
         lcd.clear();
         lcd.print("Uzbrajanie nie"); lcd.setCursor(0,1); lcd.print("powiodlo sie");
         for(int i=0;i<=15;i++);
           dzwiek(1000,1000,1000);
         noTone(buzzer);
         zapis_SD("uzbrajanie nie powiodło się");
         menu();
         return alarm_uzbrojony=false;
      }      
}

void dzwiek(int czas_przerwy, int czestotliwosc1, int czestotliwosc2)  //odtwarzanie sygnału BUZZERA
{
 tone(buzzer,czestotliwosc1),
 delay(czas_przerwy);
 tone(buzzer,czestotliwosc2),
 delay(czas_przerwy);
}

void miganie_led()  //miganie diodą LED
{
 for(int i=0;i<=5;i++)
 {
   digitalWrite(led1,HIGH);
   delay(500);
   digitalWrite(led1,LOW);
   delay(500);     
 }
}

boolean wylanczanie_alarmu() //funkcja sprawdzająca wyłączanie alarmu
{
 int cykl_oczekiwania=0;
 do
 {
   lcd_key = read_LCD_buttons();
   delay(100);
   cykl_oczekiwania++;
   if(lcd_key==btnSELECT)
   { 
     digitalWrite(led1,LOW);
     menu();
     return alarm_uzbrojony=false;
   }
 }while(cykl_oczekiwania!=35);

 alarm();
}

void zapis_SD(String stan)
{
 dt = clock.getDateTime();
 plik=SD.open("Alarm.txt");
 plik.print(dt.year);plik.print("-");plik.print(dt.month);plik.print("-");plik.print(dt.day);
 plik.print("Godzina ");plik.print(dt.hour);plik.print(":");plik.print(dt.minute);plik.print(":");plik.print(dt.second);
 plik.println(stan);plik.close();
}

void setup() 
{
 clock.begin();      //uruchomienie zegara
 lcd.begin(16, 2);   //ustawienie wyświetlacza LCD

 pinMode(led1,OUTPUT);
 pinMode(buzzer,OUTPUT);
 pinMode(odbiornik,OUTPUT);
 pinMode(czujnik,INPUT);
 pinMode(PIR,INPUT);

 SD.begin(13);
 plik=SD.open("Alarm.txt",FILE_WRITE);
 plik.println("Alarm załączony");
 plik.close();

 menu();             //uruchomienie startowe funkcji MENU
}

void loop() 
{
 lcd_key = read_LCD_buttons();   //sprawdzanie wciskanych przycisków

 switch(lcd_key)                 //przejścia do innych opcji na LCD
 {
   case btnLEFT: menu(); break;
   case btnDOWN: czas(); break;
   case btnSELECT: uzbrajanie(); break;
 }

 if(digitalRead(czujnik)==LOW&&alarm_uzbrojony==false)
   {
     lcd.setCursor(0,1);
     lcd.print("otwarte drzwi");
   }
   else 
     if(digitalRead(PIR)==HIGH&&alarm_uzbrojony==false)
     {
       lcd.setCursor(0,1);lcd.print("wykryto ruch ");
     }
     else
       if(alarm_uzbrojony==false)
          menu();
       else
       {
         lcd.clear();lcd.print("Alarm uzbrojony");
         digitalWrite(led1,HIGH);
       }

  if(alarm_uzbrojony==true&&(digitalRead(czujnik)==LOW||digitalRead(PIR)==HIGH))
     wylanczanie_alarmu();

 delay(200);

}

[ Dodano: 01-05-2018, 17:25 ]

Wystarczy że tylko dopiszę biblioteki i w void setup umieszczę SD.begin(13) i program wariuje. Próbowałem także na innych pinach ustawić CS z modułu SD ale też nic nie dawało. Używam LCD KeyPad Shield: https://www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)

Jakieś propozycje czemu się tak dzieje?

Link do komentarza
Share on other sites

ICSP to nic innego niż piny 11, 12 i 13 (między innymi), tyle że wyprowadzone dodatkowo na wygodne gniazdko.

Nic dziwnego, że program Ci wariuje jeśli chcesz użyć pinu do kilku funkcji jednocześnie.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

PIR i czujnik podłączyłeś do ISP na którym powinna chodzić karta SD. To, że podłączyłeś kartę do złącza ICSP nie oznacza, że pin 11 i 12 są "wolne" - życie.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzięki za szybką odpowiedź. Czyli jeżeli podłącze PIR i czujnik magnetyczny np. do analogowych pinów będzie wszystko OK. Jeżeli używam ICSP to piny 11,12,13 są automatycznie bezużyteczne czy można jakoś pokombinować i je wykorzystywać?

Czy tak samo jest z SLC i SDA bo są one wyprowadzone też na A4 i A5 więc jak używam zegara czasu rzeczywistego DS3231 i mam go podłączonego pod te 2 piny to A4 i A5 też nie mogę używać bo będzie problem z zegarem?

Link do komentarza
Share on other sites

Dokładnie tak.

Z tym, że możesz mieć kilka urządzeń SPI i/lub kilka urządzeń I2C. Np. wyświetlacz LCD z interfejsem I2C i zegar będą działać na dwóch pinach A4/A5. Podobnie czytnik kart i wyświetlacz graficzny będą korzystać z tych samych pinów MOSI, MISO i CLK, będą tylko potrzebować dodatkowego jednego (w niektórych przypadkach dwóch) pinów na układ.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.