Скетч для управления телескопом
Здравствуйте.
Для имеющегося телескопа хочу собрать систему управления по двум осям монтировки. Для этого приобрел Ардуино-УНО R3, два драйвера на a3967, джойстик и пару шаговых моторов.
Хочу сделать следующее — при помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения. При этом, на каждую ось монтировки будет установлено по одному мотору, вращающемуся в обе стороны. Нажатие на кнопку джойстика — режим «стоп» для обоих моторов. Нажатие еще на одну дополнительную кнопку включает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Проблема в том, что я никогда не занимался программированием. Очень нужна Ваша помощь в написании скетча для моего проекта.
Ниже, примерная схема подключения узлов.
Скетч для ардуино
Помогите соединить два скетча в один: 1) #define pirPin 9 // Объявляем переменную для датчика.
Скетч для ардуино: разделить на младший и старший бит
Здравствуйте, помогите со скетчем, нужно разделить на младший и старший бит int microsec = 0;.
Скетч
#include #include
#include «DHT.h» #define DHTPIN 4 #define.
Скетч
Привет всем, не знаю стоит сюда написать, может поможете. Мне бы хотелось разобраться в скетче. Это.
Сюда грузите следующим постом, нет ни малейшего желания ходить по ссылке.
Что именно за джойстик? Если USB, забудьте, ардунья — не хост, а подчиненное устройство. Для работы с таким джойстиком требуется совместимый хост-контроллер.
Укажите модели всех плат и железа.
1- работа с ADC есть в стандартных скетчах в комплекте со средой Arduino IDE.
2- работа с PWM есть в стандартных скетчах в комплекте со средой Arduino IDE.
3- в закрепленной теме данной ветки видеоуроки, литература и примеры на русском.
Arduino UNO R3 ATmega328P ch340
драйвер: EasyDriver Shield stepping Stepper Motor Driver V44 A3967 For Arduino
джойстик: 5Pin JoyStick Breakout Module Shield PS2 Joystick Game Controller AL
Могу скинуть ссылки на еБей, где их заказывал.
Пробовал уже кучу разных скетчей, особенно понравились примеры с сайта http://www.schmalzhaus.com/Eas. mples.html . В 5-ом примере, там, говорится как раз про управление телескопом, но мне надо джойстик вместо кнопок, и не нужен переменный резистор. Кроме этого, с этого же джойстика надо управлять вторым двигателем.
. плату с джойстиком снимаете с платы контроллера и подключаете питание и аналоговые линии X-Y-Z непосредственно на аналоговые входы Ардуино. Скетчи работы с ADC есть в комплекте, повторяю еще раз.
Пример чтения оси X допустим:
Снова здравствуйте. На этот раз я не с пустыми руками.
Нашел интересную статью http://pacpac.ru/for. php?f=23&t=233 — управление панорамной головкой.
Практически все подходит под мои требования.
Вот, чуть изменил скетч — теперь скорость регулируется от угла наклона джойстика. Переменный резистор мне нужен.
Залил для тестирования, выложенный мной выше скетч — управление джойстиком не включается, пока не сработают концевики установленные на 6 и 7 контактах (схема управления Панорамной головкой). Затем моторы, скорость и направление вращения, управляются джойстиком как положено.
Но, в процессе тестирования, было замечено, что двигатели незаметно (медленно) вращаются — 1-ый против часовой стрелки (за 1,5 минуты — четверть оборота), 2-ой по часовой (четверть оборота — за 5минут).
Что может быть? Что то в скетче, или из-за джойстика (утечки)?
Теперь, что осталось доработать. В скетче осталось введены концевые выключатели на контактах 6 и 7 Ардуино. Мне они не нужны — как их убрать из скетча (а то, пока они не сработают, не включается управление джойстиком)?
Кроме этого, как в такой скетч внести старт/стоп одного двигателя, с помощью дополнительной кнопки, в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
Источник статьи: http://www.cyberforum.ru/arduino/thread1429759.html
Как написать скетч для ардуино для телескопа
Вот и закончился базовый курс уроков программирования Arduino. Мы с вами изучили самые базовые понятия, вспомнили (или изучили) часть школьной программы по информатике, изучили большую часть синтаксиса и инструментов языка C++, и вроде бы весь набор Ардуино-функций, который предлагает нам платформа. Подчеркну – мы изучили C++ и функции Ардуино, потому что никакого “языка Arduino” нет, это ложное понятие. Arduino программируется на C или ассемблере, а платформа предоставляет нам всего лишь несколько десятков удобных функций для работы с микроконтроллером, именно функций, а не язык. Теперь перед нами чистый лист блокнота Arduino IDE и желание творить и программировать, давайте попробуем!
Структура программы
Прежде, чем переходить к реальным задачам, нужно поговорить о некоторых фундаментальных вещах. Микроконтроллер, как мы обсуждали в самом начале пути, это комплексное устройство, состоящее из вычислительного ядра, постоянной и оперативной памяти и различных периферийных устройств (таймеры/счётчики, АЦП и проч.). Обработкой нашего с вами кода занимается именно ядро микроконтроллера, оно раздаёт команды остальным “железкам”, которые в дальнейшем могут работать самостоятельно. Ядро выполняет различные команды, подгоняемое тактовым генератором: на большинстве плат Arduino стоит генератор с частотой 16 МГц. Каждый толчок тактового генератора заставляет вычислительное ядро выполнить следующую команду, таким образом Ардуино выполняет 16 миллионов операций в секунду. Много ли это? Для большинства задач более чем достаточно, главное использовать эту скорость с умом.
Зачем я об этом рассказываю: микроконтроллер может выполнить только одну задачу в один момент времени, так как у него только одно вычислительное ядро, поэтому реальной “многозадачности” нет и быть не может, но за счёт большой скорости выполнения ядро может выполнять задачи по очереди, и для человека это будет казаться многозадачностью, ведь что для нас “раз Миссисипи“, для микроконтроллера – 16 миллионов действий! Есть всего два варианта организации кода:
- Основной парадигмой работы с микроконтроллером является так называемый суперцикл, то есть главный цикл программы, который выполняется сверху вниз (если смотреть на код) и начинает с самого начала, когда доходит до конца, и так далее. В Arduino IDE нашим суперциклом является loop() . В главном цикле мы можем опрашивать датчики, управлять внешними устройствами, выводить данные на дисплеи, производить вычисления и всё такое, но в любом случае эти действия будут происходить друг за другом, последовательно. В этом и заключается основной механизм параллельности задач: на самом деле все они выполняются последовательно друг за другом, но в то же время достаточно быстро для того, чтобы казаться “параллельными”.
- Помимо основного цикла у нас есть прерывания, которые позволяют реализовать некую “поточность” выполнения задач, особенно в тех ситуациях, когда важна скорость работы. Прерывание позволяет остановить выполнение основного цикла в любом его месте, отвлечься на выполнение некоторого блока кода, и после успешного его завершения вернуться к основному циклу и продолжить работу. Некоторые задачи можно решить только на прерываниях, не написав ни одной строчки в цикл loop() ! Мы с вами изучали аппаратные прерывания, позволяющие прерваться при замыкании контактов. Такие прерывания являются внешними, то есть их провоцируют внешние факторы (человек нажал на кнопку, сработал датчик, и т.д.). Также у микроконтроллера есть внутренние прерывания, которые вызываются периферией микроконтроллера, и этих прерываний может быть не один десяток! Одним из таких прерываний является прерывание таймера: по настроенному периоду программа будет прерываться и выполнять указанный код. Об этом мы поговорим ниже, а также на сайте есть отдельный урок по работе с прерываниями таймера. Такой подход хорош для задач, которые должны выполняться часто и с большой частотой, для всего остального можно настроить один таймер на счёт времени и работать с этим временем.
- По умолчанию Arduino IDE настраивает один из таймеров (нулевой) на счёт реального времени, благодаря этому у нас работают такие функции как millis() и micros() . Именно эти функции являются готовым инструментом для тайм-менеджмента нашего кода и позволяют создавать работу по расписанию. Самый важный и критический момент: задачи не должны тормозить выполнение программы на бОльший период, чем период самой короткой задачи, иначе все задачи будут выполняться с периодом самой долгой! Именно поэтому нужно отказываться от задержек и ожиданий: задержку всегда можно заменить на проверку таймера при следующих итерациях цикла, и то же самое с ожиданием чего-то, например ответа датчика. Задачи должны быть максимально асинхронными и не блокировать код, к сожалению не во всех библиотеках есть неблокирующие аналоги функций. Даже родной блокирующий analogRead() можно сделать неблокирующим, но Arduino решили не усложнять жизнь новичкам.
“Многозадачность” с millis()
Большинство примеров к различным модулям/датчикам используют задержку delay() в качестве “торможения” программы, например для вывода данных с датчика в последовательный порт. Именно такие примеры портят восприятие новичка, и он тоже начинает использовать задержки. А на задержках далеко не уедешь!
Давайте вспомним конструкцию таймера на millis() из урока о функциях времени: у нас есть переменная, которая хранит время прошлого “срабатывания” таймера. Мы вычитаем это время из текущего времени, эта разница постоянно увеличивается, и по условию мы можем поймать тот момент, когда пройдёт нужное нам время. Будем учиться избавляться от delay() ! Начнём с простого: классический blink:
Программа полностью останавливается на команде delay() , ждёт указанное время, а затем продолжает выполнение. Чем это плохо? (А вы ещё спрашиваете?) Во время этой остановки мы ничего не можем делать в цикле loop() , например не сможем опрашивать датчик 10 раз в секунду: задержка не позволит коду пойти дальше. Можно использовать прерывания (например – таймера), но о них мы поговорим в продвинутых уроках. Сейчас давайте избавимся от задержки в самом простом скетче.
Первым делом внесём такую оптимизацию: сократим код вдвое и избавимся от одной задержки, используя флаг:
Хитрый ход, запомните его! Такой алгоритм позволяет переключать состояние при каждом вызове. Сейчас наш код всё ещё заторможен задержкой в 1 секунду, давайте от неё избавимся:
Что здесь происходит: цикл loop() выполняется несколько сотен тысяч раз в секунду, как ему и положено, потому что мы убрали задержку. Каждую свою итерацию мы проверяем, не настало ли время переключить светодиод, не прошла ли секунда? При помощи этой конструкции и создаётся нужная многозадачность, которой хватит для 99% всех мыслимых проектов, ведь таких “таймеров” можно создать очень много!
Данный код всё ещё мигает светодиодом раз в секунду, но помимо этого он с разными промежутками времени отправляет сообщения в последовательный порт. Если открыть его, можно увидеть следующий текст:
Это означает, что у нас спокойно работают 4 таймера с разным периодом срабатывания, работают “параллельно”, обеспечивая нам многозадачность: мы можем выводить данные на дисплей раз в секунду, и заодно опрашивать датчик 10 раз в секунду и усреднять его показания. Хороший пример для первого проекта!
Обязательно вернитесь к уроку о функциях времени, там мы разобрали несколько конструкций на таймере аптайма!
Параллельность с прерываниями таймера
Для критичных по времени задач можно использовать выполнение по прерыванию таймера. Какие это могут быть задачи:
- Динамическая индикация;
- Генерация определённого сигнала/протокола связи;
- Программный ШИМ;
- “Тактирование” шаговых моторов;
- Любой другой пример выполнения через строго указанное время или просто периодическое выполнение по строгому периоду (несколько микросекунд). Так как это прерывание – задача будет обрабатываться в приоритете к остальному коду в суперцикле.
Настройка таймера на нужную частоту и режим работы – непосильная для новичка задача, хоть и решается в 2-3 строчки кода, поэтому предлагаю использовать библиотеки. Для настройки прерываний по таймеру 1 и 2 есть библиотеки TimerOne и TimerTwo. Мы сделали свою библиотеку, GyverTimers, в которой есть также таймер 0 (для программирования без использования Arduino.h), а также все таймеры на Arduino MEGA, а их там целых 6 штук. Ознакомиться с документацией и примерами можно на странице библиотеки.
Сейчас рассмотрим простой пример, в котором “параллельно” выполняющемуся Blink будут отправляться данные в порт. Пример оторван от реальности, так делать нельзя, но он важен для понимания самой сути: код в прерывании выполнится в любом случае, ему безразличны задержки и мёртвые циклы в основном коде.
Прерывания по таймеру являются очень мощным инструментом, но таймеров у нас не так много и нужно использовать их только в случае реальной необходимости. 99% задач можно решить без прерываний таймера, написав оптимальный основной цикл и грамотно применяя millis() . Посмотрите мой проект контроллера теплицы: там не используются прерывания таймера, но система постоянно выполняет большое количество опросов датчиков, вычислений, управляет железками, выводит на дисплей и контролируется энкодером.
Переключение задач
Важнейшим инструментом по организации логики работы программы является так называемый конечный автомат (англ. State Machine) – значение, которое имеет заранее известный набор состояний. Звучит сложно, но на самом деле речь идёт об операторе swith и переменной, которая переключается кнопкой или по таймеру. Например:
Таким образом организуется выбор и выполнение выбранных участков кода. Переключение переменной mode тоже должно быть сделано не просто так, как в примере выше, тут есть варианты:
- Ограничить диапазон переменной mode по минимальному коду задачи (обычно 0) и максимальному (количество задач минус 1).
- Сделать переключение с последней задачи на первую и наоборот, т.е. “закольцевать” изменение.
Ограничить диапазон при увеличении можно несколькими способами. Способы абсолютно одинаковые по своей сути, но записать можно по разному:
Аналогично при уменьшении:
Переключение с первой на последнюю и обратно делается точно так же:
Рассмотрим несколько готовых примеров на базе библиотеки GyverButton:
Источник статьи: http://alexgyver.ru/lessons/how-to-sketch/
«Пишем свой первый скетч» Урок № 1
Урок № 1
Это продолжение цикла уроков про Ардуино для начинающих.
Предыдущие уроки можно посмотреть здесь.
Урок № 0 — «Введение в программирование Ардуино»
Урок № 0.5 — «Продолжение вводного урока.»Первое подключение Ардуино к компьютеру.»
В этом уроке, видео на который можно посмотреть на канале YOUTUBE
рассказано как подключить светодиод, рассчитать значение токоограничивающего резистора, про закон Ома, и многое другое.
Что такое функция void setup() и void loop(), вообщем посмотрите, не пожалеете.
Для этого урока, для основной его части потребуются.
Ардуино Нано v 3.0
Макетная плата (беспаечная) Breadboard
Провода 5 шт.
Резисторы 220 Ом 3 шт.
Светодиоды 3 шт.
Плату Ардуино и макетную плату вы покупаете всего 1 раз, а использовать будете на протяжении всех уроков.
Для дополнительного занятия потребуется ещё
Этот урок надо использовать вместе с видео.
Скетчи основной части урока.
Мигание 1 светодиодом. Скачать.
Мигание 3 светодиодами. Скачать.
Теперь, как и обещал некоторые интересности.
Вот наш код из первого скетча
void setup() <
pinMode(LED, OUTPUT); // УСТАНАВЛИВАЕМ ЦИФРОВОЙ ПИН 13 НА ВЫХОД
>
void loop() <
digitalWrite(LED, HIGH); // ЗАЖИГАЕМ СВЕТОДИОД
delay(1000); // ЖДЁМ 1 СЕКУНДУ
digitalWrite(LED, LOW); // ГАСИМ СВЕТОДИОД
delay(1000); // ЖДЁМ 1 СЕКУНДУ
>
Теперь как и обещал сократим код в функции loop()
И вместо 4 строчек написать всего 2
void loop() <
digitalWrite(LED, !digitalRead(LED)); // если светодиод был выключен – включаем и наоборот
delay(1000); // ждем 1 секунду
>
Что делают эти строчки.
Мы получаем текущее значение светодиода digitalRead(LED) и !digitalRead(LED) переворачиваем его(инвертируем).
Если светодиод горел, то гасим его
Если светодиод не горел, то зажигаем его.
с Логическими операторами мы познакомимся в следующих уроках
&& (логическое И) Истина, если оба операнда истина.
|| (логическое ИЛИ) Истина, если хотя бы один операнд истина.
! (логическое отрицание) Истина, если операнд Ложь, и наоборот.
Замена delay()
Эта функция служит для остановки микроконтроллера.
Как я и говорил в видео, функцию delay() надо применять очень осторожно.
Означает остановить выполнение всех программ (ну почти всех) и ждать пока не пройдёт время, указанное в скобках. Оно указывается в миллисекундах (1000 миллисекунд = 1 секунде) и пока это время не закончится ARDUINO будет бездействовать.
Есть ещё прерывания, но это мы будем изучать в следующих уроках.
Правильнее будет использовать функцию millis();
Она возвращает количество миллисекунд с момента начала выполнения программы.
Количество миллисекунд в millis() ограничено 50 днями. При наступлении этого времени счётчик сбросится 0.
Вот что у нас теперь получилось
#define LED 13
#define STOP 1000 // 1000 миллисекунд — это 1 секунды
unsigned long prev_ms = 0; // здесь будет храниться время последнего изменения состояния светодиода
void setup() <
pinMode(LED, OUTPUT); // УСТАНАВЛИВАЕМ ЦИФРОВОЙ ПИН 13 НА ВЫХОД
>
void loop()
<
/*
проверяем – настало ли время изменить состояние светодиода
для этого считываем значение светодиода digitalRead(LED),
а затем сверяем полученный интервал с нужным интервалом
*/
if (millis() — prev_ms > STOP) <
// текущее время –(минус) время последнего изменения. Если он больше 1000(1 сек.) то условие верно
digitalWrite(LED, !digitalRead(LED)); // если светодиод был выключен – включаем и наоборот
prev_ms = millis();
>
/*
Здесь могут быть другие команды, которые нужно выполнить и неважно, что будет делать микроконтроллер в данное время,Если настало время STOP, он прервётся, выполнит задачу, и начнёт с того же места, где прервался.
*/
>
Теперь переходим к самому интересному.
Дополнительной части урока.
Напишу её сегодня-завтра. Хочу, чтобы на выходные вам было чем заняться.
Удачи вам в освоении этого непростого, но интересного дела.
Изучив эти уроки, вы освоите новую, интересную профессию – Программист. Освоив её, вы можете быть спокойны за свою будущее, ведь по статистике, программист самый востребованный и высокооплачиваемый специалист в наше время.
Смотрите новые уроки. Подписывайтесь на канал. И удачи.
Источник статьи: http://arduino-kid.ru/lesson/pishem-svoy-pervyy-sketch-urok-no-1