Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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?

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?

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

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

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?

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

Dzięki wielkie, faktycznie pozmieniałem program, PIR i magnetyczny na analogowych pinach. Piny 11,12 i 13 są wolne. Program działa bez zarzutu, wszystko się zapisuje.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...