Считывания с CD карты массива (бюджет 1000р)

Тема в разделе "Закажу проект", создана пользователем Artclonic, 25 янв 2018.

  1. Artclonic

    Artclonic Гик

    А вот и не читает....Вернее читает, только другие команды исполняет.. и не все...
    Задал (в приложении) 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
    Отработал по факту на команды 6,7,9,10,12,13,14,18,20..
    Может дело в пробелах, табуляциях, двухзначных числах...?
     

    Вложения:

    • program.txt
      Размер файла:
      52 байт
      Просмотров:
      389
  2. DIYMan

    DIYMan Guest

    Команды разделяются через табуляцию, пробелов не должно быть, переводы строки - допустимы в любом месте. Двузначные, трёхзначные и т.п. числа - отрабатывают корректно.
    Не может такого быть, код корректный, я проверял на железе.
    Вы пытаетесь таким образом намекнуть, что я вам дал неправильно работающий код? Ок, каждый может его проверить, не вопрос - давайте судей привлечём.
     
  3. DIYMan

    DIYMan Guest

    Загрузил ваш файл program.txt на флешку, вот что в мониторе порта:
    Как видно - команды читаются правильно. Вопросы?

    З.Ы. Что вы там делаете со скетчем - сие мне неведомо, но знаю одно - неправильным подходом можно убить любой работающий код, дело нехитрое.
     
  4. Artclonic

    Artclonic Гик

    Не в коем случае... хотел убедиться, что загружаемый файл корректен, буду у себя искать причины
     
  5. Artclonic

    Artclonic Гик

    Вот файл, с которого читает... Убрал все команды вставил в соответствии номером - печать в монитор порта...
    Показывает разнобой... Не те команды...
    Код (C++):
    #include "Parser.h"
    #include <AFMotor.h>
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    // НАСТРОЙКИ
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    #define SD_CS_PIN 53 // пин Chip Select для SD-карты
    #define PROGRAM_FILENAME F("program.txt") // имя файла с микропрограммой
    #define COMMAND_DELIMITER '\t' // разделитель между командами
    #define SERIAL_SPEED 57600 // скорость работы Serial
    const int ob11=40; // ШД №1
    const int ob12=42; // ШД №1
    const int ob13=44; // ШД №1
    const int ob14=46; // ШД №1
    const int ob21=48; // ШД №2
    const int ob22=34; // ШД №2
    const int ob23=36; // ШД №2
    const int ob24=38; // ШД №2
    int ZZZ = 13;//ПЕРЕЕЗД НА 1
    unsigned long RRR= 150;//задержка на холсте
    unsigned long XXX= 150;//задержка в бункере
    unsigned long YYY= 100;//задержка перед опуск на холст
    unsigned long QQQ= 100;//задержка перед опуск на холст
    unsigned long aaa = 15;//скорость до 1(11) бункера
    unsigned long bbb = 15;//скорость до 2(12) бункера
    unsigned long ccc = 15;//скорость до 3(13) бункера
    unsigned long ddd = 10;//скорость до 4(14) бункера
    unsigned long eee = 10;//скорость до 5(15) бункера
    unsigned long fff = 10;//скорость до 6(16) бункера
    unsigned long ggg = 10;//скорость до 7(17) бункера
    unsigned long hhh = 10;//скорость до 8(18) бункера
    unsigned long iii = 10;//скорость до 9(19) бункера
    unsigned long jjj = 10;//скорость до 10(20) бункера
    int ii;
    int tt;
    int y;
    int q;
    int N=3; //путь поднятия/опускания  с холста
    int Z=2; //путь поднятия/опускания с бункера
    int W = 10;//кол-во циклов
    unsigned long  c = 10; //скорость подъема бункер/холст



    AF_Stepper motor1(200,1); // 200 шагов на оборот, 1 -подключено к М1,М2
    AF_Stepper motor2(200,2); // 200 шагов на оборот, 1 -подключено к М3,М4



    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    // обработчик следующей команды из файла
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    void ON_COMMAND(int command)
    {

      {
      switch(command)
      {
        case 1: // Блок №1
        {
          Serial.println("BUNKER1");
          delay(1000);    
        }
        break;
        case 2:// Блок №2
        {
          Serial.println("BUNKER2");
          delay(1000);
        }
        break;
        case 3: // Блок №3
        {
         Serial.println("BUNKER3");
          delay(1000);
        }
        break;
        case 4: // // Блок №4
        {
         Serial.println("BUNKER4");
          delay(1000);
        }
        break;  
        case 5:// Блок №5
        {
         Serial.println("BUNKER5");
          delay(1000);
        }
        break;
         case 6:// Блок №6
        {
          Serial.println("BUNKER6");
          delay(1000);
        }
        break;
       case 7:// Блок №7
        {
         Serial.println("BUNKER7");
          delay(1000);
        }
        break;
       case 8:// Блок №8
        {
         Serial.println("BUNKER8");
          delay(1000);
        }
        break;
       case 9:// Блок №9
        {
          Serial.println("BUNKER9");
          delay(1000);
        }
        break;
       case 10:// Блок №10
        {
        Serial.println("BUNKER10");
          delay(1000);
        }
        break;
    case 11: // Блок №11
        {
         Serial.println("BUNKER11");
          delay(1000);
        }
        break;
        case 12:// Блок №12
        {
          Serial.println("BUNKER12");
          delay(1000);
        }
        break;
        case 13: // Блок №13
        {
         Serial.println("BUNKER13");
          delay(1000);
        }
        break;
        case 14: // // Блок №14
        {
         Serial.println("BUNKER14");
          delay(1000);
        }
        break;  
        case 15:// Блок №15
        {
         Serial.println("BUNKER15");
          delay(1000);
        }
        break;
         case 16:// Блок №16
        {
          Serial.println("BUNKER16");
          delay(1000);
        }
        break;
       case 17:// Блок №17
        {
          Serial.println("BUNKER17");
          delay(1000);
        }
        break;
       case 18:// Блок №18
        {
          Serial.println("BUNKER18");
          delay(1000);
        }
        break;
       case 19:// Блок №19
        {
          Serial.println("BUNKER19");
          delay(1000);
        }
        break;
       case 20:// Блок №20
        {
          Serial.println("BUNKER20");
          delay(1000);
        }
        break;
    case 21:// Блок ПЕРЕЕЗД ПО ЯЧЕЙКАМ ВПЕРЕД
        {
    motor1.step(ZZZ, FORWARD, SINGLE);  motor1.release(); //ПЕРЕЕЗД НА 1ЯЧЕЙКУ
    Serial.println("VPEREDYCHEIKA");
          delay(1000);
        }
        break;
       case 22:// Блок ПЕРЕЕЗД ПО ЯЧЕЙКАМ НАЗАД
        {
    motor1.step(ZZZ, BACKWARD, SINGLE);  motor1.release(); //ПЕРЕЕЗД НА 1 ЯЧЕЙКУ
    Serial.println("NAZADYCHEIKA");
          delay(1000);
        }
        break;  
        case 23:// Блок ПЕРЕЕЗД ПО СТРОКАМ
        {
    motor2.step(ZZZ, FORWARD, SINGLE);  motor1.release(); //ПЕРЕЕЗД НА 1 СТРОКУ
    Serial.println("STROKA");
          delay(1000);
        }
        break;  


      } // switch

    }


    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    void setup()
    {

    // Конфигурируем вывод подключения обмоток ШД как выход (OUTPUT)
    pinMode(ob11, OUTPUT);
    pinMode(ob12, OUTPUT);
    pinMode(ob13, OUTPUT);
    pinMode(ob14, OUTPUT);
    pinMode(ob21, OUTPUT);
    pinMode(ob22, OUTPUT);
    pinMode(ob23, OUTPUT);
    pinMode(ob24, OUTPUT);
    motor1.setSpeed(20); // 20 об/мин
    motor2.setSpeed(20); // 20 об/мин

      Serial.begin(SERIAL_SPEED);
      if(!SD.begin(SD_CS_PIN))
      {
        Serial << F("CAN'T INIT SD!") << ENDLINE;
        while(true);
      }

      Parser.setup(COMMAND_DELIMITER);

      if(!Parser.load(PROGRAM_FILENAME))
      {
        Serial << F("CAN'T LOAD PROGRAM!") << ENDLINE;
        while(true);
      }
    //digitalWrite(ob21,HIGH);digitalWrite(ob22,LOW);digitalWrite(ob23,LOW);digitalWrite(ob24,HIGH);//фиксация ШД2
    //digitalWrite(ob11,HIGH);digitalWrite(ob12,LOW);digitalWrite(ob13,LOW);digitalWrite(ob14,HIGH);//фиксация ШД1
    //delay(5000);

    //ii=0;for (ii=0; ii<N; ii++){//верх с холста
    //digitalWrite(ob21,HIGH);digitalWrite(ob22,LOW);digitalWrite(ob23,LOW);digitalWrite(ob24,LOW);delay(c);//верх с холста
    //digitalWrite(ob21,HIGH);digitalWrite(ob22,HIGH);digitalWrite(ob23,LOW);digitalWrite(ob24,LOW);delay(c);//верх с холста
    //digitalWrite(ob21,LOW);digitalWrite(ob22,HIGH);digitalWrite(ob23,LOW);digitalWrite(ob24,LOW);delay(c);//верх с холста
    //digitalWrite(ob21,LOW);digitalWrite(ob22,HIGH);digitalWrite(ob23,HIGH);digitalWrite(ob24,LOW);delay(c);//верх с холста
    //digitalWrite(ob21,LOW);digitalWrite(ob22,LOW);digitalWrite(ob23,HIGH);digitalWrite(ob24,LOW);delay(c);//верх с холста
    //digitalWrite(ob21,LOW);digitalWrite(ob22,LOW);digitalWrite(ob23,HIGH);digitalWrite(ob24,HIGH);delay(c);//верх с холста
    //digitalWrite(ob21,LOW);digitalWrite(ob22,LOW);digitalWrite(ob23,LOW);digitalWrite(ob24,HIGH);delay(c);//верх с холста
    //digitalWrite(ob21,HIGH);digitalWrite(ob22,LOW);digitalWrite(ob23,LOW);digitalWrite(ob24,HIGH);delay(c);//верх с холста
    //}

    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    void loop()
    {




      // обновляем парсер
      if(!Parser.isDone()) // пока есть команды - просим выполнить следующую.
      {
        // такой механизм позволяет избавиться от блокирующего исполнения, т.к. просить выполнить следующую команду можно
        // неблокирующе, по факту выполнения предыдущей. В простейшем случае - можно в событии ON_COMMAND делать блокирующую работу
        // (т.е. не выходить из функции, пока не будет выполнено требуемое действие), тогда всё выполнение пойдёт линейно.
        Parser.processNextCommand();
      }

    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     
     

    Вложения:

    • program.txt
      Размер файла:
      2,2 КБ
      Просмотров:
      397
  6. Artclonic

    Artclonic Гик

  7. DIYMan

    DIYMan Guest

    Так у вас и написан разнобой - сначала команда 1, потом команда 21, потом - опять 1. Это что - хрен, извиняюсь, собачий?
     
  8. DIYMan

    DIYMan Guest

    Короче - не выносите мне мозг, плз. Команды читаются РОВНО В ТОЙ ПОСЛЕДОВАТЕЛЬНОСТИ, в которой заданы в файле, СЛЕВА НАПРАВО СВЕРХУ ВНИЗ, всё.

    Если вы не в состоянии понять, как и что работает - пооставьте вывод номера команды, которая выполняется сейчас, в самое начало ON_COMMAND, дабы никого не смущать вашим суржиком "VPEREDYCHEIKA" и т.п.

    Разговор за что шёл? Вы утверждаете, что команды читаются вразнобой. Я утверждаю, что они читаются так, как написано в файле, другого быть не может.
     
  9. Artclonic

    Artclonic Гик

    В фале у меня
    нечетная строка 1,2,3 и т.д.до "20" между ними "21" в конце строки "23"
    четная строка "20", "19" и т.д.до 1 между ними "22" в конце строки "23"
    Текстовый файл так читается????
     
  10. Artclonic

    Artclonic Гик

    Или вот эта запись
    Код (C++):
    case 18:// Блок №18
        {
          Serial.println("BUNKER18");
          delay(1000);
        }
        break;
    Не должна реагировать на "18" в текстовом файле?
     
  11. DIYMan

    DIYMan Guest

    Ещё раз - файл читается ПОСЛЕДОВАТЕЛЬНО, СЛЕВА НАПРАВО СВЕРХУ ВНИЗ. Т.е. если написано
    То последовательно выполнятся команды 1, 2, 3, 4, 5, 6, 7, 8. Вам понятно определение "слева-направо сверху-вниз"? Что в этой формулировке ставит вас в тупик?
    Должна, если команда 18 в текстовом файле есть. Я вам демонстрировал вычитку вашего текстового файла - читает ВСЕ команды.
     
  12. Artclonic

    Artclonic Гик

    У меня так все и записано... только при команде 2 - bunker2 - в монитор порта не прописывается... Давайте я Вам компенсирую время Ваше...
     
  13. Artclonic

    Artclonic Гик

    Взгляните на сообщение в моем мониторе
     
  14. Artclonic

    Artclonic Гик

    Это я...
     
  15. DIYMan

    DIYMan Guest

    Итак, вот скетч, на котором я тестировал, я только закомментировал вызов моторов:
    Код (C++):
    #include "Parser.h"
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    // НАСТРОЙКИ
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    #define SD_CS_PIN 4 // пин Chip Select для SD-карты
    #define PROGRAM_FILENAME F("program.txt") // имя файла с микропрограммой
    #define COMMAND_DELIMITER '\t' // разделитель между командами
    #define SERIAL_SPEED 57600 // скорость работы Serial
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    // обработчик следующей команды из файла
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    void ON_COMMAND(int command)
    {
      // тут что-то делаем с командой, пока - просто выводим в Serial
      Serial << F("Command to execute: ") << command << ENDLINE;
    switch(command)
      {
        case 1: // Блок №1
        {
          Serial.println("BUNKER1");
          delay(1000);  
        }
        break;
        case 2:// Блок №2
        {
          Serial.println("BUNKER2");
          delay(1000);
        }
        break;
        case 3: // Блок №3
        {
         Serial.println("BUNKER3");
          delay(1000);
        }
        break;
        case 4: // // Блок №4
        {
         Serial.println("BUNKER4");
          delay(1000);
        }
        break;
        case 5:// Блок №5
        {
         Serial.println("BUNKER5");
          delay(1000);
        }
        break;
         case 6:// Блок №6
        {
          Serial.println("BUNKER6");
          delay(1000);
        }
        break;
       case 7:// Блок №7
        {
         Serial.println("BUNKER7");
          delay(1000);
        }
        break;
       case 8:// Блок №8
        {
         Serial.println("BUNKER8");
          delay(1000);
        }
        break;
       case 9:// Блок №9
        {
          Serial.println("BUNKER9");
          delay(1000);
        }
        break;
       case 10:// Блок №10
        {
        Serial.println("BUNKER10");
          delay(1000);
        }
        break;
    case 11: // Блок №11
        {
         Serial.println("BUNKER11");
          delay(1000);
        }
        break;
        case 12:// Блок №12
        {
          Serial.println("BUNKER12");
          delay(1000);
        }
        break;
        case 13: // Блок №13
        {
         Serial.println("BUNKER13");
          delay(1000);
        }
        break;
        case 14: // // Блок №14
        {
         Serial.println("BUNKER14");
          delay(1000);
        }
        break;
        case 15:// Блок №15
        {
         Serial.println("BUNKER15");
          delay(1000);
        }
        break;
         case 16:// Блок №16
        {
          Serial.println("BUNKER16");
          delay(1000);
        }
        break;
       case 17:// Блок №17
        {
          Serial.println("BUNKER17");
          delay(1000);
        }
        break;
       case 18:// Блок №18
        {
          Serial.println("BUNKER18");
          delay(1000);
        }
        break;
       case 19:// Блок №19
        {
          Serial.println("BUNKER19");
          delay(1000);
        }
        break;
       case 20:// Блок №20
        {
          Serial.println("BUNKER20");
          delay(1000);
        }
        break;
    case 21:// Блок ПЕРЕЕЗД ПО ЯЧЕЙКАМ ВПЕРЕД
        {
          //motor1.step(ZZZ, FORWARD, SINGLE);  motor1.release(); //ПЕРЕЕЗД НА 1ЯЧЕЙКУ
          Serial.println("VPEREDYCHEIKA");
          delay(1000);
        }
        break;
       case 22:// Блок ПЕРЕЕЗД ПО ЯЧЕЙКАМ НАЗАД
        {
          //motor1.step(ZZZ, BACKWARD, SINGLE);  motor1.release(); //ПЕРЕЕЗД НА 1 ЯЧЕЙКУ
          Serial.println("NAZADYCHEIKA");
          delay(1000);
        }
        break;
        case 23:// Блок ПЕРЕЕЗД ПО СТРОКАМ
        {
          //motor2.step(ZZZ, FORWARD, SINGLE);  motor1.release(); //ПЕРЕЕЗД НА 1 СТРОКУ
          Serial.println("STROKA");
          delay(1000);
        }
        break;


      } // switch

     
    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    void setup()
    {
      Serial.begin(SERIAL_SPEED);
      if(!SD.begin(SD_CS_PIN))
      {
        Serial << F("CAN'T INIT SD!") << ENDLINE;
        while(true);
      }

      Parser.setup(COMMAND_DELIMITER);

      if(!Parser.load(PROGRAM_FILENAME))
      {
        Serial << F("CAN'T LOAD PROGRAM!") << ENDLINE;
        while(true);
      }

    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    void loop()
    {
      // обновляем парсер
      if(!Parser.isDone()) // пока есть команды - просим выполнить следующую.
      {
        // такой механизм позволяет избавиться от блокирующего исполнения, т.к. просить выполнить следующую команду можно
        // неблокирующе, по факту выполнения предыдущей. В простейшем случае - можно в событии ON_COMMAND делать блокирующую работу
        // (т.е. не выходить из функции, пока не будет выполнено требуемое действие), тогда всё выполнение пойдёт линейно.
        Parser.processNextCommand();
      }

    }
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    В аттаче - файл, на котором тестировал.

    Вот часть выхлопа из монитора порта:
    Видно, что команды исполняются так, как прописаны в файле. Вопросы?
     

    Вложения:

    • program.txt
      Размер файла:
      2,2 КБ
      Просмотров:
      421
  16. Artclonic

    Artclonic Гик

    У меня не работает....
    BUNKER1
    VPEREDYCHEIKA
    BUNKER3
    BUNKER3
    VPEREDYCHEIKA
    VPEREDYCHEIKA
    BUNKER6
    VPEREDYCHEIKA
    BUNKER7
    VPEREDYCHEIKA
    VPEREDYCHEIKA
    BUNKER11
    VPEREDYCHEIKA
    BUNKER12
    VPEREDYCHEIKA
    BUNKER1
    В чем может быть причина?
     
  17. DIYMan

    DIYMan Guest

    Учитывайте также, что у вас - моторы, шаговики. И их состояние надо обновлять в loop, тут одними delay не обойдёшься. Т.е. либо вы обновляете состояние моторов сами внутри ON_COMMAND, либо пишете такой код, чтобы корректно работал с моторами, и когда надо - вызывается Parser.processNextCommand();

    Поймите простую вещь - вычитка команд последовательно - она работает, и не может не работать. Просто помимо этого существует много нюансов в зависимости от того, что надо конкретно сделать. Именно поэтому я и сделал отдельную функцию Parser.processNextCommand() - чтобы можно было её дёрнуть тогда, когда обработка следующей команды разрешена.

    Не обижайтесь, но вы пока не понимаете самых основ асинхронного подхода к решению не совсем тривиальных задач, и грешите на парсер команд, хотя он тут - совсем не при чём.
     
  18. DIYMan

    DIYMan Guest

    Вы пробовали именно тот код и тот файл, что я привёл? Файл - ваш, код - слегка модифицированный: я убрал обработку моторов, чтобы исключить пока не относящееся к сути выяснения вопроса - работает таки парсер или я вам тут дичь втираю.

    Версия Arduino IDE у вас какая? Я тестировал на 1.6.7
     
  19. DIYMan

    DIYMan Guest

    Написал в личку номер скайпа, стучитесь, будем разбираться.
     
  20. SergeiL

    SergeiL Оракул Модератор

    Смотрю, похоже, ТС не правильно понимает определения.
    массив.png
    Упрощаю, хотя все с 0 считается.
     
    Последнее редактирование: 31 янв 2018