Телескопы покупают здесь


A A A A Автор Тема: Arduino для начинающих: вопросы и ответы  (Прочитано 13039 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
По многочисленным просьбам создаю тему.
Давайте обсуждать, делиться опытом.
А ещё, если будет актуально, первое сообщение можно будет прилепить и завести здесь FAQ.


Уроки для начинающих. Очень подробно и доходчиво.

#0 Введение в курс. Содержание серии "Основы Arduino для начинающих" - YouTube
« Последнее редактирование: 12 Мар 2017 [15:49:35] от Deimos »
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #100 : 02 Авг 2019 [09:33:20] »
Есть пограничные случаи, связанные с разрядной сеткой, когда это может не работать.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн Дмитрий Маколкин

  • *****
  • Сообщений: 14 864
  • Благодарностей: 1295
  • всяко разно
    • Skype - dmitrymakolkin
    • DeepSkyHosting: dvmak
  • Награды Призер конкурса астрофото
    • Сообщения от Дмитрий Маколкин
    • Панорамы Луны
Re: Arduino для начинающих: вопросы и ответы
« Ответ #101 : 02 Авг 2019 [11:19:47] »
Если на чистом Си, то можно сделать так:
sprintf(buffer, "%.1f", arg)Конкретно Arduino имеет перегрузку print/println, принимающую перегрузку (float value, size_t digits = 2), притом они именно округляют значение (убедился в этом просматривая исходник функции).
В общем случае можно прибавить к числу половину младшего разряда и отбросить остальные. Предполагается что число положительное. То есть добавляем 0,05 и отбрасываем ненужные разряды

У меня данные с ds18b20. При опросе датчика получается число от зимних минусовых температур до летних плюсовых. Число содержит два знака после запятой.
Из-за ограничений по длине строки дисплея хочется округлить до десятых и выводить с одним знаком после запятой, причём выводить не только сами температуры, но и их разность. Поэтому нужно перед выводом на экран именно округлить, потом произвести операцию вычитания и вывести на экран как округленные значения, так и результат вычитания.
Вечером попробую, поддерживается ли первый способ.

P.S. По случаю достался целый пакет датчиков, оказалось реально подобрать пары с одинаковыми показаниями, т.е. можно без особых хлопот наваять автономный дифференциальный термометр для отслеживания термостабилизации оптики телескопа.
Панорамы Луны в моей галерее:
http://www.makolkin.ru/Gallery/gallery.html
Мои дипы: https://deepskyhosting.com/dvmak

Оффлайн alexann

  • *****
  • Сообщений: 2 487
  • Благодарностей: 209
    • Сообщения от alexann
Re: Arduino для начинающих: вопросы и ответы
« Ответ #102 : 02 Авг 2019 [12:27:38] »
Из-за ограничений по длине строки дисплея хочется округлить до десятых и выводить с одним знаком после запятой, причём выводить
Выведите пробел в это место на дисплее.
22"/4.5, ТАЛ-250К, NEQ6 Pro, Canon EOS 6D

Оффлайн Дмитрий Маколкин

  • *****
  • Сообщений: 14 864
  • Благодарностей: 1295
  • всяко разно
    • Skype - dmitrymakolkin
    • DeepSkyHosting: dvmak
  • Награды Призер конкурса астрофото
    • Сообщения от Дмитрий Маколкин
    • Панорамы Луны
Re: Arduino для начинающих: вопросы и ответы
« Ответ #103 : 02 Авг 2019 [12:32:21] »
Из-за ограничений по длине строки дисплея хочется округлить до десятых и выводить с одним знаком после запятой, причём выводить
Выведите пробел в это место на дисплее.

Ну это-то понятно, вот только это не округление. Если так "округлять" исходные данные и результат действий с ними, который легко проверить самостоятельно, то будут расхождения.
Например: два параметра отображаются как 21.2 и 23.2, а разница отображается как 1.9
Это же будет выглядеть смешно...
Панорамы Луны в моей галерее:
http://www.makolkin.ru/Gallery/gallery.html
Мои дипы: https://deepskyhosting.com/dvmak

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #104 : 02 Авг 2019 [13:33:03] »
К положительному +0.05, к отрицательному -0.05. Всё остальное так же. А лучше всего вариант со sprintf.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #105 : 02 Авг 2019 [13:33:27] »
Из-за ограничений по длине строки дисплея хочется округлить до десятых и выводить с одним знаком после запятой, причём выводить
Выведите пробел в это место на дисплее.
Костыль. Не надо так делать.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн Дмитрий Маколкин

  • *****
  • Сообщений: 14 864
  • Благодарностей: 1295
  • всяко разно
    • Skype - dmitrymakolkin
    • DeepSkyHosting: dvmak
  • Награды Призер конкурса астрофото
    • Сообщения от Дмитрий Маколкин
    • Панорамы Луны
Re: Arduino для начинающих: вопросы и ответы
« Ответ #106 : 02 Авг 2019 [20:41:18] »
В итоге удовлетворился таким приемом:
t1 = round(temperature1 * 10) / 10.0;
lcd.print(t1,1);

Важно, что делить надо на 10.0, а не на 10, иначе переменна конвертируется в целое.

Теперь надо всё в коробочку убрать.
« Последнее редактирование: 02 Авг 2019 [20:48:36] от Дмитрий Маколкин »
Панорамы Луны в моей галерее:
http://www.makolkin.ru/Gallery/gallery.html
Мои дипы: https://deepskyhosting.com/dvmak

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #107 : 02 Авг 2019 [21:24:19] »
lcd тоже реализует интефейс printable, поэтому достаточно было написать lcd.print(temperature1, 1) (считаем что temperature1 имеет тип float/double - на адурине это одно и то же)
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн johny74

  • *****
  • Сообщений: 1 596
  • Благодарностей: 129
    • Сообщения от johny74
Re: Arduino для начинающих: вопросы и ответы
« Ответ #108 : 15 Окт 2019 [06:32:05] »
Столкнулся с небольшим моментом, прошу подсказать, если кто знает.
Суть в следующем: делаю систему push_to для доба на arduino mega 2560, автономную, без связи с планшетом.
Есть желание иметь встроенные каталоги NGC и IC. Памяти программ для этого вроде бы более чем достаточно, компилирует без проблем.
Размещаю данные следующим образом:
struct Obj  // Структура содержащая координаты объектов
{
  float ra;      // Right ascension.
  float dec;     // Declination.
};
const Obj M_cat[] PROGMEM = {  // Эти данные храним в памяти программ!!!

{ 1.45953158  , 0.38426332  } , //        М1
{ 5.64395846  , -0.01425352 } , //       М2
{ 3.58752427  , 0.49538261  } , //        М3
и т.д.
};

Каталог NGC (поделенный на три части) размещенный подобным образом работает отлично, при этом компилятор выдает:
Скетч использует 88150 байт (34%) памяти устройства. Всего доступно 253952 байт.
Глобальные переменные используют 1714 байт (20%) динамической памяти, оставляя 6478 байт для локальных переменных. Максимум: 8192 байт.

Если аналогичным образом дополнительно размещаю каталог IC - то программа перестает работать! (компилируется без ошибок, но перестает реагировать на внешние прерывания по энкодерам) при этом памяти (программ) свободной - половина еще!
Я так понимаю -  компилятор не корректно размещает данные структуры IC и лезет в адреса, в которые не следует? я к сожалению не программист.
Сталкивался кто нибудь с подобным? Может есть ссылка где почитать? по  параметрам PROGMEM я ничего такого не нашел.

Конечно есть вариант скинуть все каталоги на SD и читать оттуда, но вроде как есть и в самой arduino место - почему бы не использовать?

« Последнее редактирование: 15 Окт 2019 [06:37:28] от johny74 »

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #109 : 15 Окт 2019 [08:19:06] »
const Obj M_cat[] PROGMEM = {  // Эти данные храним в памяти программ!!!
1. надо не забыть, что читать эти данные тоже надо специальными функциями (вернее макросами)
2. имейте в виду, что инструкция LPM работает с 16-битным псевдорегистром Z, который адресует только 16 бит. Размещаемые в программной памяти данные не могут превышать 64 килобайта. Из этих 64к ещё часть используется для размещения таблиц переходов прерываний и ещё немножко всякого, порядка килобайта.

У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн johny74

  • *****
  • Сообщений: 1 596
  • Благодарностей: 129
    • Сообщения от johny74
Re: Arduino для начинающих: вопросы и ответы
« Ответ #110 : 15 Окт 2019 [08:57:38] »
Считываю так:
ra   =  pgm_read_float_near(& NGC_1_2999[NGC_Number-1].ra);   // Считываем координаты объекта из памяти программ
dec = pgm_read_float_near(& NGC_1_2999[NGC_Number-1].dec);  // Считываем координаты объекта из памяти программ

Это работает!

Каталоги поделил на части по 3000 (если 4000 - компилятор сообщает, что размер слишком большой) объектов (два float соответственно), т.е. NGC тремя частями.
Работа с каталогом NGC происходит без замечаний.
Но, если пытаюсь сохранить в памяти еще хотя бы 1000 дополнительных объектов - сразу перестают работать прерывания!

Кусок рабочего кода для каталога Мессье (для NGC - все тоже самое) ниже:
if(memcmp(&st[0], "GuideM" ,6)==0){  // Если содержит текст "GuideM " то считываем номер объекта каталога из строки
    sub_st = st.substring(7);  // Здесь мы вырезали начало строки - "GuideM "
    st_M_Number = sub_st.substring(0); // Считали номер
    M_Number = st_M_Number.toInt();    // Перевели номер в целое число
    Serial.print("M "); Serial.print(M_Number);  // Печатаем для проверки
    //------------------------------------------------------------------------
    ra   = pgm_read_float_near(& M_cat[M_Number-1].ra);    // Считываем координаты объекта из памяти программ
    dec = pgm_read_float_near(& M_cat[M_Number-1].dec);  // Считываем координаты объекта из памяти программ
    *ra_1 = ra;
    *dec_1 = dec;
    Serial.print("  Ra= "); Serial.print(ra,8); 
    Serial.print("  Dec= "); Serial.println(dec,8);     
    } 


Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #111 : 15 Окт 2019 [10:46:47] »
ra   =  pgm_read_float_near(& NGC_1_2999[NGC_Number-1].ra);   // Считываем координаты объекта из памяти программ
dec = pgm_read_float_near(& NGC_1_2999[NGC_Number-1].dec);  // Считываем координаты объекта из памяти программ
Всё верно.

if(memcmp(&st[0], "GuideM" ,6)==0){  // Если содержит текст "GuideM " то считываем номер объекта каталога из строки
В какой памяти находится st? Не содержит, а начинается с...

Похоже здесь у Вас динамические строки. Могут быть проблемы из-за этого. Лучше всё-таки использовать буфер на стеке.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #112 : 15 Окт 2019 [10:49:21] »
    ra   = pgm_read_float_near(& M_cat[M_Number-1].ra);    // Считываем координаты объекта из памяти программ
    dec = pgm_read_float_near(& M_cat[M_Number-1].dec);  // Считываем координаты объекта из памяти программ
Для начала попробуйте заменить чтение на вызовы pgm_read_float_far

Я бы порекомендовал сделать так, как написано в этой статье:
https://habr.com/ru/post/346202/

После этого будет намного больше информации для обсуждения.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн johny74

  • *****
  • Сообщений: 1 596
  • Благодарностей: 129
    • Сообщения от johny74
Re: Arduino для начинающих: вопросы и ответы
« Ответ #113 : 15 Окт 2019 [16:58:26] »
Для начала попробуйте заменить чтение на вызовы pgm_read_float_far
Пробовал так, результат тот же.

По приведенной ссылке, не совсем понял, что в итоге необходимо сделать.
В общем не буду заморачиваться, наверное это перебор - хранить массивы под 100кбайт в памяти arduino )
Каталоги скину на SD карту, благо по работе с SD примеров достаточно.
Спасибо!

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #114 : 15 Окт 2019 [17:43:49] »
В итоге должно получиться 2 файла: дизассемблированная программа и карта распределения памяти.
Хотя вроде как замена _near-вызова на _far-вызов должно хватить.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн god.production

  • Новичок
  • *
  • Сообщений: 35
  • Благодарностей: 2
  • Лиха беда начало
    • Сообщения от god.production
Re: Arduino для начинающих: вопросы и ответы
« Ответ #115 : 19 Янв 2020 [17:16:06] »
Подскажите, пожалуйста. Пока что полный ноль в этой теме.
В планах сделать подобие ведения по оси RA используя 28BYJ-48 (5 вольт) + ULN2003.
Еще один драйвер можно будет к плате добавить, если вдруг руки дойдут сделать ведение по оси DEC?

Оффлайн xdАвтор темы

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Arduino для начинающих: вопросы и ответы
« Ответ #116 : 19 Янв 2020 [23:14:38] »
Подскажите, пожалуйста. Пока что полный ноль в этой теме.
В планах сделать подобие ведения по оси RA используя 28BYJ-48 (5 вольт) + ULN2003.
Еще один драйвер можно будет к плате добавить, если вдруг руки дойдут сделать ведение по оси DEC?
Слишком мало информации. Какой интерфейс управления этим драйвером? Как часто выдаются импульсы управления?
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн Kvif49

  • ****
  • Забанен!
  • Сообщений: 400
  • Благодарностей: 1
  • Мне нравится этот форум!
    • Сообщения от Kvif49
Re: Arduino для начинающих: вопросы и ответы
« Ответ #117 : 20 Янв 2020 [02:56:50] »
И что за монти. По мне так 28BYJ-48 фигота мелкая, лучше взять nema17, пусть и не самый мощный..

Оффлайн god.production

  • Новичок
  • *
  • Сообщений: 35
  • Благодарностей: 2
  • Лиха беда начало
    • Сообщения от god.production
Re: Arduino для начинающих: вопросы и ответы
« Ответ #118 : 20 Янв 2020 [09:19:05] »
Не очень понял про интерфейс (arduino по разному взаимодействуют с драйверами?),  но попробую пояснить как могу. Вот как я представляю начиная с самого верхнего уровня - PHD (аналоги), далее ASCOM драйвер, Arduino Uno по usb, драйвер мотора, мотор.
Монтировка EQ2 (где-то 2,5 кг нагрузка будет - планирую с телеобъективом на зеркалку снимать). Находил одну тему, в которой использовался этот моторчик на eq2, правда управление там через другой драйвер и контроллер.
Nema17 попадался на глаза, но и стоит он раза в 4 больше. А этот хоть спалить не жалко будет при тестах
« Последнее редактирование: 20 Янв 2020 [09:43:56] от god.production »

Оффлайн johny74

  • *****
  • Сообщений: 1 596
  • Благодарностей: 129
    • Сообщения от johny74
Re: Arduino для начинающих: вопросы и ответы
« Ответ #119 : 20 Янв 2020 [09:34:34] »
По мне так 28BYJ-48 фигота мелкая, лучше взять nema17, пусть и не самый мощный..
Я тоже думаю, что 28BYJ-48 может и не провернуть.