Potentiometer Feedback lineaire actuator met Arduino

In dit voorbeeld laten we zien hoe je een Arduino gebruikt om het signaal van Firgelli's Feedback Rod Actuator te lezen en dit om te zetten in een afstandsmeting van hoe ver de staaf is uitgeschoven. Deze tutorial bouwt voort op de principes die zijn besproken in de tutorial "Motor Driver Speed ​​Control met een Arduino”, Raden we aan om die tutorial te bekijken voordat je verder gaat.

Opmerking: deze tutorial veronderstelt voorkennis met elektronische basisprincipes, Arduino-hardware en -software. Als dit de eerste keer is dat je Arduino gebruikt, raden we je aan om de basisprincipes te leren van een van de vele geweldige tutorials voor beginners die beschikbaar zijn via Google- en YouTube-zoekopdrachten. Houd er rekening mee dat we niet de middelen hebben om technische ondersteuning te bieden voor aangepaste toepassingen en we zullen geen fouten opsporen, bewerken, code of bedradingsschema's verstrekken buiten deze openbaar beschikbare tutorials.

Componenten

Bedrading

Potentiometer Feedback lineaire actuator met Arduino

Hardware- en softwareoverzicht voor het lezen van positie

Monteer het circuit zoals hierboven en upload de onderstaande code. U moet regel 16 van de code aanpassen aan uw specifieke slaglengte, deze is momenteel ingesteld voor een 6 inch feedbackstangactuator.

Dit programma zal in eerste instantie de actuator uitschuiven en volledig intrekken om de minimale en maximale analoge sensoruitlezing van de potentiometer te vinden (regel 27 en 28 van de code). Dit is nodig omdat ondanks dat het bereik van de potentiometeraflezingen [0, 1023] is, dit bereik in de praktijk kan worden verkleind doordat de overbrengingsverhouding in de actuator verhindert dat de potentiometer volledig tot zijn limiet draait.

Na deze aanvankelijke kalibratieprocedure zal de actuator continu uitschuiven en terugtrekken, waarbij een stroom gegevens wordt afgegeven die de huidige uitgebreide lengte van de lineaire actuator weergeven (in inches).

Code

https://gist.github.com/Will-Firgelli/8c78092ca850aa8a50ae36842b97150f
COPY
/* Firgelli Automations
 * Limited or no support: we do not have the resources for Arduino code support
 * 
 * Program enables momentary direction control of actuator using push button
 */
 
#include <elapsedMillis.h>
elapsedMillis timeElapsed;

int RPWM = 10;   
int LPWM = 11;
int sensorPin = A0;

int sensorVal;
int Speed=255;
float strokeLength = 6.0;                           //customize to your specific stroke length
float extensionLength;

int maxAnalogReading;
int minAnalogReading;

void setup() {
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
  maxAnalogReading = moveToLimit(1);
  minAnalogReading = moveToLimit(-1);
}

void loop(){
  Serial.println("Extending...");
  sensorVal = analogRead(sensorPin);
  while(sensorVal < maxAnalogReading){
    driveActuator(1, Speed);
    displayOutput();  
    delay(20);
  }
  driveActuator(0, Speed);
  delay(1000);
  
  Serial.println("Retracting...");
  sensorVal = analogRead(sensorPin);
  while(sensorVal > minAnalogReading){
    driveActuator(-1, Speed);
    displayOutput();  
    delay(20);
  }
  driveActuator(0, Speed);
  delay(1000);
}

int moveToLimit(int Direction){
  int prevReading=0;
  int currReading=0;
  do{
    prevReading = currReading;
    driveActuator(Direction, Speed);
    timeElapsed = 0;
    while(timeElapsed < 200){ delay(1);}           //keep moving until analog reading remains the same for 200ms
    currReading = analogRead(sensorPin);
  }while(prevReading != currReading);
  return currReading;
}

float mapfloat(float x, float inputMin, float inputMax, float outputMin, float outputMax){
 return (x-inputMin)*(outputMax - outputMin)/(inputMax - inputMin)+outputMin;
}

void displayOutput(){
  sensorVal = analogRead(sensorPin);
    extensionLength = mapfloat(sensorVal, float(minAnalogReading), float(maxAnalogReading), 0.0, strokeLength);
    Serial.print("Analog Reading: ");
    Serial.print(sensorVal);
    Serial.print("\tActuator extension length: ");
    Serial.print(extensionLength);
    Serial.println(" inches");  
}

void driveActuator(int Direction, int Speed){
  switch(Direction){
    case 1:       //extension
      analogWrite(RPWM, Speed);
      analogWrite(LPWM, 0);
      break;
   
    case 0:       //stopping
      analogWrite(RPWM, 0);
      analogWrite(LPWM, 0);
      break;

    case -1:      //retraction
      analogWrite(RPWM, 0);
      analogWrite(LPWM, Speed);
      break;
  }
}

Gebruik een externe potentiometer om de positie te regelen

Het bovenstaande voorbeeld heeft laten zien hoe metingen kunnen worden gedaan van de Feedback Rod Actuator, maar stel dat we de actuator naar een specifieke positie willen verplaatsen, hoe doen we dat dan? In de volgende sectie wordt een dergelijke situatie behandeld door een externe potentiometer te gebruiken als gebruikersinvoer voor de gewenste setpointpositie van de actuator. In de praktijk kunt u dit voorbeeld aanpassen om gebruikersinvoer te ontvangen vanuit elke gewenste vorm.

Bedrading

Lineaire actuator met Arduino

Hardware- en softwareoverzicht voor positieregeling

De bedrading is bijna exact hetzelfde als in het eerste deel van deze tutorial, alleen is er nu een externe potentiometer aangesloten op analoge pin A1.

Het onderstaande programma gaat naar de positie die door een gebruiker is ingesteld via de externe potentiometer. In regel 18 van de code wordt een buffervariabele ingesteld, deze wordt later in regel 36 en 39 gebruikt. De buffervariabele geeft een bereik rond de gewenste setpointpositie waar de actuator zal stoppen met bewegen, dit is vereist aangezien de twee potentiometers een neiging tot vloeien met +/- 2 eenheden. Als zodanig, als de buffer niet was inbegrepen, zouden de actuatoren heftig rond de instelpuntpositie trillen. Om dit in actie te zien, zet u de buffer in regel 18 op nul (laat actuatoren niet te lang trillen omdat dit schade kan veroorzaken).

Code

https://gist.github.com/Will-Firgelli/41ec87433f0aaa1abc33e79168076b3b
COPY
/* Firgelli Automations
 * Limited or no support: we do not have the resources for Arduino code support
 * 
 * Program enables momentary direction control of actuator using push button
 */
 
#include <elapsedMillis.h>
elapsedMillis timeElapsed;

int RPWM = 10;   
int LPWM = 11;
int sensorPin = A0;
int potPin = A1;
int potVal;

int sensorVal;
int Speed = 255;
int Buffer = 4;

int maxAnalogReading;
int minAnalogReading;

void setup() {
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(sensorPin, INPUT);
  pinMode(potPin, INPUT);
  Serial.begin(9600);
  maxAnalogReading = moveToLimit(1);
  minAnalogReading = moveToLimit(-1);
}

void loop(){
  potVal = map(analogRead(potPin), 0, 1023, minAnalogReading, maxAnalogReading);
  sensorVal = analogRead(sensorPin);
  if(potVal > (sensorVal+Buffer)){               //addition gives buffer to prevent actuator from rapidly vibrating due to noisy data inputs
    driveActuator(1, Speed);
  }
  else if(potVal < (sensorVal-Buffer)){             
    driveActuator(-1, Speed);
  }
  else{
    driveActuator(0, Speed);
  }
  Serial.print("Potentiometer Reading: ");
  Serial.print(potVal);
  Serial.print("\tActuator reading: ");
  Serial.println(sensorVal);
  delay(10);
}

int moveToLimit(int Direction){
  int prevReading=0;
  int currReading=0;
  do{
    prevReading = currReading;
    driveActuator(Direction, Speed);
    timeElapsed = 0;
    while(timeElapsed < 200){ delay(1);}           //keep moving until analog reading remains the same for 200ms
    currReading = analogRead(sensorPin);
  }while(prevReading != currReading);
  return currReading;
}

void driveActuator(int Direction, int Speed){
  switch(Direction){
    case 1:       //extension
      analogWrite(RPWM, Speed);
      analogWrite(LPWM, 0);
      break;
   
    case 0:       //stopping
      analogWrite(RPWM, 0);
      analogWrite(LPWM, 0);
      break;

    case -1:      //retraction
      analogWrite(RPWM, 0);
      analogWrite(LPWM, Speed);
      break;
  }
}

Share This Article
Tags: