консультация по ардуино

Тема в разделе "Флудилка", создана пользователем CYITEP_BAC9I, 21 мар 2017.

  1. ostrov

    ostrov Гуру

    Если фотоприемник не видит излучателя, значит между ними что то есть. Зачем тут ШИМ и прочие примудрости?
     
  2. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо за ответ. возможно и так, у меня была такая приблуда, китайского изготовления. (излучающий диод и приемник, в 2х коробочках) постоянно были ложные срабатывания если попадало затенение на приемник (или наоборот не срабатывал если приемник на солнце был направлен). Вот и возникла мысля, чтоб приемник реагировал не на изменение уровня засветки, а на пропадание частоты. + это, что то, типа стимула, для полноценного изучения программирования Дуни. Стараюсь хотя бы к среднему уровню познания приблизиться)
     
  3. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Большое спасибо всем за помощь. прям завалили советами, аж неудобно. разобрался сам, начал учить работу с таймерами, жалко нет литературы для начинающих, где бы подробно было разжовано, что к чему и как работает.
     
  4. rkit

    rkit Гуру

    А почему вы решили, что частота не будет пропадать от солнца? Солнце в сто раз мощнее вашего светодиода светит. Вычленить из этого информацию можно только аналоговой схемотехникой, стоящей как десять китайских приемников.
    Поставьте экран от внешних воздействий и не страдайте ерундой. Проще всего поместить приемник в трубку, направленную на излучатель.
     
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    вечер добрый. Спс за практический совет. Простое и разумное решение. почему работа с частотой, а не с интенсивностью засветки? - в качестве примера тот же пульт ИК и приемник ардуино, ему пофигу засветки и прочие помехи, вот и подумал что принцип то один и тот же. заодно выучу работу с генерацией и детектированием частоты на ардуино. Кст подобную тему нашел на этом форуме, очень помогло.
    Правила хорошего тона не позволяют мне вставить ссылку на штуку, но характеристики ИК барьера следующие:
    дальность приема:не менее 100 м
    инфракрасный частота: 1.92 КГЦ
    питание: 12 В DC
    длина волны: 940nm
    вход: RX 15mA-TX 30mA
    видно не мне одному пришла в голову такая идея) сомневаюсь что на простом не модулированном сигнале можно построить охрану периметра 100 метров. правда цена 30 убитых енотов.
    учу роботу с таймерами и родственными функциями, не совсем ясно предствляю принцип работы pulseln() она что меряет только 1 раз промежуток между HIGH и LOW и фсе??? или чего то недопонимаю. большое спасибо тому кто просветит по этой функции.

    кст выпустили arduino 1.8.2 на официальном сайте, буду посмотреть сегодня, исправили ли косяки
     
    Последнее редактирование: 10 апр 2017
  6. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    всем таки наше здравстуйте. имею вопрос очень специфический. Таки как вывести в монитор порта данные с датчиков в виде таблицы?. видел несколько раз что люди выводят данные столбцами. но или не хорошо искал, но нашел только классичиское Serial.print(); Serial.println();. буду благодарен если кто подкажет как выводить данные в монитор порта столбцами(колонками) и вообще команды табуляции в мониторе порта (если есть такие)
     
  7. ostrov

    ostrov Гуру

    Таблицу рисует компьютер по данным из МК. Можете использовать что угодно, например Processing, он под это и заточен. Придется изучить его сперва, само собой.
     
    CYITEP_BAC9I нравится это.
  8. mcureenab

    mcureenab Гуру

    Символ табуляции в строке кодируется \t.
    "Колонка 1\tКолонка 2"

    если монитор порта на \t не реагирует, используйте полноценный эмулятор терминала - telnet и т.п.

    для форматированного вывода удобно использовать функцию sprintf

    http://www.atmel.com/webdoc/avrlibc...tdio_1ga6017094d9fd800fa02600d35399f2a2a.html

    детальное описание семейства функций prntf тут

    http://www.atmel.com/webdoc/avrlibc...tdio_1gaa3b98c0d17b35642c0f3e4649092b9f1.html

    Код (C++):
    fload a,b;
    char buf[256];
    sprintf(buf, "%d\t%d", a, b);
    Serial.println(buf);
     
    CYITEP_BAC9I нравится это.
  9. rkit

    rkit Гуру

    символ табуляции - "\t"
    Знает ли его монитор порта, я не уверен
     
    CYITEP_BAC9I нравится это.
  10. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Премного благодарен за помощь. "\t" работает. То что мне надо! получилось выводить в столбцы данные датчиков для отладки игрушки.
    спасибо за наводку даже не предполагал), что так можно.
    ниже мой учебный код.
    Код (C++):
     int IN_1 ;
    int IN_2 ;
    int IN_3 ;
    int IN_4 ;

    void setup() {


    Serial.begin(9600);
    Serial.print("IN_1");
    Serial.print("\t");
      Serial.print("IN_2");
    Serial.print("\t");
      Serial.print("IN_3");
    Serial.print("\t");
      Serial.print("IN_4");
    Serial.print("\t");
    Serial.println("");

    }

    void loop() {
    int IN_1 = 453;
    int IN_2 = 455;
    int IN_3 = 454;
    int IN_4  = 454;
    Serial.print(IN_1);
    Serial.print("\t");
      Serial.print(IN_2);
    Serial.print("\t");
      Serial.print(IN_3);
    Serial.print("\t");
      Serial.print(IN_4);
    Serial.print("\t");
    Serial.println("");

    }
    Я правильно понял дзен табуляции в мониторе порта? ( в смысле грамотно написано?:) ) В таком виде использую для отладки в своем коде, все работает
     
  11. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Доброй ночи всем. урывками как Ленин работаю по ночам
    над игрушкой под названием "рамочный хронограф". Основную часть рабочего кода почти заканчиваю. Решил заняться плюшками, в виде сохранения 100 измерений хронографа. для удобства дальнейшей обработки данных и настройки всяких игрушек. ниже прикрепил код, в котором накидал алгоритм сохранения результатов в массив из 100 элементов. планирую выводить эти данные на 7сегментный индикатор с помощью нажатия кнопок, на один элемент вперед или назад. (индикатор тот еще геморой( , так как хочу чтобы он гас, после 3 секундной демонстрации данных, чтоб не тратил драгоценную энергию). записывать в независимую память это в данном случае лишнее, так как пострелял, переписал данные, выключил включил, и начал новую серию. Просьба гляньте пожалуйста правильный ли ход мыслей? если да, то этот алгоритм сохранения измерений вставлю в основной код. (в коде описана ситуация приближенная к требуемой. Случилось событие, записали данные с какого либо датчика, прибавили 1 индексу элемента массива. еще одно событие, снова запись данных с датчика. И.Т. далее пока не забьются все 100 ячеек. как только заняты все 100 ячеек, пишем ошибку на индикаторе и останавливаем измерения.
    Код (C++):
    #define button 2
    #define Measurement A2
    int Measure;
    int MeasRes[99]; //массив из 100 элементов для хранения результатов измерений
    int i = 0;
    void setup() {
      Serial.begin(9600);
       for ( int i = 0; i <= 99; ++i )  //забиваем все элементы 0(по крайней мере так понял из того что на форумах нашел)
      { Serial.println(i);
          MeasRes[ i ] = 000; //
         Serial.println(MeasRes[i]);

    }
    }

    void loop() {//чисто абстрактная ситуация. Нажали кнопку измерили что то на 2 пине и записали в элемент массива 0

      if(digitalRead(button) == HIGH)
      {
        Measure = analogRead(Measurement);
        MeasRes[ i ] = Measure;;
        i++;  // увеличиваем индекс элемента на 1, что бы следующее измерение было записано в след элемент
      }
    if(i == 99)
    {
    Serial.print("error");
    }
    Serial.print("i"); //
    Serial.print(i);
    Serial.print("\t");
      Serial.print(MeasRes[ i ]);
    Serial.println("");
    }
    С уважением Вася
     
  12. mcureenab

    mcureenab Гуру

    Код (C++):
    int MeasRes[99]; //массив из 100 элементов
    это массив из 99 элементов

    Используйте #define или константу для хранения размера. Сейчас вам придется код перелопатить чтобы поменять размер.

    Код (C++):
    #define MRSIZE 100
      int MeasRes[MRSIZE];

       for(int i =0; i <MRSIZE;++i )//забиваем все элементы 0(по крайней мере так понял из того что на форумах нашел)
    { Serial.println(i);
          MeasRes[ i ]=000;//
         Serial.println(MeasRes[i]);

    }

    if(i == MRSIZE) // За последним элементом
    {
    Serial.print("error");
    }

     
     
    CYITEP_BAC9I нравится это.
  13. mcureenab

    mcureenab Гуру

    Нет завершения измерений. Нужно добавить проверку, что в массиве есть свободные ячейки и писать error только при попытке что то еще измерить.

    Код (C++):

      if(digitalRead(button) == HIGH)
      {
        if ( i < MRSIZE ) {
          Measure = analogRead(Measurement);
          MeasRes[ i ] = Measure;;
          i++;  // увеличиваем индекс элемента на 1, что бы следующее измерение было записано в след элемент
        } else {
            Serial.print("error");
        }
      }
     
     
    CYITEP_BAC9I нравится это.
  14. mcureenab

    mcureenab Гуру

    Не понятно что у вас за кнопка. Если её нажимать пальцем, то сотня измерений проскочит менее чем за 0.1 сек.
    У измерений нет привязки ко времени.

    Крутить 100 чисел по моему не гуманно. Посмотрите варианты многострочных экранов.
    Для экономии энергии стоит обратиться к LCD.
     
    CYITEP_BAC9I нравится это.
  15. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    большое спасибо за ответ. что бы проще обяснить ситуацию такой пример привел.
    если бы начал расписывать, что и почему, получилось бы намного дольше, (чем привести аналогию с кнопками). сам код измерений и калибровки уже практически готов. Теперь занимаюсь настройкой, улучшайзингом ( капризная схема получилась((( очень помехи влияют и зависимость от стабильного напряжения) и выводом измерений. оказалась вывести показания на индикатор намного сложнее , чем написать код измерения скорости.
    полностью согласен. Но у меня заняты все аналоговые пины, + стояла цель сделать схему самую дешевую насколько возможно. Поеэтому и остановился на 7сегментном 3 разрядном, индикаторе + останется на "ардуино нано" 2 пина как раз для кнопок "вперед" "назад"
    Еще раз спасибо за помощь, как завершить измерения.
    сейчас осталось самое сложное, допилить вывод данных на индикатор. Планирую так; сначал 1 сек высвечивается номер измерения, потом 4 сек данные этой ячейки.

    Вообще не думал что проект выйдет таким сложным и кодоемким. Для новичка нелекая задача оказалась, но зато программирование учится намного интереснее, когда решаешь практическую задачу. С уважением Вася
     
  16. mcureenab

    mcureenab Гуру

    Для этого есть микросхемы IR приемников с защитой от помех и автоматическим управлением чувствительностью.

    http://www.vishay.com/ir-receiver-modules/


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

    Ему ведь надо сообразить, что последовательность началась или закончилась. И, понятно, даже в самом простом случае непрерывной генерации сигнала вы не сможете фиксировать время точнее чем один период излучателя. А импульс длительностью в пол периода вообще может не фиксироваться.
     
    CYITEP_BAC9I нравится это.
  17. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Всем доброго вечера. Что бы не мусорить в основой теме, консультируюсь здесь.
    Уважаемые господа. подскажите, ниже представленный код идеологически верный? а то как у многих новичков возможно у меня неправильное понимание действия прерывания. Если коротко то суть в следующем. два датчики хронографа. при прохождении обьекта через них подается положительный сигнал на пины 2 3. и необходимо замерять время срабатывания датчиков в микросекундах и соответственно их разность что бы вычислить скорость пролета объекта.
    Код (C++):
    uint32_t InPort_mcs ;  //время срабатывания датчиков входного порта
    uint32_t OutPort_mcs; // время срабатывания датчиков выходного порта в микросекундах
    bool InPort_stat = false;  // флаг срабатывания входа
    bool OutPort_stat = false; // флаг срабатывания выхода
    int Speed ; // скорость
    void InPort_meter(); // функция измерения входного датчика. фигня но без объвления функции в этом месте отказывается работать компилятор
    void OutPort_meter(); // обработка выходных датчиков

    void setup() {
    attachInterrupt (0, InPort_meter, RISING);
    attachInterrupt (1, OutPort_meter, RISING);                                                                                                      
    }
    void loop() {
    if (InPort_stat == true && OutPort_stat == true && OutPort_mcs - InPort_mcs > 500)
    // если появлись флажки срабатывания обоих портов и они укладываются в нужные рамки, знаяит это не помехи и измеряем данные с датчиков
    {
    Speed = (220 /(OutPort_mcs - InPort_mcs)) /1000; // вычисление скорости
    InPort_stat = false; // обнуление флажков
    OutPort_stat = false; //
    }
    }
    void InPort_meter() // описание функций
    {
    InPort_mcs = micros();
      InPort_stat = true;
    }
    void OutPort_meter()
    {
    OutPort_mcs = micros();
      OutPort_stat = true;
    }

     
    следующий этапом буду мучать вывод данных на индикатор и сохраниние в память.)))
    (прошу прощения за ошипки, они не от неграмотности а результат скоростной "10 пальцевой печати" :)
     
  18. ostrov

    ostrov Гуру

    Почему просто не ждать срабатывания первого датчика, после чего ждать второго? Если в коде больше ничего не происходит. И прерывания не нужны и через PINB быстрее реакция.
     
    CYITEP_BAC9I нравится это.
  19. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Оно конечно очень заманчиво, может даже скорее всего попробую. но код не совсем пустой будет. Он мне так видится. Включается, тестируются датчики если все норм, зажигается и гаснет светодид. Если нет то начинает мигать с определенной частотой. тогда надо будет подстроить датчик. затем собственно измерение скорости пролета обьекта, сохранение 100 результатов измерений и вывод на дисплей. как то так. код не сильно емкий. надо попробовать, может получится. У меня печаль великая сдохла дуня на которой я эксперементировал. Не катастрофа но очень неприятно. Даже если закажу с экспресс доставкой это 2-3 недели простоя. Неполадка выглядит так. Комп перестал видеть ардуинку. при подключении через usb еле еле горят pwr и tx индикаторы. когда подаешь на прямую не ноги вин и гнд светится впол яркости от исходной при этом TX моргает как будто сам МК работает. Огромная просьба подскажите можно ли реанимировать ее? У меня весь эксперемент встанет из за нее(((. если по чьемунибудь совету получится ее воскресить (хоть ненадолго) обещаю забросить символические 20 рублей на телефон.
     
  20. mcureenab

    mcureenab Гуру

    Питание как подключено? От USB или с колодки или с Vin?

    Проверьте стабилизатор напряжения.