Potensiometer Umpan Balik Aktuator Linear dengan Arduino

Dalam contoh ini, kami akan mendemonstrasikan cara menggunakan Arduino untuk membaca sinyal dari Aktuator Batang Umpan Balik Firgelli dan mengubahnya menjadi pengukuran jarak sejauh mana batang telah diperpanjang. Tutorial ini dibuat berdasarkan prinsip yang dibahas dalam tutorial "Kontrol Kecepatan Pengemudi Motor dengan Arduino”, Kami menyarankan untuk meninjau tutorial itu sebelum melanjutkan.

Catatan: Tutorial ini mengasumsikan pengetahuan sebelumnya dengan prinsip-prinsip elektronik dasar, perangkat keras dan perangkat lunak Arduino. Jika ini adalah pertama kalinya Anda menggunakan Arduino, kami sarankan untuk mempelajari dasar-dasarnya dari salah satu dari banyak tutorial pemula hebat yang tersedia melalui pencarian Google dan YouTube. Perlu diketahui bahwa kami tidak memiliki sumber daya untuk memberikan dukungan teknis untuk aplikasi kustom dan tidak akan men-debug, mengedit, memberikan kode atau diagram pengkabelan di luar tutorial yang tersedia untuk umum ini.

Komponen

Pengkabelan

Potensiometer Umpan Balik Aktuator Linear dengan Arduino

Tinjauan perangkat keras dan perangkat lunak untuk posisi membaca

Pasang sirkuit seperti di atas dan unggah kode di bawah ini. Anda perlu memodifikasi baris 16 kode ke panjang kayuhan spesifik Anda, saat ini disetel untuk aktuator batang umpan balik 6 inci.

Program ini pada awalnya akan memperluas dan menarik kembali aktuator sepenuhnya untuk menemukan pembacaan sensor analog minimum dan maksimum dari potensiometer (baris 27 dan 28 dari kode). Ini diperlukan karena meskipun kisaran pembacaan potensiometer [0, 1023], dalam praktiknya kisaran ini dapat dikurangi karena rasio roda gigi di dalam aktuator yang mencegah potensiometer berputar sepenuhnya hingga batasnya.

Mengikuti urutan kalibrasi awal ini, aktuator akan terus menerus memperpanjang dan menarik keluaran aliran data yang menampilkan panjang yang diperpanjang dari aktuator linier (dalam satuan inci).

Kode

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;
  }
}

Menggunakan potensiometer eksternal untuk mengontrol posisi

Contoh di atas telah mendemonstrasikan bagaimana pembacaan dapat diambil dari Aktuator Batang Umpan Balik, tetapi katakanlah kita ingin memindahkan aktuator ke posisi tertentu, bagaimana kita melakukannya? Bagian berikut membahas situasi seperti itu dengan menggunakan potensiometer eksternal sebagai input pengguna untuk posisi setpoint yang diinginkan dari aktuator. Dalam praktiknya, Anda dapat memodifikasi contoh ini untuk mengambil input pengguna dari bentuk apa pun yang Anda inginkan.

Pengkabelan

Aktuator Linear dengan Arduino

Ikhtisar perangkat keras dan perangkat lunak untuk kontrol posisi

Pengkabelannya hampir sama persis dengan bagian pertama tutorial ini, hanya saja sekarang potensiometer eksternal telah dihubungkan ke pin analog A1.

Program, di bawah, bergerak ke posisi yang ditentukan oleh pengguna melalui potensiometer eksternal. Dalam baris 18 kode variabel penyangga ditetapkan, ini digunakan kemudian di baris 36 dan 39. Penyangga vairable memberikan kisaran di sekitar posisi setpoint yang diinginkan di mana aktuator akan berhenti bergerak, ini diperlukan karena dua potensiometer memiliki a kecenderungan untuk berfluktuasi sebesar +/- 2 unit. Dengan demikian, jika buffer tidak disertakan, aktuator akan bergetar hebat di sekitar posisi setpoint. Untuk melihat ini beraksi, setel buffer pada baris 18 ke nol (jangan biarkan aktuator bergetar dalam waktu lama karena dapat menyebabkan kerusakan).

Kode

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: