Подключаем USB-флешку к Arduino

Тема в разделе "Глядите, что я сделал", создана пользователем DIYMan, 4 янв 2020.

  1. DIYMan

    DIYMan Guest

    Когда-то давно - стояла задача подключить вот такой модуль к дуне, чтобы читать не с SD-карты, а с полноценной флешки:

    scheme.png

    Помыкавшись, помумукавшись, почитав китайский даташит на это дело (которому слепо следовать нельзя, потому что практика показала, что временнЫе задержки, там фиругирующие - ни разу на практике не работают), выискав точку отсчёта в виде кода экспериментов одного забугорного товарища - родилось вот это: https://github.com/Porokhnya/CH376STest

    Код является, во-первых, быстрым наброском. Далее - он блокирующий, чтение из файла - блочное, ну а поскольку эта китайская хрень почему-то иногда выдаёт не точно запрошенное кол-во байт - реализована дочитка.

    Всё это дело, в целом - сыровато хотя бы по части архитектуры, но уже позволяет через тот же SoftwareSerial на скорости 9600 ткнуть к Arduino флешку и почитать/пописать файлы на неё. Приведённый пример скетча - для Arduino Mega, флешка цепляется на Serial1, для простоты понимания. Но, поскольку код работает с любым потомком Stream - то конструктору класса скормить можно и экземпляр SoftwareSerial.

    Никаких далеко идущих претензий, дальнейшего развития, прочего - выкладываю как есть, возможно, будет полезно для старта кому-то. В идеале, да для взрослого проекта - надо переписывать всё на асинхронщину, чтобы без этих ваших delay и подобных неприятных вещей. Архитектура - наколенная, тупо не задумывался особо, так что as is.

    Для простеньких проектов - можно причеплять, и читать с флешки (что я, собственно, с успехом и делал). Для очень сурьёзных - нужен асинхронный подход, как по мне.

    Ну и - пример с гита:

    Код (C++):
    //--------------------------------------------------------------------------------------------------------------------------------
    #include "CH376S.h"
    CH376S_UART USBDisk(Serial1);
    //--------------------------------------------------------------------------------------------------------------------------------
    void setup()
    {
      Serial.begin(9600);
      Serial1.begin(9600);

      if(USBDisk.begin())
      {
          String fileName = "TEST.TXT"; // имя файла на флешке
       
          if(USBDisk.isFlashDriveInserted()) // если флешка вставлена
          {
              USBFile f = USBDisk.open(fileName);
              if(f.isOpen())
              {
                  Serial.print(F("File size: "));
                  Serial.println(f.size());
                  Serial.println(F("Content of \"TEST.TXT\": "));

                while(f.available())
                {
                  char ch = (char) f.read();
                  if(ch == 0)
                  {
                    break;
                  }

                  Serial.print(ch);
                }
             
                f.close();
              }
           
          }
      }
    }
    //--------------------------------------------------------------------------------------------------------------------------------
    void loop()
    {

    }
    //--------------------------------------------------------------------------------------------------------------------------------
     
    Может, кому и будет полезно. Если нет - ну значит нет, от меня не убудет, лавровых венков не жду, просто вспомнилось, сколько эта фигня мне крови попила, и захотелось поделиться.
     
    DetSimen, Daniil, ИгорьК и 2 другим нравится это.
  2. alp69

    alp69 Форумчанин

    Какик флэшки читаются?
     
  3. DIYMan

    DIYMan Guest

    Тыкал те, что были в наличии - читаются. Если интересует более подробно - инфа есть в даташите на микруху.
     
    DetSimen и alp69 нравится это.
  4. zveros

    zveros Нерд

    Ntfs поддерживается?
     
  5. DetSimen

    DetSimen Guest

    Естественно, нет.