Introduction: Arduino Tutorial - Digital Vs PWM Output

About: This is a channel for Homemakers and DIY where you will find useful tutorials about Arduino and IOT systems, some Gardening techniques and Woodworking projects.

Neste tutorial iremos demonstrar as principais diferenças entre as saídas de sinal digital IO e as PWM "Pulse Width Modulation". Para isso iremos apresentar uma montagem que terá ligados 3 LED e onde serão carregados 2 códigos diferentes, no entanto, apesar da utilização de códigos e funções diferentes os pinos no Arduino continuarão a ser os mesmo (Ver imagem acima).

Em ambos os casos, os códigos utilizarão os pinos 9, 10 e 11, mas estes no primeiro código terão a função de saídas digitais IO, ou seja do tipo "ON" e "OFF", fazendo piscar alternadamente os LED da montagem, no segundo código os mesmos pinos terão a função de PWM, alterando a luminosidade dos LED alternadamente.

Caso queiram saber mais sobre estas ou outras funções do Arduino UNO, vejam as especificações detalhadas na página oficial do Arduino https://store.arduino.cc/arduino-uno-rev3". Abaixo encontram-se 2 ligações para os tutoriais anteriores, onde são explicados estes dois tipos de saídas mais pormenorizadamente:

Arduino Tutorial - Digital Output - LED - https://www.instructables.com/id/Arduino-Tutorial-Digital-Output-LED/

Arduino Tutorial - PWM Output - LED - Monitor Serial - https://www.instructables.com/id/Ardu%C3%ADno-Tutorial-PWM-Output-LED-Monitor-Serial/

Step 1: Montagem

Esta é mais uma montagem muito simples que utiliza apenas 3 LED de cores diferentes, para podermos identificar e explicar mais facilmente o seu funcionamento, como também torna mais fácil a identificação de possíveis erros na montagem, de forma a organizar melhor as ligações entre os vários componentes electrónicos utilizamos uma "Breadboard".

Material necessário:

  • 1x Arduino UNO;
  • 1x Cabo USB;
  • 1x BreadBoard;
  • 3x LED (Vermelho / Verde / Azul);
  • 3x Resistência 1KΩ.

Relembro mais uma vez que os LED só funcionam se directamente polarizados, assim o pino positivos é ligados ao pino de sinal digital escolhido do Arduino e o pino negativo ligado a GND. Alem da polarização, não esquecer também de ligar cada LED em serie com uma resistência eléctrica de 1KΩ, evitando assim que estes se danifiquem quando forem ligarmos (Ver imagem acima).

Step 2: Código

Com a montagem terminada carregamos os códigos no Arduino, no código vamos destacar a utilização das funções AnalogWrite e DigitalWrite, estas têm o objectivo de configurar os pinos como saídas IO ou PWM. Alem destas também utilizamos a função For, sendo esta responsável durante a sua execução do código, pela selecção dos pinos que ligam ou desligam os LED.

//Enquanto for menor que 12, executa o código abaixo;
//Depois incrementa +1 ao valor da variável Pino.
for (Pino; Pino < 12; Pino ++) {

	//Colocar aqui o restante código.

}

ou

//Enquanto for menor ou igual que 9, executa o código abaixo;
//Depois Subtrai -1 ao valor da variável Pino.
for (Pino; Pino >= 9; Pino --) {

	//Colocar aqui o restante código.

}

Código para a função com os pinos em IO:

int Tempo = 100;	//Variável para o tempo de atraso.
int Pino;	//Variável para selecção do pino.

//Correr a função SETUP apenas uma vez após ser pressionado Reset:
void setup(){
	//Coloca na variável.
	Pino = 9;
	//Enquanto a variável Pino, for menor que 12, executa o código abaixo;
	//Depois incrementa +1 ao valor da variável Pino.
	for (Pino; Pino < 12; Pino ++){
		//Definição do tipo de pino (Saída ou entrada):
		pinMode(Pino, OUTPUT);
	}
}
//Correr a função LOOP repetidamente:
void loop(){
	//Coloca na variável.
	Pino = 9;
	
	//Enquanto a variável Pino, for menor que 12, executa o código abaixo;
	//Depois incrementa +1 ao valor da variável Pino:
	for (Pino; Pino < 12; Pino ++){
		//Liga o LED (HIGH é nível alto):
		digitalWrite(Pino, HIGH);
		//Atraso para o próximo passo:
		delay(Tempo);
	}

	//Enquanto a variável Pino, for maior ou igual a 9, executa o código abaixo;
 	//Depois subtrai -1 ao valor da variável Pino:
	for (Pino; Pino >= 9; Pino --) {
		//Desliga o LED (LOW é nível baixo):
		digitalWrite(Pino, LOW);
		//Atraso para o próximo passo:
		delay(Tempo);
	}
}

A função While é responsável pela alteração do valor de brilho dos LED, variando o valor entre 0 e 255, ou seja com a função PWM (Ver gráfico acima):

  • 255 = 100%
  • 204 = 80%
  • ≈128 = 50%
  • 51 = 20%
  • 0 = 0%
//Enquanto a variável Brilho for maior que 0, executa o código baixo:
while (Brilho > 0){

	//Colocar aqui o restante código.

}

Código para a função com os pinos em PWM:

int Tempo = 100;       //Variável para o tempo de atraso.
int Pino;              //Variável para selecção do pino.
int Brilho;            //Variável para a definição do brilho dos LED.

//Correr a função SETUP apenas uma vez após ser pressionado Reset:
void setup(){
	//Coloca na variável.
	Pino = 9;
	//Enquanto a variável Pino, for menor que 12, executa o código abaixo;
 	//Depois incrementa +1 ao valor da variável Pino:
	for (Pino; Pino < 12; Pino ++){
		//Definição do tipo de pino (Saída ou entrada):
		pinMode(Pino, OUTPUT);
	}
}
//Correr a função LOOP repetidamente:
void loop(){
	//Coloca na variável. 
	Pino = 9;
	
	//Enquanto a variável Pino, for menor que 12, executa o código abaixo;
 	//Depois incrementa +1 ao valor da variável Pino:
	for (Pino; Pino < 12; Pino ++){
		//Coloca na variável.
		Brilho = 0;
		//Enquanto a variável Brilho for menor que 255 executa o código abaixo:
		while (Brilho < 255 ){
			//Coloca no LED o brilho igual à variável:
			analogWrite(Pino, Brilho);
			//Atraso para o próximo passo:
			delay(Tempo);
			//Incrementa +1 ao valor da variável.
			Brilho ++;
		}
	}

	//Enquanto a variável Pino, for maior ou igual a 9, executa o código abaixo;
 	//Depois subtrai -1 ao valor da variável Pino:
	for (Pino; Pino >= 9; Pino --){
		// Coloca na variável.
		Brilho = 255;
		//Enquanto a variável Brilho for maior que 0, executa o código abaixo:
		while (Brilho > 0){
			//Liga o LED com o brilho igual a variável:
			analogWrite (Pino, Brilho);
			//Atraso para o próximo passo:
			delay(Tempo);
			//Subtrai -1 ao valor da variável.
			Brilho --;
		}
	}
}

Caso queiram saber mais ou tenham dúvidas sobre estas ou outras referências no código, vejam a sua explicação detalhada no site oficial do Arduino, através da ligação https://www.arduino.cc/en/Reference/HomePage.

Procurem os nossos tutoriais sobre do Arduino, onde explicamos diversas montagens e o funcionamento dos seus componentes, já agora visitem o nosso canal no Youtube, Instagram, Facebook ou Twitter.

Abraço e bons projectos.