Arduino. Изучаем вместе

Всё о ЧПУ (CNC). Компоненты, станки, программы.
Аватара пользователя
L0ki
Реальное имя: Женя

Arduino. Изучаем вместе

Сообщение L0ki » 19 дек 2018, 15:17

е_Вячеслав писал(а):Источник цитаты Не знаю, как работает функция map(), имею в виду как она реализована на уровне ассемблера

оно там на си (ардуине) реализовано, Игорь выше давал ссылку.
// фактически среда ардуины - это надстройка (с моей личной кочки зрения кривая и уродливая) с макросами над сишным компилятором GCC :pardon:

Имхо функция map() в данном случае дикий оверкил, т.к. там дофига лишних в нашем случае умножений и делений (которые больше всего жрут как объем кода, так скорость работы). Эту функцию имеет смысл использовать когда надо масштабировать обе границы диапазона т.е. и верхнюю и нижнюю.

Как я уже говорил выше
L0ki писал(а):Источник цитаты если что, деление двоичных чисел на числа являющиеся степенями двойки т.е. 2^n (например 2, 4, 8, 16, 32, 64... и т.д.)
сводится к побитовому сдвигу числа вправо на n разрядов (с потерей младших разрядов).

Т.е. в сишной интерпретации деление целого положительного числа на 16 (т.е. на 2 в степени 4) будет выглядеть так:

Код: Выделить всё

val = val >> 4;

или же более кратко вот так:

Код: Выделить всё

val >>= 4;

то бишь побитно сдвигаем значение вправо на 4 бита, с заполнением нулями слева, и потерей (отбрасыванием) четырех младших битов справа.
// операции побитных сдвигов есть практически в любом ассемблерном наборе команд, и обычно это одни из самых быстрых команд процессора.
чукча - не писатель, чукча - читатель.
Аднака.

Аватара пользователя
е_Вячеслав
Откуда: Москва

Arduino. Изучаем вместе

Сообщение е_Вячеслав » 19 дек 2018, 16:48

L0ki писал(а):Источник цитаты Имхо функция map() в данном случае дикий оверкил,
Да, мне то это все нафига, не занимаюсь я ни программированием, ни ардуинками, ни, кстати колокольчиками!!!

Аватара пользователя
L0ki
Реальное имя: Женя

Arduino. Изучаем вместе

Сообщение L0ki » 19 дек 2018, 17:28

е_Вячеслав, "оверкил" (overkill) ну... :? русский эквивалент будет "стрельба из пушки по воробьям" :pardon:
чукча - не писатель, чукча - читатель.
Аднака.

Аватара пользователя
Автор темы
KimIV
Реальное имя: Игорь
Откуда: Кунгур

Arduino. Изучаем вместе

Сообщение KimIV » 02 янв 2019, 11:11

LED матрица 8х8. Управление движением точки джойстиком.

А теперь объединим две предыдущие схемы, то бишь в первую схему вместо кнопок поставим джойстик из второй схемы.

027_1.png


И перепишем скетч следующим образом. В самом начале объявляем константы и переменные.

Код: Выделить всё

// Номера выводов подключения осей джойстика
const int axisX = 18;   // Ось X
const int axisY = 19;   // Ось Y
// Значения осей
int X = 0;              // Текущее значение по оси X
int Y = 0;              // Текущее значение по оси Y
// Задержка перемещения точки
int speedP = 100;


Здесь я привёл только те константы и переменные, которые стали новыми по отношению к скетчу с кнопками. Остальные остаются прежними. В функции setup() всё также, кроме исключения из конфигурирования аналогового вывода 16. Он не используется и остаётся свободным.

В функции loop() организовано чтение аналоговых входов (приём сигналов джойстика), масштабирование значений по осям X и Y и обработка этих значений, то есть принятие решения, куда двигать точку. Блок вывода точки также немного доработан. Там добавлена функция delay(), задающая скорость перемещения точки (если точнее, то задержку в перемещении).

В конце сообщения прикрепляю схему в формате программы Fritzing и весь код скетча. А пока видео работы семы и скетча.

https://youtu.be/YY6D4TlRZQg


Здесь мы реализовали управление движением точки с одной постоянной скоростью. Но джойстик - это пропорциональный орган управления, то есть значения на его выходах зависят от угла наклона. И это можно использовать для управления скоростью движения точки. Попробуем реализовать две ступени скорости движения светящейся точки. Схема остаётся прежней. И вот оно на лицо удобство использования микроконтроллеров. При одной и той же схеме включения мы можем реализовывать огромное количество вариантов её работы, всего лишь меняя код скетча. Итак, меняем скетч следующим образом.
1. Значение переменной speedP увеличиваем до 500. Это будет первая (медленная) скорость движения точки (правильнее будет сказать задержка).
2. В функциях масштабирования увеличиваем максимальные значения с 3-ёх до 5-ти.

Код: Выделить всё

  X = map(X, 0, 1023, 0, 5);    // Масштабирование по X
  Y = map(Y, 0, 1023, 0, 5);    // Масштабирование по Y


3. Средней точкой (средним положением джойстика) теперь будет не единица, а двойка, то есть во всех условиях орпеделения направления движения точки типа X > 1 меняем единицу на двойку. Правильнее, кстати, было бы эту двойку вынести в константу, чтобы менять только в одном месте.
4. Добавляем новых блок задания скорости движения точки.

Код: Выделить всё

  // Скорость...
  if (X < 1 || Y < 1 || X > 3 || Y > 3) {
    speedP = 100;
  } else {
    speedP = 500;
  }


Ну и видео работы того, что получилось.

https://youtu.be/3AOG-o4P57g
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Леха-сумо
Реальное имя: Алексей(можно Леха :-))
Откуда: Кемерово

Arduino. Изучаем вместе

Сообщение Леха-сумо » 02 янв 2019, 16:52

Ребят. а ни кто не находил скейтч для управления спидометром и тахометром? Сын у меня делает панель типа авто. для симулятора ЕТС-2
H-shifter я ему напечатал, руль тоже от "семрки" сделали на кронштейне,а вот приборку победить не можем....
Жги асфальт, а не резину!!!

Аватара пользователя
Автор темы
KimIV
Реальное имя: Игорь
Откуда: Кунгур

Arduino. Изучаем вместе

Сообщение KimIV » 02 янв 2019, 19:28

Нюансы работы сервопривода SG90

Что такое сервопривод и как он работает, отлично описано в книге "Петин В.А., Биняковский А.А. Практическая энциклопедия ARDUINO" в главе 17 на странице 77. Копипастить ликбез сюда не вижу смысла. Кому надо, можете сами скачать книгу и прочитать. Схема подключения сервопривода и потенциометра управления углом поворота тоже взята из этой же книги, см. рис. 17.2. Сервопривод SG90 был в комплекте моего китового набора, поэтому использую его. Собрал схему на макетке.

028_1.jpg


Скетч тоже взял готовый, но не из книги, а из комплекта примеров, которые устанавливаются вместе с официальным приложением. Загружается этот пример следующим образом. Идём в Меню - Файл - Примеры - Servo - Knob

028_2.png


Этот пример от книжного отличается только номером вывода подключения управляющего входа сервопривода. В книжном примере используется вывод 8, а в примере Knob вывод 9. Всё остальное одинаковое за мелким исключением типа наименований переменных. Оба примера рабочие. Я проверял. Поэтому сразу же перейдём к нюансам, которые мне удалось обнаружить. Их три:

1. Сервопривод постоянно гудит, то есть постоянно, даже без изменения управляющего сигнала пытается позиционироваться на заданный сигналом угол.
2. На градусах позиционирования, близких к нулевому (в моём случае от 0 до 6, а потенциометр в это время подаёт на аналоговый вход сигнал низкого уровня), сервопривод продолжает потихоньку вращаться в сторону уменьшения градуса и дойдя до 180, делает быстрый полуоборот до ноля. И если масштабирование сделать не до 0 градусов, а до 7, то такие "танцы" прекращаются. Причём медленное сползание от 0 до 180 тем быстрее, чем ближе к нулю нижний предел масштабирования. Например, при таком масштабировании

Код: Выделить всё

val = map(val, 0, 1023, 7, 180);


Сползания нет. При таком

Код: Выделить всё

val = map(val, 0, 1023, 6, 180);


самое медленное сползание. А при таком

Код: Выделить всё

val = map(val, 0, 1023, 0, 180);


самое быстрое.

3. Поворот более, чем на 180 градусов.

Видео с демонстрацией всех трёх нюансов.

https://youtu.be/oQm-H-gHS1I
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
е_Вячеслав
Откуда: Москва

Arduino. Изучаем вместе

Сообщение е_Вячеслав » 02 янв 2019, 22:24

KimIV писал(а):Источник цитаты Поэтому сразу же перейдём к нюансам,
Может стоит убрать потенциометр и посмотреть, как будет работать серва по алгоритму, например, поворот на 180 - удержание - поворот на 180 и т.д., потом поворот 90 - удержание - поворот 90, ну и можно дальше снижать градус.
Надеюсь, что все это хозяйство не от батарейки запитано, как при экспериментах с джойстиком!!


Вернуться в «Системы ЧПУ»