Помогите новичку. очень простой проект, мучаюсь 3 дня.
- Войдите на сайт для отправки комментариев
Ср, 29/11/2017 - 01:08
Помогите со скетчем новичку. Для учебы надо сделать скетч под симуляцию примитивного конвеера со счетчиком. Уже 3 дня мучаюсь, на одном месте.
Есть конвеер, едет, пока счетчик не насчитает определенное количество допустим кубиков, 5 или 10 (2 режима счетчика) затем мотор отключается, конвеер перекрывается шторкой и с него снимаются отсчитанные ранее предметы. Порты ввода вывода сконфигурировал а вот с циклами беда. Куда какой пихать, с областями видимости переменных тоже беда. Может кто поможет идеей. Сделать через FOR, Switch, While или как то иначе.
Всем не равнодушним заранее благодарность.
/*Digital Inupt's*/ #define SW_Start 2 #define SW_Stop 3 #define SW_5 4 #define SW_10 5 #define Counter 6 /*Digital Outputs*/ #define Motor 7 #define Lock 8 #define Pull 9 void setup() { pinMode(SW_Start, INPUT); pinMode(SW_Stop, INPUT); pinMode(SW_5, INPUT); pinMode(SW_10, INPUT); pinMode(Counter, INPUT); pinMode(Motor, OUTPUT); pinMode(Lock, OUTPUT); pinMode(Pull, OUTPUT); Serial.begin(9600); } /*VARIABLES*/ bool start_flag, stop_flag, work_flag, count_5, count_10=0; byte count=0; void loop() { }
Такой охеренный объем проделаной работы никого не оставит равнодушным ))))))))
Вали отсюдова учится!
вот набросал пару строк. просто чтоб направить в нужное русло , писал максимально понятно для новичка.
код далек от идеала
много лишнего (кнопок) много портов занято
от delay() нужно избавиться
можно убрать кнопку sw5 сделать чтоб по умолчанию было 5 кубиков а при нажатии кнопки переключить на 10 при повторном нажатии опять 5
кнопку старт стоп можно тоже одну сделать
Спасибо за толчок в верном направлении. подправил код под ARDUINO нюансы и работает.
Еще есть вопросик как избавится от delay(); ибо пишут все что очень не хорошая штука для работы программы? Нашел примеры как это сделать, но что то не получается по человечески, как обычно с первого раза.
прикреплю файл протеуса, чтобы нагляднее.
Такой охеренный объем проделаной работы никого не оставит равнодушным ))))))))
Вали отсюдова учится!
Ты что такой злой сегодня )))
Такой охеренный объем проделаной работы никого не оставит равнодушным ))))))))
Вали отсюдова учится!
век живи, век учись.
Про избавление от делай, прежде, чем спрашивать как избавиться от делей, ответьте на вопрос "зачем". Если ты не понимаешь, зачем, то тебе это не нужно. А когда будешь понимать зачем, то заодно и будешь знать как.
отвечаю. Согласно ТЗ опрос кнопок должен быть доступен с любого участка программы и в любой момент. А при использовании delay(); это не возможно, так как выполнение программы останавливается на время задержки.
отвечаю. Согласно ТЗ опрос кнопок должен быть доступен с любого участка программы и в любой момент. А при использовании delay(); это не возможно, так как выполнение программы останавливается на время задержки.
Строго говоря, есть один способ сделать так, чтобы и овцы целы, и волки сыты, а именно: заюзать функцию позднего связывания yield. Цитирую исходник функции delay:
В строке 6 видно, что вызывается yield(). Которая - нигде не определена, т.к. в её объявлении указано, что она является функцией позднего связывания:
Т.е. можно использовать этот предоставленный авторами Wiring механизм, чтобы выполнять периодические операции, когда вызывающая сторона этого пожелала (а этого очень желает та же функция delay):
По факту - получим и присутствие delay, и опрос кнопок. Сам юзаю yield, но для других задач, хотя и схожих по факту: когда во время работы ресурсоёмкого по части времени алгоритма надо обновлять чего-то там, типа энкодеров и т.п.
DIYMan, только надо отметить, что задачи, вызываемые в коде yield(), должны выполнятся относительно быстро и не должны сами использовать delay(), иначе ардуину легко наглухо завесить. Именно поэтому эта возможность и не попала в буквари для чайников...
Кстати, у ТС опрос кнопок довольно объемный и с делеями... - yield() ему не подойдет.
Если пользоваться этим принципом - безопаснее написать свою собственную функцию задержки my_delay(). в которой проверять кнопки, энкодеры или еще что - и использовать эту функцию вместо штатного delay()
Но вообще это все - "костыли". Что касается кода ТС - "Тут всю систему менять надо" (с)
DIYMan, только надо отметить, что задачи, вызываемые в коде yield(), должны выполнятся относительно быстро и не должны сами использовать delay()
Но вообще это все - "костыли". Что касается кода ТС - "Тут всю систему менять надо" (с)
В точку ;)
Но вообще это все - "костыли". Что касается кода ТС - "Тут всю систему менять надо" (с)
ага. добрый saftik "помог" :)
Если у Вас есть другие предложения то излогайте. Такое количество if-ов всем не по душе. Хотя и так будет работать. Думал через SWITCH сделать или как то иначе можно по роскинуть мыслями.
А еще лучше через классы , и тогда с видимостью проблем не будет.
Пока в Вилларибе считают урожай на пальцах рук и ..ног , периодически занимая еще пальцы у соседей, а Виллабаджо начали использовать математику и давно посчитали урожай, а теперь гуляют.
ПС: Такие задачи программируют примитивно, по методичке, быстро и легко.
Я не заявлял себя программистом. Ардуино это хобби. Я сам прошёл по пути когда задаеш вопросы а тебе вместо подсказок указывают куда идти. Я же осознают что ТС не проделал никакой работы но я попытался ему хотябы как то намекнуть на логику кода. Постарался объяснить на доступном языке.
Более того скажу . мы тут не делаем эталонные приборы. Не собираемся запускать линию производства. Человеку надо для учёбы.
И думаю пусть код будет на костылях но если он будет работать и стабильно. То не обязательно извращаться. . все остальное придёт с опытом.
А вы Logic как опытный программист могли бы и подсказать хотябы логику кода.
Я понимаю книжки теория. Но например мне трудно понять написанное иногда проще когда тебе обьяснят на пальцах.
Думаю и форум нужен для того чтоб советоваться а не посылать друг друга.
Простите за прямолинейность
Простите за аналогию. Вы за рулем машины. Ведь машина ваша, и руль ваш. И кому нах*ер нужно указывать, как на ней ехать. Что по правой стороне, что по левой, что на зеленый, что на красный. Но ведь придумали ПДД, службу ГАИ (или что там у вас). Штрафы берут с шоферов любителей. Блин и никакой свободы, и за рулем сидят совсем не профессионалы. Вот так и с программированием.
Простите за прямолинейность.
Я не вам писал )) h
Моё сообщение адресовано logik
Но конструктивная критика принимается
Вот это интересный вопрос из области человековедения :) Все люди делятся на тех, кто получает информацию из книг, документации, даташитов - и на тех, кому обязательно нужно у кого-то спросить. К примеру, "saftik" проще, когда ему обьясняют на пальцах. А я вот "на пальцах" не воспринимаю вообще. Категорически. Иногда другие даже обижаются - типа, если тебе что-то непонятно - спроси! , а мне все равно проще книжку почитать, даже когда рядом есть кто-то опытный. Я не представляю, как, к примеру,на пальцах обьяснить квантовую теорию или стиль программирования... да и зачем это обьяснять, коги есть учебники?
Тут есть и оборотная сторона. Поскольку я не люблю, когда мне обьясняют на пальцах, то и когда меня просят что-то обьяснить, показать - мне это трудно... я не понимаю, нафига что-то спрашивать, когда есть книги? - начинаю подозревать. что спрашивающий идиот :)... люди это чувствуют и обижаются :(
ни разу ни у кого не спросив или подсказки, все прям по книгам. У каждого свой стиль программирования, согласен, ибо "Я художник, я так вижу". Не надо ни над кем превозносится, все люди одинаковы, просто кто то начал раньше изучать кто то позже. Учится никогда не поздно и не стыдно а методы обучения у каждого свои. Все когда то задавали вопросы. Разные. Порой даже абсурдные. Но с побед и поражений вся наша жизнь состоит, если речь о человековедениии прочей философской мути. Народ. я только за если кто то предложит по другому организовать задачу, но беседы на вольные темы перенесите в другой топ.
А я вот "на пальцах" не воспринимаю вообще. Категорически...
Я не представляю, как, к примеру,на пальцах обьяснить квантовую теорию или стиль программирования... да и зачем это обьяснять, коги есть учебники?
А я вот помню, мой сын решал численными методами систему дифференциальных уравнений в частных производных второго порядка. В 8-м классе. Не имея ни малейшего представления, что такое численные методы, что такое дифференциальное уравнение, и, тем более - его порядок, и что такое частная производная.
Просто перед этим я с ним "на пальцах" разобрал физику явления.
Сейчас он к.ф.-м.н. Так что "на пальцах" совсем не помешало ему развивиаться.
Другое дело, что "на пальцах" IMHO имеет смысл разбирать лишь задачи, существенно превосходящие текущий уровень, но никак не примеры на уровне школьной программы, а то и вообще младших классов.
за рулем сидят совсем не профессионалы
За рулём сидят роботы, управляемые Ардуино :)
беседы на вольные темы перенесите в другой топ
Вроде на форуме давно, но так и не понял, что вольное общение тут в почти каждой теме.
[ Так что "на пальцах" совсем не помешало ему развивиаться.
Я ни на кого не наезжаю. Это всего лишь пятничный разговор "за жизнь". Я обозначил два пути. И не превозношу один над другим. Просто один мне лично понятней и ближе... вот и все. Но это мои личные проблемы.
беседы на вольные темы перенесите в другой топ
Вроде на форуме давно, но так и не понял, что вольное общение тут в почти каждой теме.
я не говорил что нарушаются правила ведения темы. просто попросил не срать тут а только если реально кто то чем то помочь может.
Спасибо всем кто помог, словом и делом.
Эта задача примитивная. Вот вам буквально на пальцах ее написание. У ТС 4 кнопки и 1 конвейеp. И что бы они работали нормально надо разместить их части в объявлении , в setup-е и в loop-е. В общем начинается с этого.
Про кнопки я неоднократно говорил на этом форуме. От кнопок человеку ничего не надо. Ни состояние ни дребезг ни прочая мура. С помощью кнопок человек управляет Ардуиной. Нажали на кнопку и выполнелась обределеная функция один раз и все.
Разумеется ТС хочет управлять с помощью кнопок конвейером. Так что создадим методы класса ковейер и подключим к кнопкам. И да объявим конвейер перед кнопками, что бы не задействовать механизм предварельного объявления.
У транспортера Мотор шторка и толкатель. Подключим их к пинам
Круто, спасибо) Не совсем понятно правда что написать в этих функциях:
qwone
Александр Ф Скляр сказал бы - "Так надо!" (с)
За такие "на пальцах" нестыдно и денег брать, с новичков особенно!)
Теперь решим что надо учетчику. Разумеется пин который считает предметы. Опять же сюда надо перевести режим подсчета на 5 и 10 предметов и наконец обработчик который командует транспортеру остановиться.
Пользуясь этим #6 :) Расписываем класс кнопки , а так же подключаем Serial
ОК. В прямолинейности нет ничего плохого. Плохое в другом, в желании перекинуть свою работу на плечи других. И не стоит удивлятся что окружающие этому сопротивляются. И дело не в том кто здесь больше программист. До програмирования необходимо определится с задачей, продумать её. А это посильно любому с достаточным IQ. Я не сомниваюсь, что Вы вполне смогли бы сами расписать необходимую последовательность действий максимально детально удобным себе способом. Т.е. составить алгоритм. С задачами такого рода как у Вас человек справляется очень хороше. Интуиция и жизненый опыт помогают. Надо только записать свои действия будь Вы на месте ардуино. Как бы вы определяли что "пока счетчик не насчитает определенное количество допустим кубиков"? Наверно запоминали бы сколько кубиков было и при появлении нового увеличивали это число на 1, затем сравнивали бы с заданым. А как определяли бы появление нового кубика? И т.д. Но все эти действия - работа. Вполне посильная Вам, не требующая специальных знаний и умений, но не выполненая Вами. Вы не стали напрягатся, предпочли опубликовать пустой код. Пусть работают другие и нашару. Но на форуме помогают тем кто сам делает, а для желающих чтоб за них делали другие есть спецраздел. Вам наверно туда обратится разумней, и чесней.
///"Ардуино это хобби" Хобби - любимое занятие для получения удовольствия не приносящее дохода. Вы уверены что ардуино ваше любимое занятие? Как жеж вы им занимаетесь не умея писать программы. Может всеже будете прямыми до конца - возникла необходимость в решении задачи, но тратить время и деньги влом, пусть форум поработает ;)
Теперь напишем полностью содержимое класса учетчика
ПС: Не надо думать что я воспылал благотворитьльностью к ТС. Это просто банальная "методичка" как писать простые программы под Ардуино по "простым задачам". И при этом я не вырываю волосы с головы или других частей. И самое главное не бегу за помошью на форум, что бы мне помогли со скетчем. Все делается по шагам , а которое я разложил до "пальцевого объяснения". И которое некоторые не любят, так как это объянение расжевано до примитивизма.
С этим немного разобрался. Но вот содержимое функции Swap сделал через delay();
, так как что то не пошло у меня через millis.
Может что то не так делаю, но ни разу у меня не заработала задержка без delay();
С этим немного разобрался. Но вот содержимое функции Swap сделал через delay();
, так как что то не пошло у меня через millis.
Может что то не так делаю, но ни разу у меня не заработала задержка без delay();
Здесь у Вас в коде 5 задержек разной длительности.
Реализацию единственной задержки через millis() Вы можете сделать?
А теперь заводите переменную состояния, которая последовательно будет принимать значения от 0 до максимуму (например, до 4). Одновременно заводите массив констант на 5 значений. И текущее значение задержки (так, как Вы это делаете в случае единственой задержки) берете из массива с нужным индексом.
Ну вот вы и не заметили важную фишку. У вашего конвейера есть неслолько состояний, которые и задаются плохим но таким привычным delay.
Ну и заключительное . Понятно у меня конвейера нет , так что проверить не смогу. Да и к тем более там надо дотачивать под "окончательные хотелки" заказчика. А заказчики они такие... . Здесь я привел методику как без особого труда делать простые промышленные решения на Ардуине.
ПС: Простите за окончательное причесывание кода.
Вполне посильная Вам, не требующая специальных знаний и умений, но не выполненая Вами. Вы не стали напрягатся, предпочли опубликовать пустой код. Пусть работают другие и нашару. Но на форуме помогают тем кто сам делает, а для желающих чтоб за них делали другие есть спецраздел. Вам наверно туда обратится разумней, и чесней.
///"Ардуино это хобби" Хобби - любимое занятие для получения удовольствия не приносящее дохода. Вы уверены что ардуино ваше любимое занятие? Как жеж вы им занимаетесь не умея писать программы. Может всеже будете прямыми до конца - возникла необходимость в решении задачи, но тратить время и деньги влом, пусть форум поработает ;)
мне кажеться вы что то путаете. код нужен не мне а ТС.
такой код я могу и сам написать. конечно не такой хороший как у qwone , но если надо будет напишу.
если мне нужен будет код и я не смогу его сам регить тогда естественно заплачу. но повторюсь в нашем случае код нужен не мне
Да, извините, это разумеется к ТС относится. Вы честно попробовали помоч, хоть и не очень удачно. Проблема - delay.
Вобще обходить его не сложно, например так для функции knopki
Код не проверял, свежеписаный. Подход вобщем универсален, а в случае именно кнопок разумно их просто опрашивать не часто, тогда и дребезга не будет и проц не загрузится лишним.
Проще просто некуда.
Тоже не проверял, но думаю мелкие огрехи Вы и сами почистите если чё.
За рулём сидят роботы, управляемые Ардуино :)
А гаишники, видимо, stm управляются? Так вот откуда эти вечные срачи! А я то думал ...
Спасибо огромное, кажется меньшая половина материала понята и усвоена. Классы и объекты еще учить и учить. Ну и еще на прямую портами управлять, чтобы как бы быстрее и правильнее было. Мой вариант, как бы пока что без ООП. Но все в будущем. Учится, учится и потом еще перед сном форум покурить.
Ну без ООП не обойтись . В даном случае ООП = объектно-ориентированое проектирование. Когда надо прорабатывать ТЗ до мельчальших нюансов. Но так как все не учтешь, вот и выработал такой подход как собирать новые скетчи из проверенных старых,которые нормально идут без конфликта.
Хм, не пойму, почему если я заменяю ардуиновские "8,9,10" на прямые обращения к регистру DDRx, выхода на мотор, шторку и разргузку работают а входные сигналы нет?(
И если не тяжело, подскажите как через PINx читать состояние кнопок и датчик в моем случае? Препод закапризничал чтобы на прямую к регистрам портов были обращения.
Так вы основ не знаете. Дело в том что пины придуманы для новичков Ардуинщиков, которые банально нихрена не знают ни об языке Си ни о процессорах. Для управления пином надо знать адреса трех!!! регистров . А что такое адрес это указатель . а пин это число. Это очень разные вещи . Вы же не будете мерять напряжение в литрах. А мощнось установки рулеткой. Так и там . #175
Для управления пином надо знать адреса трех!!! регистров .
DDRx = Регистр направления передачи данных
PORTx = Регистр вывода данных
PINx = Регистр ввода данных
это понятно, тут как бы не надо быть гуру и много знать.
Вопро почему оно не фурычит, точнее не везде в скетче.
это понятно, тут как бы не надо быть гуру и много знать.
Вопро почему оно не фурычит, точнее не везде в скетче.
Вам был дан вполне себе правильный ответ:
так вы основ не знаете.
Вы сейчас хитрым образом, скопипастив код qwone, дописав туда неизвестно что, хотите, чтобы вам поправили его до рабочей версии? Не совсем тонко, что называется. Идите в гугль, набирайте в строке поиска "Работа с портами AVR" и сделайте над собой усилие, изучив хотя бы парочку (заметьте, я не говорю о даташитах - а просто о вводных статьях).
Только там можно чему-то научиться. Поэтому препод не капризничает, а прав на 100500% - вам, долбанам, так и надо знания в головы вкладывать.
DDRx = Регистр направления передачи данных
PORTx = Регистр вывода данных
PINx = Регистр ввода данных
это понятно, тут как бы не надо быть гуру и много знать.
Вопро почему оно не фурычит, точнее не везде в скетче.
Потому что надо создать структуру. А потом организовать элемент -аналог пина. И уже с этим аналогом пользоваться. Вы не жрете сырую картошку. Вы ее печете, варите жарите. Можно и так но желудок у человека не приспоблен. Так и здесь новички банально не умеют работать напрямую с регистрами, но и "готовить" их тоже не умеют. Где прошло , а где "пронесло". А там где прошло- "пронесет" но попозже.