Вопрос по работе с SD картой

Тема в разделе "Флудилка", создана пользователем Rudolph Sikorskiy, 17 май 2016.

Метки:
  1. На карту все пишется исправно,
    необходима лишь одна делать.

    Как сделать так чтобы мое устройство определялось как флешка?
    Сейчас чтобы достать записанный файл мне нужно вытащить из устройства флешку,
    воткнуть в комп и увидеть файл.
    А нужно чтобы при подключении ардуины через USB можно увидеть флешку не вынимая из устройства.

    код программы прилагаю.

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <SPI.h>
    #include <SD.h>

    LiquidCrystal_I2C lcd(0x27,16,2);

    #define sens A0
    #define sensmq A1
    const int chipSelect = 10;

    void setup() {
    Serial.begin(9600);
    while (!Serial);
    lcd.init();
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("Initializing ");
    lcd.setCursor(0,1);
    lcd.print("SD card...");
    delay(1000);

    if (!SD.begin(chipSelect))
    {
    lcd.setCursor(0,0);
    lcd.print("Card failed,");
    lcd.setCursor(0,1);
    lcd.print("or not present.");
    delay(1000);
    return;
    }

    lcd.setCursor(11,1);
    lcd.print("DONE");
    delay(1000);
    pinMode(sens, INPUT);
    pinMode(sensmq, INPUT);

    }

    void loop() {
    int data = analogRead(sens);
    int data1 = analogRead(sensmq);

    File dataFile = SD.open("datalog.txt", FILE_WRITE);

    if (dataFile)
    {
    dataFile.print("CO ");
    dataFile.print(data);
    dataFile.print(" CH4 ");
    dataFile.print(data1);
    dataFile.print(" H2 ");
    dataFile.print(data);
    dataFile.print(" LPG ");
    dataFile.println(data1);
    dataFile.close();

    }

    else {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("error opening datalog.txt");
    lcd.setCursor(0,1);
    lcd.print("datalog.txt");
    delay(1000);
    }
    lcd.setCursor(0,0);
    lcd.print("CO ");
    lcd.setCursor(data < 100 ? 6 : 5, 0);
    lcd.print(data);
    lcd.setCursor(0,1);
    lcd.print("CH4 ");
    lcd.setCursor(data1 < 100 ? 6 : 5, 1);
    lcd.print(data1);
    lcd.setCursor(9,0);
    lcd.print("H2 ");
    lcd.setCursor(data < 100 ? 14 : 13, 0);
    lcd.print(data);
    lcd.setCursor(9,1);
    lcd.print("LPG ");
    lcd.setCursor(data1 < 100 ? 14 : 13, 1);
    lcd.print(data1);
    delay(1000);
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    никак, Arduino тут вообще ни при чем - чип UART-USB-интерфейса это тоже не умеет.
     
  3. Ок, а железом дополнительным можно это решить?
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    перейти на другой микроконтроллер, типа Raspberry или аналогов.
     
  5. Меня скорей интересует можно ли сделать выход на SD карту посредством USB.
     
  6. ostrov

    ostrov Гуру

    [​IMG]
     
  7. AlexU

    AlexU Гуру

    Так понял, что нужно получать определённый файл с корня флешки.

    Простой способ:
    Через Serial порт Arduino должна принимать, например, строку "get <имя_файла>", и в ответ отправлять размер файла и данные, считанные из файла, соответствующие размеру. Соответственно на компьютере программка (которую так же необходимо будет написать) должна отправлять строку "get <имя_файла>" через COM-порт, в ответ получать размер данных и непосредственно сами данные и сохранять эти данные в файл.

    Сложный способ:
    В случае с оригинальной Arduino UNO, для второго контроллера ATmega16U2 можно попробовать написать прошивку, которая будет эмулировать USB-флэшку, при этом данные от реальной флэшки второй контроллер ATmega16U2 будет получать через Serial соединение с основным ATmega328P. Для реализации нужно будет покопаться в проекте LUFA, там есть заготовка для реализации эмуляции MassStorage на основе AVR.
    Но при реализации второго способа Arduino перестанет в системе определяться как плата Arduino.
     
  8. ANV

    ANV Гуру

    На компьютере можно не писать программу, а писать лог из serial в файл. В том-же нетленном hyperterm есть "запись протокола в файл"
     
  9. ну, остроумно...
     
  10. Спасибо, буду пробовать)
     
  11. Можно подробней пожалуйста?
    гугл говорит про hyperterm что это либо плазморез либо система для управления модемом
     
  12. AlexU

    AlexU Гуру

    Если память не изменяет, это оно и есть -- HyperTerminal.
    Но всё же программку для отправки данных в COM-порт и приёма написать не очень сложно. И это будет проще, чем из потока сохранённых данных выделять нужное.
     
  13. Потока то у мкеня нет, есть лишь один файл TXT с временем и числом
     
  14. AlexU

    AlexU Гуру

    Если один текстовый файл, то с программой для компьютера можно не заморачиваться -- возьмите любую программу, которая может слать данные в COM-порт (minicom, hyperterminal и т.п., да вроде как в Arduino IDE есть возможность общаться с Arduino через COM-порт -- монитор порта). Только скетч нужно немного доработать -- он должен проверять наличие данных в Serial и при наличии там, например, строки "get" обратно отправлять содержимое файла.