Projeto - Cycloduino

Olá galera, sou novo aqui no fórum mas queria divulgar um projeto que estou desenvolvendo o Cycloduino.
A ideia é criar um ciclocomputador completo com velocidade, cadência, temperatura, altitude, frequência cardíaca, log no cartão SD, e outras funções.
O projeto está hospedado no GitHub GitHub - carmolim/cycloduino: The Cycloduino is a attempt to create a full featured cyclocomputer using an Arduino. e estou a procura de colaboradores para me ajudar no desenvolvimento desse projeto.
Já completei boa parte do projeto, e estou avançando na medida que os sensores vão chegando e que vou tendo tempo livre.
Se você tiver interesse e participar desse projeto entre no repositório dê uma olhada e vamos conversar!

Valeu!

Portanto... tens este código todo e não tens sensores?

Não seria melhor primeiro ver o que dão os sensores e depois comecar a juntar as coisas? Algo que se calhar pode limitar um pouco o sistema é a escrita para o cartão. Isso talvez demore um pouco mais e limite a frequência de amostragem. Também reparei que usas timers... e uma interrupcão algo complexa. Isso pode tornar dificil fazer as medicões sempre no mesmo intervalo...

Algo que também notei é a ausência de filtros... Mas isso pode ser feito à posteriori já que não vais controlar nada.

Depois mostra o resultado final.

Todo o código foi feito com o sensores que já tenho e já foram testados e estão funcionando... eu vou ampliar na medida que os outros sensores chegarem, barômetro o receptor do polar etc...

O que poderia fazer para melhorar a escrita no cartão? Se eu entendi essa etapa pode demorar e atrasar a execução do resto do código é isso?
Quanto aos timers não entendi a sua colocação, eu estou utilizado os timers justamente para ter uma leitura precisa de quando o imã passa em frente ao sensor reed. Você quis dizer que o código dentro da interrupção está muito complexo?

E em relação aos filtros, o que poderia filtrar?

obrigado pela ajuda!

Estive a pensar um pouco... e se calhar foi um comentário idiota (na altura estava a fazer trend de sinais rápidos e não pensei bem na aplicacão que tens). Certamente que não queres amostrar a cada 100ms... isso seria um tanto ou quanto ridículo.
Dependendo até das tuas voltas de bicicleta, diria que uma amostragem ao segundo seria também um tanto excessiva. O que podes fazer é uma amostragem selectiva... ou seja, em vez de leres todas as variáveis sempre que fazes uma amostragem, lias algumas sempre (tipo frequência cardíaca, velocidade... não sei o que queres dizer com cadência) e outras a cada 10 ou 5 leituras das outras variáveis... a altitude (que julgo eu será um sensor barométrico) não vai variar consideravelmente de segundo a segundo ou mesmo de 10 em 10 segundos.

Mas numa primeira fase, guardar os dados todos seria o melhor. (eventualmente meter um GPS seria bom, mas ter de lidar com as strings do GPS certamente que iria tornar o programa bem mais pesado).

Quanto a filtragens, qualquer sinal analógico pode necessitar de filtragem. Se todos os teus sensores forem digitais, isso é um problema que não se coloca.

Como vais medir a frequência cardíaca e aquilo a que chamas de cadência?

interessante, realmente talvez fazer todas as leituras a cada segundo seja meio exagerado, vou pensar nisso, vc tem alguma sugestão da melhor forma de fazer isso?

para a frequência cardíaca eu ainda estou em dúvida, mas tenho duas opções, a primeira é usar RMCM01 que é um módulo OEM compatível com as cintas da Polar, mas está difícil de encontrar ele OEM só encontro a interface da SparkFun - Polar Heart Rate Monitor Interface - SEN-08661 - SparkFun Electronics, mas daí fica muito caro, tem que comprar essa interface e ainda a cinta...

a outra opção é usar o Transceiver nRF24L01+ Module - SparkFun Transceiver Breakout - nRF24L01+ - WRL-00691 - SparkFun Electronics para utilizar uma cinta cardíaca da Garmin, é mais barato e teoricamente seria possível se comunicar com outros sensores da Garmin, mas pelo que vi pode ser meio complexo, mas ainda não cheguei nessa etapa...

a cadência nada mais é que as rotações por minuto do pedal e para isso também estou utilizando um reed switch.

Com o millis faz uma leitura de 10 em 10 segundos. :\

Já experimentaste o reed switch na bicicleta? não tiveste problemas de ruído? Por vezes contactos mecânicos podem activar se expostos a choques grandes... o que acontecerá se andares com a bicicleta fora de estrada.

legal... agora eu estou trabalhando em uma forma incrementar o nome dos logs gerados, se já tiver um log criado ele muda o nome do novo arquivo parar não sobrescrever o log anterior, sempre seguindo uma sequência... RIDE_01.csv, RIDE_02.csv e assim por diante...

quando aos reeds, atualmente estou testando com um toca disco, para não ter que levar a bicicleta no quarto. mas de qualquer forma eu estou reutilizando os reeds de outros velocímetros que tinha instalado em outras bicicletas, eu dei uma olhada na construção deles e realmente podem dar falsos positivos causados por impactos, teria que fazer um teste real em uma trilha para verificar se ocorreriam tantos falsos positivos... acredito que uma alternativa a isso seria utilizar um sensor Hall, não tenho tanto conhecimento assim sobre eletrônica, mas achei esses dois links bem interessantes...

http://www.meder.com/sensor-vs-hall-effect4.html

Quanto ao nome dos logs, tem em atencão o tamanho. Certamente que depois vais querer importar esses dados para Excel ou algo assim e um ficheiro gigantesco pode não ser aberto e dar imenso trabalho depois a tirar dados para poderes fazer um gráfico.

Existem funcões na libraria SD que dão para ver os nomes, né? Em todo o caso podes tentar manter uns contadores para isso... mas não é ideal.

Os sensores hall devem ser simples de colocar a trabalhar... digo eu. Vais medir no pedal ou nos aros da bicicleta?

Que hardware é que vais usar? Um Arduino mega? Ou um normal?

quanto ao log, o esse é o trecho do código que estou desenvolvendo:

  // create a new file
  for (uint8_t i = 0; i < 100; i++)
  {
    logName[5] = i/10 + '0';
    logName[6] = i%10 + '0';
    if (! SD.exists(logName))
    {
      // only open a new file if it doesn't exist
      myFile = SD.open(logName, FILE_WRITE); 
      break;  // leave the loop!
    }
  }

estou usando esse pedaço tirado de um tutorial da ladyada, não sei se seria melhor implementar esse mesmo código utilizando um laço while... ainda não testei mas seria algo assim:

 // while the filename exists...
  while(SD.exists(logName))
  { 
    logCount += 1;                 // adds 1 to the counter
    logName[5] = logCount / 10 + '0';
    logName[6] = logCount % 10 + '0';
  }   

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open(logName, FILE_WRITE);

mas ainda não tive tempo de testar...

quando aos sensores, eu estou utilizando um reed no garfo da bicicleta com um imã preso a um aro, e outro imã na parte interna do pedal, para medir a cadência, vc acha que utilizando um sensor hall os problemas com falso negativo seriam eliminados?

no momento estou utilizando um mega 2560, assim que finalizar o projeto quero ver se consigo passar tudo para um arduino mini ou nano, não sei ainda se será possível...

Talvez porque não está dependente dum contacto mecânico.

Outra coisa que pensei foi nas mudancas. Se medires a cadência no pedal, sabes o trabalho que as tuas pernas estão a fazer, se medires no aro medes a velocidade da bicicleta mas isso não indica o trabalho que fazes. Como disseste que vais medir o ritmo cardíaco, se calhar saber a cadência nos pedais daria uma maior informacão acerca de ti e menos sobre o percurso que estás a fazer. :\

Mas não sei qual é o teu objectivo aqui, a sensacão que fiquei foi que querias fazer um log da tua performance. :\

vou ter que fazer alguns testes para ver se vale a pena substituir os reeds por sensores hall...
eu vou medir a cadência e a velocidade pq eu quero colocar um lcd nokia instalado na bike para mostrar as informações...
assim eu posso controlar minha cadencia, que para um treino de ciclismo é mais importante do que manter a velocidade...
e coletando esses dados também poderei fazer algumas comparações e melhorar minha performance...

olá, recentemente meu LCD chegou e já desenvolvi algumas páginas de exibição, para passar para próxima página eu coloquei um push button, mas coloquei o a verificação de quando botão é pressionado dentro do timer, cada vez que eu pressiono o botão ele pula muitas páginas, eu sei que eu preciso fazer um debounce do botão, mas não estou conseguindo solucionar... parece que não é possível algumas funções quando já tem um timer rodando e fiquei meio confuso...

o código do projeto está aqui: cycloduino/cycloduino.ino at master · carmolim/cycloduino · GitHub

a parte do push button começa na linha 495.

obrigado!

Se apenas tens um push button, se calhar nada como verificar se houve diferenças no pino do botão de X em X tempo. Isto normalmente soluciona o debouncing duma forma "simples".

Algo assim:

#define IO_CHECK   500 //500 milisegundos
unsigned long before = 0; 


//dentro do loop

if (millis() - before > IO_CHECK) {
   if (digitalRead(botao) == PUSHED) {
       //faz o que pretendes
   }
   before = millis();
}

Podes tentar diminuir o periodo (tipo 100 ms) para melhorar a resposta ao utilizador. Isto não é ideal, mas é a maneira mais simples de evitar bouncing.

o problema é que meu loop está com um delay de 1000... por isso estava tentando colocar dentro do timer, mas acho que daí ele não funciona né?

Porque é que tens um delay?

tem alguns métodos que estão programados para funcionar nesse ciclo de 1 segundo... aí fiquei meio preso, não sei como separar as coisas... teria como jogar esses métodos que preciso desse ciclo fora do loop e fazer eles rodarem de segundo em segundo?

#define RUNNING   1000 //1 segundo
unsigned long before = 0; 


//dentro do loop

if (millis() - before > RUNNING) {
   //isto corre de segundo a segundo... 
   before = millis();
}

Isto funciona para o que pretendes. Assim podes ter partes do programa a correr de x em x segundos sem bloqueares tudo com o delay.

interessante, quando tiver um tempo vou reestruturar meu código para essa forma...
obrigado! assim que fizer volto a dar notícias...