Робототехника

Как программировать STM32 без программатора

Во многих микроконтроллерах STM32 есть бутплоадер. Для большинства моделей (есть исключения) нужно соединить ножку микроконтроллера BOOT c VCC (напряжением питания 3.3V), и после этого подать питание (или, как вариант, нажать на кнопку RESET, если питание уже подано). В результате микроконтроллер загрузится в режиме bootloader. Bootloader умеет прошивать микроконтроллер по UART и I2C. Достаточно купить у китайцев какой-нибудь преобразователь USB->serial (есть много разных, не буду рекламировать ничего конкретного), и можно прошивать микроконтроллер без программатора.
А если микроконтроллер поддерживает и USB, то можно и обойтись без преобразователя.

К каким ножкам STM32F030 подключаться для программирования UART

stm32f0 serial programming

У большинства микроконтроллеров это ножки PA9 и PA10.
PA9 - нужно подключать к RXD (или RX)
PA10 - нужно подключать TXD (или TX)

Бывают и альтернативные ножки PA14, PA15 (их нет в корпусе с 20 ножками) :
PA14- нужно подключать к RXD (или RX)
PA15 - нужно подключать TXD (или TX)

Какими программами пользоваться для программирования STM32F030

Я пользователь линукса и пользуюсь stm32flash, возможно и под Windows есть что-то аналогичное

stm32flash -w Release/my-firmware.bin -v /dev/ttyUSB0

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

Хватит ли мне 16 Кб Flash памяти. Это мало или много?

STM32F030 один из простых и дешёвых контроллеров. И на первый взгляд 16Кб очень даже много. Но если вы используете CubeIDE/CubeMx, то генерированный код занимает довольно много места. Конечно, всё зависит от того, что именно вы используете. Лично мой опыт показал, что даже довольно простой код, забирающий данные из микросхемы по SPI, и выдающий их по запросу UART/MODBUS, с небольшой обработкой чисел float, всё-таки не влез в 16 кБ флеш памяти микроконтроллера, а уж об обработке double и речи быть не могло.

Есть способы всё-таки уменьшить итоговый размер прошивки. О них - в отдельной статье.

А в целом я бы рекомендовал не рисковать, и для новых разработок, когда трудно предсказать размер будущего кода, взять микроконтроллер чуть дороже с 32 кБ flash памяти. Например - STM32F060.

Введение

внутренняя схема микросхемы акселерометра

Со времени последнего моего обзора акселерометров прошло 13 лет. И как ни странно, мало что поменялось: adxl345 всё ещё в продаже, и пользуется большой популярностью. Но появилось ли что-то новое? Лучше, и дешевле?
ADXL345 я решил поставить первой строкой в таблице, чтобы было видно, что за эти 13 лет изменилось.

Курс рубля скачет, поэтому цену будем писать в долларах.

Общие характеристики акселерометров

 Модель Наличие
гироскопа
Наличие
датчика
магнитного
поля
Напряжение
питания, В
Интерфейсы Пределы 
измерений
Частота
выборки,
(samples/s)
Цена, USD
(2023 г)
ADXL345  -  - 2.0-3.6  I2C, SPI  ±2g, ±4g, ±8g,±16g  0.1-3200  $1.8
QMI8658C  +  - 1.71-3.6  I2C, SPI, I3C, MIPI  ±2g, ±4g, ±8g,±16g  1-1000  $1.6
LSM6DS3 + -  1.71-3.6  I2C, SPI  ±2g, ±4g, ±8g,±16g 1-6667  $0.7
LSM6DSR  + - 1.71-3.6  I2C, SPI, I3C, MIPI  ±2g, ±4g, ±8g,±16g  1.6-6667  $1.7
STK8321  -  -  1.71-3.6  I2C, SPI  ±2g, ±4g, ±8g  7.8-1000  $0.6
BMI160  + -  1.71-3.6  I2C, SPI  ±2g, ±4g, ±8g,±16g  12.5-1600  $2.6
LIS2DW12TR  -  -  1.62-3.6  I2C, SPI  ±2g, ±4g, ±8g,±16g  12.5-1600  $0.8
QMI8610 + - 2.7-3.47  I2C, SPI  ±2g, ±4g, ±8g,±16g  8-1000 $1.6
LIS3DHTR - -  1.71-3.6 I2C, SPI  ±2g, ±4g, ±8g,±16g 1-5000 $0.7
ADXL355  -  -  2.25 - 3.6  I2C, SPI  ±2g, ±4g, ±8g  1-1000  $26.5

