Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in /home/itstreet/public_html/classes/CMySQL.php on line 22

Warning: mysqli_query() expects at least 2 parameters, 1 given in /home/itstreet/public_html/classes/CMySQL.php on line 24
ITstreet -Arduino i upotreba podataka sa SD kartice
Preskoči na sadržaj

ITstreet postovi

Arduino i upotreba podataka sa SD kartice

Prošli put kada sam pisao o SD modulu bilo je reči kako ga povezati i kako običnim "dugme" prekidačem upisati, izlistati i obrisati pripremljen tekst. Na mikro SD karticu se mogu upisivati razne pripremljene vrednosti kao i očitavanja raznih modula. Ali, može li se SD modul koristiti kao input koji će uslovljavati određena izvršenja? Recimo, na jednom Arduinu zadamo određene komande koje su uslovljene nekim senzorom ili prekidačem, zatim karticu prebacimo u drugi Arduino i u zavisnosti od upisanih vrednosti, Arduino broj 2 izvrši određenu radnju? Naravno da može. Više o tome u tekstu koji sledi.


1. Upis naredbi na Arduinu broj 1


Za pripremu uslovljenih komandi koristimo već pripremljenu Megu iz pomenutog članka. Uz par modifikacija, naravno, gde je samo dodat prekidač na 5V liniju SD modula da bi se kartica mogla izvaditi i kada je Mega upaljena.



Najveće promene su u skeču. Imamo tri prekidača i u zavisnosti koji je pritisnut na mikro SD karticu upisujemo neku vrednost u test.txt fajl. U ovom slučaju neki od brojeva 1, 2 ili 3. Pri tom se prilikom svakog upisa prethodno obriše sve da ne bi došlo do dupliranja unosa.
-----------------------------------------
#include <SD.h>
#include <SPI.h>
const int SD_CS = 10;
const int buttonPin = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;
int buttonState = 0;
int buttonState2 = 0;
int buttonState3 = 0;
File dataFile;
void setup() {
  Serial.begin(9600);
  SD.begin(SD_CS);
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
}
void loop() {
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  if(buttonState == HIGH){
        SD.remove("test.txt");
        if(SD.exists("test.txt")){
          Serial.println("Test.txt nije obrisan");
          }else{
            Serial.println("Fajl je obrisan");
            Serial.println("........");
            }
    dataFile = SD.open("test.txt", FILE_WRITE);
    if(dataFile){
      dataFile.println("1");
      delay(200);
      dataFile.close();
      Serial.println("Kreiran novi test.text fajl");
      Serial.println("Uspešno uneta vrednost - 1");
      delay(100);
      }else{
        Serial.println("Nema test.txt fajla");
        }
    }
  if(buttonState2 == HIGH){
        SD.remove("test.txt");
        if(SD.exists("test.txt")){
          Serial.println("Test.txt nije obrisan");
          }else{
            Serial.println("Fajl je obrisan");
            Serial.println("........");
            }
    dataFile = SD.open("test.txt", FILE_WRITE);
    if(dataFile){
      dataFile.println("2");
      delay(200);
      dataFile.close();
      Serial.println("Kreiran novi test.text fajl");
      Serial.println("Uspešno uneta vrednost - 2");
      delay(100);
      }else{
        Serial.println("Nema test.txt fajla");
        }
    }
  if(buttonState3 == HIGH){
        SD.remove("test.txt");
        if(SD.exists("test.txt")){
          Serial.println("Test.txt nije obrisan");
          }else{
            Serial.println("Fajl je obrisan");
            Serial.println("........");
            }
    dataFile = SD.open("test.txt", FILE_WRITE);
    if(dataFile){
      dataFile.println("3");
      delay(200);
      dataFile.close();
      Serial.println("Kreiran novi test.text fajl");
      Serial.println("Uspešno uneta vrednost - 3");
      delay(100);
      }else{
        Serial.println("Nema test.txt fajla");
        }
    }
}
----------------------------
2. Izvršenje na Arduinu broj 2

Ovde je korišten Uno gde su dodata dva prekidača sa pull-down otpornikom od 10K i tri LED sa otpornicima od 220R. Povezujemo prema Fritzing šemi.



