Сообщество - Arduino & Pi

Arduino & Pi

1 493 поста 20 825 подписчиков

Популярные теги в сообществе:

25

STM32F429I Discovery + SDRAM + LTDC под Arduino IDE

Сижу на карантине и придумываю себе сложности. Дома валяется STM32F429I Discovery, вот и решил проверить возможности Arduino IDE для программирования STM32 и данной платки в частности.


Для начала нужно поставить STM32 Cores под Arduino IDE. Детально этот процесс расписан тут https://github.com/stm32duino/wiki/wiki/Getting-Started так что не буду повторяться, тут ничего сложного.


Мне немного не повезло, так как именно этой платки нет в этой сборке, но это не проблема. Можно добавить практически любую стандартную отладочную STM32 вручную, так как драйвера есть в комплекте под большое количество чипов. Вот тут лежит инструкция по добавлению новой платы https://github.com/stm32duino/wiki/wiki/Add-a-new-variant-(board) Но я напишу вкратце со своими конфигами:


1) добавить плату в файл boards.txt (у меня он находится тут ...\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.8.0\boards.txt) - тут нужные строки  - https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/bl...

2) добавить настройки пинов для платы - в папку ...\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.8.0\variants добавить папку https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/tr...


Теперь в меню выбора плат в Arduino IDE в разделе Discovery появится наша платка.


После добавления платы я проверил все стандартные возможности:

цифровые входы/выходы, аналог, шим, уарт, SPI, I2C, прерывания, freertos и т.д.

В большинстве случаев все отлично работает, но некоторые вещи с дополнительными костылями под stm32


Также отлично завелся гироскоп, который есть на плате через библиотеку Adafruit_L3GD20 (только старую, в которой есть SPI, а не I2C)


После этого всего я дошел до экрана и тут началось веселье. Контроллер экрана здесь стоит ILI9341, поэтому для начала я попробовал завести его через SPI и библиотеку Adafruit_ILI9341. С небольшими допилами это получилось - нужно было добавить вручную инициализацию пинов под SPI:


__GPIOC_CLK_ENABLE();

__GPIOD_CLK_ENABLE();

__GPIOF_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_13;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

GPIO_InitStruct.Alternate = GPIO_AF5_SPI5;

HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);


Но скорость отрисовки через SPI не порадовала, а с учетом того, что особенностью данной платы есть возможность работы экрана через SDRAM , то начал ковырять все это дело. С драйверами под это все в stm32 cores проблемы, поэтому пришлось делать на регистрах.


Сначала прикрутил SDRAM  https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/bl...

командами SDRAM_Read8 и SDRAM_Write8 можно записывать/считывать значение в памяти по адресу.


После этого прикрутил LTDC - для работы экрана через память - https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/bl...

команда PutPixel меняет цвет пикселя по координатам x, y


Осталось только перевести экран в соответствующий режим работы, для этого нужно задать набор команда по SPI конроллеру ILI9341 - для этого я использовал все ту же библиотеку Adafruit_ILI9341, в которую дописал функцию begin_ltdc() - доработанные файлы библиотеки также лежат в репозитории.


Ну и видео на котором можно оценить разницу в скорости работы двумя методами: заливка экрана черным > синим > красным с задержкой в одну секунду через SPI и LTDC.

Кстати тачскрин тоже работает, для этого нужна библиотека Adafruit_STMPE610, тут только пини для I2C надо правильные задать.


По идее через LTDC можно подключить любой другой подходящий TFT любого разрешения, только настройки нужно будет выставить соответствующие. По возможности обязательно попробую и проверю по скорости.

Показать полностью 1
16

Датчик атмосферного давления bmp 180

Доброго времени, уважаемые единомышленники по увлечению!


Нуждаюсь в помощи тех из вас, у кого есть под рукой этот датчик или аналогичный и кого не затруднит его включить для меня.


Цель эксперимента- понять чувствительность датчика и его способность улавливать разницу давления с подветренной/наветренной стороны.

Другими словами, если у вас двусторонняя квартира, будут ли отличаться показания датчика при открытом/закрытом окне с одной/другой стороны.


Что нужно.

Открыть окно или форточку в помещении с любой стороны. Перейти в помещение, окна которого выходят на противоположную сторону, посмотреть показания. Открыть окно или форточку и посмотреть, изменились ли показания датчика. Потом вернуться в первое помещение, посмотреть показания, закрыть окно, посмотреть, изменились ли цифры.


Заранее премного благодарен!)

Надеюсь, я немного развлек и вас и праздночитающих.

Показать полностью
80

Управляемый жестами светильник на Arduino

Всем привет!!!

Я рад , что могу снова показать Вам свои наработки.

На этот раз я собрал светильник на ардуино управляемый жестами.

Данный проект отнял у меня очень много времени, которого у меня и так всегда не хватает.

Первый вариант светильника я собрал очень быстро и он прекрасно работал у меня на макетной плате, но когда я перенес его на постоянное место в корпус, вот тут все и началось, вылезли все проблемы с подвисаниями, ложными срабатываниями и прочими неприятностями. Погуглив в интернете, я нашел на иностранных сайтах, множество жалоб связанных с проблемами датчика APDS9960, но не нашел решений этих проблем. Пришлось понемножку тратить время на изучения Datasheet этого датчика и на понимание его работы. Что в конце концов это принесло свои плоды и я смог написать стабильно работающий код.

И так все по порядку


Описание светильника

Основной упор в этом светильнике я сделал не на визуализацию, а на управление жестами, все остальные функции второстепенные.

Включается светильник жестами влево или в право, а так же можно включить и жестом на себя, но это не совсем удобно. Далее жестами влево и в право можно перелистывать световые эффекты. Если начать листать вправо, то лампа сначала будет менять свои цвета от белого до красного, включая все основные цвета и переходы между ними.

Если после включения лампы начнем листать влево, то увидим динамические световые эффекты, такие как «Огонь» , «Матрица», «Лава лампа», «Радуга», «Конфетти», «Искры», «Огненный светильник». Если Вам нужно вернуться на обычный светильник, то вместо перелистывания, можно выключить лампу жестом от себя и включить любым из трех жестов.

Выключение производится жестом от себя.


Яркость регулируется жестом приближения и отдаления от датчика. Сначала нужно поднести ладонь на максимально близкое расстояние к сенсору, а потом резко поднять вверх. Светильник перейдет в режим регулировки яркости, приближая и отдаляя ладонь, нужно найти подходящую яркость и зафиксировать руку на пару секунд, для того что бы значение яркости сохранилось. Когда яркость сохранится, светильник даст об этом знать, плавным выключением света с последующим включением уже с новым уровнем яркости.

Я не уделял особого внимания визуальным эффектам, так как планирую сделать вторую версию лампы на контроллере Wemos D1 mini. В которой планирую довести все до идеала. По этой же причине я пока использую только одну линейку светодиодов, состоящую из 4 планок ws2812b, вместо четырех.


Прерывания APDS9960

Собственно основные проблемы светодиодной лампы связаны именно с ним. Прерывания в apds9960 живут своей жизнью, может сработать от чего угодно например от ЭМ помехи или от нахождения рядом с датчиком человека, от пульсации по питанию и возможно от чего то еще.

Сначала попробовал исправить проблему изменениями в железе. Фильтрация питания не помогла, даже от аккумулятора 18650 датчик все равно продолжал жить своей жизнью. Попробовал переключить нагрузочный резистор сигнала INT на +5В и это тоже не принесло успеха.

По мере изучение пришло понимание, от чего происходят ложные срабатывания прерываний. Основная проблема это случайные отражения ИК сигнала. Производитель рекомендует покрыть датчик и все вокруг него черным резиновым напылением. У меня нет такой краски и я не стал с этим заморачиваться. Хотя наверняка это могло бы немного уменьшить число ложных срабатываний.

Я написал код который фильтрует все случайные срабатывания, но столкнулся еще с одной проблемой. После срабатывания прерывания информация о жесте передается по шине I2C не моментально, а имеет определенную задержку. А если питание из-за адресной светодиодной ленты зашумлено, то время передачи с учетом этих помех всегда будет разным. Пришлось учитывать этот факт и по новой переписывать код определения жестов.


Определение жеста

Если в коде не использовать прерывание от датчика, то с определением жеста нет ни каких проблем. Но в таком случаи теряется многозадачность. Если на лампе включен динамический эффект, то соответственно он требует цикличного, постоянно исполняемого кода и что бы вывести контроллер из цикла, потребуется использование прерываний.

Для того, что бы улучшить стабильность распознавания жестов, так же пришлось в библиотеке уменьшить чувствительность приемника. Для этого нужно в файле SparkFun_APDS9960.h заменить строку:

if( !setLEDBoost(LED_BOOST_300) )

на

if( !setLEDBoost(LED_BOOST_150) )

Если Вы скачали библиотеку из этой статьи, то ничего делать не нужно, там уже все исправлено.

Я так же экспериментальным путем подобрал ток светодиода 50 мА, при котором жесты определяются наиболее стабильно и нет надобности насиловать инфракрасный светодиод, током 100 мА.

А так же я допустил ошибку, разместив микроконтроллер в нижней части светильника, а датчик жестов в на верхней крышке. Из-за этого, для соединения arduino и apds9960, пришлось использовать провода длинной 30 см. Что тоже добавило дополнительной нестабильности работы датчика. В итоге я программным путем победил все эти проблемы.


Схема

Для питания устройства я использую зарядное устройство от моего смартфона, с напряжением выхода 5В и током 2А. Но на самом деле светильник при включенном белом свете на максимальной яркости, не потребляет выше 1,3 А. По этому подойдет любой источник питания с выходным током не менее 1,3А.

Стабилизатор dc-dc mini360, можно заменить на любой другой понижающий преобразователь напряжения, с выходным током не менее 150 мА.

В нижеприведенной схеме я не использую преобразователь логических уровней, но это мое личное решение и по этому я заранее снимаю с себя ответственность, в том случаи если у Вас выйдет из строя сенсор APDS9960, подключенный без преобразователя TTL уровней.

Вместо Ардуино Нано можно использовать контроллер Arduino UNO или его клоны.

Обязательно проверьте на датчике жестов наличие перемычек, они отмечены красным цветом на фотографии ниже. В случаи их отсутствия следует паяльником на эти контактные дорожки, нанести и разогреть припой, до образования однородной капли. Сейчас китайцы поставляют эти датчики без перемычек. Без указанных перемычек работа датчика не гарантируется.

Используемые компоненты

Arduino Nano — 1 шт.

Датчик жестов APDS9960 — 1 шт.

Светодиодные планки ws2812b — 4 шт.

Преобразователь понижающий mini360 — 1 шт.

Соединительные провода dupont— 1 комплект.


Программный код для Ардуино

Код разбит на две части. В первой части находится основной код, который работает с сенсором, а во второй части находится код всех световых эффектов.

Вы можете сами добавить любой эффект по аналогии с моим кодом, но главное не забудьте добавить функцию выхода по жесту из зацикленного эффекта. Для этого нужно добавить в конце цикла, следующую строку if(check_int()) return;

Описание основных функций программы

processingGesture() обрабатывает прерывания от датчика жестов.

processingProximity() обрабатывает прерывания от датчика приближения.

gesture_int() — обработчик прерывания от датчика жестов.

proximity_int() — обработчик прерывания от датчика приближения.


Описание констант

APDS9960_INT — вход для внешнего прерывания. В Arduino Nano и UNO всего два таких входа, 2 и 3.

PIN — здесь нужно указать выход на светодиодную ленту. Можно указывать любой цифровой пин к которому подключены планки ws2812b.

NUM_PIX — здесь указываем количество адресных светодиодов в используемой ленте.

range — предел погрешности от 0 до 10. Если при регулировке яркости зафиксировать руку над датчиком на 2 сек, то показания должны сохраниться, если же показания не сохраняются, то увеличивайте постепенно предел погрешности.


Скачать библиотеку APDS9960

Скачать скетч светильника


Итоги

Светильник в живую выглядит лучше чем на видео. Теперь все кто увидел его у меня, просят собрать им такой же. На данный момент мне не нравится как работает регулировка яркости, но я над этим работаю. Не обещаю, что скоро, но уже в разработке следующая версия светильника.

Спасибо, что дочитали статью до конца! Если у Вас остались вопросы, можете задать в комментарии под статьей, регистрация не требуется.

Показать полностью 4
154

КАК СДЕЛАТЬ АРДУИНО ПЛОТТЕР, РИСУЮЩИЙ НА ЯЙЦАХ_EGGBOT

В этом посте я хочу показать, как сделать простой и дешевый Arduino плоттер, который может рисовать на яйцах или других сферических объектах.


Как по мне, яйцебот - это один из самых простых типов плоттеров, CNC-устройств. Для его изготовления не нужны миллионы направляющих и линейных подшипников. Имея в распоряжение два шаговых двигателя, сервопривод, платы управления шаговыми двигателями, Ардуино и ещё некоторые материалы, вы сможете при желании с лёгкостью собрать интересное устройство, которое поможет вам начать свой путь в мир CNC. К тому же, скоро Пасха и эта самоделка может вам очень пригодится.

Видео изготовления:

Список материалов:

- Arduino UNO

- 2х шаговый двигатель (28BYJ-48)

- 2x платы управления шаговым двигателем (ULN2003)

- Блок питания на 12В +

- Сервопривод (sg90)

- Фанера (7,5 мм)

- Подшипник

- Болты

- Гайки

- Шины от игрушечной машины

- ПВХ пластик

- Ручка

И различные инструменты

Для начала мы построим корпус. Прежде всего необходимо вырезать заготовки из фанеры с размерами: 120х90 и 120х80 и еще две заготовки с размерами: 90х70. Затем с помощью 10-миллиметрового сверла, сделайте отверстие, как на фотографии. Также нужно сделать отверстие для подшипника и вставить его туда. После этого все должно быть склеено. После сушки необходимо закрепить в указанных местах шаговый двигатель

Крепления для яиц изготавливаются из шин от игрушечной машины, кругов из ПВХ пластика, гаек, шайб, болтов и рукоятки от ручки, которая отлично подходит к валу двигателя. После полного склеивания, как на фотографии, необходимо вставить болт в подшипник и закрепить его с помощью гайки. Прикрутите еще одну гайку (она используется как контргайка), а затем привинтите одну часть нашего держателя. На двигатель нужно надеть другую часть с колпачком от ручки

Держатель ручки (вторая ось) у меня выполнены из ПВХ пластика. Чтобы соединить эту ось с шаговым двигателем, я также использовал колпачок от ручки. Сервопривод прикручен к этой части как на фото. Подробности её изготовления можете увидеть в видео.

Затем нужно соединить все электронные компоненты по схеме, которую вы видите ниже. Подробно об установке программного обеспечения вы узнаете в видео на 11-ой минуте.

--->Программное обеспечение, скетч и схема<---

Eggduino-Прошивка от Joachim Cerny, 2015


Часто у людей возникает ошибка: Inkscape has received additional data from the script executed.The script did not return an error,but this may indicate the results will not to be as expected(Inkscape получил дополнительные данные от выполненного скрипта. Скрипт не вернул ошибку, но это может указывать на то, что результаты будут не такими, как ожидалось.). Чтобы её исправить нужно в свойствах документа изменить мм на px (Inkscape -> Файл -> Свойства документа)На px нужно поменять  "Display units"("Единицы измерения") и "Units"("Единицы").

Вот и все. Теперь вам нужно зафиксировать  яйцо или другой любой сферический объект в нашем плоттере и начать творить.

Вот примеры того, что можно загрузить для печати:

-->Примеры<--


Хорошей Пасхи !!!

Показать полностью 16 1
1141

Продолжение поста «Когда есть знания и умения, но отсутствует интернет»6

Вызов принят 3.

В комментариях просили птеродактелей и смену дня и ночи.

Со вторым еще нужно дорабатывать.

29

Микро обзор транзистор тестера GM328A

GM328A - Многофункциональный прибор для проверки и автоматического обнаружения транзисторов типа NPN и PNP, полевых транзисторов, диодов, спаренных диодов, светодиодов, стабилитронов, тиристоров, с автоматическим определением цоколевки выводов всех компонентов.


GM328 можно использовать в качестве генератора прямоугольных ШИМ-сигналов, с возможностью изменять скважность от 1 до 99%. Транзистор тестер может измерять частоту от 1 до 4000000 Гц, проверять у конденсаторов емкость, ESR – эквивалентное последовательное сопротивление и Vloss - добротность.


А также этот универсальный прибор имеет: Русифицированный интерфейс. Цветной ЖК TFT дисплей. Управление в меню прибора производится поворотным энкодером с функцией нажатия. Микросхема контроллера ATmega328P установлена на панельку и имеет удобный для замены и ремонта корпус DIP.

В режиме "Транзистор тест" проверяет переходы транзисторов типа NPN и PNP, автоматически определяет расположение выводов транзисторов, коэффициент усиления по току, пороговое напряжение открытия, утечку тока. Проверяет диоды, емкость перехода, напряжение падения и обратный ток. Есть поддержка измерения делителя из двух резисторов.


Питание прибора можно осуществлять от любого внешнего источника 7 В - 12 В, через стандартный разъем питания(5,5 мм). Если tester не используется в течение 1 минуты, то он автоматически переходит в сон, ток спящего режима всего 20 нА.


При первом включении, следует выбрать "режим самотеста", соединить перемычками из медного провода контакты 1-2-3 и приготовить керамический конденсатор 0,1 мкФ, далее тестер на дисплее подскажет Вам следующие шаги. Во время калибровки, не желательно дотрагиваться до платы, так как Вы можете внести погрешность в измерения.


Внимание!!! Тестер легко спалить, если попытаться измерять емкость электролита, предварительно не разрядив его.

Показать полностью
Отличная работа, все прочитано!