Метрологические характеристики

Погрешности, устраняемые калибровкой

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

Модель Погрешность нуля, mg Приведённая погрешность нуля, %
(приведённая к концу наименьшего диапазона)
Погрешность чувствительности
ADXL345  150  7.5  10
QMI8658C  100  5  6
LSM6DS3  40    -
LSM6DSR  10  0.5  1
STK8321  50  2.5  -
BMI160  150  7.5  -
LIS2DW12TR  20 1  -
QMI8610  150 7.5  1
LIS3DHTR 40 2 -
ADXL355 75  3.75  -

Температурные погрешности

Модель Температурный
дрейф нуля, mg/°C 
 Температурная нестабильность
коэффициента преобразования, %/°C
 ADXL345  1 0.02
QMI8658C  0.5 0.04
LSM6DS3  0.5 0.03
LSM6DSR  0.1 0.01
STK8321  1 0.02
BMI160  1 0.03
LIS2DW12TR  0.2 0.01
QMI8610  0.5 0.01
LIS3DHTR 0.5 0.01
ADXL355 0.02 0.01

Другие метрологические характеристики

Модель Разрешение, mg/LSB межосевая
чувствительность, % 
Нелинейность,
% от максимума

Выходной шум

ADXL345  3.9  1 0.5 1.1 LSB
QMI8658C  0.061  2  0.75 0.2 mg/√Hz
LSM6DS3 0.061  - - 0.09 mg/√Hz
LSM6DSR  0.061  -  - 0.06 mg/√Hz
STK8321  0.98  1  0.5 0.2 mg/√Hz
BMI160  0.061  1  0.5 0.3 mg/√Hz
LIS2DW12TR  0.244  -  -  0.09 mg/√Hz
QMI8610  0.061  1  1  50 g√Hz (ошибка в даташите?)
LIS3DHTR 1 - - 0.22 mg/√Hz
ADXL355 0.004 1 0.1 0.022 mg/√Hz

Выводы

Хотя, в продаже появились и акселерометры хуже ADXL345 13 летней давности, есть и акселерометры с весьма впечатляющими характеристиками.

Если не брать дорогой и не всегда доступный ADXL355, то явный лидер обзора LSM6DSR. Если правда всё то, что написано в даташите, то у него невероятно низкие шумы, очень низкая погрешность нуля и довольно низкий температурный дрейф. Настораживает то, что в даташите не указана межосевая чувствительность, очень надеюсь, что она стандартно 1% (маловероятно, что со всеми остальными отличными характеристиками межосевая чувствительность огромная, и производитель её скрывает)

Qt for BeagleBone BlackВведение

На сегодняшний день в сети есть достаточно много мануалов сборки qt4.8 для Raspberry PI или BeagleBone Black, но они уже безвозвратно устарели (изменились опции для ./configure).

В сети уже есть несколько инструкций как собирать qt5.2 и qt5.5, но без дополнительных тайных знаний вы можете потратить много времени и нервов, так ничего и не добившись.

 

За основу я взял статью Simon Stürz : Crosscompile Qt 5.2.1 for the Beaglebone Black и скрипт автоматической сборки, делающий всю работу за вас.

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

Ставим линукс

Есть куча примеров кросс-компиляции под windows, но если вы хотите сэкономить себе время и нервы, используйте Linux. Позже, когда вы разберётесь как всё работает на линуксе, можно уже будет попробовать собрать и под виндой.

Ставить линукс второй операционной системой вовсе не обязательно, вы можете запустить его на виртуальной машине, например при помощи VirtualBox. Такой способ будет даже удобнее: пока идёт сборка qt можно спокойно работать на основной машине.

Ставим Ubuntu 14.04. Если вы ставите Linux на виртуалку, то настоятельно рекомендую именно этот дистрибутив или другой хорошо распространнённый. Посколько в других дистрибутивах могут отличаться названия пакетов.

Подготовка rootfs

Для успешной сборки нам понадобится образ файловой системы с вашего работающего Beaglebone. Это нужно, чтобы слинковаться с конкретными библиотеками, установленными на вашу систему.

Важно: для образа вашей файловой системы используйте SD-карту. Файловую систему на карте памяти намного проще скопировать на компьютер. Делается это через обычный кардридер. Сложнее скопировать файловую систему на внутренней памяти BeagleBone: для этого придётся разбираться с копирование файлов по SSH.

В качестве дистрибутива для BeagleBone я использую Debian 7.9.

Установка обновлений (выполняем на BeagleBone)

Для начала, установим системные обновления:

$ sudo apt-get update
$ sudo apt-get upgrade

Установка зависимостей

Все библиотеки и include-файлы, необходимые для сборки Qt будут браться не с вашего компьютера, а с rootfs BeagleBone. Поэтому, необходимо поставить туда все необходимые пакеты.

Основные зависимости:

$ sudo apt-get install libc6-dev

Зависимости для libxcb:

$ sudo apt-get install "^libxcb.*" libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev

Зависимости для QtMultimedia:

$ sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev

Зависимости для QtWebEngine:

$ sudo apt-get install libcap-dev libbz2-dev libgcrypt11-dev libpci-dev libnss3-dev build-essential libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libdrm-dev libfontconfig1-dev libxtst-dev libasound2-dev gperf libcups2-dev libpulse-dev libudev-dev libssl-dev flex bison ruby

Зависимости для QtConnectivity (поддержка Bluetooth):

$ sudo apt-get install bluez libbluetooth-dev bluetooth bluez-tools

Работы с шиной I2C (если вы не знаете что это такое, то скорее всего вам это не нужно):

$ sudo apt-get install i2c-tools libi2c-dev

Подготовка директории на диске

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

Важно: директория на вашей TARGET-машине будет в точности соответствовать директории на HOST-машине (BeagleBone). Т.е если вы решите производить сборку в /home/vasya/Projects/build. То все пути будут завязаны именно на эту директорию. Настоятельно рекомендуется указывать пути не зависящие от конкретного пользователя. Например /opt/qt-beaglebone/.

Создаём директорию под рутом (т.к. обычный пользователь не может писать в корень диска) и меняем владельца на текущего пользователя:

$ sudo mkdir /opt/qt-beaglebone/
$ sudo chown $USER /opt/qt-beaglebone/

Создание снимка rootfs

Извлекаем карту памяти из BeagleBone, вставляем её в кард-ридер своего компьютера.

Затем монтируем файловую систему sd-карты (под Ubuntu файловая система монтируется сама) и заходим в корень смонтированной файловой системы.

Там выполняем:

$ sudo tar cpjfv /opt/qt-beaglebone/rootfs.tar.bz2 ./
$ sudo chown $USER /opt/qt-beaglebone/rootfs.tar.bz2

 

Сборка QT для кросс-компиляции

Подготовка машины для сборки

Ставим необходимые пакеты:

$ sudo apt-get install lib32z1-dev

Скрипт сборки Qt

Можно было бы самим скачать пакет qt-everywhere-opensource. Наложить на него патч для поддержки BeagleBone и компилятора gcc-linaro-arm-linux-gnueabihf, но есть уже готовый скрипт от товарища Simon Stürz. С 2015 года пути немного поменялись и скрипт безнадёжно устарел. Пришлось его немного допилить. Новый скрипт можно взять здесь.
Если у вас есть rootfs со всеми необходимыми библиотеками, то остальное скрипт сделает за вас. Нужно только его скачать и запустить:

$ cd /opt/qt-beaglebone/
$ wget http://guh.guru/downloads/scripts/crosscompile-Qt_5.2.1-beaglebone-black.sh
$ chmod +x crosscompile-Qt_5.2.1-beaglebone-black.sh
$ ./crosscompile-Qt_5.2.1-beaglebone-black.sh

Скрипт распакует архив с rootfs (лучше не удалять исходный архив. Если что-то пойдёт не так вы всегда сможете вернутся к исходной версии). Далее скрипт скачает дистрибутив Qt-5.2.1, компилятор и начнёт сборку.

Собранный Qt для ARM

Собранный Qt будет лежать на распакованном образе rootfs в директории /opt/qt-beaglebone/. Полный путь на вашей HOST-машине будет: /opt/qt-beaglebone/rootfs/opt/qt-beaglebone/Qt-5.2.1/.

qmake для кросс-компиляции

qmake для кросс-компиляции будет находиться здесь: /opt/qt-beaglebone/Qt-5.2.1

Компилятор будет находиться здесь: /opt/qt-beaglebone/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin

Кросс-компиляция Qt-приложений под ARM

Кросс компиляции Qt-приложений под ARM будет посвещена следующая статья.

Возможные проблемы

Проблемы при сборке Qt для BeagleBone

1. gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-g++: error while loading shared libraries: libstdc++.so.6

Решение: скорее всего не хватает пакетов на вашей сборочной системе:

sudo apt-get install libc6-i386 lib32z1 lib32stdc++6

2. arm-linux-gnueabihf/libz.a: error adding symbols: Bad value

Вместо libz.so тут может быть любая библиотека. Проблема в то, что libz.so не найден на вашей файловой системе. И компилятор пытается использовать вместо динамической либы libz.so статическую libz.a, которой тоже нет на вашей rootfs. Решение: идём в директорию rootfs и создаём libz.so как ссылку на существующую библиотеку (в моём случае это libz.so.1.2.7).

$cd /opt/qt-beaglebone/rootfs/usr/lib/arm-linux-gnueabihf/
$ln -s libz.so.1.2.7 libz.so

Скорее всего тоже самое придётся проделать и для других библиотек. Мне пришлось повторить это действие для libm.so, libdl.so.  Притом в директориях /lib/arm-linux-gnueabihf и /usr/lib/arm-linux-gnueabihf

Внимание! Проверять нужно не только наличие библиотеки *.so но и куда ссылается символическая ссылка.

Например:

$ cd /opt/qt-beaglebone/rootfs/usr/lib/arm-linux-gnueabihf/
$ ls -l |grep libdl

выводит

-rw-r--r-- 1 root root     9022 фев 12  2016 libdl.a
lrwxrwxrwx 1 root root       35 фев 12  2016 libdl.so -> /lib/arm-linux-gnueabihf/libdl.so.2

Т.е. символическая ссылка с абсолютными путями и ссылается не на библиотеку для Beaglebone, а на библиотеку для x86 процессора, на котором мы выполняем сборку.

Исправляем:

$ cd /opt/qt-beaglebone/rootfs/usr/lib/arm-linux-gnueabihf/
$ rm -rf libdl.so
$ ln -s ../../../lib/arm-linux-gnueabihf/libdl-2.13.so libdl.so

3. crosscompile-Qt_5.2.1-beaglebone-black.sh: /opt/qt-beaglebone/Qt-5.2.1/bin/qmake: not found

Найдя директорию Qt-5.2.1, скрипт считает, что всё уже собрано, и пытается запустить qmake, который не собрался из-за ошибки. Самый простой способ будет - удалить директорию Qt-5.2.1.

4. undefined reference to `clock_gettime`

Проблема линковки в librt.so. Для неё также нужно создать символическую ссылку как для libz.so, обозначенной во второй проблеме.

5.  undefined reference to `__dlopen'

Та же самая проблема, что и проблема 2: /usr/lib/arm-linux-gnueabihf/libdl.so отсутствует, либо символическая ссылка ведёт не туда.
Исправляем:

$ cd /opt/qt-beaglebone/rootfs/usr/lib/arm-linux-gnueabihf/
$ rm -rf libdl.so
$ ln -s ../../../lib/arm-linux-gnueabihf/libdl-2.13.so

То же самое нужно сделать и для libm.so.

Если и это не помогает, то удаляем/переименовываем статическую библиотеку, чтобы компилятор начал использовать динамическую:

$ cd /opt/qt-beaglebone/rootfs/usr/lib/arm-linux-gnueabihf/
$ sudo mv libdl.a old-libdl.a

 

BB-VIEW с Debian 7.8

Введение

В новом ядре linux-4.4 переписали механизм работы с deviceTree. Теперь они больше не компилируются вместе с ядром, а поставляются отдельным репозиторием. В прошлый раз, когда я пытался завести китайский 4х дюймовый дисплей WaveShare, никаких адекватных мануалов не было. Максимум, что я смог найти - это исходники модуля для старого ядра (linux-3.8.13). Провозившись неделю я всё-таки собрал своё ядро, с которым не расстаюсь.

Но время меняется, уже давно все перешли на Debian 8.7, но мануалов как подключить дисплей BB-VIEW на новом ядре я так и не нашёл.

Установка Debian 8.7 на BeagleBone

  1. Качаем свежий образ с официального сайта: beagleboard.org/latest-images
  2. Теперь и под линуксом появилась удобная утилита для заливки образа файловой системы на SD-карту. Больше не нужно копировать в консоли через dd, боясь ошибиться и затереть себе содержимой жёсткого диска. Заливаем на SD-карту через Etcher.
  3. Вставляем SD-карту в BB и ждём загрузки

Как найти BeagleBone в сети

Есть несколько стандартных способов подключения к консоли BeagleBone

  • SSH через Ethernet
  • UART через Debug-разъём на плате (нужно купить преобразователь USB->UART)
  • Втыкаем Биглбон в USB-порт, устанавливаем драйвера и на нашем компе создаётся вторая подсеть 192.168.7.0, в которой и будет наш BeagleBOne.

Лично мне проще втыкать Биглбон в роутер и общаться с ним по сети. Только вот одна проблема: как узнать его адрес?

Для этого есть утилита nmap, которая сканирует все живые компьютеры в вашей локальной сети.

Сканируем сеть:

nmap -sP 192.168.1.1/24

Не забудьте справьте на 192.168.0.1, ели у вас нулевая подсеть.

И.... стучимся к каждому найденному айпишнику:

ssh Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.

Один из них обязательно ответит приветствием.

Обновление Debian

Наверное это очевидно, но на всякий случай напишу.

sudo apt-get update
sudo apt-get upgrade

Вполне вероятно, что при этой операции у вас может не хватить свободного места на SD-карте. Не беда. Выключаем Биглбон, вставляем SD-карту в компьютер, а дальше при помощи gparted просто увеличиваем размер соответствующего раздела (главное - не менять начало раздела).

Где брать драйвера дисплея

Проще всего установить оверлеи из репозитория debian.
Обновляем пакет с оверлеями:

sudo apt update ; sudo apt install bb-cape-overlays

Обновляем пакет с оверлеями:

Если не помогло, то можем собрать из исходников

Вообще, репозиторий оверлеев теперь располагается по адресу: https://github.com/beagleboard/bb.org-overlays

Но! Создатели BeagleBone уже всё за вас продумали, и уже склонированный репозиторий находится на SD-карте вашего BeagleBone по адресу: /opt/source/bb.org-overlays

Заходим туда.

Обновляем исходники драйверов до последней версии:

git pull origin master

Обновляем компилятор DTC:

./dtc-overlay.sh

Собираем и устанавливаем *.dtbo драйвера:

./install.sh

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

Как включить нужный *.dtbo драйвер

Рассмотрим на примере 7-дюймового диспле BB-VIEW.

Редактируем файл /boot/uEnv.txt (не забываем sudo, т.к. владелец файла root)

И вставляем туда (ближе к концу) следующие строчки:

cape_disable=bone_capemgr.disable_partno=BB-GREEN-HDMI
cape_enable=bone_capemgr.enable_partno=BB-VIEW-LCD7-01

Первая строчка запрещает загрузку HDMI-драйвера. Т.к. BB-VIEW конфликтует по ножкам с HDMI. Вторая строка - загружает соответствующий модуль.

Перезагружаемся и проверяем.

Типичные проблемы

После перезагрузки через некоторые время все лампочки потухают и устройство выключается

Не хватает питания. Скорее всего выключение BeagleBone происходит в момент включения подсветки дисплея. С дисплеем рекомендуется использовать USB-зарядку с током не менее 2А. Кроме зарядки также важен USB-кабель. Плохой кабель уменьшает ток и напряжение на входе биглбона. Лучше всего брать короткие и толстые кабели.

Как изменить разрешение экрана и неправильные цвета

Картинка с рабочим столом Debian появляется, но сплюснутая и на половину экрана. Как изменить разрешение?

Редактируем файл /etc/X11/xorg.conf.  Находим там раздел Section "Screen", и в нём параметр DefaultDepth. Ставим значение 24. Сохраняем, перезагружаем. Должно работать!

 

 

VTMotor - alternative firmware for the board Seeedstudio Grove - I2C Motor Driver

Updated 13.02.2013

Русская версия статьи (Russian version of the article)

seeedstudio Grove i2c motor driver

Board flashing

I have an old version of the board: v1.1. MOSI and SCK pin labels are confused at the board. If you have troubles flashing it, consider changing MOSI with SCK pins.

Add delay() is not good solution

I connect this board to my robot. It runs under Linux. I use i2c-gpio driver. I use i2cdetect for i2c bus testing.

The i2c bus hangs just after first addressing of the board. New firmware doesn't solve the problem.

At wiki, it is written "Different Arduino IDE may have difference. I use arduino-0019 and it works fine, but when i use arduino - 0022, I need to add some delay() at the end of Wire.endTransmission()."

I don't think it is a good idea to add delays to the i2cdetect or even in the i2c-gpio driver.

Therefore I have decided to write my own firmware.

Alternative firmware VTMotor

The firmware uses AVR Libc (for Linux). There are Windows version WinAVR, but I don't know wheather it is fully compatible.

VTMotor can control two motors. Pwm frequency is fixed (maybe someone will implement support of frequency change). Frequency = 200 Hz.

Cooperation

I would be grateful to receive any report from you. If you want to improve something - please send me a patch to Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript..

Commands

The device address is 0x28.

Command Command code (1 byte) Argument 1 (1 byte) Argument 1 (1 byte) Comments
DRV_WHO_AM_I 0x10 - - Check existance of the device. It must return 0x47
DRV_DRV_ENABLE 0x11 - - Turn on
DRV_DRV_DISABLE 0x12 - - Turn off (Default)
DRV_SET_SPEED 0x13 Left drive speed Right drive speed Value from 0 to 100. (Default is 0)
DRV_SET_DIRECTION 0x14 Left drive direction Right drive direction 0x0 - forward (default); 0x1 - back

 

Download VTMotor firmware

Changelog:

* v1.1 Added firmware for board v1.2, which has different schematics.

Latest stable: firmware + source:

VTMotor v1.1 13.02.1012 

Unstable current version:

https://github.com/vitperov/VTMotor

Collaborators

Denis Morin

 

 

P.S. If you have found any spelling or other mistakes, please write to Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.

Поиск