Ir ao conteúdo
  • Cadastre-se

limitador de RPM com arduino


Posts recomendados

  • Membro VIP

Não tenho muito a somar +. A não ser os offs:

-manutenção da incógnita 😁

-sou phd em pisca led pra mc 😜e acredite se quiser mas de fato certa feita

8 horas atrás, ComandateGustavo disse:

essas baterias devem ser de vida bem longa também, ou os circuitos que usam ela devem puxar uma corrente baixíssima

fiz um pisca led com pic pra colocar no carro como alarme falso. Usando o recurso sleep, a ideia era mesmo fazer piscar pra sempre. Colei no painel meio que perto da saída de ar condicionado. Alguns dias e ele caiu lá dentro. Acho que tá piscando até hoje

11 horas atrás, mlegnari disse:

um pisca pisca com led para colar no retrovisor do carro,

 

9 horas atrás, Thiago Miotto disse:

presentes dados para você até 50 doletas não serão taxados

9 horas atrás, Thiago Miotto disse:

Na prática, eles olham caixas grandes para taxar

... e na teoria quando suspeitam que você pediu pro vendedor colocar um preço menor do que o treco vale.

Em tempo: numa de minhas primeiras compras de lâmpada led veio numa caixa monstruosa +- do tamanho de uma cadeira. Sem taxa...

8 horas atrás, ComandateGustavo disse:

Vai entender, atualmente ser taxado ou não depende simplesmente de pura sorte...

 

8 horas atrás, ComandateGustavo disse:

baterias devem ser de vida bem longa também, ou os circuitos que usam ela devem puxar uma corrente baixíssima

E descobriu isso sozinho! Gênio! kk brinc...

abç

Já começou a palhaçada de virar página sem grandes progressos ... e eu contribuí pra isso kk 😜

  • Haha 1
Link para o comentário
Compartilhar em outros sites

@.if ,

 

Tá vendo com a lenda do pisca-pisca na gaveta tinha um fundo verdadeiro ? 

 

Voltando ao tópico, acho que embora tenha alguns posts para dar uma relaxada, tem bastante coisa legal escrita ao longo de todo tópico.

 

@ComandateGustavo,

 

A pergunta  feita sobre a linguagem de programação dos Pics , se ela é parecida com a do Arduino ... vou dar algumas rtespostas aqui :

 

Podemos programar qualquer microcontrolador em qualquer linguagem disponível para ele !

 

Não tem como "portar" o código usado em um Pic para usar em um Avr, pois os hardwares internos, embora façam funções idênticas em algumas vezes, são diferentes, portanto o programa sempre tem de ser adaptado para funcionar.

 

E temos o problema dos compiladores ....existem vários compiladores de cada linguagem, todos incompatíveis entre si.... pode considerar a plataforma Arduíno como um tipo de compilador C, originalmente projetado para alguns microcontroladores AVR como o Atmega328, mas hoje existe como baixar suporte para outras famílias, como o ESP8266 .

 

O que importa não é a cor do gato, mas sim, que ele coma ratos.... então você pode ver algumas linguagens e procurar aquela que você mais se identifica.

 

Quando eu fiz o meu primeiro programa de microcomputador, foi num Sinclair, em 1980, me identifiquei na hora com o Basic dele, tudo era fácil. Na faculdade, aprendi o Assembly do 8080, e claro, do Z80, e algum tempo depois comprei um livrinho que ensinava a programar em Assembly o Sinclair, acabei comprando um Sinclair e fui me divertindo, isso ainda em 1981, logo depois aprendi a usar os Apple ][ em Basic também, e logo me interessei pelo Assembly do 6502, e logo depois descobri que existia uma placa de CP/M para os Apple, com um microcontrolador Z80, fiquei imaginando como dois microcontroladores podiam existir usando o mesmo hardware periférico, como as memórias e a saída de  vídeo .... e fui estudando , comprando livros importados na Litec, enfim acabei comprando o meu Apple][ quando estava no quinto ano da faculdade.

Detalhe, tudo o que eu fazia era usando Basic ou/e Assembly ....

 

Até hoje só me sinto confortável usando Basic e Assembly kkkkk não consigo entender a linguagem C, então fico muito restrito a dar apoio aqui no CDH na área de programação, mas tento ajudar no hardware pelo menos ....

 

No seu lugar eu ainda usaria bastante a plataforma Arduino, mas depois de um tempo iria para um verdadeiro compilador C. Minha idade não me permite fazer isso, mas ainda permite saber o que deveria fazer se fosse bem mais jovem kkkk !

 

Paulo

  • Curtir 1
  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

16 horas atrás, aphawk disse:

Até hoje só me sinto confortável usando Basic e Assembly kkkkk não consigo entender a linguagem C, então fico muito restrito a dar apoio aqui no CDH na área de programação, mas tento ajudar no hardware pelo menos ....

 

No seu lugar eu ainda usaria bastante a plataforma Arduino, mas depois de um tempo iria para um verdadeiro compilador C. Minha idade não me permite fazer isso, mas ainda permite saber o que deveria fazer se fosse bem mais jovem kkkk !

eu malemá entendo a C quanto mais outras linguagens kkkkkk

 

Em 30/04/2021 às 07:57, .if disse:

Já começou a palhaçada de virar página sem grandes progressos ... e eu contribuí pra isso kk 😜

tu tem uma aversão a virar páginas mesmo ein? kkkkk

 

Bom hoje estou estudando os links que me passaram, e é um assunto denso e complexo ein?

 

estou entendendo mais ou menos, achei alguns videos em inglês tipo esse aqui:

 

 

 

É bem complexo mesmo mas acho que estou progredindo, é bem provável que eu empaque em alguma etapa ou dê erro na hora de compilar, aí eu corro aqui no tópico novamente kkkkkk

 

 

Link para o comentário
Compartilhar em outros sites

Nossa pessoal estou desde cedo em cima disso e não tá saindo nada, vi videos do cara tentei começar baseando no código que a @.if colocou e não virou em nada também,  tem que estudar e entender muito bem o hardware do atmega328 e como ele funciona certinho além de estar tudo em inglês, mesmo lendo o manual e os links que me mandaram não deu certo, imagino que é algo muito avançado e teria que ser craque em programação pra ir pra algo desse nível...

 

Por curiosidade fui pesquisar se existia algo assim ou parecido com isso pra ter um inicio mais fácil, e olhando esse site achei algo mais ou menos parecido:

 

http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/index.html

 

É um frequencimetro básico que mostra a frequência no monitor serial e está escrito que ele usa o pino 5 como entrada por causa disso aqui: 

 

Citação

This pin is mapped to the alternate port function T1 which is the input 16 Bit Hardware Counter1.

Então imaginei que fosse mais preciso do que aquele meu frequencimetro anterior, compilei o código  e mandei para o arduino, e pra variar sem alterar nadinha do código original ele simplesmente não funciona, todas as frequencias que eu medi ele não acerta nenhuma, mostra 10,17,6hz tudo errado...

 

Citação

#include <FreqCounter.h>

void setup() {
  Serial.begin(57600);                    // connect to the serial port
  Serial.println("Frequency Counter");
}

long int frq;
Void loop() {

 FreqCounter::f_comp= 8;             // Set compensation to 12
 FreqCounter::start(100);            // Start counting with gatetime of 100ms
 while (FreqCounter::f_ready == 0)         // wait until counter ready
 
 frq=FreqCounter::f_freq;            // read result
 Serial.println(frq);                // print result
 delay(20);
}

 

Sinceramente estou perdido 😔

Link para o comentário
Compartilhar em outros sites

Esse link que você enviou tem download da biblioteca. você fez ele e colocou na pasta das bibliotecas?

Se o resultado está bem louco, minha 1ª teoria é que você tem outra biblioteca com o mesmo nome.

2ª teoria

16 horas atrás, ComandateGustavo disse:

está escrito que ele usa o pino 5 como entrada

Acho  que você deve montar um desses esquemas que ela põe lá. Do jeito que você falou, eu entendi que você ligou direto no pino 5.

image.thumb.png.f6eb93f9e83eba2915e10e8a7ec8bdfc.png

Link para o comentário
Compartilhar em outros sites

5 horas atrás, Thiago Miotto disse:

Esse link que você enviou tem download da biblioteca. você fez ele e colocou na pasta das bibliotecas?

Se o resultado está bem louco, minha 1ª teoria é que você tem outra biblioteca com o mesmo nome.

sim sim baixei e instalei o zip pela propria ide arduino

 

5 horas atrás, Thiago Miotto disse:

Acho  que você deve montar um desses esquemas que ela põe lá. Do jeito que você falou, eu entendi que você ligou direto no pino 5.

sim liguei direto no pino 5, achei que esses esquemas era apenas se a tensão do sinal da frequência fosse maior que 5v aí ele iria abaixar para 5v...

 

Mas olha que reviravolta @Thiago Miotto  uns 3 dias antes de criar o tópico eu tinha mandado email para o criador do esqueminha original, esse aqui:

 

https://create.arduino.cc/projecthub/adrianos_botis/automotive-engine-rev-limiter-9c05cc

 

aí falei pra ele sobre a frequencia do hall que 33Hz é igual a 1000RPM e achei que ele poderia ajudar também, mas ele nunca mais respondeu, aí hoje do nada ele me mandou o código e o link para a biblioteca que ele usa, dizendo que demorou para responder porque está muito ocupado, o código que ele mandou é esse aqui:

 

Citação

#include <FreqCount.h>

// Rev-Limiter Code for Arduino Project Hub
//
//Written by Adrianos Botis: [email protected]
//
//Use at your own and change the parameters: rpm_val to set the rpm limit of your engine.
//You can also change the delay of milliseconds at the end of the code to set how fast your engine will be switched on-off.
//


const int sensor_pin = 5;
// set number of hall trips for RPM reading (higher improves accuracy)
float sensor_thresh = 20.0;  //Changed the threshold value to 44 wich corresponds to 1 rotation
float rev_limit = 4000.0;    // Set your rev limiter rpm of your choice
int ignition = 2;
float HztoRpm = 0.033;
void setup() {
  // initialize serial communication at 115200 bits per second:
  Serial.begin(9600);
  // make the sensor pin an input:
  pinMode(sensor_pin, INPUT);
  pinMode(ignition, OUTPUT);
  FreqCount.begin(200);
}

// this loop routine runs over and over again forever:
void loop() {
  unsigned long freq;
  // preallocate values for tach
  if(FreqCount.available()){
    freq = 5*FreqCount.read();
    float rpm_val = freq/HztoRpm;
  Serial.println(rpm_val);
   if(rpm_val > rev_limit){
     digitalWrite(ignition, HIGH);
     } 
     else { 
     digitalWrite(ignition, LOW);
  } 
  
  delay(10); 
  }
          // delay in between reads for stability
}

 

 

e ele deixou claro que era para usar o pino 5 como entrada de sinal nessa mensagem:

 

 

Citação

I made some tweaks to the code so you can now directly feed the Hall Effect sensor output to your Arduino!! Be careful to use as an input the Digital Pin 5(instead of Digital Pin 3) because it was more convenient to set up the code. 

For your further information I used the method of frequency counting and I have integrated it into the original Rev_Limiter code! I also made some experimenting to simulate the real conditions by using an Arduino Uno as a pulse generator by using the PWM pins,and an Arduino Nano with the code I tweaked. It proved to work like a charm!!

Don't forget to set up the rev limit to the desired RPM value in the first lines of the code(default is set to 5500)!!

 

Entendi mais ou menos o que ele diz aí, porém se ele usa o pino 5 imaginei que dessa forma fosse mais preciso, então coloquei no arduino e conectei no carro e ele começou a limitar em 1000RPM o que é estranho porque no código coloquei pra limitar em 2000, então voltei no PC e imaginei que estivesse contando os pulsos dobrados no hall, mudei para 4000 no código achando que ele iria limitar em 2000 e deu certo limitou em 2000.

 

MAS por incressa que parível esse código dele funcionou bem pior que aquele anterior que tinhamos feito, ele limita o rpm só que "vareia" demais, o anterior que fizemos era bem mais estável, eu fui acelerando lentamente até chegar 2000rpm e mantive o pedal do acelerador paradinho, mas olha como ele ficou variando do nada:

 

 

 

Estou achando que vou basear no código dele a parte de contar a frequência porque usando o pino 5 deve ser mais preciso, mas vou deletar tudo sobre a parte de multiplicar por 5 e converter para RPM, estou achando que esse é um dos motivos dele ser beem impreciso, vou usar aquela parte do código anterior que criamos para ligar e desligar o rele sem converter para RPM, creio que assim vai ter uma resposta melhor.

 

Outra coisa que estava pensando, o rele interrompe o fio negativo da bobina, nesse caso será que no lugar  do rele poderia usar esse módulo com transistor? o que acham @.if @aphawk @mlegnari?

 

modulo-mosfet-irf520-driver-controlador-

 

Já tenho ele aqui, e acho que com ele podemos conseguir ligar e desligar bem bais rápido do que usando o rele, além de ser mais silencioso(o rele ligando e desligando rápido parece a seta do carro fica estranho kkkkk) 🙃

 

Link para o comentário
Compartilhar em outros sites

Fuçando na documentação dessa biblioteca FreqCout vi que depois que ela foi instalada ela cria um exemplo para facilitar, aí abri o exemplo, só que tinha algo errado faltava colocar: const int sensor_pin = 5; depois que coloquei ajustei para medir por 100ms, então a frequência que iria aparecer no monitor serial seria 10 vezes menor do que a frequência real, fiz isso e deu certo.

 

Mas na hora de colocar a restante do código para o led piscar no pino 7 ele faz o upload não aparece nenhum erro e funciona normal, mas o led não pisca de jeito nenhum, o que pode ser? @Thiago Miotto

 

aqui o código, está bem basiquinho só que não estou entendendo porque ele não pisca o led... veja se consegue achar algum erro por favor:

 

Citação

/* FreqCount - Example with serial output
 * http://www.pjrc.com/teensy/td_libs_FreqCount.html
 *
 * This example code is in the public domain.
 */
#include <FreqCount.h>
#define outrele  7

const int sensor_pin = 5;
const int rele=7;
long  counter;

void setup() {
  Serial.begin(57600);
  FreqCount.begin(100);
  pinMode(rele, OUTPUT);
}

void loop() {
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
    Serial.println(count);
  
  if ((count > 15 )) { 

  if (((counter / 500) % 2) == 1) {
    digitalWrite(rele, HIGH); //liga por 500 milisgundos o led se freq maior que 15
  }
  else
  {
    digitalWrite(rele, LOW); //desliga por 500 milisgundos o led se freq maior que 15
  }
}
 else
{
  digitalWrite(rele, LOW); //desliga o led se freq menor que 15

}
}
}
  

 

Link para o comentário
Compartilhar em outros sites

@ComandateGustavo O negativo da bobina vai para o modulo de ignição certo? Olha eu iria interromper o fio do sensor de rotação do seu modulo, porque a corrente é baixa e tensão também, ali na bobina se você for cortar ela no mosfet ou igbt tem que ser algo proprio para uso automotivo, senão pode queimar e você ficar a pé! E outra coisa, o fio que vai para o modulo da bobina, após abrir o contato para centelhar (dwell time) gera picos de mais de 300v nesse fio, o IRF540 é só 100v.

 

Foca mais em resolver o código agora, com relê esta funcionando bem, posta o ultimo código aqui que vou te ajudar .

Link para o comentário
Compartilhar em outros sites

13 horas atrás, mlegnari disse:

O negativo da bobina vai para o modulo de ignição certo? Olha eu iria interromper o fio do sensor de rotação do seu modulo, porque a corrente é baixa e tensão também, ali na bobina se você for cortar ela no mosfet ou igbt tem que ser algo proprio para uso automotivo, senão pode queimar e você ficar a pé! E outra coisa, o fio que vai para o modulo da bobina, após abrir o contato para centelhar (dwell time) gera picos de mais de 300v nesse fio, o IRF540 é só 100v.

sim, aqui está o esquema completo do meu sistema de ignição:

 

modulo142gauss-350x275.jpg

 

voce acha que seria melhor interromper o sinal do hall ao módulo? No caso seria o fio azul, hall imput certo?

 

 

13 horas atrás, mlegnari disse:

Foca mais em resolver o código agora, com relê esta funcionando bem, posta o ultimo código aqui que vou te ajudar .

 

 

@mlegnari sim com rele está funcionando, mas creio que dá pra melhorar, mas vamos lá o código atual é esse aqui:

 

Citação

/* FreqCount - Example with serial output
 * http://www.pjrc.com/teensy/td_libs_FreqCount.html
 *
 * This example code is in the public domain.
 */
#include <FreqCount.h>
#define outrele  7

const int sensor_pin = 5;
const int rele=7;
long  counter;

void setup() {
  Serial.begin(57600);
  FreqCount.begin(100);
  pinMode(rele, OUTPUT);
}

void loop() {
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
    Serial.println(count);
  
  if ((count > 15 )) { 

  if (((counter / 500) % 2) == 1) {
    digitalWrite(rele, HIGH); //liga por 500 milisgundos o led se freq maior que 15
  }
  else
  {
    digitalWrite(rele, LOW); //desliga por 500 milisgundos o led se freq maior que 15
  }
}
 else
{
  digitalWrite(rele, LOW); //desliga o led se freq menor que 15

}
}
}

 

Ele mede a frequencia em 100ms, mas no meu caso não preciso multiplicar por 10 para saber qual seria a frequencia, a ideia é que 100ms é a frequencia dividida por 10 então 2000RPM =66Hz nesse caso em 100ms ele vai mostrar 6.6Hz e está certo ele mostra 6-7hz só que a ideia era fazer o led piscar quando passar de 15 e isso não está acontecendo, creio que seja algum bug, porque na hora de compilar e fazer upload não dá erro nenhum... Consegue ver algum erro?

Link para o comentário
Compartilhar em outros sites

@Thiago Miotto @mlegnari  olha que doido tirei a parte da comunicação serial e nada do led piscar, então fiz tipo o pisca led bem basiquinho, estava assim:

 

Citação

if ((count > 15 )) { 

  if (((counter / 500) % 2) == 1) {
    digitalWrite(rele, HIGH); //liga por 500 milisgundos o led se freq maior que 15
  }
  else
  {
    digitalWrite(rele, LOW); //desliga por 500 milisgundos o led se freq maior que 15
  }
}
 else
{
  digitalWrite(rele, LOW); //desliga o led se freq menor que 15

 

 

ficou assim:

 

Citação

if ((count > 10 )) { 

   digitalWrite(rele, HIGH);
   delay(50);
   digitalWrite(rele, LOW);
   delay(50);
   
  }
  else
  {
    digitalWrite(rele, LOW); 

}

 

aí agora mesmo usando a comunicação serial funciona normal, vai entender...

 

Mas da ultima vez usando a função delay fazia a medição da frequencia ficar toda louca, agora mesmo usando comunicação serial está funcionando de boa, será que justamente por usar o pino 5 a função delay não interfere com a medição? Isso seria o tal do nointerrupt pin? 🤔

Link para o comentário
Compartilhar em outros sites

3 horas atrás, ComandateGustavo disse:

Mas da ultima vez usando a função delay fazia a medição da frequencia ficar toda louca, agora mesmo usando comunicação serial está funcionando de boa, será que justamente por usar o pino 5 a função delay não interfere com a medição? Isso seria o tal do nointerrupt pin?

Pelo que entendi, o pino está servindo só para contar, não é nem a função nointerrupt. Mas sim, ele faz a contagem independente de delays. Assim como o nointerrupt.

Link para o comentário
Compartilhar em outros sites

6 minutos atrás, Thiago Miotto disse:

Pelo que entendi, o pino está servindo só para contar, não é nem a função nointerrupt. Mas sim, ele faz a contagem independente de delays. Assim como o nointerrupt.

então eu também não sei ao certo, será que dentro da biblioteca FreqCount  pode ter alguma coisa que automáticamente já faça o pino 5 trabalhar como no nointerrupt? Como o gringo disse no email aquele dia para funcionar necessáriamente precisa ser no pino 5, só fuçando no manual do hardware ou explorando sobre a biblioteca pra saber mesmo...

 

bom agora vou tentar programar o restante, o potenciometro para ajuste, o botão e o rele também, vou testar até qual velocidade o rele consegue ligar e desligar, mas deve haver um ponto em que ele não vai conseguir acompanhar a velocidade e vai começar a ficar estranho, vou testar aqui e amanhã posto o resultado.

Link para o comentário
Compartilhar em outros sites

 

 

Agora funcionou bem melhor:

 

a parte de ler o botão e o do potenciometro ficou assim:

 

 

Citação

void loop() {
  int x = analogRead(pot);
  int y = map(x,0,1023,0,20);
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
    Serial.println(count);
  
if ((count > y ||(!(digitalRead(inbotao))))) { 

   digitalWrite(rele, HIGH);
   delay(50);
   digitalWrite(rele, LOW);
   delay(50);
   
  }
  else
  {
    digitalWrite(rele, LOW); 
  }
}

 

agora quero ver se descubro como colocar um outro potenciometro para alterar a velocidade que o led pisca, pra aumentar ou diminuir o tempo de delay nesse caso é 50 mas se eu quiser mais tempo ou menos tempo tenho que voltar no PC alterar o código mandar pro arduino e aí testar no carro, então se der pra mudar isso na hora usando o potenciometro vai ser bem melhor...

 

Viu  @Thiago Miotto dessa vez como a anterior usei esse comando como você havia me falado:

 

Citação

 pinMode(inbotao,INPUT_PULLUP);

 

Aí para aprender melhor fui fuçar na documentação do arduino e estava assim:

 

Citação

O microcontrolador ATmega na maioria das placas Arduino possui resistores pull-up internos (resistores conectados a alimentação internamente) que você pode acessar. Se você preferir usar estes em vez de resistores de pull-up externos, você pode usar o argumento INPUT_PULLUP na função pinMode().

 

Me corrija se estiver errado, mas pelo que entendi a função input_pullup faz exatamente a mesma função do resistor ligado em 5v que colocamos para evitar flutuações, e usando essa função não é mais necessário colocar o resistor porque internamente já está ligado em 5v, ou mesmo assim é bom colocar o resistor de pullup externo?

Link para o comentário
Compartilhar em outros sites

18 horas atrás, ComandateGustavo disse:

e corrija se estiver errado, mas pelo que entendi a função input_pullup faz exatamente a mesma função do resistor ligado em 5v que colocamos para evitar flutuações, e usando essa função não é mais necessário colocar o resistor porque internamente já está ligado em 5v, ou mesmo assim é bom colocar o resistor de pullup externo?

 

Sempre use resistor externo quando trabalhar perto de bobinas, relés, ou qualquer tipo de ruído.

Esse resistor interno de pull-up tem valor muito alto , cerca de 70K se não me engano, e assim a impedância do pino fica muito alta, tornando ele muito susceptível a qualquer tipo de ruído.

 

Paulo

 

Off-topic : estou me divertindo vendo a luta para conseguir uma simples contagem de pulsos por hardware sem ser atrapalhada pelo programa .....

Link para o comentário
Compartilhar em outros sites

3 horas atrás, aphawk disse:

Sempre use resistor externo quando trabalhar perto de bobinas, relés, ou qualquer tipo de ruído.

Esse resistor interno de pull-up tem valor muito alto , cerca de 70K se não me engano, e assim a impedância do pino fica muito alta, tornando ele muito susceptível a qualquer tipo de ruído.

 

Paulo

 

Off-topic : estou me divertindo vendo a luta para conseguir uma simples contagem de pulsos por hardware sem ser atrapalhada pelo programa .....

certo @aphawk  vou colocar o resistor quando for testar no carro, por hora não estou usando porque estou apenas testando na bancada (mesa do meu quarto) estou usando apenas um led na saida, quando for substituir o led pelo rele aí sim usarei o resistor.

 

Falando em contagem de pulsos ser atrapalhada pelo programa não sei se fiz algo errado, mas agora coloquei o segundo potenciometro para poder ajustar a velocidade que o led pisca e pronto o trêm ficou doido.

 

O led não muda a velocidade que ele pisca de acordo com o segundo potenciometro, o led pisca mais rápido ou mais devagar de acordo com a frequência, se for mais baixa pisca mais rápido, se a frequencia for maior ele pisca mais devagar, na verdade está acontecendo a mesma coisa com o monitor serial, ele vai subindo as linhas mais rápido se a frequencia for menor, se a frequencia for maior ele vai subindo as linhas mais devagar, parece que quanto maior a frequencia mais lento fica tudo aqui, ahn o brilho do led tá variando também, quando pisca mais rápido  o brilho é mais fraco e piscando lento fica com brilho mais forte. 

 

😵

 

Tirei a parte do monitor serial pra ver se ficava mais rápido, mas tá lento mesmo assim, será que ler os dois potenciometros, o botão, e contar os pulsos é muita coisa e está começando a sobrecarregar o sistema do ATmega deixando tudo lento ou eu que fiz trapalhada no software de novo?

 

Curiosamente foi a primeira vez que abri a IDE coloquei o código e não deu nenhum erro na hora de compilar kkkkk o que acham@Thiago Miotto @mlegnari

 

aqui está o código atual:

 

Citação

/* FreqCount - Example with serial output

#include <FreqCount.h>
#define outrele  2
#define pot     A0  
#define potb    A1  
#define inbotao  4
  

const int sensor_pin = 5;
const int rele=2;
long  counter;

void setup() {
  FreqCount.begin(100);
  pinMode(rele, OUTPUT);
  pinMode(pot,INPUT);
  pinMode(potb,INPUT);
  pinMode(inbotao,INPUT_PULLUP);
}

void loop() {
  int x = analogRead(pot);
  int y = map(x,0,1023,0,20);
  int a = analogRead(pot);
  int b = map(a,0,1023,0,500);
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
   
  
if ((count > y ||(!(digitalRead(inbotao))))) { 

   digitalWrite(rele, HIGH);
   delay(a);
   digitalWrite(rele, LOW);
   delay(a);
   
  }
  else
  {
    digitalWrite(rele, LOW); 
  }
}
}

 

Link para o comentário
Compartilhar em outros sites

19 minutos atrás, ComandateGustavo disse:

if ((count > y ||(!(digitalRead(inbotao))))) { 

Não deveria, mas talvez o erro seja daqui.
A condição 1 não está fechada entre parênteses antes da condição 2, aí talvez a IDE de uma piradinha.
 

if ( (count > y) || (!(digitalRead(inbotao) )) ) { 

 

Link para o comentário
Compartilhar em outros sites

13 horas atrás, ComandateGustavo disse:

Tirei a parte do monitor serial pra ver se ficava mais rápido, mas tá lento mesmo assim, será que ler os dois potenciometros, o botão, e contar os pulsos é muita coisa e está começando a sobrecarregar o sistema do ATmega deixando tudo lento ou eu que fiz trapalhada no software de novo?

 

Olha .... acho que você não tem a noção exata do que um simples Atmega328 a 16 Mhz pode fazer ....

 

Eu desenvolvi um sistema para controle de rotor de antenas para radioamador com ele, controla até 6 antenas com direções diferentes cada uma, inclusive do tipo bi-direcionais ( dipolos ); ele se liga a um computador via porta USB convertida para serial a 9600 bauds, e a qualquer rádio amador com interface serial ou CI-V , rodando a até 38.400 bauds, ambas funcionando ao mesmo tempo ( uma é por hardware e a outra é por software ), não posso perder 1 byte de nenhuma das duas conversas.... ainda tenho o Timer0 configurado como contador de pulsos ( recebe sinal de um outro aparelho meu, um comutador inteligente de antenas ), o Timer1 é a minha base de tempo de 20 Milisegundos aproximados, o Timer2 gera o PWM para controlar a velocidade do movimento do rotor no início e no fim para evitar trancos nas gôndolas das antenas e que acabam moendo as engrenagens do rotor .... ainda tenho um display I2C ligado nele, e dois rotary encoders que usam 4 interrupções por hardware .... ainda uso mais um pino com interrupção por hardware para me sinalizar dados na serial por software de maneira que eu nunca perca nenhum byte dela.

Fora isso, tem 3 botões para controle também .... isso tudo rodando a 18,432 Mhz , e o sistema dá conta de tudo e ainda poderia fazer mais coisas.

 

Tudo foi programado em Basic e com cerca de uns 300 bytes de rotinas em Assembly....

 

Tudo é software, meu amigo. Quando você achar que algo está lento ou as coisas não estão funcionando como deveriam, reveja o seu programa, use ao máximo as interrupções por hardware existentes no microcontrolador. O verdadeiro poder de um programador é saber como utilizar bem o hardware disponível.

 

Lembre-se sempre que um Atmega 328 tem no mínimo 3 vezes mais capacidade de programa, 5 vezes mais RAM, e pelo menos 30 vezes mais velocidade de processamento  que o computador que levou a Apolo 11 'a Lua !

 

  Já pensou nisso com cuidado ?

 

Paulo

 

Link para o comentário
Compartilhar em outros sites

Quer coisa melhor e mais fácil? Esse código utiliza a frequência de clock para a contagem. Isso te dá alguns milhões de pulsos por segundo. A cada evento externo é feita a captura da contagem, isto é, tem-se o período. Frequência é o inverso do período. O alto valor do clock te dá uma possibilidade de ter várias leituras por segundo com pouco sacrifício da precisão.

https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

Link para o comentário
Compartilhar em outros sites

Em 05/05/2021 às 22:56, Thiago Miotto disse:

A condição 1 não está fechada entre parênteses antes da condição 2, aí talvez a IDE de uma piradinha.

alterei como você pediu e ainda continua doido...

 

estava pesquisando mais coisas e vi esse comando:

 

Citação

int ValorPoten = 0;

void setup() {

pinMode(Led, OUTPUT);

}

void loop() {

ValorPoten = analogRead(Potenciometro);

digitalWrite(Led, HIGH);

delay(ValorPoten);

digitalWrite(Led, LOW);

delay(ValorPoten);

}

o problema é que assim ele não converte nada só faz a leitura do potenciometro, mas pode ser que funcione, vou tentar adaptar aqui.

 

10 horas atrás, aphawk disse:

Tudo é software, meu amigo. Quando você achar que algo está lento ou as coisas não estão funcionando como deveriam, reveja o seu programa, use ao máximo as interrupções por hardware existentes no microcontrolador. O verdadeiro poder de um programador é saber como utilizar bem o hardware disponível.

 

Lembre-se sempre que um Atmega 328 tem no mínimo 3 vezes mais capacidade de programa, 5 vezes mais RAM, e pelo menos 30 vezes mais velocidade de processamento  que o computador que levou a Apolo 11 'a Lua !

 

Pois é @aphawk  sei que o AT328 é parrudo o problema é programar tudo é bem complexo, tem que entender bastante do hardware e do software, eu mesmo começei a "programar" em um mês, malemá sei usar a função iF kkkkk mas devagar vamos longe, em breve vamos conseguir, e como eu comentei eletronica é um hobby pra mim então não tenho como dedicar muito tempo, mas no meu tempo livre vou progredindo aos poucos.

 

2 horas atrás, Sérgio Lembo disse:

Quer coisa melhor e mais fácil? Esse código utiliza a frequência de clock para a contagem. Isso te dá alguns milhões de pulsos por segundo. A cada evento externo é feita a captura da contagem, isto é, tem-se o período. Frequência é o inverso do período. O alto valor do clock te dá uma possibilidade de ter várias leituras por segundo com pouco sacrifício da precisão.

https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

bem interesante @Sérgio Lembo  não tinha reparado, mas estou usando a biblioteca FreqCount desse mesmo site, e esse link que me mandou é do mesmo criador mas usa a biblioteca FreqMeasure, e lendo aqui está escrito para usar as bibliotecas nesses casos:

 

FreqCount: best for 1 kHz to 8 MHz (up to 65 MHz with Teensy 3.0 & 3.1)
FreqMeasure: best for 0.1 Hz to 1 kHz

 

ou seja para frequências baixas que é meu caso já que o hall do distribuidor não deve passar de uns 250Hz o mais indicado é usar essa mesma do link que me mandou a FreqMeasure, inclusive olhando aqui parece que ela usa a tão falada função interrupt:

 

At the end of each cycle, an interrupt routine runs. The actual capture of elapsed time is done by hardware, so some interrupt latency is acceptable.

At relatively low frequencies, under 1 kHz, only minimal CPU time is used. However, as the frequency increases, the interrupt demands more CPU time. A hardware low-pass filter is recommended if the input frequency could possibly be much higher than several kHz.

 

Bom vou mudar tudo aqui e tentar usar essa biblioteca freqmeasure e vamos ver, é bom porque já poderei fazer outro teste prático nesse fim de semana.

 

ei  @aphawk está assim no site dessa biblioteca: At the end of each cycle, an interrupt routine runs. The actual capture of elapsed time is done by hardware.

 

quer dizer que a cada fim de ciclo da frequência que está sendo medida uma rotina de interrupção acontece, e a contagem de tempo é feita por hardware, nesse caso é aquilo que você havia comentado antes, contar o tempo por hardware é usar um dos timers do ATmega328 e quando chega o fim do ciclo acontece uma interrupção, ou seja a função interrupt, é isso mesmo ou estou enganado?🤔

Link para o comentário
Compartilhar em outros sites

@ComandateGustavo,

 

Pelo que eu li eles usam 2 Timers, um deles configurado como contador, que faz a contagem de pulsos.

O outro Timer é apenas a base de tempo , que gera uma interrupção a cada xxx milissegundos justamente para ler quantos pulsos o outro Timer contou.

 

A outra maneira que eles usaram é configurar um dos Timers como contador de pulsos de clock, ao invés de contar os pulsos externos.

 

Você pega um dos pinos que podem gerar interrupção,  de preferência o Int0 ou Int1, programa ele para interromper na descida do sinal , assim a cada descida você pega a contagem dos pulsos de clock e após isso zera essa contagem para começar de novo.

Sabendo quantos pulsos de clock houveram, e sabendo a frequência do clock, você tem o tempo total, e assim sabe a frequência na entrada.

 

Repare que você já leu sobre essas maneiras ...  o que você está tendo dificuldades é apenas porque você está aprendendo um monte de coisa ao mesmo tempo !

 

Mas olhe quanta coisa você aprendeu em um mês !

 

Paulo

 

Link para o comentário
Compartilhar em outros sites

12 horas atrás, ComandateGustavo disse:

ou seja para frequências baixas que é meu caso já que o hall do distribuidor não deve passar de uns 250Hz o mais indicado é usar essa mesma do link que me mandou a FreqMeasure, inclusive olhando aqui parece que ela usa a tão falada função interrupt:

 

Errado.

Em muitos timers existe um acessório chamado capture. No exato instante em que o pino a ele associado altera de valor ele imediatamente faz a leitura do timer e armazena na memória, seta uma flag e com possibilidade de gerar eventos e interupções, depende do modelo do processador.. A leitura dessa memória vai levar um tempo, processamento idem mas o valor está congelado, não teremos distorções de elapse time. O programa sugerido utiliza o capture do timer como marcador de evento e o clock preciso do oscilador a cristal como base de tempo.

Link para o comentário
Compartilhar em outros sites

@Sérgio Lembo ,

 

No Arduino Uno temos um Atmega328, e ele tem Input Capture no Timer1 , de 16 bits.

Pode ser feito com ele também, e fazer a conta dos ciclos de clock para calcular a frequência.

Só não temos um clock muito preciso, pois é um filtro cerâmico de 16 Mhz.... mas para o que se espera neste projeto, está ótimo...

 

Paulo

 

 

Link para o comentário
Compartilhar em outros sites

É pessoal deu e não deu...

 

seguindo o link que o @Sérgio Lembo  mandou, baixei a biblioteca freqmeasure e fiz o teste aqui, testei com a comunicação serial depois desabilitei para ver se melhorava a resposta e não mudou muito...

 

o código atual é esse:

 

Citação

/* FreqMeasure - Example with serial output
 * http://www.pjrc.com/teensy/td_libs_FreqMeasure.html
 *
 * This example code is in the public domain.
 */
#include <FreqMeasure.h>
#define outrele  2
#define pot     A0 

const int rele=2;

void setup() {
  Serial.begin(57600);
  FreqMeasure.begin();
  pinMode(rele, OUTPUT);
  pinMode(pot,INPUT);
  
}

double sum=0;
int count=0;

void loop() {
  int x = analogRead(pot);
  int y = map(x,0,1023,0,200);
  if (FreqMeasure.available()) {
    // average several reading together
    sum = sum + FreqMeasure.read();
    count = count + 1;
    if (count > 30) {
      float frequency = FreqMeasure.countToFrequency(sum / count);
      Serial.println(frequency);
      sum = 0;
      count = 0;
     
    
    if (frequency > y) { 

   digitalWrite(rele, HIGH);
   delay(50);
   digitalWrite(rele, LOW);
   delay(50);
   
  }
  else
  {
    digitalWrite(rele, LOW); 
  }
  }
}
}
 

 

 

usei o código cru sem nada e ele realmente é mais preciso do que o anterior, ele mede até décimos de frequência, mas é mais devagar do que o código usando a biblioteca  freqcount e curiosamente em frequências mais baixas fica mais lento ainda, a atualização das linhas do monitor serial sobem mais devagar, depois que passa de uns 150Hz aí começa a ficar mais rápido.

Alterei o código para ler o potênciômetro também e aí e ficou mais lento ainda, o potenciometro cumpre a função de alterar a frequência que o led pisca, só que assim como as linhas sobem mais devagar no monitor serial o led também pisca mais devagar em frequencias mais baixas, depois que a frequência aumenta aí começa a responder melhor. (não sei porque isso acontece, mas é assim)

 

Estou achando que terei que voltar para o código anterior e trabalhar com uma fração da frequência real, no código anterior dava para determinar qual seria o tempo que a frequência seria medida, no caso coloquei para 100ms então se em 100ms teve uma frequencia de 10 pulsos em 1000ms seriam 100 pulsos ou 100Hz, com certeza terá uma precisão menor, porém se tiver uma resposta mais rápida pode funcionar bem.

 

@aphawk será que justamente por este código usar a interrupção ele tem mais precisão porém perde desempenho em outras funções? Me corrija se entendi errado, mas quando ocorre a interrupção o AT328 para tudo o que está fazendo e foca naquilo que foi programado para fazer durante a interrupção, nesse caso contar pulsos, e justamente por contar exatamente todos os pulsos ele tem muito mais precisão, porém durante a interrupção ele faz apenas isso, não lê potenciometro nem manda nada para o monitor serial nem pisca led, então não é que ele está lento, é que ele está focando na contagem de pulsos e o restante fica em segundo plano dando impressão de estar mais lento, é isso?

Link para o comentário
Compartilhar em outros sites

voltei no código anterior pra testar e fiquei quebrando a cabeça agora de madrugada (já devia ter ido dormir kkkkk)

 

Estava desistindo de colocar o potenciometro de ajuste da velocidade de piscar o led então achei melhor apagar essa parte, iria deixar apenas o potenciometro de ajuste que faz o led piscar acima da frequência desejada. foi aí que percebi um erro que passou batido por todos nós.

 

aqui:

 

Citação
Em 05/05/2021 às 22:33, ComandateGustavo disse:

#include <FreqCount.h>
#define outrele  2
#define pot     A0  
#define potb    A1  
#define inbotao  4
  

const int sensor_pin = 5;
const int rele=2;
long  counter;

void setup() {
  FreqCount.begin(100);
  pinMode(rele, OUTPUT);
  pinMode(pot,INPUT);
  pinMode(potb,INPUT);
  pinMode(inbotao,INPUT_PULLUP);
}

void loop() {
  int x = analogRead(pot);
  int y = map(x,0,1023,0,20);
  int a = analogRead(pot);
  int b = map(a,0,1023,0,500);
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
   
  
if ((count > y ||(!(digitalRead(inbotao))))) { 

   digitalWrite(rele, HIGH);
   delay(a);
   digitalWrite(rele, LOW);
   delay(a);

 

 

eu defini o primeiro potenciometro como pot no pino A0 e o segundo como potb no pino A1  e a ideia era usar o pot para selecionar a frequencia que o led iria piscar, e o potb para ajustar o delay que faz o led piscar, só que nas linhas:

 

Citação

void loop() {
  int x = analogRead(pot);
  int y = map(x,0,1023,0,20);
  int a = analogRead(pot);
  int b = map(a,0,1023,0,500);

 

 

 

eu coloquei pot para as duas funções, ou seja ele estava baseando o tempo de delay e o ajuste de frequencia pelo mesmo potenciometro, por isso estava doidão

 

 

 

Arrumei isso mandei o código consertado pro arduino, ainda tem um pouco de lentidão, mas estou usando o monitor serial então acho que isso afeta a velocidade também, teve um desempenho não 100% mas acho que está dentro do esperado, vou montar tudo amanhã no carro e ver se funciona.

 

 

off-topic: @aphawk @mlegnari @Thiago Miotto tô beeeem longe de ser um programador, mas posso considerar ter descoberto esse erro de usar o mesmo potenciometro para as duas funções como meu primeiro erro debugado? kkkkkkk 🙃

 

 

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...