U okviru skeča pritiskom na dugme čitamo sadržaj kartice i u zavisnosti koja je vrednost uneta na Megi, palimo određenu LED. Drugi prekidač služi da se LED ugase.
-------------------------------
#include <SD.h>
#include <SPI.h>
const int SD_CS = 10;
const int buttonPin = 7;
const int buttonPin2 = 8;
int buttonState = 0;
int buttonState2 = 0;
char c;
int ledPin1 = 4; //crvena LED
int ledPin2 = 5; //zuta LED
int ledPin3 = 6; //zelena LED
File dataFile;
void setup() {
  Serial.begin(9600);
  SD.begin(SD_CS);
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
}
void loop() {
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);
  if(buttonState == HIGH){
  dataFile = SD.open("test.txt");
  if(dataFile) {
    while (dataFile.available()) {
     c = dataFile.read();
     if(c=='1'){
      Serial.println("Imamo upisan broj 1");
      digitalWrite(ledPin1,HIGH);
      }else if(c=='2'){
        Serial.println("Imamo upisan broj 2");
        digitalWrite(ledPin2,HIGH);
        }else if(c=='3'){
          Serial.println("Imamo upisan broj 3");
          digitalWrite(ledPin3,HIGH);
          }else{
            Serial.println("Sadrzaj fajla nije ono sto smo uneli u Megi");
            }
    }
    dataFile.close();
  } else {
         Serial.println("Greska u otvaranju test.txt");
         }
    }//if buttonState
 if(buttonState2 == HIGH){
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  Serial.println("LED su pogasene.");
  }
delay(200);
}
-------------------------------




Sa ovim, ali i sa prethodnim člankom sam pojasnio upotrebu osnovnih funkcija u okviru SD.h biblioteke neophodne za rad sa SD modulom. Prilikom testiranja ovog modula kao i nekoliko šildova, ova biblioteka se pokazala dobro i od mene sve preporuke. Na kraju jedan mali rezime:

Funkcije
SD.begin() - pokreće SD slot
SD.open() - otvara SD slot
SD.remove() - briše određeni folder
SD.exists() - proverava postojanje određenog fajla
мyFile.print() - upis na SD karticu
мyFile.println() - upis na SD karticu i početak novog reda
мyFile.close() - zatvara prethodno otvorene foldere na kartici
мyFile.read() - čita sadržaj foldera
мyFile.available() - proverava da li određeni fajl postoji
Funkcija koju nisam upotrebljavao ali koja može biti od koristi
SD.mkdir() - za pravljenje foldera po potrebi i unutar foldera
Tu su još i seek(), position(), size(), isDirectory(), openNextFile() i name().
Prilikom pravljenja naziva fajlova treba imati u vidu da SD.h biblioteka koristi 8.3 format (8 znakova u nazivu i 3 u ekstenziji). Takođe biblioteka ne pravi razliku malih i veilikih slova pa će tako tEsT.txT biti isto što test.txt ili TEST.TXT. Takođe, unosi na karticu neće biti po abecednom redu već po redu vremena unosa.


Ovo je samo jedan od primera kako iskoristiti unete vrednosti na SD karticu. Pri tom ovde radimo samo sa test.txt fajlom dok će svi drugi fajlovi ostati netaknuti. Mogućnosti je puno a ograničenje može da bude samo vaša mašta.

Treba imati na umu da mikro SD kartice rade na isključivo 3,3V i da nisu tolerantne na 5V. Za slične projekte se mogu koristiti i SD slotovi ali u tom slučaju treba voditi računa o naponu izlaznih pinova ploče koju koristimo a najveći broj njih radi na 5V. Takođe treba dodati da se prilikom upisivanja na karticu vuče prilično jaka struja od preko 100mA. Da bi se izbeglo spaljivanje kartica i ploča a pri tom zadržale brzine prenosa potrebno je koristiti što kraće žice a po mogućstvu i bez njih i neki od level šiftera, poput 4050 (HEF, CD...). O "prelaženju" sa 5V na 3,3V i obrnuto biće reči nekom drugom prilikom.

Ostavite poruku

Vaša mejl adresa neće biti objavljena.Označena polja su obavezna*