Меню Рубрики

Как написать скетч для ардуино для телескопа

Скетч для управления телескопом

Здравствуйте.
Для имеющегося телескопа хочу собрать систему управления по двум осям монтировки. Для этого приобрел Ардуино-УНО 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


0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии