Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Rastreador de caminhada

Componentes e suprimentos

Arduino 101
× 1
Baterias AA
× 1
porta-bateria 4xAA
× 1
Acessório Shiled
× 1
Sensor de pressão Adafruit BMP180
× 1
Adafruit Ultimate GPS Breakout
× 1
Adafruit - 3 eixos magnéticos
× 1
Sensor de umidade Adafruit AM2320
× 1
Adafruit Coin Cell CR2012
× 2
Resistor 10k ohm
× 1
Resistor 3,9 k
× 1

Ferramentas e máquinas necessárias

Pistola de cola quente (genérica)
Ferro de soldar (genérico)

Aplicativos e serviços online

Arduino IDE

Sobre este projeto





O que é o Caminhada Tracker?


Caminhando Tracker é um dispositivo que detecta a mudança no ambiente ao redor de um caminhante durante uma caminhada.

A ideia é observar a mudança de temperatura, pressão, umidade, altitude, localização, direção etc. Isso dá uma visão interessante da caminhada.

Nas montanhas, onde é frio, seco e com ar de baixa densidade em comparação com as terras mais baixas, muitas pessoas têm dificuldade em respirar. Alguns apresentam irritação na pele seca. Este dispositivo permite que as pessoas interessadas em caminhadas conheçam seus limites. Também existe a diversão de ir a locais de grande altitude. Saber a altitude é divertido!

Não apenas as montanhas, mas também explorando pântanos, desertos, florestas - cada um com seu perfil ambiental único, poder monitorar o meio ambiente em movimento é a melhor maneira de entender a natureza.





Demonstração de vídeo





Etapa 1:Hardware, para quê?


Há muitos sentidos circulando com este projeto

A blindagem de acessórios vem com alguns dispositivos I2C a bordo:
  • Sensor de temperatura LM 75B para detecção da temperatura ambiente
  • ADXL345 acelerômetro de 3 eixos para detecção de inclinação e gravidade
  • DS3231 RTC de alta precisão para detecção do tempo
  • HMC5883 sensor magnético de 3 eixos para detecção do rumo da bússola
  • Sensor de umidade AM2320 para detecção de% UR do ar
  • sensor de pressão BMP180 para detecção de pressão atmosférica e altitude
  • Sensor MTK3339 GPS para detecção de localização e distância percorrida

No Arduino Uno:
  • Divisor de tensão de 3,9k + 22k para detecção 4 AA voltagem da bateria
  • 1306 OLED para visualização de dados
  • Buzzer para bipe de alarme
  • RGB LED não é necessário para este projeto
  • A interface XBee não é usada, mas o Arduino D2, D3, D9, D10 pode ser trazido dessa interface para outros projetos, o D2 está conectado para redefinir, o que permite redefinir o Arduino a partir do código!
  • joystick de 5 direções não é usado
  • 101 pote não é usado





Etapa 2:Modificar e conectar o hardware


Poucas modificações são feitas no Arduino Uno. Ele é montado em um suporte de bateria 4 AA com suportes de parafuso e cola quente.

4 AA e CR1220 (para RTC) estão instalados nos suportes da bateria.

Existe um espaço entre o suporte da bateria e a placa do Arduino Uno onde podem ser colocados os sensores de pressão, umidade, magnético e GPS.

Sensores I2C são soldados juntos em um pedaço de placa pref e colocados neste espaço

Esses sensores são conectados ao Arduino Uno na parte inferior:

Um divisor de tensão é adicionado para medir a tensão da bateria de 4 baterias AA.

A linha de detecção de tensão do pacote de bateria AA vai para ADC A1:

O joystick da blindagem é mapeado para o pino A1 do ACD através do pino A5. É por isso que o joystick é dessoldado e removido.

Ao conectar algum pad no Escudo de Acessórios (para esquemático, consulte a referência) com a ponte de solda D2 (para reinicialização suave), os pinos D3, D9, D10 do Arduino são disponibilizados na interface Xbee.

Os componentes empilham assim:
  • Camada superior:Escudo de acessórios no Arduino
  • Camada intermediária:outros sensores e o GPS ficarão entre o Uno e o estojo de bateria
  • Camada inferior:Suporte de bateria 4 AA com baterias

E as conexões são assim:





Etapa 3:Programação do dispositivo


Arduino IDEBuild 1.8.5 é usado para programar o dispositivo. Primeiro, todas as seguintes bibliotecas são incluídas ou baixadas usando o gerenciador de bibliotecas.

Ao digitar o nome do sensor na caixa de pesquisa do gerenciador de biblioteca, as bibliotecas apropriadas aparecerão.

Algumas das bibliotecas de acessório Shield (consulte a referência) são adicionadas por meio da opção zip.file

Depois de adicionar as bibliotecas necessárias, códigos de exemplo para cada sensor são revisados ​​para descobrir as APIs para sensores associados.

Em seguida, todos os cabeçalhos da biblioteca são incluídos em um esboço vazio do Arduino.





Lista de arquivos de cabeçalho

  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  

Após várias edições, compilação e depuração (incluindo conexão solta, onde descobri que o BMP180 funciona sem Vcc devido ao vazamento de energia para pinos I2C, talvez) e upload - finalmente o código estava pronto.





As advertências

  • O cálculo da altitude é baseado na queda da pressão do ar, aplicável apenas durante as condições meteorológicas normais.
  • O código da bússola não tem compensação de inclinação no software, o dispositivo deve ser mantido em um plano nivelado. Existe um círculo de compasso fixo, no qual existe outro círculo de raio variável. Quando o dispositivo é inclinado, o círculo interno aumenta. Quando estiver em uma posição nivelada (ou seja, os componentes xey do acelerômero são quase 0), o círculo interno se reduzirá a um ponto. É quando a direção da bússola é mais precisa.
  • O ângulo de declinação do ponteiro da bússola depende da localização e variação do campo magnético da Terra. Que pode ser afetado pela tempestade solar. Se o ângulo de declinação não for incluído, o rumo da bússola será desviado alguns graus.

Encontre declinação em sua área:http://www.magnetic-declination.com
  • A direção da bússola está sujeita a objetos magnéticos próximos, como a presença de minerais magnéticos fortes nas montanhas.
  • A tensão mínima de operação do dispositivo é de cerca de 4,5 volts. É quando as baterias AA devem ser substituídas.
  • A hora e a data são programadas a partir do código. Se for necessário tempo para trocar, a bateria de célula tipo moeda deve ser desconectada e conectada. Um novo upload de programa com uma nova hora no código mudará a hora.
  • Durante o desenvolvimento, o módulo GPS não estava disponível. Conseqüentemente, as coordenadas de demonstração são colocadas em Lat-Long. Se alguém deseja replicar este projeto, é necessário incluir a biblioteca GPS e os códigos associados.
  • O plano XY do acelerômetro e do magnetômetro estão sujeitos à colocação no PCB. O código deve ser ajustado de acordo.
  • A precisão da leitura do acelerômetro está sujeita a vibrações. É aconselhável usar o dispositivo na condição de repouso.





Escopo de melhoria


Melhorias podem ser feitas do lado do firmware para mais alguns recursos:
  • Registro periódico de parâmetros na EEPROM
  • Bip do alarme da campainha ao atingir o marco de altitude / localização
  • Beba um lembrete de água
  • Lembrete para uma pausa
  • Alarme de bateria fraca
  • Temperatura baixa, alerta de umidade
  • Calibração do software da bússola para compensação de inclinação (muitas coisas de trigonometria)
  • Auto busca declinação usando GPS e conectividade IoT por meio do aplicativo Gateway

Quanto à parte de melhoria de hardware:
  • Interruptores de entrada do usuário para definir o tempo, declinação, etc.
  • Capa 3D personalizada para o dispositivo
  • Usando bateria recarregável LiPo
  • Design PCB compacto de placa única para maior portabilidade





Conclusão


Viajar e fazer caminhadas é legal, quando você pode verificar a mudança no ambiente circundante, torna as coisas mais interessantes. Especialmente, verificar as mudanças de altitude, umidade, pressão e temperatura dentro de algumas horas durante uma caminhada. Este dispositivo permite que você saiba a que altura você sente o mal-estar da altitude, que nível de umidade faz sua pele ficar seca - coisas assim. Embora haja espaço para melhorias tanto no layout do circuito quanto no código para lidar com as advertências, ainda é legal ter um gadget como esse enquanto você está indo para o deserto!





Recursos externos


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

Kit de prototipagem rápida

Código

  • Hiking_Tracker.ino
  • Bibliotecas
Hiking_Tracker.ino C / C ++
main.c
 / * /////////// NOTE ////////// D2 permite soft reset assertable de codeD3, D9, D10 estão disponíveis através de 12,13,16 de xbee interfaceD4, D13 não são acessíveis ///////////////////////////// * ///// ARQUIVOS DE CABEÇALHO PARA BIBLIOTECA ///// # incluir  #include  #include  #include  #include  #include  #include "U8glib.h" #include "ds3231.h" #include "Adafruit_Sensor.h" #include "Adafruit_AM2320.h" #include  #include  #include  ////// ///////////// RTC Variables /////////////////// uint8_t time [8]; struct ts t; int s; int m; int h; int dy; int mo; int yr; ///////////////// Variáveis ​​do acelerômetro ///////////// float X =0.0; float Y =0,0; flutuante Z =0,0; flutuante Gravidade =0,0; ///////////////// Variáveis ​​do acelerômetro /////////////// float Xm =0,0; flutuante Ym =0,0; flutuante Zm =0,0; /////////////////////////// RGB LED Variables /////////////// Const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0; boolean up =true; //////////////////////// potenciômetro /////////////////// // int pot =0; ////////////////////// Batt / Supply Vin ///////////////// float Vbatt =0.0; //// //////////////////// Termômetro //////////////////// float temp =0.0; ////// /////////////// Humidity /////////////////////// float humid =0.0; ////// ////////////// Pressão do ar //////////////////// double prsr =0.0; ///////// /////////// Altitude //////////////////// float alt =0.0; /////////////// ////// Lat, Long //////////////////// float lat =0.0; float lon =0.0; ////////////////// Cabeçalho da bússola /////////////////// float cabeçalho =0.0; /// //////////////////// Ohter Variables /////////////// int mstime =0; int sensor_selector =1; ///// /////// ENUM // I2C Tipo de dispositivo Object ///////////////// 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 acelerômetro; // leds I2C Acce SensorChainableLED (clk_pin, data_pin, rgb_pwr, 1); // I2C RGB LEDAdafruit_AM2320 am2320 =Adafruit_AM2320 (); // I2C Humid SensorAdafruit_BMP085_Unified bmp180 =Adafruit_BMP085_Unified (10085); // I2C Press SensorAdafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified (12345); // I2C Compa Sensor // descomente as 2 linhas a seguir para habilitar o GPS // A depuração serial não estará disponível // HardwareSerial mySerial =Serial; // Adafruit_GPS GPS (&mySerial); void setup (void) {// 1.1V Interno Analog Ref // analogReference (INTERNAL); ///////////// Sinais para OLED no Escudo de Acessórios /////////// //// solda em ponte na blindagem necessária para D2, D3, D9, D10 // pinMode (2,1); // auto-reset D2 para RST pinMode (3,1); // sai em xbee int 12, pinMode (9,1); // outs em xbee int 13 pinMode (10,1); // outs em xbee int 16 // digitalWrite (2, HIGH); digitalWrite (3, ALTO); digitalWrite (9, BAIXO); digitalWrite (10, ALTO); pinMode (7,1); pinMode (8,1); digitalWrite (7, ALTO); digitalWrite (8, BAIXO); // 10k POT em A0 // Vin Batt / Abastecimento em A1 (3,91k / 21,76k) ///////////////////////////// //////////////////////////// Serial Comm para depuração (opcional) ////////// Serial.begin (9600); // //////////// Espera de inicialização de aceleração ///////// if (! Accelerometer.begin ()) {delay (50); } /////////////// RTC Interrupt enable ///////// DS3231_init (DS3231_INTCN); //////////////// Buzzer Init //////////////// pinMode (11,1); digitalWrite (11, LOW); } void loop (void) {// loop de imagem u8g.firstPage (); fazer {desenhar (); } while (u8g.nextPage ()); // alternar entre os sensores I2C sensor_selector ++; if (sensor_selector> =3) {sensor_selector =0;} ////// API de busca de temperatura ////// temp =termo.getTemp (); delay (5); // "C /////// API de busca de pressão //////// if (sensor_selector ==0) {///////////// Sensor de pressão Init ///////// if (! Bmp180.begin ()) delay (11); sensores_event_t event; bmp180.getEvent (&event); if (event.pressure) {prsr =event.pressure / 10; / / hP para kP delay (50);}} ////////////// GPS Init ////////////GPS.begin(9600);//// /// API Altitude Fetch //////// if (sensor_selector ==0) {sensores_event_t event; bmp180.getEvent (&event); alt =bmp180.pressureToAltitude (1013,25, event.pressure); delay (50); // bmp180.end ();} // em medidor ////////////// Umidade Sensor Init /////// if (sensor_selector ==1) {am2320.begin (); delay (50); ////// API de busca de umidade ///////// humid =am2320.readHumidity (); delay (50); // am2320.end (); // em% de RH} // em kPa ////// API de busca de aceleração ////// Vector norm =accelerometer.readNormalize (); X =norm.XAxis; Y =norm.YAxis; Z =norm.ZAxis; Gravidade =sqrt (X * X + Y * Y + Z * Z) - (0,3); // deslocamento // em m / s ^ 2 ///// API de busca de tempo //////// DS3231_get (&t); s =t.seg; m =t.min; h =t. hora; dy =t.mdia; mo =t.mon; ano =t.ano; ///// Pote Posição Fetch /////// pot =analogRead (A0) * 5 / (10 * 3); delay (2); ///// VBatt / Supply Fetch /////// // 1.1 é 1,08 para este chip Vbatt =(1,08 * analogRead (A1) / 1023) /3,91 * ((3,91 + 21,76) ); atraso (2); ///////// Cabeçalho da bússola //////// if (sensor_selector ==2) {if (! mag.begin ()) {while (1); } // delay (70); sensor_t sensor2; mag.getSensor (&sensor2); atraso (70); // ângulo de declinação depende da localização geográfica // use Lat Long do GPS para calcular sensores_event_t event2; mag.getEvent (&evento2); // Xm =event2.magnetic.x; // Ym =event2.magnetic.y; atraso (70); declinação de flutuação =0,0; rumo =atan2 (evento2.magnético.y, evento2.magnético.x); rumo + =declinação; // correção de sinal if (cabeçalho <0) cabeçalho + =2 * PI; if (cabeçalho> 2 * PI) cabeçalho - =2 * PI; // Converta radianos em graus para facilitar a leitura. rumo =rumo * 180 / M_PI; // mag.end ();} ///// Buzzer Control ////////// if (pot> 80) {digitalWrite (11,1);} else {digitalWrite (11,0); } ///// RGB Addressable LED Control ///////////// if (pot> 40) {leds.pwr_set (PWR_ENABLE); para (byte i =0; i <1; i ++) leds.setColorHSB (i, matiz, 1,0, 0,5); if (up) matiz + =0,025; senão matiz- =0,025; if (matiz> =1.0 &&up) up =false; senão if (matiz <=0,0 &&! up) up =true; } ///////////////////////////////////////////////// Auto-reset //// /////// // digitalWrite (2, LOW); ///////////////////////////////////} ///////// Void Loop termina aqui /////////////////////// Oled Picture Loop Desenhar Fn ///////// ////////// void draw (void) {u8g.setFont (u8g_font_7x13); u8g.drawHLine (37, 0, 62); u8g.setPrintPos (41, 12); if (h <10) u8g.print (0); u8g.print (h); u8g.drawStr (54,12, ":"); u8g.setPrintPos (62, 12); if (m <10) u8g.print (0); u8g.print (m); u8g.drawStr (75,12, ":"); u8g.setPrintPos (83, 12); se (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); if (dy <10) u8g.print (0); u8g.print (dy); u8g.drawStr (11,7, "/"); u8g.setPrintPos (17, 7); if (mo <10) u8g.print (0); u8g.print (mo); u8g.drawStr (0,16, "/"); u8g.setPrintPos (6, 16); u8g.print (ano); 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, "AIR TEMP:"); u8g.setPrintPos (85, 24); u8g.print (temp); u8g.drawStr (118,24, "C"); u8g.drawStr (39,34, "UMIDADE:"); u8g.setPrintPos (85, 34); u8g.print (úmido); u8g.drawStr (118,34, "%"); u8g.drawStr (39,44, "PRESSÃO:"); u8g.setPrintPos (85, 44); u8g.print (prsr); u8g.drawStr (118,44, "hP"); u8g.drawStr (39,54, "ALTITUDE:"); u8g.setPrintPos (85, 54); u8g.print (round (alt)); u8g.drawStr (118,54, "m"); u8g.drawHLine (0, 56, 128); u8g.drawStr (19,64, "LAT:"); u8g.setPrintPos (39, 64); u8g.print (23,57); // Demo, substitua por LAT quando o GPS adiciona u8g.drawStr (69,64, "LONG:"); u8g.setPrintPos (94, 64); u8g.print (90.36); // demonstração, substitua por LON quando o GPS for adicionado // u8g.setPrintPos (40, 25); u8g.print (round (temp)); u8g.drawStr (55,25, "'C"); int r =redondo (sqrt (X * X + Y * Y)); // float tid =atan (Y / X) * 180 / 3.1415; // questões matemáticas aqui // int radius =round (tid); u8g.drawStr (0,22, "cabeçalho"); u8g.drawCircle (18, 34, r, U8G_DRAW_ALL); // círculo de nivelamento interno u8g.drawCircle (18, 34,10, U8G_DRAW_ALL); // círculo fixo externo // círculo interno se tornará um ponto quando não houver inclinação em x e eixo y // quando o rumo da bússola é mais preciso //u8g.drawLine(18, 34, (18 + round (Y * 2)), (34 + round (X * 2))); // ampliado 2x u8g.setPrintPos (0, 53); u8g.print (cabeçalho); // 0 ou 360 é N // 90 é E // 180 é S // 270 é W // u8g.setFont (u8g_font_5x8); if ((cabeçalho> 315) | (cabeçalho <=45)) {u8g.drawLine (18,34,8,34); } if ((cabeçalho> 45) &(cabeçalho <=135)) {u8g.drawLine (18,34,18,24);} if ((cabeçalho> 135) &(cabeçalho <=225)) {u8g.drawLine (18,34,28,34);} if ((cabeçalho> 225) &(cabeçalho <315)) {u8g.drawLine (18,34,18,44);} // u8g.drawLine (18, 34, (18 + round (Y * 2)), (34 + round (X * 2))); // ampliado 2x BASEADO NO ACELARÔMETRO // o loop termina aqui} 
Bibliotecas C / C ++
Descompacte-o e adicione os arquivos compactados individuais da biblioteca ao Arduino Library Manager
 Sem visualização (apenas download). 

Esquemas


Processo de manufatura

  1. O que é um sensor de O2?
  2. Sensor de movimento usando Raspberry Pi
  3. Sensor de umidade do solo Raspberry Pi
  4. Transforme seu Raspberry Pi em um Hamster Fitness Tracker
  5. Teste o sensor DS18B20
  6. Sensor de temperatura Raspberry Pi
  7. Rastreador de banheiro (Powered by Walabot)
  8. Sensor de emoção / EEG
  9. Windows 10 IoT Core no Raspberry Pi 2 - Dados do sensor Adafruit
  10. Rastreador de sensor RSSI WiFi para a ISS