Ir ao conteúdo

Posts recomendados

Postado

Olá a todos,

 

Consegui gravar o programa directamente no atmega328. Por isso estou a utilizá-lo directamente na breadboard. Acontece que antes tinha testado o mesmo hardware e software na placa do arduino UNO. Neste momento a única coisa que mudou foi o arduino uno, que passou a ser o pic atmega328.

 

Estou a testar o sensor ultrasónico HC-SR04, ligando o mesmo ao arduino uno. Caso a distancia inferior a 5 cm ele dá um sinal na saída 7. Acontece que com o arduino tudo funciona bem. Quando ligo com o atmega328 não tenho sinal de echo nem trigger. Ainda pensei que fosse da minha programação, da forma que estou a gravar o programa no atmega. Para teste coloquei um led a pisca no pino6, e o mesmo funciona. Por isso o programa está a ser bem gravado.

 

Aqui fica a imagem da montagem: http://imgur.com/a/PByrn

O que acham que poderá ser?

 

Obrigado

Postado

O pino 1 e 4 do sensor vai directo nos 5 V de alimentação.

HC-SR04-Ultrasonic-distance-sensor-pinou

Enquanto que o pino trigger vai no pino 9 do atmega328 e o echo vai no pino8.

atmega328-arduino-pinout.jpg

 

Postado

Entendo, mas o Atmega 328 não tem um pino de alimentação como no Arduino normal. Fiz um projeto igual ao seu e pus o pino 1 do sensor em um porta analógica com a A0 e no Void Setup pus esta porta como OUTPUT, que vai sair 5v como deseja. Tenta ver se dar certo no seu. 

IC-ATMEGA328-PU-3.jpg

Postado

Obrigado pela ajuda :)

Está dizendo que colocou o Vcc do sensor no pino 23 do pic?

 

Consegue simular esta montagem no proteus ou construi na breadboard?

 

Obrigado

Postado

@aphawk, gravei o quê?

 

O código é este:


/*
   Teste do Sensor Ultrassônico HC-SR04
   
   Objetivo: medir a distância em centímetros exibindo os dados via serial monitor
   
   Autor: Eng. Wagner Rambo
   
   Data: Fevereiro de 2015
   
   Embedded System: Arduino Duemilanove

*/

#define trig 9  //Pino 9 do Arduino será a saída de trigger
#define echo 8  //Pino 8 do Arduino será a entrada de echo
#define impulso 7 //Pino 7 do Arduino que vai dar o impulso para o contador
#define teste 6


void trigPuls();  //Função que gera o pulso de trigger

float pulse;     //Variável que armazena o tempo de duração do echo
float dist_cm;   //Variável que armazena o valor da distância em centímetros


void setup()
{
  pinMode(trig, OUTPUT);   //Pino de trigger será saída digital
  pinMode(echo, INPUT);    //Pino de echo será entrada digital
  pinMode(impulso, OUTPUT);  //Pino do pulse que será saída digital
  pinMode(teste, OUTPUT);
 
  digitalWrite(trig, LOW); //Saída trigger inicia em nível baixo
  digitalWrite(impulso, LOW); //Saída do pulse que inicia a nível baixo
  digitalWrite(teste, LOW);
 
  Serial.begin(9600);      //Inicia comunicação serial

}

void loop()
{
   trigPulse();                 //Aciona o trigger do módulo ultrassônico
   
   pulse = pulseIn(echo, HIGH); //Mede o tempo em que o pino de echo fica em nível alto
   
   dist_cm = pulse/58.82;       //Valor da distância em centímetros
   
   // 340m/s
   // 34000cm/s
   
   /*
        100000 us - 17000 cm/s
             x us - 1cm
           1E6
      x = -----
          17E3
   */
   
   Serial.println(dist_cm);     //Imprime o valor na serial
   digitalWrite(impulso, LOW);
   digitalWrite(teste, LOW);

    if(dist_cm < 5){
    Serial.println("Duas");
    digitalWrite(impulso, HIGH);
    digitalWrite(teste, HIGH);
    delay(9000);
   }
   delay(2000);
   digitalWrite(teste, HIGH);  
   delay(500);                  //Taxa de atualização  

}

void trigPulse()
{
  digitalWrite(trig, HIGH);  //Pulso de trigger em nível alto
  delayMicroseconds(10);     //duração de 10 micro segundos
  digitalWrite(trig, LOW);   //Pulso de trigge em nível baixo
}

Postado

@ilovepic Me parece que está havendo um erro entre os pinos da placa do Arduíno e os pinos do próprio ATmega328, na tabela abaixo mostra qual é cada pino correspondente:

F9E1URBHIF0C4GC.LARGE.jpg

Veja que os pinos 8 e 9 da placa que você indica no código C, na verdade são os pinos 14 e 15 do ATmega. Os pinos 7, 8 e 22 correspondem a alimentação.

Postado

@Mestre88  compreendo! Mas porque que se utilizar o arduino esses pinos já funcionam?

515b4656ce395f8a38000000.png

Repare que no pino 6, o que fica responsável por piscar o led, funciona. Terá sido coincidência?

image.png.3d5d054af7b58804150d07d77327677e.png

Como 6, D6 estão no pino 12 o código: #define teste 6 já funcionou?

O que me deixa intrigado é que no arduino este código funciona, apenas no atmega328, fora do board, ele já deixa de funcionar.... entendi!!!!

Obrigado

 

Postado

Provavelmente no seu Protoboard tem alguma ligação ou componente faltando que está presente na placa do Arduíno.

Veja esta outra imagem, é de como o ATmega está ligado na placa:

798319_268647079927060_1589108426_o.jpg

 

  • Curtir 1
Postado

Pesquisando acabei lembrando de outro projecto que uma vez estive para fazer. Caso pretendemos criar o próprio arduino temos que seguir uma série de regras e existe um esquema especifico. Talvez seja isto que está faltando.

 

Vou debugar todos os pinos, um por um, com a montagem que tenho. Depois post um resultado! Entretanto, se tiver um bom projecto de como fazer o arduino na placa, agradeço a partilha. Pois o que está em falta deve ser isso....

 

Obrigado

Postado

Era isso que eu queria que entendesse. 

Na placa do arduino existem vários componentes e ligações, então na Protoboard eles devem estar presentes também, pelo menos os básicos. 

Outra coisa, esses CIs são muito sensíveis a ruídos e interferências. Por isso se percebe que a placa tem uma boa blindagem, já vi alguns relatos aqui no fórum sobre arduinos que recebiam interferências eletromagnéticas e deixavam de funcionar ou ficavam com funcionamento maluco. 

Postado
14 horas atrás, ilovepic disse:

 

@aphawk, gravei o quê?

 

 

O Atmega328 vem de fábrica configurado para usar o clock interno de 8 Mhz e apresentar em seu pino 14 o clock de 1 Mhz. Ou seja, independente de você colocar um cristal oscilador de 16 Mhz, ele vai rodar a 8 Mhz, e você não consegue usar o pino 14 nem como entrada e nem como saída.

 

Para usar ele da maneira que ele funciona no Arduíno, é necessário gravar os Fuses internos com a mesma configuração usada no Arduíno...

 

Você fez a gravação dos Fuses ?

 

E como você está passando o seu programa compilado na IDE do Arduíno ? Usando um Bootloader ou pela interface ISP ?

 

Paulo

Postado

Ok, esta conversa faz-me lembrar deste tutoriais:

 

Este para gravar programas: https://www.arduino.cc/en/Main/Standalone

e este para gravar o bootloader: https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard

 

Segundo este artigo não preciso FT 232RL pelo meio: http://br-arduino.org/2015/06/atmega-standalone-programar-com-arduino.html

 

Tenho que estudar melhor sobre isso de ISP e Bootloaders!

Postado

@ilovepic ,

 

Repare no segundo link .

 

Na hora de gravar o Bootloader voce deve escolher se vai trabalhar a 8 Mhz ou se vai usar cristal a 16 Mhz, mas não menciona que para rodar a 16 Mhz tem de regravar os Fuses com os valores adequados...

 

Paulo

Postado

@aphawk se refere a isto?

image.png.9fe34a8c96ed50fc080993fe6e80b55b.png

 

Escolhi Arduino Duemilanove, pois estou a seguir o tutorial e preciso do cristal de 16 Mhz.

 

Ainda não percebi o que são os fuses. O que é isso?

Postado



The fuses determine how the chip will act, whether it has a bootloader, what speed and voltage it likes to run at, etc.

Tenho que configurar os parametros de funcionamento do meu microcontrolador. É isso?

 

Tenho sempre que fazer isso quando pretendo utiliza o atmega 328 sem a placa do arduino? Ou caso utilize um AVR Programmer já não preciso disso?

 

Vou explorar o site http://www.engbedded.com/fusecalc/ para aprender a configurar os fuses do atmega328P.

Obrigado

Postado
7 horas atrás, ilovepic disse:

Tenho sempre que fazer isso quando pretendo utiliza o atmega 328 sem a placa do arduino? Ou caso utilize um AVR Programmer já não preciso disso?

 

Todo microcontrolador AVR tem muita coisa para ser configurada via Fuses, e claro que isso depende do que você pretende fazer com ele.

Para torná-lo compatível com um Arduino Uno, precisa programar os Fuses, pois ele vai funcionar diferente da maneira default que o fabricante fornece.

 

Gravar o Fuse é uma operação que a gente faz muito raramente, e depois não precisa mais fazer, a menos que você precise alterar algo no hardware, como por exemplo configurar para clock interno de 8 Mhz , ou de 1 Mhz, ou proteger o programa contra cópia, ou esperar um pouquinho mais de tempo após o Reset antes de começar a executar o programa, etc ....

 

Use um programador para isso, a opção mais simples e barata é comprar um USB ASP , que custa baratinho e tem em qualquer lugar.

 

Depois de gravar esses Fuses, pode seguir os tutoriais que ele vai rodar na velocidade do cristal e vai  te liberar o pino 14 para uso.

 

Paulo

  • Curtir 2
Visitante
Este tópico está impedido de receber novas respostas.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!