Если фотоприемник не видит излучателя, значит между ними что то есть. Зачем тут ШИМ и прочие примудрости?
спасибо за ответ. возможно и так, у меня была такая приблуда, китайского изготовления. (излучающий диод и приемник, в 2х коробочках) постоянно были ложные срабатывания если попадало затенение на приемник (или наоборот не срабатывал если приемник на солнце был направлен). Вот и возникла мысля, чтоб приемник реагировал не на изменение уровня засветки, а на пропадание частоты. + это, что то, типа стимула, для полноценного изучения программирования Дуни. Стараюсь хотя бы к среднему уровню познания приблизиться)
Большое спасибо всем за помощь. прям завалили советами, аж неудобно. разобрался сам, начал учить работу с таймерами, жалко нет литературы для начинающих, где бы подробно было разжовано, что к чему и как работает.
А почему вы решили, что частота не будет пропадать от солнца? Солнце в сто раз мощнее вашего светодиода светит. Вычленить из этого информацию можно только аналоговой схемотехникой, стоящей как десять китайских приемников. Поставьте экран от внешних воздействий и не страдайте ерундой. Проще всего поместить приемник в трубку, направленную на излучатель.
вечер добрый. Спс за практический совет. Простое и разумное решение. почему работа с частотой, а не с интенсивностью засветки? - в качестве примера тот же пульт ИК и приемник ардуино, ему пофигу засветки и прочие помехи, вот и подумал что принцип то один и тот же. заодно выучу работу с генерацией и детектированием частоты на ардуино. Кст подобную тему нашел на этом форуме, очень помогло. Правила хорошего тона не позволяют мне вставить ссылку на штуку, но характеристики ИК барьера следующие: дальность приема:не менее 100 м инфракрасный частота: 1.92 КГЦ питание: 12 В DC длина волны: 940nm вход: RX 15mA-TX 30mA видно не мне одному пришла в голову такая идея) сомневаюсь что на простом не модулированном сигнале можно построить охрану периметра 100 метров. правда цена 30 убитых енотов. учу роботу с таймерами и родственными функциями, не совсем ясно предствляю принцип работы pulseln() она что меряет только 1 раз промежуток между HIGH и LOW и фсе??? или чего то недопонимаю. большое спасибо тому кто просветит по этой функции. кст выпустили arduino 1.8.2 на официальном сайте, буду посмотреть сегодня, исправили ли косяки
всем таки наше здравстуйте. имею вопрос очень специфический. Таки как вывести в монитор порта данные с датчиков в виде таблицы?. видел несколько раз что люди выводят данные столбцами. но или не хорошо искал, но нашел только классичиское Serial.print(); Serial.println();. буду благодарен если кто подкажет как выводить данные в монитор порта столбцами(колонками) и вообще команды табуляции в мониторе порта (если есть такие)
Таблицу рисует компьютер по данным из МК. Можете использовать что угодно, например Processing, он под это и заточен. Придется изучить его сперва, само собой.
Символ табуляции в строке кодируется \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);
Премного благодарен за помощь. "\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(""); } Я правильно понял дзен табуляции в мониторе порта? ( в смысле грамотно написано? ) В таком виде использую для отладки в своем коде, все работает
Доброй ночи всем. урывками как Ленин работаю по ночам над игрушкой под названием "рамочный хронограф". Основную часть рабочего кода почти заканчиваю. Решил заняться плюшками, в виде сохранения 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(""); } С уважением Вася
Код (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"); }
Нет завершения измерений. Нужно добавить проверку, что в массиве есть свободные ячейки и писать error только при попытке что то еще измерить. Код (C++): if(digitalRead(button) == HIGH) { if ( i < MRSIZE ) { Measure = analogRead(Measurement); MeasRes[ i ] = Measure;; i++; // увеличиваем индекс элемента на 1, что бы следующее измерение было записано в след элемент } else { Serial.print("error"); } }
Не понятно что у вас за кнопка. Если её нажимать пальцем, то сотня измерений проскочит менее чем за 0.1 сек. У измерений нет привязки ко времени. Крутить 100 чисел по моему не гуманно. Посмотрите варианты многострочных экранов. Для экономии энергии стоит обратиться к LCD.
большое спасибо за ответ. что бы проще обяснить ситуацию такой пример привел. Спойлер: Рамочный хронограф http://forum.amperka.ru/threads/рамочный-хронограф.9058/page-3 если бы начал расписывать, что и почему, получилось бы намного дольше, (чем привести аналогию с кнопками). сам код измерений и калибровки уже практически готов. Теперь занимаюсь настройкой, улучшайзингом ( капризная схема получилась((( очень помехи влияют и зависимость от стабильного напряжения) и выводом измерений. оказалась вывести показания на индикатор намного сложнее , чем написать код измерения скорости. полностью согласен. Но у меня заняты все аналоговые пины, + стояла цель сделать схему самую дешевую насколько возможно. Поеэтому и остановился на 7сегментном 3 разрядном, индикаторе + останется на "ардуино нано" 2 пина как раз для кнопок "вперед" "назад" Еще раз спасибо за помощь, как завершить измерения. сейчас осталось самое сложное, допилить вывод данных на индикатор. Планирую так; сначал 1 сек высвечивается номер измерения, потом 4 сек данные этой ячейки. Вообще не думал что проект выйдет таким сложным и кодоемким. Для новичка нелекая задача оказалась, но зато программирование учится намного интереснее, когда решаешь практическую задачу. С уважением Вася
Для этого есть микросхемы IR приемников с защитой от помех и автоматическим управлением чувствительностью. http://www.vishay.com/ir-receiver-modules/ От вас требуется сделать генератор сигнала. Но приёмники с хорошей защитой имеют задержку срабатывания длительностью минимального пакета импульсов. А после получения пакета ему нужно время поправить чувствительность. Ему ведь надо сообразить, что последовательность началась или закончилась. И, понятно, даже в самом простом случае непрерывной генерации сигнала вы не сможете фиксировать время точнее чем один период излучателя. А импульс длительностью в пол периода вообще может не фиксироваться.
Всем доброго вечера. Что бы не мусорить в основой теме, консультируюсь здесь. Уважаемые господа. подскажите, ниже представленный код идеологически верный? а то как у многих новичков возможно у меня неправильное понимание действия прерывания. Если коротко то суть в следующем. два датчики хронографа. при прохождении обьекта через них подается положительный сигнал на пины 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 пальцевой печати"
Почему просто не ждать срабатывания первого датчика, после чего ждать второго? Если в коде больше ничего не происходит. И прерывания не нужны и через PINB быстрее реакция.
Оно конечно очень заманчиво, может даже скорее всего попробую. но код не совсем пустой будет. Он мне так видится. Включается, тестируются датчики если все норм, зажигается и гаснет светодид. Если нет то начинает мигать с определенной частотой. тогда надо будет подстроить датчик. затем собственно измерение скорости пролета обьекта, сохранение 100 результатов измерений и вывод на дисплей. как то так. код не сильно емкий. надо попробовать, может получится. У меня печаль великая сдохла дуня на которой я эксперементировал. Не катастрофа но очень неприятно. Даже если закажу с экспресс доставкой это 2-3 недели простоя. Неполадка выглядит так. Комп перестал видеть ардуинку. при подключении через usb еле еле горят pwr и tx индикаторы. когда подаешь на прямую не ноги вин и гнд светится впол яркости от исходной при этом TX моргает как будто сам МК работает. Огромная просьба подскажите можно ли реанимировать ее? У меня весь эксперемент встанет из за нее(((. если по чьемунибудь совету получится ее воскресить (хоть ненадолго) обещаю забросить символические 20 рублей на телефон.