Adxl345 klipper arduino

Как подключить цифровой акселерометр ADXL345 к Arduino

  • Arduino UNO или иная совместимая плата;
  • модуль GY-291 или аналогичный с цифровым акселерометром ADXL345;
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1 Описание модуля GY-291 с акселерометром ADXL345

Акселерометр – это устройство, которое позволяет измерить динамическое и статическое ускорение по трём осям X, Y и Z. Благодаря статическому ускорению можно определить положение в пространстве (акселерометр как датчик поворота), а благодаря динамическому (движение или встряска) – направление ускорения.

Цифровой акселерометр ADXL345 – это 3-осевой акселерометр с высоким разрешением (13 бит) по осям с пределом до ±16g. Модуль обладает пониженным энергопотреблением и малыми размерами. Информационный обмен с модулем осуществляется по последовательным интерфейсам I2C или SPI (3- или 4-проводной).

Существует множество модулей для Arduino с акселерометром ADXL345. Модуль может выглядеть, например, так:

Внешний вид модуля GY-291 с цифровым акселерометром ADXL345

Показанный модуль имеет название GY-291. У модуля имеются следующие выводы:

Вывод модуля Назначение Подключать к выводу Arduino
SPI I2C
GND Земля GND GND
VCC Питание +3,3V +3,3V
CS Выбор ведомого интерфейса SPI 10
INT1 Выход прерывания 1 (*)
INT2 Выход прерывания 2 (*)
SDO Данные от ведомого 12
SDA Данные от мастера интерфейса SPI
Шина данных интерфейса I2C
11 A4
SCL Шина тактирования 13 A5

(*) Работы с прерываниями ADXL345 касаться в этой статье не будем. Вот есть хорошая статья, в которой достаточно подробно описан вопрос работы с прерываниями.

В зависимости от выбранного интерфейса – SPI или I2C – подключение модуля будет соответствующим, как показано в таблице. Но в обоих случаях очень простым.

Рассмотрим структуру регистров микросхемы ADXL345:

Карта регистров цифрового акселерометра ADXL345

Кроме того, нас интересует регистр управления питанием, т.к. он отвечает за режим работы устройства:

Регистр управления питанием цифрового акселерометра ADXL345

Как видим, бит D3 (Measure) переключает акселерометр в режим измерения.

2 Работа с цифровым акселерометром ADXL345 по интерфейсу SPI

Акселерометр ADXL345 поддерживает 3- и 4-проводные варианты интерфейса SPI. Мы рассмотрим только 4-проводное подключение. Кроме того, акселерометр работает в режиме 3 интерфейса SPI (помните, мы уже обсуждали: CPOL =1, CPHA =1). Диаграмма, показывающая обмен с акселерометром ADXL345 по 4-проводному интерфейсу SPI:

Работа с ADXL345 по SPI

Здесь бит MB – это признак того, что мы собираемся читать много байтов за раз (если бит установлен в 1). Для тестирования работы с SPI устройствами и быстрого освоения порядка обмена с ними я обычно использую отладочную плату с микросхемой FT2232H. Эта микросхема поддерживает множество режимов, в том числе I2C и SPI. Управление работой микросхемы FT2232H – с помощью программы SPI via FTDI, о которой я уже неоднократно рассказывал.

Подключим акселерометр к отладочной плате и прочитаем регистр DEVID, в котором хранится постоянное значение-идентификатор акселерометра ADXL345. Значение идентификатора должно быть 0xE5.

ADXL345 соединён с отладочной платой на FT2232H

Не забудем перед чтением записать команду 0x80, которая укажет акселерометру, что мы собираемся читать, начиная с регистра по адресу 0x0 (см. диаграмму выше, рисунок 38 – SPI 4-Wire Read):

Чтение регистра ID акселерометра ADXL345 по SPI

Видно, что в регистре содержится число 0xE5, которое и является значением идентификатора акселерометра ADXL345, согласно техническому описанию (datasheet). Вот как это выглядит на временной диаграмме:

Временная диаграмма чтения регистра ID акселерометра ADXL345 по SPI

Устройство отвечает, всё нормально. Теперь нам нужно перевести акселерометр в режим измерений. Для этого необходимо записать в регистр POWER_CTL (адрес регистра 0x2D) число 0x08 (установить бит Measure в HIGH). После этого можно начинать читать регистры с 0x32 по 0x37, в которых хранятся данные об ускорениях по трём осям. Сделаем это с помощью Arduino. Напишем такой скетч:

Скетч для чтения данных ADXL345 по SPI (разворачивается)

Вот так выглядит временная диаграмма работы этого скетча:

Временная диаграмма чтения значений по осям X, Y, Z акселерометра ADXL345

Ясно, почему первый байт передачи от Arduino при чтении значений ускорений по осям – число 0xF2? Это адрес первого регистра, с которого начинаем чтение (0x32), объединённый по ИЛИ с 0x80 – маркером чтения READ – и с 0x40 – маркером многобайтовой передачи MB: 0x32 OR 0x80 OR 0x40 = 0011_0010 OR 1000_0000 OR 0100_0000 = 1110_1101 = 0xF2

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

3 Работа с цифровым акселерометром ADXL345 по интерфейсу I2C

Временная диаграмма информационного обмена с ADXL345 по интерфейсу I2C выглядит так:

Диаграмма обмена с ADXL345 по I2C

Давайте перепишем скетч для Arduino, который будет делать всё то же самое, только с обменом по интерфейсу I2C:

Скетч для чтения данных ADXL345 по I2C (разворачивается)

Диаграмма чтения регистра DEVID цифрового акселерометра ADXL345 при обмене по последовательному интерфейсу I2C будет в этом случае такой:

Диаграмма чтения регистра DEVID акселерометра ADXL345 по I2C

Как видно, ADXL345 возвращает нам ожидаемое значение 0xE5. А вот так будет выглядеть диаграмма чтения регистров, в которых хранятся данные по осям XYZ:

Диаграмма чтения регистров данных X, Y, Z акселерометра ADXL345 по I2C

Тут всё ещё проще, чем при работе с интерфейсом SPI.

4 Разбор показаний цифрового акселерометра ADXL345

Посмотрите на фотографию ниже. На плате модуля нарисованы три оси: X, Y и Z. Они показывают направление осей акселерометра. Направления осей обусловлены расположением микросхемы ADXL345 на плате. В данном случае ось X акселерометра направлена горизонтально вправо, ось Z направлена горизонтально на нас, ось Y – вертикально вверх.

Акселерометр ADXL345 на макетной плате

А вот что выводит наш скетч в монитор последовательного порта среды Arduino IDE (надо уточнить, что данный вывод наблюдается в режиме покоя – акселерометр неподвижно лежит на столе в положении, как на приведённом фото):

Данные ускорений по X, Y, Z акселерометра ADXL345 в мониторе последовательного порта Arduino IDE

В трёх столбцах представлено значение статического ускорения, измеренное акселерометром по осям X, Y и Z, соответственно. В среднем столбце – показания оси Y – значения больше, чем в двух других. Эти значения даны в условных отсчётах, как они записаны в регистрах акселерометра. Акселерометр ADXL345 имеет несколько диапазонов измерений. Давайте посмотрим на сводную таблицу диапазонов и разрешений датчика акселерометра:

Параметры датчика ADXL345

Напомню, что g – это ускорение свободного падения, численно равное примерно 9,81 метр в секунду за секунду (м/с 2 ).

Диапазон по умолчанию – от −16g до +16g (размах 32g). Согласно таблице, на этот диапазон ускорений приходится 13 бит точности или 2 13 = 8192 отсчёта. Таким образом, на 1 отсчёт приходится ускорение 32g/8192 = 0,00390625g=0,00390625×9,81 ≈ 0,038 м/с 2 . Имея это в виду, получается, что в данном выводе скетча ускорение составляет:

Ось акселерометра Ускорение по оси, м/с 2
X 0,76
Y 10,4
Z −0,12

Что ж, вполне логично. Ось Y направлена вертикально, т.е. вдоль вектора силы земного притяжения, и значение ускорения примерно равно константе g. Ускорения по осям X и Z, которые лежат в одной горизонтальной плоскости, примерно одинаковы и находятся около 0. Из-за кривизны стола, на котором стоит датчик, значения немного отличаются. Если бы я выровнял акселерометр по уровню, то его показания были бы более точные. В идеальном случае по оси Y должно быть ускорение 9,8 м/с 2 , а по осям X и Z – 0.

Кроме того, датчик ADXL345 имеет возможность тонкой настройки и калибровки. В данном примере мы этого не делали, а использовали акселерометр с заводскими настройками, как есть. Отсутствие калибровки также может вносить некоторые искажения в показания датчика. Рекомендую применять специальные библиотеки Arduino, которые упрощают взаимодействие с акселерометром ADXL345, в частности, позволяют проводить тонкую настройку.

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

В архиве также лежит техническое описание (datasheet) на цифровой акселерометр ADXL345. Установка библиотеки производится путём копирования разархивированной папки с библиотекой в директорию libraries среды Arduino IDE.

Источник

Measuring Resonances¶

Klipper has built-in support for ADXL345 accelerometer, which can be used to measure resonance frequencies of the printer for different axes, and auto-tune input shapers to compensate for resonances. Note that using ADXL345 requires some soldering and crimping. ADXL345 can be connected to a Raspberry Pi directly, or to an SPI interface of an MCU board (it needs to be reasonably fast).

When sourcing ADXL345, be aware that there is a variety of different PCB board designs and different clones of them. Make sure that the board supports SPI mode (small number of boards appear to be hard-configured for I2C by pulling SDO to GND), and, if it is going to be connected to a 5V printer MCU, that it has a voltage regulator and a level shifter.

Installation instructions¶

Wiring¶

You need to connect ADXL345 to your Raspberry Pi via SPI. Note that the I2C connection, which is suggested by ADXL345 documentation, has too low throughput and will not work. The recommended connection scheme:

ADXL345 pin RPi pin RPi pin name
3V3 (or VCC) 01 3.3v DC power
GND 06 Ground
CS 24 GPIO08 (SPI0_CE0_N)
SDO 21 GPIO09 (SPI0_MISO)
SDA 19 GPIO10 (SPI0_MOSI)
SCL 23 GPIO11 (SPI0_SCLK)

An alternative to the ADXL345 is the MPU-9250 (or MPU-6050). This accelerometer has been tested to work over I2C on the RPi at 400kbaud. Recommended connection scheme for I2C:

MPU-9250 pin RPi pin RPi pin name
3V3 (or VCC) 01 3.3v DC power
GND 09 Ground
SDA 03 GPIO02 (SDA1)
SCL 05 GPIO03 (SCL1)

Fritzing wiring diagrams for some of the ADXL345 boards:

Double-check your wiring before powering up the Raspberry Pi to prevent damaging it or the accelerometer.

Mounting the accelerometer¶

The accelerometer must be attached to the toolhead. One needs to design a proper mount that fits their own 3D printer. It is better to align the axes of the accelerometer with the printer’s axes (but if it makes it more convenient, axes can be swapped — i.e. no need to align X axis with X and so forth — it should be fine even if Z axis of accelerometer is X axis of the printer, etc.).

An example of mounting ADXL345 on the SmartEffector:

Note that on a bed slinger printer one must design 2 mounts: one for the toolhead and one for the bed, and run the measurements twice. See the corresponding section for more details.

Attention: make sure the accelerometer and any screws that hold it in place do not touch any metal parts of the printer. Basically, the mount must be designed such as to ensure the electrical isolation of the accelerometer from the printer frame. Failing to ensure that can create a ground loop in the system that may damage the electronics.

Software installation¶

Note that resonance measurements and shaper auto-calibration require additional software dependencies not installed by default. First, run on your Raspberry Pi the following commands:

Next, in order to install NumPy in the Klipper environment, run the command:

Note that, depending on the performance of the CPU, it may take a lot of time, up to 10-20 minutes. Be patient and wait for the completion of the installation. On some occasions, if the board has too little RAM the installation may fail and you will need to enable swap.

Afterwards, check and follow the instructions in the RPi Microcontroller document to setup the «linux mcu» on the Raspberry Pi.

Make sure the Linux SPI driver is enabled by running sudo raspi-config and enabling SPI under the «Interfacing options» menu.

For the ADXL345, add the following to the printer.cfg file:

It is advised to start with 1 probe point, in the middle of the print bed, slightly above it.

For the MPU-9250, make sure the Linux I2C driver is enabled and the baud rate is set to 400000 (see Enabling I2C section for more details). Then, add the following to the printer.cfg:

Restart Klipper via the RESTART command.

Measuring the resonances¶

Checking the setup¶

Now you can test a connection.

  • For «non bed-slingers» (e.g. one accelerometer), in Octoprint, enter ACCELEROMETER_QUERY
  • For «bed-slingers» (e.g. more than one accelerometer), enter ACCELEROMETER_QUERY CHIP= where is the name of the chip as-entered, e.g. CHIP=bed (see: bed-slinger) for all installed accelerometer chips.

You should see the current measurements from the accelerometer, including the free-fall acceleration, e.g.

If you get an error like Invalid adxl345 id (got xx vs e5) , where xx is some other ID, it is indicative of the connection problem with ADXL345, or the faulty sensor. Double-check the power, the wiring (that it matches the schematics, no wire is broken or loose, etc.), and soldering quality.

Next, try running MEASURE_AXES_NOISE in Octoprint, you should get some baseline numbers for the noise of accelerometer on the axes (should be somewhere in the range of

1-100). Too high axes noise (e.g. 1000 and more) can be indicative of the sensor issues, problems with its power, or too noisy imbalanced fans on a 3D printer.

Measuring the resonances¶

Now you can run some real-life tests. Run the following command:

Note that it will create vibrations on X axis. It will also disable input shaping if it was enabled previously, as it is not valid to run the resonance testing with the input shaper enabled.

Attention! Be sure to observe the printer for the first time, to make sure the vibrations do not become too violent ( M112 command can be used to abort the test in case of emergency; hopefully it will not come to this though). If the vibrations do get too strong, you can attempt to specify a lower than the default value for accel_per_hz parameter in [resonance_tester] section, e.g.

If it works for X axis, run for Y axis as well:

This will generate 2 CSV files ( /tmp/resonances_x_*.csv and /tmp/resonances_y_*.csv ). These files can be processed with the stand-alone script on a Raspberry Pi. To do that, run the following commands:

This script will generate the charts /tmp/shaper_calibrate_x.png and /tmp/shaper_calibrate_y.png with frequency responses. You will also get the suggested frequencies for each input shaper, as well as which input shaper is recommended for your setup. For example:

The suggested configuration can be added to [input_shaper] section of printer.cfg , e.g.:

or you can choose some other configuration yourself based on the generated charts: peaks in the power spectral density on the charts correspond to the resonance frequencies of the printer.

Note that alternatively you can run the input shaper autocalibration from Klipper directly, which can be convenient, for example, for the input shaper re-calibration.

Bed-slinger printers¶

If your printer is a bed slinger printer, you will need to change the location of the accelerometer between the measurements for X and Y axes: measure the resonances of X axis with the accelerometer attached to the toolhead and the resonances of Y axis — to the bed (the usual bed slinger setup).

However, you can also connect two accelerometers simultaneously, though they must be connected to different boards (say, to an RPi and printer MCU board), or to two different physical SPI interfaces on the same board (rarely available). Then they can be configured in the following manner:

Then the commands TEST_RESONANCES AXIS=X and TEST_RESONANCES AXIS=Y will use the correct accelerometer for each axis.

Max smoothing¶

Keep in mind that the input shaper can create some smoothing in parts. Automatic tuning of the input shaper performed by calibrate_shaper.py script or SHAPER_CALIBRATE command tries not to exacerbate the smoothing, but at the same time they try to minimize the resulting vibrations. Sometimes they can make a sub-optimal choice of the shaper frequency, or maybe you simply prefer to have less smoothing in parts at the expense of a larger remaining vibrations. In these cases, you can request to limit the maximum smoothing from the input shaper.

Let’s consider the following results from the automatic tuning:

Note that the reported smoothing values are some abstract projected values. These values can be used to compare different configurations: the higher the value, the more smoothing a shaper will create. However, these smoothing scores do not represent any real measure of smoothing, because the actual smoothing depends on max_accel and square_corner_velocity parameters. Therefore, you should print some test prints to see how much smoothing exactly a chosen configuration creates.

In the example above the suggested shaper parameters are not bad, but what if you want to get less smoothing on the X axis? You can try to limit the maximum shaper smoothing using the following command:

which limits the smoothing to 0.2 score. Now you can get the following result:

If you compare to the previously suggested parameters, the vibrations are a bit larger, but the smoothing is significantly smaller than previously, allowing larger maximum acceleration.

When deciding which max_smoothing parameter to choose, you can use a trial-and-error approach. Try a few different values and see which results you get. Note that the actual smoothing produced by the input shaper depends, primarily, on the lowest resonance frequency of the printer: the higher the frequency of the lowest resonance — the smaller the smoothing. Therefore, if you request the script to find a configuration of the input shaper with the unrealistically small smoothing, it will be at the expense of increased ringing at the lowest resonance frequencies (which are, typically, also more prominently visible in prints). So, always double-check the projected remaining vibrations reported by the script and make sure they are not too high.

Note that if you chose a good max_smoothing value for both of your axes, you can store it in the printer.cfg as

Then, if you rerun the input shaper auto-tuning using SHAPER_CALIBRATE Klipper command in the future, it will use the stored max_smoothing value as a reference.

Selecting max_accel¶

Since the input shaper can create some smoothing in parts, especially at high accelerations, you will still need to choose the max_accel value that does not create too much smoothing in the printed parts. A calibration script provides an estimate for max_accel parameter that should not create too much smoothing. Note that the max_accel as displayed by the calibration script is only a theoretical maximum at which the respective shaper is still able to work without producing too much smoothing. It is by no means a recommendation to set this acceleration for printing. The maximum acceleration your printer is able to sustain depends on its mechanical properties and the maximum torque of the used stepper motors. Therefore, it is suggested to set max_accel in [printer] section that does not exceed the estimated values for X and Y axes, likely with some conservative safety margin.

Alternatively, follow this part of the input shaper tuning guide and print the test model to choose max_accel parameter experimentally.

The same notice applies to the input shaper auto-calibration with SHAPER_CALIBRATE command: it is still necessary to choose the right max_accel value after the auto-calibration, and the suggested acceleration limits will not be applied automatically.

If you are doing a shaper re-calibration and the reported smoothing for the suggested shaper configuration is almost the same as what you got during the previous calibration, this step can be skipped.

Testing custom axes¶

TEST_RESONANCES command supports custom axes. While this is not really useful for input shaper calibration, it can be used to study printer resonances in-depth and to check, for example, belt tension.

To check the belt tension on CoreXY printers, execute

and use graph_accelerometer.py to process the generated files, e.g.

which will generate /tmp/resonances.png comparing the resonances.

For Delta printers with the default tower placement (tower A

= 330 degrees, and C

= 90 degrees), execute

and then use the same command

to generate /tmp/resonances.png comparing the resonances.

Input Shaper auto-calibration¶

Besides manually choosing the appropriate parameters for the input shaper feature, it is also possible to run the auto-tuning for the input shaper directly from Klipper. Run the following command via Octoprint terminal:

This will run the full test for both axes and generate the csv output ( /tmp/calibration_data_*.csv by default) for the frequency response and the suggested input shapers. You will also get the suggested frequencies for each input shaper, as well as which input shaper is recommended for your setup, on Octoprint console. For example:

If you agree with the suggested parameters, you can execute SAVE_CONFIG now to save them and restart the Klipper. Note that this will not update max_accel value in [printer] section. You should update it manually following the considerations in Selecting max_accel section.

If your printer is a bed slinger printer, you can specify which axis to test, so that you can change the accelerometer mounting point between the tests (by default the test is performed for both axes):

You can execute SAVE_CONFIG twice — after calibrating each axis.

However, if you connected two accelerometers simultaneously, you simply run SHAPER_CALIBRATE without specifying an axis to calibrate the input shaper for both axes in one go.

Input Shaper re-calibration¶

SHAPER_CALIBRATE command can be also used to re-calibrate the input shaper in the future, especially if some changes to the printer that can affect its kinematics are made. One can either re-run the full calibration using SHAPER_CALIBRATE command, or restrict the auto-calibration to a single axis by supplying AXIS= parameter, like

Warning! It is not advisable to run the shaper autocalibration very frequently (e.g. before every print, or every day). In order to determine resonance frequencies, autocalibration creates intensive vibrations on each of the axes. Generally, 3D printers are not designed to withstand a prolonged exposure to vibrations near the resonance frequencies. Doing so may increase wear of the printer components and reduce their lifespan. There is also an increased risk of some parts unscrewing or becoming loose. Always check that all parts of the printer (including the ones that may normally not move) are securely fixed in place after each auto-tuning.

Also, due to some noise in measurements, it is possible that the tuning results will be slightly different from one calibration run to another one. Still, it is not expected that the noise will affect the print quality too much. However, it is still advised to double-check the suggested parameters, and print some test prints before using them to confirm they are good.

Offline processing of the accelerometer data¶

It is possible to generate the raw accelerometer data and process it offline (e.g. on a host machine), for example to find resonances. In order to do so, run the following commands via Octoprint terminal:

ignoring any errors for SET_INPUT_SHAPER command. For TEST_RESONANCES command, specify the desired test axis. The raw data will be written into /tmp directory on the RPi.

The raw data can also be obtained by running the command ACCELEROMETER_MEASURE command twice during some normal printer activity — first to start the measurements, and then to stop them and write the output file. Refer to G-Codes for more details.

The data can be processed later by the following scripts: scripts/graph_accelerometer.py and scripts/calibrate_shaper.py . Both of them accept one or several raw csv files as the input depending on the mode. The graph_accelerometer.py script supports several modes of operation:

  • plotting raw accelerometer data (use -r parameter), only 1 input is supported;
  • plotting a frequency response (no extra parameters required), if multiple inputs are specified, the average frequency response is computed;
  • comparison of the frequency response between several inputs (use -c parameter); you can additionally specify which accelerometer axis to consider via -a x , -a y or -a z parameter (if none specified, the sum of vibrations for all axes is used);
  • plotting the spectrogram (use -s parameter), only 1 input is supported; you can additionally specify which accelerometer axis to consider via -a x , -a y or -a z parameter (if none specified, the sum of vibrations for all axes is used).

Источник

Adblock
detector