Introduction: Arduino Tutorial - Control Servo Motor - Joystick

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.

Meus amigos sejam bem vindos a mais um tutorial sobre o Arduino, desta vez será sobre uma montagem que controla 2 servo motores através de apenas um pequeno "Joystick", este será o responsável por controlar os servo motores representando assim um o eixo de X e o outro o eixo dos Y, alem destes componentes também será novamente utilizado um Arduino NANO.

Os componentes principais da nossa montagem são os servo motores, estes são qualificados como motores no entanto a principal diferença entre os servo motores e os motores comuns é o facto de estes terem integrado o circuito controlador e um sensor de posição, sendo estes responsáveis por controlar a sua a velocidade e precisão de movimento (Ver imagem acima).

Para controlar os servo motores são utilizados sinais digital de onda quadrada modulados, ou seja, estamos perante sinais PWM. O sensor de posição que é solidário com a posição do eixo do motor enviará um sinal, que depois é comparado com o sinal PWM de controlo ou comando enviado pelo Arduino. Assim se estes 2 sinais não forem coincidentes o circuito controlador irá alimentar o motor, movimentando assim o seu eixo que consequentemente irá alterar novamente o sinal do sensor de posição, isto irá acontecer até que ambos que ambos os sinais voltem a ser coincidentes (Ver imagem acima).

Para que o servo motor movimente o seu eixo de acordo com o solicitado pelo operador, o sinal PWM enviado pelo Arduino terá de ter uma modulação que se encontre entre 1mS e 1,5mS sendo assim o seu eixo movimentado para a esquerda aproximadamente entre os e -90º, já se essa mesma modulação se encontrar entre 1,5mS e 2mS o eixo irá se movimentar para a direita aproximadamente entre os e 90º (Ver imagem acima).

Como nos últimos tutoriais este também utilizará um Arduino NANO, este comparativamente com outros tipos de Arduino é muito mais pequeno, ainda que tenha as mesma funcionalidades e características idênticas.

Para a montagem será então necessário utilizar alguns dos pinos de sinal digital e analógico do nosso Arduino, neste caso este tipo de Arduino tem 13 pinos de sinal digital, podendo estes ser programados como entradas ou saídas em que que 6 destes também podem ter a funcionalidade de PWM "Pulse Width Modulation", alem destes o Arduino também tem mais 8 pinos de entrada de sinal analógico (Ver imagem acima).

Caso queiram saber mais sobre os pinos de sinal digital com a funcionalidade de PWM ou os pinos de sinal analógico do Arduino vejam os tutoriais anteriores onde são explicadas as suas características e funcionalidades.

Arduino Tutorial - PWM Output - LED - Monitor Serial

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

Arduino Tutorial - Analog Input - Resistive Sensors - Monitor Serial

https://www.instructables.com/id/Arduino-Tutorial-Analog-Input-Resistive-Sensors-Mo/

Para poderemos controlar os servo motores através da montagem será utilizado um pequeno "Joystick" que permite controlar os eixos do X e do Y. Este é constituído por 2 resistências variáveis que ao serem movimentadas serão alterados os valores dessas resistências e como estas fazem parte de num circuito do "Joystick" serão alterados também os valores de tensão nos seus pinos de saída VRX e VRY (Ver imagem abaixo).

Alem destas resistências variáveis, este também tem no seu circuito um pequeno "Push Button", que é activado quando pressionamos o "Joystick", assim iremos atribuir a função de recentrar a posição dos servo motores após alterarmos os seus pontos de descanso ou central (Ver imagem acima).

Step 1: Montagem

Na montagem começamos por utilizar uma "Breadboard" onde vamos colocar os componentes e onde serão distribuídas as alimentações positivas e negativas fornecidas pelo Arduino e depois montamos o próprio Arduino NANO, pois o seu tamanho e configuração é apropriada para ser montado directamente na "Breadboard" (Ver montagem acima).

Material necessário:

  • 1x Arduino NANO;
  • 1x Cabo USB;
  • 1x Breadboard;
  • 1x Joystick KY-023;
  • 1x Botão (Push Button);
  • 2x Resistência 1KΩ;
  • 2x Servo Motor SG90;

Instalação do Joysitck KY-023 e Push Button:

Para instalarmos o "Joystick" KY-023 na montagem começamos por realizar as ligações das suas respectivas alimentações, depois ligamos os pinos de saída de sinal VRY e VRX aos pinos de sinal analógico do Arduino tendo escolhidos os pinos A0 e A1 respectivamente (Ver imagem acima).

Depois colocamos e realizamos a suas ligações na montagem relativas aos botões do tipo "Push Button", esta montagem terá 2 deste tipo de botões e cada um terá uma funcionalidade especifica, assim o botão montado na "Breadboard" será designado de FIXAR e será responsável por alterar o ponto de descanso ou central dos servo motores, já o botão incorporado no "Joystick" será encarregue por recentrar novamente os servo motores.

Ambos os botões serão ligados em paralelo às suas resistências de 1KΩ, sendo o botão do "Joystick" ligado através do pino SW e depois esse mesmo pino será ligado a um dos pinos de sinal digital do Arduino ficando no pino D2, já o botão FIXAR será também ligado a um dos pinos de sinal digital mas agora será ao pino D3.

Caso tenham duvidas ou queiram saber mais sobre os pinos de sinal digital como entradas vejam o seguinte tutorial:

Arduino Tutorial - Digital Input - Button - Monitor Serial
https://www.instructables.com/id/Arduino-Tutorial-Digital-Input-Button-Monitor-Seri/

Instalação dos Servo Motores SG90:

Agora só falta colocar na montagem os nossos servo motores SG90, como já repararam o servo motores têm 3 cablagens, sendo 2 destas as suas alimentações positiva e negativa, esta alimentação será fornecida também pelo Arduino tendo uma tensão de cerca de 5V.

A cablagem que sobra será para receber o sinal de controlo vindo do Arduino e como explicado anteriormente esta terá de ser ligada a um dos pinos de sinal digital que tenha a função de PWM, assim o servo motor correspondente ao eixo dos X será ligado ao pino D9, já o correspondente ao eixo dos Y será ligado ao pino D1 (Ver imagem acima).

Step 2: Código

Com a montagem terminada ligamos o cabo Mini USB e depois carregarmos o código na placa do Arduino, mas antes não nos podemos esquecer de configurar o programa para este poder funcionar com o Arduino NANO. Caso tenham duvidas sobre este procedimento vejam o tutorial anterior, onde é explicado todo esse processo.

Arduino Tutorial - Fire Alarm

https://www.instructables.com/id/Arduino-Tutorial-Fire-Alarm/

Também iremos como sempre descrever agora o código para a nossa montagem, desta modo começamos por importar as bibliotecas, neste caso apenas será necessário importar a biblioteca Servo.h, esta foi concebida especificamente para controlar servo motores, facilitando assim a programação para controlar os controlar.

Para trabalhar com esta biblioteca é necessário também declarar e nomear os nossos servo motores, como nesta montagem vamos utilizar 2 servo motores iremos numerar um para o eixo do X e outro para o eixo do Y.

Alem de nomear os servo motores também teremos que atribuir os pinos do Arduino que serão responsáveis por os controlar, sendo que neste caso esses pinos têm de ser obrigatoriamente pinos de sinal digital com a função PWM, assim os pinos escolhidos são os pino 9 e 10.

#include <Servo.h>	//Importar a "Servo" library.

Servo Nome_Servo;  //Variável para nomeação dos Servo Motores.

int Valor_Mov;  //Variável para determinação do valor de movimento do Servo Motor.

//Correr a função SETUP apenas uma vez após ser pressionado Reset:
void setup() {
	Nome_Servo.attach(XX);  //Atribuição do pino PWM para o controlo do Servo Motor.
}
//Correr a função LOOP repetidamente:
void loop() {
	//Função de relacionamento ou mapeamento entre valores:
	Valor_Mov = map(Valor_Mov, 0, 1023, 0, 180);

	//Função para movimentação do Servo Motor:
	Nome_Servo.write(Valor_Mov);
}

Agora para controlar o movimento dos servo motores será utilizada uma função map(), esta é a primeira vez que esta função é utilizada num tutorial do nosso canal e por isso vamos tentar exemplificar o melhor possível o seu funcionamento.

Esta função tem como principal função mapear 2 intervalos de valores, ou seja, relacionar o intervalo de valores com outro intervalo, assim o nosso código necessita desta função precisamente para relacionar o intervalo de valores de 0 e 1023 obtidos através da leitura do sinal recebido pelo pino de sinal analógico relativo ao movimento realizado no nosso "Joysitck", com a amplitude de movimento de 0º e 180º que os servo motores conseguem realizar (Ver cálculos acima).

Os valores obtidos através dos pinos de sinal analógico são calculados através da função analogRead(), logo quando movimentamos o nosso "Joystick" os valores de tensão nos seus pinos VRX e VRY vão variar entre os 0 e 5V e posteriormente são convertidos esses valores de tensão em valores numéricos de 0 a 1023 (Ver imagem acima).

//Correr a função LOOP repetidamente:
void loop() {
	//Leitura do pino analógico:
	analogRead(Pino);
}

O tipo de "Joystick" que estamos a utilizar tem um ponto de descanso exactamente no seu ponto central de ambos os eixo X e Y. Deste modo a leitura dos valores obtidos através da função analogRead() serão por volta dos 511 o que corresponde através da função map() a uma amplitude de movimento de cerca de 90º, determinando essa a posição de descanso dos nossos servo motores (Ver imagem acima).

Agora para alterar esse ponto de descanso, deforma a realizar uma espécie de ajuste ou calibração desse mesmo ponto, iremos colocar no código uma função que atribui essa funcionalidade ao botão FIXAR da nossa montagem.

Visto que o ponto de descanso em cada um dos servo motores é atribuído ao valor de 511, vamos então dividir a amplitude de movimento em 2 quadrantes a partir desse mesmo ponto, criando o quadrante esquerdo que é determinado pelos valores compreendidos entre 511 e 1023 ou Vmax e o quadrante direito que compreende os valores de 0 a 511 ou Vmin.

Agora para atribuir um cálculos diferente para cada um desses quadrantes e sempre que carregarmos no botão FIXAR existirá também 2 condições que definirão em qual quadrante o "Joysitck" se encontra nesse momento para depois realizar o cálculo do novo ponto de descanso especifico desse quadrante.

Depois desse cálculo ser realizado será colocado o valor obtido novamente na função map(), no entanto dependendo do quadrante em que se encontra o "Joystick" iremos alterar alterar ou o Vmax ou o Vmin, fixando assim um novo ponto de descanso dos servo motores.

Para desfazer todo este processo colocando novamente os servo motores no seu ponto central e de descanso original, bastará colocar uma função para o botão integrado no "Joystick" que ao ser pressionado, coloca novamente os valores de 511 em ambos os eixos, sendo este o valor intermédio obtido pela função analogRead(), respondendo desta modo prontamente os servo motores voltando os seus eixo para o ponto central.

#include <Servo.h>	//Importar a "Servo" library.

Servo Servo_X;	//Variável para nomeação dos Servo Motores.
Servo Servo_Y;	//Variável para nomeação dos Servo Motores.

int Botao_Centrar_Joystick = 2;	//Variável para selecção do pino do botão do Joysitck.
int Botao_Fixar = 3;	//Variável para selecção do pino do botão Fixar Servo Motor

int Pino_Joystick_X = 0;//Variável para selecção do pino de sinal analógico do Joysitck Eixo X.
int Pino_Joystick_Y = 1;//Variável para selecção do pino de sinal analógico do Joysitck Eixo Y.

int Valor_X;  //Variável para determinação do valor no Eixo X.
int Valor_Y;  //Variável para determinação do valor no Eixo Y.

//Variáveis dos valores máximos e mínimos para os cálculos da função fixar:
int Valor_Xmax = 1023;
int Valor_Xmin = 0;
int Valor_Ymax = 1023;
int Valor_Ymin =0;

//Correr a função SETUP apenas uma vez após ser pressionado Reset:
void setup() {
	//Definição do tipo de pino de sinal digital (Saída ou Entrada):
	pinMode(Botao_Fixar, INPUT);
	//Definição do tipo de pino de sinal digital (Saída ou Entrada):
	pinMode(Botao_Centrar_Joystick, INPUT);
	
	Servo_X.attach(9);  //Atribuição do pino para o controlo do Servo Motor.
	Servo_Y.attach(10); //Atribuição do pino para o controlo do Servo Motor.
}
//Correr a função LOOP repetidamente:
void loop() {
	//Leitura dos valores enviados pelo Joystick:
	Valor_X = analogRead(Pino_Joystick_X);
	Valor_Y = analogRead(Pino_Joystick_Y);
	
	//Condição para acção do Botão Fixar:
	if (digitalRead(Botao_Fixar) == LOW){
		//Se o valor do Eixo de X for superior a 511:
		if (Valor_X > 511){
			//Coloca nas variáveis os valores resultante do cálculo:
			Valor_Xmax = 1023 - Valor_X + 511;
			Valor_Xmin = 0;
		}
		//Se o valor do Eixo de X for inferior a 511:
		else if (Valor_X < 511){
			//Coloca nas variáveis os valores resultante do cálculo:
			Valor_Xmax = 1023;
			Valor_Xmin = 511 - Valor_X;
		}

		//Se o valor do Eixo de Y for superior a 511:
		if (Valor_Y > 511){
			//Coloca nas variáveis os valores resultante do cálculo:
			Valor_Ymax = 1023 - Valor_Y + 511;
			Valor_Ymin = 0;
		}
		//Se o valor do Eixo de Y for inferior a 511:
		else if (Valor_Y < 511){
			//Coloca nas variáveis os valores resultante do cálculo:
			Valor_Ymax = 1023;
			Valor_Ymin = 511 - Valor_Y;
		}
	}
	//Condição para acção do Botão Centrar Joystick:
	if (digitalRead(Botao_Centrar_Joystick) == LOW){
		//Coloca nas variáveis os valores necessários para centrar o Servo Comando:
		Valor_Xmax = 1023;
		Valor_Xmin = 0;
		Valor_Ymax = 1023;
		Valor_Ymin = 0;
	}
	//Função de relacionamento ou mapeamento entre valores:
	Valor_X = map(Valor_X, Valor_Xmin, Valor_Xmax, 0, 180);
	//Função para movimentação do Servo Motor:
	Servo_X.write(Valor_X);

	//Função de relacionamento ou mapeamento entre valores:
	Valor_Y = map(Valor_Y, Valor_Ymin, Valor_Ymax, 0, 180);
	//Função para movimentação do Servo Motor:
	Servo_Y.write(Valor_Y);
	
	//Atraso para o próximo passo:
	delay(50);
}

Para saber mais ou caso tenham dúvidas sobre estas e 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 acerca do Arduino, onde explicamos diversas montagens como também o funcionamento dos seus componentes e já agora visitem o nosso canal no Youtube, Instagram, Facebook ou Twitter.

Abraço e bons projectos.

Arduino Contest 2019

Participated in the
Arduino Contest 2019