Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Умная стелька «сделай сам» для проверки распределения давления

Компоненты и расходные материалы

Arduino MKR1000
× 1
Чувствительный к силе резистор
Я использовал модель Interlink 402
× 3
Проводной кабель OpenBuilds - пешком
× 1
Резистор 10 кОм
× 3
Power Bank
× 1
Прорыв трехосного акселерометра SparkFun - ADXL345
× 1

Необходимые инструменты и машины

Паяльник (общий)
Не забудьте купить припой, термоусадку и другие подходящие аксессуары, если у вас их нет

Приложения и онлайн-сервисы

Платформа Thinger.io
IDE Arduino

Об этом проекте

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

Требуемое оборудование

  • Arduino MKR1000 - большинство плат на 3,3 В или 5 В с Wi-Fi справятся с этой задачей, но я бы не рекомендовал использовать для этого ESP. По какой-то причине несколько плат ESP вернули неточные измерения при создании этого проекта.
  • Резисторы, чувствительные к силе (3). Я использовал Interlink 402 (100 Н). Я также использовал еще один дорогой Interlink 406, но, оглядываясь назад, 402 тоже сработал бы. Для большей точности используйте больше FSR.
  • Резисторы 10 кОм. Измените резистор, чтобы масштабировать показания в желаемом диапазоне. Чем выше резисторы, тем больше шаг. Дополнительную информацию об этом можно найти здесь.
  • Акселерометр, я использовал ADXL345 16G. Используйте это для измерения ускорения и движения стопы.
  • Паяльник, чтобы собрать все вместе. Зажимы из кожи аллигатора не подходят для обуви по очевидным причинам.

Подключение

Небольшие заметки о схеме:

FSR: Прочитать это до вы начало пайка: будьте предельно осторожны при пайке проводов к FSR. Не пытайтесь сделать это, если не уверены, что у вас есть навыки. Паять нужно очень быстро или пластик плавится. Поверьте, я выяснил это на собственном горьком опыте ...

В FSR нет положительных или отрицательных сторон, так что вам не о чем беспокоиться.

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

Земля / 5 В: Как видите, все датчики припаяны к линии 5В и общей.

Акселерометр: Вы можете не использовать акселерометр, если он вам не нужен для вашего проекта. Необязательно использовать его, если вы просто хотите измерить давление, но он может пригодиться, если вы хотите измерить ускорение или если вам нужно проанализировать цикл походки. Однако в этом руководстве это не является строго обязательным.

Крепление фурнитуры к стельке

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

FSR прикрепляются к трем точкам стельки. Верхний левый FSR измеряет выворот, верхний правый FSR измеряет инверсию, а FSR на пятке измеряет давление пятки. Найти подходящее место для FSR - дело попытки. Лучше всего их прикреплять в том месте, где аналоговое значение больше всего изменяется при ходьбе.

Лента используется для удержания проводов на месте. Если они двигаются, это может помешать показаниям FSR. Я также использовал липкую ленту внизу подошвы и внутри обуви, чтобы удерживать стельку на месте.

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

Измерение сил

Теперь мы готовы измерить силы. Примечание. В следующих двух разделах я предполагаю, что знаком с библиотекой Thinger.io. Для получения дополнительной информации об этом я обращаюсь к разделу «отправка данных через Thinger.io».

Программа имеет довольно длинный заголовок, включая переменные, необходимые для настройки, такие как данные подключения к WiFi. В эту часть также входят глобальные переменные, в основном массивы, используемые в программе. Я сделал один важный выбор - максимально использовать массивы. Идея состоит в том, чтобы использовать отдельные элементы массива для каждого датчика FSR. Таким образом, в этом случае массивы имеют длину 3.

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

Код объяснен в комментариях. Мы рассмотрим код шаг за шагом. Вы можете скачать полный код ниже.

  #define _DEBUG_ // позволяет нам использовать Serial Monitor 
#include
#include
#include // Акселерометр
#include // Акселерометр
#include // Акселерометр
#include
#define USERNAME "yourUsername"
#define DEVICE_ID "yourDeviceID"
#define DEVICE_CREDENTIAL "yourDeviceCredential"
#define SSID "yourSSID"
#define SSID_PASSWORD "yourSSIDPassword"
// * Датчики FSR * /
#define noFSRs 3 // Количество подключенных FSR
#define FSR1 A1
#define FSR2 A2
#define FSR3 A3
float fsrVoltageArray [3 ]; // Аналоговое значение преобразовано и преобразовано в напряжение как число с плавающей запятой
float fsrForceArray [3]; // Сила в Ньютоне
float fsrWeightInGramsArray [3]; // Вес преобразован в граммы
int pinArray [3] ={FSR1, FSR2, FSR3}; // ID вывода для трех устройств
float forceMaxArray [3] ={100.0, 100.0, 100.0}; // Максимальные поддерживаемые силы
float Million =1000000.0; // Единица для "1 / микро
преобразование числа с плавающей запятойToKgrams =1.0 / 9.80665;
long K =1000;
long R =10 * K; // R в кОм
long Vcc =5000; // 5 В =5000 мВ, 3,3 В =3300 мВ
Float VoltageMax =0,98 * Vcc; // Максимальное напряжение установлено на 95% от Vcc. Установите максимальную силу, превышающую это значение.
ThingerWifi101 вещь (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);

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

Мы хотим визуализировать результаты. Для этого мы используем Wi-Fi библиотеку Thinger.io. Это соединение устанавливается через следующую строку:

  ThingerWifi101 вещь (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);  

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

В функции setup () сначала устанавливается последовательное соединение. Затем следует вызов для создания соединения Wi-Fi.

  void setup (void) {
Serial.begin (115200); // Запуск последовательной связи
thing.add_wifi (SSID, SSID_PASSWORD); // вызов для настройки функции WiFi
}
void loop (void) {
thing.handle ();
}

Затем мы определяем «вещь» под названием «давление». «Вещь» - это ключевая концепция библиотеки Thinger.io. Он ведет себя как функция, но имеет особую структуру. Необходимо отправить данные результата в облако. Более подробную информацию об этой библиотеке можно найти в разделе «Отправка данных через Thinger.io».

«Вещь» под названием «давление» считывает значения трех датчиков FSR и печатает их на последовательной консоли. Такие же значения отправляются и в "выходной" канал. Таким образом, мы можем легко проверить необработанные входные данные.

В «вещи» с именем «Voltage» значения напряжения считываются и сохраняются в локальной переменной с именем «fsrReading». С помощью функции «map» значение масштабируется относительно минимального и максимального поддерживаемых значений и возвращается в массив «fsrVoltageArray». С помощью цикла for мы гарантируем, что каждый FSR имеет собственное местоположение в этом массиве результатов.

Обратите внимание, что весь код помещается в функцию настройки. Не кладите ничего внутрь цикла (как вы, наверное, привыкли). Библиотека Thinger.io не справится с этим ...

  void setup (void) {
Serial.begin (115200); // Запуск последовательной связи
thing.add_wifi (SSID, SSID_PASSWORD); // вызов для настройки функции WiFi
/ * датчики FSR * /
thing ["pressure"]>> [] (pson &out) {
out ["FSR1"] =analogRead (FSR1);
Serial.print ("FSR1:");
Serial.println (analogRead (FSR1));
out ["FSR2"] =analogRead (FSR2);
Serial.print ("FSR2:");
Serial.println (analogRead (FSR2));
out ["FSR3"] =analogRead (FSR3);
Serial.print ( «FSR3:»);
Serial.println (analogRead (FSR3));
};
вещь ["напряжение"]>> [] (pson &out) {
for (int FSR =0; FSR fsrVoltageArray [ FSR] =0,0; // Сбрасывать значения при входе
fsrForceArray [FSR] =0.0;
int fsrPin =pinArray [FSR];
int fsrReading =analogRead (fsrPin);
fsrVoltageArray [FSR] =(float) map (fsrReading, 0, 1023, 0, 5000); // измените 5000 на другое значение, если вы не используете устройство на 5 В
} // конец цикла через FSR
out ["FSR1voltage"] =fsrVoltageArray [0];
out ["FSR2voltage"] =fsrVoltageArray [1];
out ["FSR3voltage"] =fsrVoltageArray [2];
};
void loop (void) {
thing.handle ();
// Не помещайте сюда никакого кода, потому что Thinger.io это не понравится.
}

После завершения цикла for значения отправляются в выходной канал «out». У каждого датчика есть уникальная строка, например «FSR1voltage».

«Вещь» под названием «ньютон» - самая сложная функция в этой программе. Он преобразует напряжение в силу в Ньютонах. Для этого снова используется цикл for для каждого FSR.

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

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

Полученное в результате вычислений значение сохраняется в массиве «fsrForceArray». Опять же, каждый FSR занимает свою позицию в этом массиве. Три последних значения отправляются в выходной канал "out".

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

  thing ["newton"]>> [] (pson &out) {
for (int FSR =0; FSR // Значение сила F как функция напряжения V вычисляется как:F (V) =(Fmax / Vmax) * V
float force_value =(forceMaxArray [FSR] / VoltageMax) * fsrVoltageArray [FSR];
// Различают три ситуации:
//
// 1. Если V слишком близко к максимуму (как определено в VoltageMax),
//
// 2 . Если вычисленная сила F слишком мала, мы устанавливаем ее равной нулю, чтобы избежать шумовых эффектов.
//
// 3. Во всех остальных случаях мы берем логарифмическое значение, чтобы уменьшить крутизну и
if (fsrVoltageArray [FSR] // В этой ветви напряжение не слишком велико
if (force_value <=1.00) {
fsrForceArray [FSR] =0.0; // Сила слишком мала, установите ее на ноль
} else {
fsrForceArray [FSR] =log10 (force_value); // Значение в порядке, запишите это
}
} else {
// Ограничьте силу, если напряжение слишком близко к Vcc (для Vcc это будет бесконечность)
fsrForceArray [FSR] =log10 (forceMaxArray [FSR]);
Serial.print («Отключение активировано для FSR =»); Serial.println (FSR);
}
} // Конец цикла по FSR
out ["FSR1newton"] =fsrForceArray [0];
out ["FSR2newton"] =fsrForceArray [1];
out ["FSR3newton"] =fsrForceArray [2];
}; // конец вещи
thing ["weight"]>> [] (pson &out) {
// Простое вычисление для преобразования силы в Ньютонах в вес в граммах
for ( int FSR =0; FSR fsrWeightInGramsArray [FSR] =fsrForceArray [FSR] * conversionToKgrams * 1000.0;
}
out ["FSR1weight"] =fsrWeightInGramsArray [0];
out ["FSR2weight"] =fsrWeightInGramsArray [1];
out ["FSR3weight"] =fsrWeightInGramsArray [2];
}; // конец вещи

Не забудьте настроить панель управления на Thinger.io. Я полагаю, вы знаете, как это работает.

Подсказка :Если все работает, как ожидалось, ваша панель управления должна выглядеть примерно так:

Измерение ускорения

На самом деле это намного проще, чем измерять давление. Сначала нам нужно добавить код в часть заголовка. Мы начинаем с включения библиотек Wire.h (для связи с выводами SDA и SDL), Adafruit_Sensor.h и Adafruit_ADXL345_U.h. Нам также понадобятся три новые глобальные переменные, чтобы мы могли измерять и передавать ускорение по осям x, y и z

Не удаляйте библиотеки, которые вы добавили ранее. Они понадобятся вам для подключения к Thinger.io.

В следующем блоке кода мы проверяем реакцию акселерометра. В противном случае ничего не произойдет. В противном случае определяется диапазон и выполняется «вещь», называемая «акселерометр». Это запрашивает устройство и отправляет три значения ускорения в направлениях x, y и z на выходной "выходной" канал.

Эта часть кода аналогична включенному образцу кода Adafruit (Файл> Примеры> Adafruit ADXL345), но я исключил некоторые части, потому что они нам не нужны.

  #include  
#include
#include
/ * Назначьте уникальный идентификатор этому датчику в одновременно * /
Adafruit_ADXL345_Unified Accel =Adafruit_ADXL345_Unified (12345);
int x =0;
int y =0;
int z =0;
void setup (void) {
Serial.begin (115200);
if (! Accel.begin ()) {// Инициализируем датчик
Serial.println ("Нет Обнаружен ADXL345 ");
} else {
// Диапазон для этого датчика - Если вы не знаете диапазон, запустите
// displayDataRate примера кода ADXL345, предоставленного Adafruit
Accel.getEvent (&событие); // Получить новое событие датчика
out ["x"] =event.acceleration.x; // Отображение результатов (ускорение измеряется в м / с ^ 2)
out ["y"] =event.acceleration.y;
out ["z"] =event.acceleration.z;
Serial.print ("X:"); Serial.print (event.acceleration.x); Serial.print ("");
Serial.print ("Y:"); Serial.print (event.acceleration.y); Serial.print ("");
Serial.print ("Z:"); Serial.print (event.acceleration.z); Serial.print (""); Serial.println ("м / с ^ 2");
}; // конец вещи
} // конец оператора if / else
}

Подсказка: после выполнения приведенного выше кода ваши результаты должны выглядеть примерно так, как показано ниже

Собираем все вместе

Пожалуйста, найдите полный код внизу страницы :)

Отправьте данные через Thinger.io

Эта библиотека хорошо документирована здесь, но вот некоторая важная информация, чтобы упростить написание и использование "вещей" (без каламбура).

Thinger.io - очень обширная библиотека. В этом разделе мы рассматриваем только те функции, которые необходимы и используются в нашем приложении. Структура выглядит следующим образом (обратите внимание на точку с запятой ";" после закрывающей фигурной скобки "}"):

  thing []>> [] (pson &out) 
{
<ваш код>
};

В C ++ это называется лямбда-функцией. Обязательным первым словом для начала определения является «вещь», а вся функция также называется «вещью».

Строка (например, thing ["myFirstThing"]) дает имя функции. У каждой «вещи» должно быть уникальное имя.

Символ «>>» указывает на то, что эта «вещь» имеет только выходные значения. Если требуется ввод, измените его на «<<». Если требуются и ввод, и вывод, следует использовать символ «=». В нашем случае у нас есть только выходные значения.

Аргумент «pson &out» означает, что наши выходные значения отправляются через структуру данных, называемую «out». Тип данных «pson» очень гибкий и может содержать различные типы переменных, а также поддерживает документы JSON.

В нашем коде мы используем форму "out [] =value" t o отправлять значения на дисплей визуализации, связанные с вызовом «ThingerWifi101 thing (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL)» в первой части программы.

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

Код внутри «вещей» зацикливается непрерывно. Если ваши данные регулярно обновляются, как в нашем случае, важно поместить свои вычисления в «вещи».

FAQ

Ничего не происходит!

Проверьте свои провода. Скорее всего, на этом уровне что-то сломалось. Если в вашем Serial Monitor ничего не появляется, проверьте, находится ли "#define _DEBUG_" в первой строке вашего кода. TLS также может мешать. Вы можете отключить это, но будьте осторожны с этим. Также проверьте, работает ли ваше соединение с Thinger.io.

Результат не соответствует ожиданиям

Весь код, который нужно обновить, находится внутри «вещи»? Если он находится вне «вещи», он не обновляется. Я также обнаружил, что устройства ESP не работают с датчиками FSR без видимой причины.

вывод равно нет обновлено регулярно

Вы добавляли задержки в свой код? Удалите их :) Вы можете установить частоту обновления на самом Thinger.io.

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

Добавьте весь код в одну «штуку»

Молодец!

Я надеюсь, что это руководство помогло вам понять основы FSR-датчиков, акселерометров и Thinger.io. Я хотел бы прочитать любые предложения по улучшению этого кода, и, пожалуйста, не стесняйтесь и делитесь своими творениями!

Код

  • Smart-Insole-Tutorial
Smart-Insole-Tutorial Arduino
Полный код этого руководства
 #define _DEBUG_ // Убедитесь, что это происходит до любых других включений, иначе ваша плата может вылететь / * См. Руководство здесь:https://www.hackster.io/projects/a5ceae*/# include  // Thinger # include  // Thinger # include  // Акселерометр # include  // Акселерометр # include  // Акселерометр # определить ИМЯ ПОЛЬЗОВАТЕЛЯ "yourUsername" #define DEVICE_ID "yourDevice" #define DEVICE_CREDENTIAL "yourCredential" #define SSID "yourSSID" #define SSID_PASSWORD "yourSSIDPassword" Adafruit_ADXL345_Unified accl =Adafruit_ADX; // Акселерометр int x =0; // Сброс до 0 int y =0; int z =0; // * датчики FSR * / # определить noFSR 3 // Количество подключенных FSR # определить FSR1 A1 // Аналоговые порты # определить FSR2 A2 #define FSR3 A3 float fsrVoltageArray [3]; // Аналоговое показание преобразовано и // масштабировано до напряжения как с плавающей запятой // numberfloat fsrForceArray [3]; // Сила в Newtonfloat fsrWeightInGramsArray [3]; // Вес преобразован в граммы цента pinArray [3] ={FSR1, FSR2, FSR3}; // ID вывода для // трех устройств на плаву forceMaxArray [3] ={100.0, 100.0, 100.0}; // Максимальные силы // поддерживаемый плавучесть миллион =1000000.0; // Единица для "1 / преобразование микроплотностиToKgrams =1.0 / 9.80665; long K =1000; long R =10 * K; // R в кОм long Vcc =5000; // 5V =5000mV, 3.3V =3300 mVfloat VoltageMax =0,98 * Vcc; // Максимальное напряжение установлено на 95% от Vcc. Установите // усилие на максимум, превышающий это // значение. ThingerWifi101 thing (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); // Вызов для настройки функции WiFivoid setup (void) {Serial.begin (115200); thing.add_wifi (SSID, SSID_PASSWORD); if (! Accel.begin ()) {// Инициализируйте датчик Serial.println ("ADXL345 не обнаружен.");} Else {Accel.setRange (ADXL345_RANGE_16_G); // Диапазон для этого датчика ["акселерометр"]>> [] (pson &out) {sensor_event_t event; accel.getEvent (&event); out ["x"] =event.acceleration.x; out [ "y"] =event.acceleration.y; out ["z"] =event.acceleration.z;};} / * Датчики FSR * / thing ["давление"]>> [] (pson &out) {out ["FSR1"] =analogRead (FSR1); // Serial.print ("FSR1:"); // Serial.println (analogRead (FSR1)); out ["FSR2"] =analogRead (FSR2); // Последовательный .print ("FSR2:"); // S erial.println (analogRead (FSR2)); out ["FSR3"] =analogRead (FSR3); // Serial.print ("FSR3:"); // Serial.println (analogRead (FSR3)); }; вещь ["напряжение"]>> [] (pson &out) {for (int FSR =0; FSR > [] (pson &out) {for (int FSR =0; FSR > [] (pson &out) {// Простое вычисление для преобразования силы в Ньютонах в вес в граммах для (int FSR =0; FSR  

Схема

Три FSR (с делителями напряжения) и акселерометр.

Производственный процесс

  1. Умный бармен
  2. ABB представляет интеллектуальный датчик для проверки состояния подшипников
  3. Станьте умнее:будущее вашего дома
  4. Рационально расходуйте свой доллар Интернета вещей
  5. Система управления зданием:ваш билет в умный город
  6. Проверьте использование памяти вашими объектами Python
  7. Ежеквартальная проверка вашей цепочки поставок
  8. Измерьте время реакции
  9. Таинственный водяной насос может быть самым трудолюбивым в вашем доме
  10. Уменьшение падения давления в вашей системе сжатого воздуха