Ускорьтесь с акселерометрами и Netduino
Мы слышали об акселерометрах тысячи раз, но что они представляют собой на самом деле? Как они работают? И что более важно для читателей Coding4Fun, как с их помощью можно создавать классные устройства и приложения?
Странно, вы должны спросить… Как насчет учебника, который объясняет, как работают акселерометры, как создать проект с Netduino, а также и обсуждает и кодирование?
Акселерометры: библиотека ADXL345 и руководство для Netduino
Введение
Пока акселерометры могут требовать немного понимания, для их использования, это не означает, что они сложны, или требуют черной магии.
В этом руководстве я научу вас использовать акселерометр для управления кубом, мы увидим, как различные подходы изменяют его реакцию, и выясним, какой подход является наилучшим для данного приложения.
Что такое акселерометр?
Акселерометр – принадлежит к семье сенсоров движения, состоящей из акселерометров, гироскопов и компасов. В данном руководстве мы поговорим главным образом об акселерометрах, однако в следующих руководствах мы затронем и другие датчики, создавая полноценный внутренний измерительный модуль.
Акселерометр – прибор, измеряющий ускорение. Пока достаточно просто, но имеется два типа акселерометров: статическое ускорение (наклон) и динамическое ускорение (движение).
Вход акселерометра, говорит пользователю, в каком направлении к своим осям действует приложенная сила. Хорошая новость состоит в том, что акселерометр улавливает все виды движения, что означает, что можете получить он него всю возможную информацию. Плохая новость заключается в том, что акселерометр собирает все виды движения, что означает, что вы не знаете, на что вы смотрите!
...
Статья дает представление о том, как работает акселерометр
Итак, наша первая проблема с акселерометром состоит в том, как выделить нужное значение из набора сил. Имея всю информации о том, куда указывает гравитация и как пользователь перемещает устройство, становится сложно получить от сенсора то, что требуется.
Другая проблема связана с тем, что акселерометры – крайне шумные устройства, и я не имею в виду, что они играют громкую музыку в три утра. Их выходной сигнал всегда флуктуирует, они имеют собственные резонансные шумы, они фиксируют вибрации устройства, в которое они вмонтированы, всевозможные помехи влезают в сигнал, который нам нужно отфильтровать.
Итак, нам надо понять какие данные мы получаем от акселерометра, и отфильтровать их.
Как решить эту проблему?
Есть несколько разных способов решения этих проблем. В следующей секции мы пройдем по всему процессу обмена данными с сенсором, получению «сырых» данных, их фильтрации и использования результатов.
Решение.
Существует множество различных производителей акселерометров, Analog Devices выпускает прекрасные датчики, наряду с Invensense. Существуют многие и многие разные типы устройств, которые вы можете выбрать, а выбор наилучшего требует специального руководства! Поэтому мы используем тот акселерометр, который применяем постоянно на Love Electronics – ADXL345.
Этот отличный компактный чип – выгодная покупка. Это трехосевой цифровой акселерометр с хорошим диапазоном измерений (вплоть до 16g) с очень хорошим разрешением (13 разрядов, 4 mg/LSB). Хотя большинство из этих параметров явно излишни для куба, никогда не мешает иметь как можно более надежные данные. Чес с более точными данными мы имеем дело, тем лучше будут результаты.
Если вы решите последовать этому руководству, вам понадобиться плата ADXL345 и Netduino, а также Windows ПК с Visual Studio 2010 (версия Express Edition свободно доступна).
Кроме того требуется способ подсоединить последовательный порт Netduino к вашему ПК, так как Netduino в настоящее время не обеспечивает отправку последовательных данных через USB-соединение. Я рекомендую использовать плату USB to Serial Breakout Board.
C этого момента в статье начинается создание аппаратной платформы и обсуждение кода:
...
Чтение данных.
Отлично, мы подключились к акселерометру и хотим прочитать данные с устройства. Чтобы сделать это, скопируйте следующий код с метод Main файла Program.cs и прочтите в комментариях, что делает каждая часть кода.
// Создайте экземпляр акселерометра ADXL345. ADXL345 accel = new ADXL345(); // Убедитесь, что удалось к нему подключиться // (будет сгенерировано исключение, если он не отвечает). accel.EnsureConnected(); // Задайте диапазон измерения акселерометра +/- 2g. accel.Range = 2; // Задайте полное разрешение. accel.FullResolution = true; // Разрешите измерения на устройстве. accel.EnableMeasurements(); // Задайте темп передачи данных в 50 Гц accel.SetDataRate(0x0A); double yAxisGs, xAxisGs; // Здесь хранятся данные, полученные от акселерометра. double yAxisRadians, xAxisRadians; // Здесь хранятся преобразованные в радианы значения. // Таймер позволяет задать частоту измерений, мы зададим период в 20 мс, //что соответствует темпу измерений, заданному для акселерометра int timerPeriod = 20; Timer timer = new Timer(delegate(object o) { // Получить данные от акселерометра. accel.ReadAllAxis(); // Получить ускорения по двум осям в g. yAxisGs = accel.ScaledYAxisG; xAxisGs = accel.ScaledXAxisG; // Нас интересуют величины в диапазоне от -1g до +1g, отбросим остальное. if (yAxisGs > 1) yAxisGs = 1; else if(yAxisGs < -1) yAxisGs = -1; if (xAxisGs > 1) xAxisGs = 1; else if (xAxisGs < -1) xAxisGs = -1; // Вычислить углы для каждой оси, используя функцию Asin. yAxisRadians = ExMath.Asin(yAxisGs); xAxisRadians = ExMath.Asin(xAxisGs); Debug.Print("X: " + xAxisRadians + "\t\tY: " + yAxisRadians); }, null, 0, timerPeriod); // Убедиться, что устройство запустило таймер и не прекратило выполнение. while (true) { Thread.Sleep(Timeout.Infinite); }
Если вы попытаетесь запустить этот код, то получите ошибку компиляции, связанную с тем, что Visual Studio не может найти ExMath. Это происходит потому, что это вызов находится в проекте LoveElectronics . Resources, который был в скачанном вами архивном файле Love Electronics Accelerometer. Просто добавьте это проект в решению, как вы сделали с проектом акселерометра, и выполните AddReference ... еще раз, чтобы сделать доступным ExMath для приложения. Теперь просто добавьте
using LoveElectronics.Resources;
как вы делали прежде и теперь ваше предложение должно скомпилироваться.
Статья продолжается демонстрацией того, как отфильтровать данные и представить их в наглядной форме.
Если вы хотите добавить возможности акселерометра к следующему проекту Netduino, или просто интересуетесь, как он работает, эта статья станет интересным чтением.
Вот несколько ссылок, которые могут оказаться интересными: