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

Походный трекер

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

Arduino 101
× 1
Батарейки AA
× 1
Держатель батареи 4xAA
× 1
Аксессуар упакован
× 1
Датчик давления Adafruit BMP180
× 1
Adafruit Ultimate GPS Breakout
× 1
Adafruit - трехосевой магнитный
× 1
Датчик влажности Adafruit AM2320
× 1
Adafruit Coin Cell CR2012
× 2
Резистор 10 кОм
× 1
Резистор 3,9 кОм
× 1

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

Пистолет для горячего клея (общий)
Паяльник (общий)

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

IDE Arduino

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

Что такое трекер для пеших прогулок?

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

Идея состоит в том, чтобы наблюдать за изменением температуры, давления, влажности, высоты, местоположения, направления и т. Д. Это дает некоторое интересное представление о походах.

В горах, где холодный, сухой воздух с низкой плотностью по сравнению с низменностями, многим людям трудно дышать. У некоторых наблюдается раздражение сухой кожи. Это устройство позволяет людям, интересующимся пешим туризмом, узнать свои пределы. Также есть удовольствие отправиться в высокогорные места. Возможность узнать высоту - это весело!

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

Видео демонстрация

Шаг 1. Оборудование, какое для чего?

Этот проект вызывает много интересного

Дополнительный щиток поставляется с некоторыми устройствами I2C на борту:

  • Датчик температуры LM 75B для измерения температуры окружающей среды
  • Трехосевой акселерометр ADXL345 для определения угла наклона и силы тяжести
  • DS3231 высокоточный RTC для измерения времени
  • 3-осевой магнитный датчик HMC5883 для определения направления по компасу
  • Датчик влажности AM2320 для определения% относительной влажности
  • Датчик давления BMP180 для измерения атмосферного давления и высоты
  • Датчик GPS MTK3339 для определения местоположения и пройденного расстояния

На Arduino Uno:

  • Делитель напряжения 3,9k + 22k для определения 4 AA напряжение батареи
  • 1306 OLED для просмотра данных
  • Зуммер для сигнала тревоги
  • Светодиод RGB для этого проекта не нужен
  • Интерфейс XBee не используется, но Arduino D2, D3, D9, D10 можно вывести из этого интерфейса для других проектов, D2 подключен к сбросу, что позволяет сбросить Arduino из кода!
  • 5-позиционный джойстик не используется.
  • 101 горшок не используется.

Шаг 2:модификация и подключение оборудования

В Arduino Uno внесено несколько модификаций. Он установлен на держателе батареек 4 AA с винтовыми стойками и горячим клеем.

4 AA и CR1220 (для RTC) устанавливаются на держатели для батареек.

Между держателем батареи и платой Arduino Uno есть пространство, где можно разместить датчик давления, влажности, магнитный и GPS-датчик.

Датчики I2C припаяны на куске сборной платы и помещены в это пространство

Эти датчики подключаются к Arduino Uno снизу:

Добавлен делитель напряжения для измерения напряжения батареи 4 батареек АА.

Линия измерения напряжения батарейного блока AA подключается к АЦП A1:

Джойстик экрана подключен к контакту A1 ACD через контакт A5. Вот почему джойстик распаян и удален.

При подключении какой-либо площадки на Accessory Shield (схему см. Ссылку) с паяным мостом D2 (для мягкого сброса), контакты D3, D9, D10 Arduino становятся доступными на интерфейсе Xbee.

Компоненты складываются следующим образом:

  • Верхний слой:Accessory Shield на Arduino
  • Средний уровень:другие датчики и GPS будут находиться между Uno и батарейным отсеком.
  • Нижний слой:4 батарейных отсека AA с батарейками.

А соединения выглядят так:

Шаг 3. Программирование устройства

Arduino IDEBuild 1.8.5 используется для программирования устройства. Сначала все следующие библиотеки включаются или загружаются с помощью диспетчера библиотек.

При вводе имени датчика в поле поиска диспетчера библиотек появятся соответствующие библиотеки.

Некоторые библиотеки Accessory Shield (см. Справку) добавляются с помощью параметра zip.file

После добавления необходимых библиотек проверяются примеры кодов для каждого датчика, чтобы найти API для связанных датчиков.

Затем все заголовки библиотеки включаются в один пустой скетч Arduino.

Список файлов заголовков

  math.h, inttypes.h, Wire.h, lm75.h, ADXL345.h, ChainableLED.h, U8glib.h, ds3231.h, Adafruit_Sensor.h, Adafruit_AM2320.h, Adafruit_BMP085_U.h, Adafruit_HMC5883_U.h, Adafruit_GPS.h  

После многократного редактирования, компиляции и отладки (включая неплотное соединение, когда я обнаружил, что BMP180 работает без Vcc из-за утечки мощности для контактов I2C, возможно) и загрузки - наконец, код был готов.

Предостережения

  • Расчет высоты основан на падении давления воздуха, применимом только в нормальных погодных условиях.
  • Код компаса не поддерживает программную компенсацию наклона, устройство должно находиться на горизонтальной плоскости. Есть фиксированный круг компаса, в котором есть еще один круг переменного радиуса. Когда устройство наклонено, внутренний круг увеличится. Когда он находится в выровненном положении (т.е. оба компонента акселеромера x и y равны почти 0), внутренний круг уменьшится до точки. Это когда направление по компасу более точное.
  • Угол склонения стрелки компаса зависит от местоположения и изменения магнитного поля Земли. Который может пострадать от солнечной бури. Если угол склонения не указан, направление по компасу будет отклонено на несколько градусов.

Найдите склонение для своего региона:http://www.m Magnetic-declination.com

  • Направление по компасу подвержено влиянию близлежащих магнитных объектов, например сильных магнитных минералов в горах.
  • Минимальное рабочее напряжение устройства составляет около 4,5 В. В этом случае следует заменить батарейки типа АА.
  • Время и дата программируются с помощью кода. Если время необходимо для замены, батарейку типа «таблетка» необходимо отключить и вставить в розетку. При загрузке новой программы с новым временем в коде время изменится.
  • Во время разработки модуль GPS был недоступен. Следовательно, демонстрационные координаты помещаются в Lat-Long. Если кто-то желает воспроизвести этот проект, необходимо включить библиотеку GPS и связанные коды.
  • Плоскость XY акселерометра и магнитометра подлежит размещению на печатной плате. Требуется соответствующая корректировка кода.
  • Точность показаний акселерометра подвержена вибрации. Рекомендуется использовать устройство в неподвижном состоянии.

Объем улучшений

Со стороны прошивки можно сделать улучшения для еще нескольких функций:

  • Периодическая запись параметров в EEPROM
  • Звуковой сигнал при достижении контрольной точки высоты / местоположения.
  • Напоминание о питьевой воде.
  • Напоминание о перерыве
  • Предупреждение о низком заряде батареи
  • Предупреждение о низкой температуре и влажности.
  • Калибровка программного обеспечения компаса для компенсации наклона (много всего тригонометрического)
  • Автоматическое определение склонения с использованием подключения к Интернету вещей и GPS через приложение Gateway.

Что касается аппаратной части доработки:

  • Переключатели пользовательского ввода для установки времени, склонения и т. д.
  • Индивидуальный 3D-футляр для устройства
  • Использование перезаряжаемой LiPo батареи
  • Одноплатная компактная конструкция печатной платы для большей портативности.

Заключение

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

Внешние ресурсы

https://www.waveshare.com/wiki/Accessory_Shield

Набор для быстрого прототипирования

Код

  • Hiking_Tracker.ino
  • Библиотеки
Hiking_Tracker.ino C / C ++
main.c
 / * /////////// ПРИМЕЧАНИЕ ////////// D2 позволяет мягкий сброс, утверждаемый из кода D3, D9, D10 доступны через 12,13,16 из xbee interface include  #include  #include  #include  #include  #include  #include "U8glib.h" #include "ds3231.h" #include "Adafruit_Sensor.h" #include "Adafruit_AM2320.h" #include  #include  #include  ////////// ///////////// Переменные RTC /////////////////// uint8_t time [8]; struct ts t; int s; int m; int h; int dy; int mo; int yr; ///////////////// Переменные акселерометра ///////////// float X =0.0; float Y =0.0; float Z =0.0; float Gravity =0.0; /////////////////// Переменные акселерометра ///////////// float Xm =0.0; поплавок Ym =0,0; поплавок Zm =0,0; /////////////////////// Переменные светодиода RGB /////////////// const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0; логическое up =true; //////////////////////// потенциометр ///////////////// // int pot =0; //////////////////// Batt / Supply Vin ///////////////// float Vbatt =0.0; //// ////////////////// Термометр //////////////////// float temp =0.0; ////// /////////////// Влажность ///////////////////// float humid =0,0; ////// ////////////// Давление воздуха //////////////////// double prsr =0.0; ///////// /////////// Высота //////////////////// float alt =0.0; ///////////// ////// Lat, Long //////////////////// float lat =0.0; float lon =0.0; //////////////////// Заголовок компаса ///////////////// float heading =0,0; /// ////////////////// Переменные другого типа /////////////// int mstime =0; int sensor_selector =1; ///// /////// ENUM // Тип устройства I2C Объект ///////////////// U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C OLED DisplayTempI2C_LM75 termo =TempI2C_LM75 (0x48, TempI2C_LM75 ::nine_bits); // I2C Temp SensorADXL345 акселерометр; // Светодиоды I2C Acce SensorChainableLED (clk_pin, data_pin, rgb_pwr, 1); // I2C RGB LEDAdafruit_AM2320 am2320 =Adafruit_AM2320 (); // Датчик влажности I2CAdafruit_BMP085_Unified bmp180 =Adafruit_BMP085_Unified (10085); // Датчик давления I2CAdafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified (12345); // Датчик I2C Compa // раскомментируйте следующие 2 строки, чтобы включить GPS // Последовательная отладка не будет доступна // HardwareSerial mySerial =Serial; // Adafruit_GPS GPS (&mySerial); void setup (void) {// 1.1V Internal Analog Ref // analogReference (INTERNAL); ///////////// Сигналы для OLED на дополнительном щите /////////// //// припаивать перемычку к экрану, необходимому для D2, D3, D9, D10 // pinMode (2,1); // Самостоятельный сброс D2 в RST pinMode (3,1); // выход на xbee int 12, pinMode (9,1); // выход на xbee int 13 pinMode (10,1); // выход на xbee int 16 // digitalWrite (2, HIGH); digitalWrite (3, ВЫСОКИЙ); digitalWrite (9, LOW); digitalWrite (10, ВЫСОКИЙ); pinMode (7,1); pinMode (8,1); digitalWrite (7, ВЫСОКИЙ); digitalWrite (8, LOW); // 10k POT на A0 // Vin Batt / Supply на A1 (3,91k / 21,76k) /////////////////////////////// //////////////////////// Последовательная связь для отладки (необязательно) ////////// Serial.begin (9600); // //////////// Ожидание инициализации ускорения ///////// if (! Accelerometer.begin ()) {delay (50); } /////////////// Разрешение прерывания RTC ///////// DS3231_init (DS3231_INTCN); //////////////// Запуск зуммера //////////////// pinMode (11,1); digitalWrite (11, LOW); } void loop (void) {// цикл изображений u8g.firstPage (); делать {рисовать (); } while (u8g.nextPage ()); // переключение между датчиками I2C sensor_selector ++; if (sensor_selector> =3) {sensor_selector =0;} ////// API выборки температуры ////// temp =termo.getTemp (); delay (5); // "C /////// API извлечения давления //////// if (sensor_selector ==0) {///////////// Датчик давления Init ///////// if (! Bmp180.begin ()) delay (11); sensor_event_t event; bmp180.getEvent (&event); if (event.pressure) {prsr =event.pressure / 10; / / Задержка в КП до КП (50);}} ////////////// Инициализация GPS ////////////GPS.begin(9600);//// /// Altitude Fetch API //////// if (sensor_selector ==0) {sensor_event_t event; bmp180.getEvent (&event); alt =bmp180.pressureToAltitude (1013.25, event.pressure); delay (50); // bmp180.end ();} // в метрах ////////////// Инициализация датчика влажности /////// if (sensor_selector ==1) {am2320.begin (); delay (50); ////// Humidity Fetch API ///////// humid =am2320.readHumidity (); delay (50); // am2320.end (); // в% от RH} // в кПа ////// Acceleration Fetch API ////// Vector norm =accelerometer.readNormalize (); X =norm.XAxis; Y =norm.YAxis; Z =norm.ZAxis; Gravity =sqrt (X * X + Y * Y + Z * Z) - (0.3); // смещение // в м / с ^ 2 ///// Time Fetch API //////// DS3231_get (&t); s =t.sec; m =t.min; h =t. час; dy =t.mday; mo =t.mon; yr =t. год; ///// Выбор позиции банка /////// pot =analogRead (A0) * 5 / (10 * 3); delay (2); ///// VBatt / Supply Fetch /////// // 1.1 равно 1.08 для этого чипа Vbatt =(1.08 * analogRead (A1) / 1023) /3.91 * ((3.91 + 21.76) ); delay (2); ///////// Направление по компасу //////// if (sensor_selector ==2) {if (! mag.begin ()) {while (1); } // задержка (70); sensor_t sensor2; mag.getSensor (&sensor2); задержка (70); // угол склонения зависит от геолокации // использовать широту и долготу от GPS для вычисления датчиков_event_t event2; mag.getEvent (&event2); // Xm =event2.m Magnetic.x; // Ym =event2.m Magnetic.y; задержка (70); склонение поплавка =0,0; заголовок =atan2 (event2.mintage.y, event2.m Magnetic.x); курс + =склонение; // исправление знака if (заголовок <0) заголовок + =2 * PI; if (заголовок> 2 * PI) заголовок - =2 * PI; // Преобразуем радианы в градусы для удобства чтения. заголовок =заголовок * 180 / M_PI; // mag.end ();} ///// Управление зуммером ////////// if (pot> 80) {digitalWrite (11,1);} else {digitalWrite (11,0); } ///// Управление адресными светодиодами RGB ///////////// if (pot> 40) {leds.pwr_set (PWR_ENABLE); for (байт i =0; i <1; i ++) leds.setColorHSB (i, hue, 1.0, 0.5); если (вверх) оттенок + =0,025; иначе оттенок- =0,025; если (оттенок> =1.0 &&вверх) up =false; иначе, если (оттенок <=0,0 &&! вверх) up =true; } /////////////////////////////////////////// Самостоятельный сброс //// /////// // digitalWrite (2, LOW); /////////////////////////////////} ///////// Здесь заканчивается Void Loop /////////////////////// Oled Picture Loop Draw Fn ///////// ////////// void draw (void) {u8g.setFont (u8g_font_7x13); u8g.drawHLine (37, 0, 62); u8g.setPrintPos (41, 12); если (h <10) u8g.print (0); u8g.print (h); u8g.drawStr (54,12, ":"); u8g.setPrintPos (62, 12); если (m <10) u8g.print (0); u8g.print (m); u8g.drawStr (75,12, ":"); u8g.setPrintPos (83, 12); если (s <10) u8g.print (0); u8g.print (s); u8g.drawHLine (37, 14, 62); u8g.setFont (u8g_font_5x8); u8g.drawVLine (37, 0, 14); u8g.setPrintPos (0, 7); если (dy <10) u8g.print (0); u8g.print (dy); u8g.drawStr (11,7, "/"); u8g.setPrintPos (17, 7); если (mo <10) u8g.print (0); u8g.print (mo); u8g.drawStr (0,16, "/"); u8g.setPrintPos (6, 16); u8g.print (год); u8g.drawVLine (99, 0, 14); u8g.drawStr (104,7, "BATT"); u8g.setPrintPos (102, 15); u8g.print (Vbatt); u8g.drawStr (123,15, "V"); // u8g.setFont (u8g_font_7x13); // u8g.setPrintPos (40, 25); u8g.print (round (temp)); u8g.drawStr (55,25, "'C"); // u8g.print (round (temp)); u8g.setFont (u8g_font_5x8); // u8g.drawStr (5,40, "x"); u8g.setPrintPos (15, 40); u8g.print (round (X)); // u8g.drawStr (50,40, "y"); u8g.setPrintPos (60, 40); u8g.print (round (Y)); // u8g.drawStr (90,40, "z"); u8g.setPrintPos (100, 40); u8g.print (round (Z)); // u8g.drawStr (68,22, "BATT:"); u8g.setPrintPos (95, 22); u8g.print (Vbatt); u8g.drawStr (123,22, "V"); u8g.drawVLine (37, 18, 36); u8g.drawStr (39,24, «ТЕМП. ВОЗДУХА:»); u8g.setPrintPos (85, 24); u8g.print (темп); u8g.drawStr (118,24, "C"); u8g.drawStr (39,34, «ВЛАЖНОСТЬ:»); u8g.setPrintPos (85, 34); u8g.print (влажный); u8g.drawStr (118,34, "%"); u8g.drawStr (39,44, «ДАВЛЕНИЕ:»); u8g.setPrintPos (85, 44); u8g.print (prsr); u8g.drawStr (118,44, "hP"); u8g.drawStr (39,54, «ВЫСОТА:»); u8g.setPrintPos (85, 54); u8g.print (round (alt)); u8g.drawStr (118,54, "м"); u8g.drawHLine (0, 56, 128); u8g.drawStr (19,64, «LAT:»); u8g.setPrintPos (39, 64); u8g.print (23,57); // Демо, заменить на LAT при добавлении GPS u8g.drawStr (69,64, "LONG:"); u8g.setPrintPos (94, 64); u8g.print (90.36); // демонстрация, заменяем на LON при добавлении GPS // u8g.setPrintPos (40, 25); u8g.print (круглый (темп)); u8g.drawStr (55,25, "'C"); int r =круглый (sqrt (X * X + Y * Y)); // float tid =atan (Y / X) * 180 / 3.1415; // математические проблемы здесь // int radius =round (tid); u8g.drawStr (0,22, «заголовок»); u8g.drawCircle (18, 34, r, U8G_DRAW_ALL); // внутренний выравнивающий круг u8g.drawCircle (18, 34,10, U8G_DRAW_ALL); // внешний фиксированный круг // внутренний круг станет точкой без наклона по x и ось y // это когда направление компаса более точное //u8g.drawLine(18, 34, (18 + round (Y * 2)), (34 + round (X * 2))); // увеличен в 2 раза u8g.setPrintPos (0, 53); u8g.print (заголовок); // 0 или 360 - N // 90 - E // 180 - S // 270 - W // u8g.setFont (u8g_font_5x8); если ((заголовок> 315) | (заголовок <=45)) {u8g.drawLine (18,34,8,34); } if ((заголовок> 45) &(заголовок <=135)) {u8g.drawLine (18,34,18,24);} if ((заголовок> 135) &(заголовок <=225)) {u8g.drawLine (18,34,28,34);} if ((заголовок> 225) &(заголовок <315)) {u8g.drawLine (18,34,18,44);} // u8g.drawLine (18, 34, (18 + круг (Y * 2)), (34 + круг (X * 2))); // увеличен в 2 раза НА ОСНОВЕ АКСЕЛАРОМЕТРА // цикл здесь заканчивается} 
Библиотеки C / C ++
Разархивируйте его и добавьте отдельные архивы библиотеки в диспетчер библиотек Arduino
 Без предварительного просмотра (только загрузка). 

Схема


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

  1. Что такое датчик O2?
  2. Датчик движения с использованием Raspberry Pi
  3. Датчик влажности почвы Raspberry Pi
  4. Превратите Raspberry Pi в фитнес-трекер для хомяков
  5. Тест датчика DS18B20
  6. Датчик температуры Raspberry Pi
  7. Счетчик туалета (на платформе Walabot)
  8. Датчик эмоций / ЭЭГ
  9. Windows 10 IoT Core на Raspberry Pi 2 - данные датчика Adafruit
  10. Трекер датчика WiFi RSSI для МКС