Às vezes, quando estamos criando um projeto usando um atuador linear, estamos tentando resolver um problema que não poderia ser solucionado sem as vantagens que esses mecanismos oferecem. Em outras ocasiões, queremos facilitar uma tarefa ao automatizá-la. Mas, de vez em quando, criamos algo simplesmente porque podemos. Este é um desses projetos.
Neste artigo, vamos mostrar como você pode usar um sensor ultrassônico para medir a distância entre um objeto e o atuador linear e usá-la para alterar automaticamente a posição do Recorrido do atuador. Embora isto não tenha sido criado com uma aplicação específica em mente, as possibilidades são infinitas.
O que você vai precisar
- 1 x Shield Driver de Motor RobotPower MegaMoto
 - 1 x Arduino Uno
 - 1 x Sensor ultrassônico
 - 1 x PA-04-12-400-HS-24VDC (pode ser qualquer atuador com Feedback de efeito Hall)
 - 1 x PS-20-24 (ou qualquer fonte de alimentação 24 VCC com capacidade nominal de pelo menos 6 A)
 
Para o controle, estamos usando um Arduino Uno com um driver de motor MegaMoto. Nosso atuador é o PA-04-12-400-HS-24VDC. É importante que o atuador tenha algum tipo de Feedback para que o Arduino possa monitorar sua posição – qualquer controle de Feedback de atuador linear pode funcionar; por exemplo, o Feedback por potenciômetro também seria eficaz aqui. O potenciômetro seria menos preciso, mas teria a vantagem de não exigir um procedimento de homing após uma queda de energia. O código também precisaria ser modificado.
Passo 1: Cabeamento

O cabeamento deste projeto é bem simples. Aqui, usaremos apenas um dos dois sensores de efeito Hall do PA-04-HS – não importa qual (pino 4 ou 5). O pinout abaixo é para o conector Molex de 6 pinos que acompanha o PA-04-HS:

Conector de 6 pinos do atuador para Arduino/MegaMoto
- Pino 3 para 5 V
 - Pino 2 para GND
 - Pino 1 para o pino 2 do Arduino
 - Pino 4 para A no MegaMoto
 - Pino 5 para B no MegaMoto
 
Sensor ultrassônico para Arduino/MegaMoto
- VCC para 5 V
 - GND para GND
 - Trig para o pino 8
 - Echo para o pino 7
 
MegaMoto para a fonte de alimentação
- + para V+
 - - para V-
 
Passo 2: Programando o Arduino
O código usado neste tutorial é uma versão modificada do que utilizamos em outra publicação, Hall Effect Sensors 1: Position Control. Fique à vontade para conferir esse tutorial e entender melhor como usamos o sensor de efeito Hall para controle de posição! O sensor ultrassônico funciona transmitindo um pulso ultrassônico acionado por um dos pinos GPIO do Arduino. Esse pulso é refletido em um objeto e detectado pelo receptor. Quando o receptor detecta o pulso, ele envia um sinal ao Arduino. Com isso, podemos realizar um cálculo para determinar a distância para um atuador linear medindo o tempo entre a transmissão e a recepção e usar uma fórmula para converter essa medida em polegadas.
Determinamos a posição do atuador contando o número de pulsos gerados pelo sensor de efeito Hall (isso é descrito com mais detalhes na publicação mencionada acima). Podemos determinar a posição do Recorrido em polegadas descobrindo quantos pulsos/polegada o nosso atuador específico gera e, em seguida, dividindo nossa contagem de pulsos por esse número. Ter tanto a leitura do sensor ultrassônico quanto a leitura do sensor de efeito Hall convertidas para polegadas torna a codificação muito mais limpa e simples. A partir daí, essencialmente dizemos ao Arduino: “se o objeto estiver a x polegadas de distância, estenda o atuador x polegadas”. Fazer o upload do código abaixo permitirá aplicar o modelo de distância controlada por atuador linear em um de nossos atuadores PA-04-12-400-HS-24VDC. No próximo passo, veremos as modificações que podem ser feitas no código.
[code]
/* The purpose of this code it to be able to measure the distance of an object and position the stroke of a linear acuator accordingly.
 *  The required components are an Arduion Uno, a PobotPower MegaMoto Driver, and an Ultra sonic sensor.
 *  Written by Progressive Automations 2/02/21
 */
#define PWMA0 6
#define PWMB0 5
#define enable0 13   //pins for MegaMoto
#define hall0 2 //interrupt pins for hall effect sensors
#define echoPin 7 //echo pin on ultra sonic sensor
#define trigPin 8 //output on ultra sonic sensor
float duration, distance; 
int enable = 0; //enable pin for megaMoto
int count[] = {0};
int currentPos = 0;//current position
int threshold = 100;//position tolerance
int destination = 0;
bool forwards = false;
bool backwards = false;// motor states
void setup() {
  pinMode(PWMA0, OUTPUT);
  pinMode(PWMB0, OUTPUT);//set PWM outputs
  pinMode(enable0, OUTPUT);
  digitalWrite(enable0, LOW);//set enable and turn board OFF
  pinMode(hall0, INPUT);
  digitalWrite(hall0, LOW);//set hall, set low to start for rising edge
  attachInterrupt(0, speed0, RISING); //enable the hall effect interupts
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin, INPUT);
  
  Serial.begin(9600);
  //homeActuator();//fully retracts actuator
  Serial.println("READY"); 
}//end setup
void loop() {
getDistance();//measure distance of object from ultra sonic sensor
currentPos = count[0]; 
if(distance < 13) //ignore value if greater than stroke length
{
destination = distance * 275; //translate measured distance (in inches) to desired stroke position (in pulses)
}
  if ((destination >= (currentPos - threshold)) && (destination <= (currentPos + threshold))) stopMoving();//stop acuator if it is in the desired position
  else if (destination > currentPos) goForwards();
  else if (destination < currentPos) goBackwards();
  Serial.print("Counts:      "); Serial.println(count[0]);
  Serial.print("currentPos:  "); Serial.println(currentPos);
  Serial.print("Destination: "); Serial.println(destination);
}//end loop
void speed0() {
  //Serial.println("Update 1");
  if (forwards == true) count[0]++; //if moving forwards, add counts
  else if (backwards == true) count[0]--; //if moving back, subtract counts
}//end speed0
/*void ReadInputs() {
  sw[0] = digitalRead(switch0), sw[1] = digitalRead(switch1);//check switches
  currentPos = count[0];
}//end read inputs
*/
void goForwards()
{
  forwards = true;
  backwards = false;
  //Serial.println("Moving forwards");
  digitalWrite(enable0, HIGH);//enable board
  //Serial.print(" Speeds "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]);
  //Serial.print(" Counts "), Serial.println(count[0]);
  analogWrite(PWMA0, 255);
  analogWrite(PWMB0, 0);//apply speeds
}//end goForwards
void goBackwards()
{
  forwards = false;
  backwards = true;
  //Serial.println("Moving backwards");
  digitalWrite(enable0, HIGH);//enable board
  //Serial.print(" Speeds "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]);
  //Serial.print(" Counts "), Serial.println(count[0]);
  analogWrite(PWMA0, 0);
  analogWrite(PWMB0, 255);//apply speeds
}//end goBackwards
void stopMoving()
{
  forwards = false;
  backwards = false;
  Serial.println("Stopped");
  analogWrite(PWMA0, 0);
  analogWrite(PWMB0, 0);//set speeds to 0
  delay(10);
  
  digitalWrite(enable0, LOW);//disable board
}//end stopMoving
void getDistance()
{
digitalWrite(trigPin, LOW); 
delayMicroseconds(10); 
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); 
digitalWrite(trigPin, LOW);
 
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2/2.5;
Serial.print("Distance:"); Serial.println(distance);
}
void homeActuator() //fully retract actuator and set count to 0
{
  goBackwards();
  delay(25000);//change this value to the amount of time it takes for the actuator to fully retract
  count[0] = {0};
}
[/code]
Passo 3: Modificando o código
O valor de threshold determina com que precisão a posição do atuador deve corresponder à leitura do sensor ultrassônico. Aumentá-lo reduzirá a precisão; diminuí-lo terá o efeito inverso. Com esse valor definido em 100, basicamente dizemos ao Arduino para não mover o atuador enquanto os pulsos dos sensores de efeito Hall e ultrassônico estiverem dentro de 100 pulsos um do outro. Deixar esse número muito baixo pode fazer o atuador se mover com trancos frequentes ao tentar alcançar exatamente a posição correta.

Altere este valor para o comprimento do Recorrido do seu atuador (ou uma polegada a mais). Isso dirá ao Arduino para ignorar quaisquer valores altos demais.

Altere este valor para os pulsos/polegada do seu atuador.

Conclusão
Esperamos sinceramente que você ache este projeto útil — ou pelo menos interessante! Sinta-se à vontade para modificá-lo e deixá-lo com a sua cara. Como sempre, adoraríamos ver quaisquer projetos relacionados que você tenha, seja usando esta ideia ou criando algo diferente com nossos produtos! Você também pode falar conosco por e-mail em sales@progressiveautomations.com e por telefone pelo 1-800-676-6123.