Arduino FSR: Αισθητήρας δύναμης


nc
Δημοσίευση: • Share Article:

force___flex_fsrpulldowndia.png

@Ο ευκολότερος τρόπος για να μετρήσετε έναν αισθητήρα αντίστασης είναι να συνδέσετε το ένα άκρο στο Power (5V) και το άλλο σε μια αντίσταση στη γείωση (Ground). Στη συνέχεια, το σημείο μεταξύ της σταθερής αντίστασης pulldown και της μεταβλητής αντίστασης FSR συνδέεται στην αναλογική είσοδο ενός μικροελεγκτή Arduino. Σε αυτό το παράδειγμα, χρησιμοποιούμε τα 5V, αλλά μπορούμε κάλλιστα να χρησιμοποιήσουμε και τα 3.3V εξίσου εύκολα. Σε αυτή τη διαμόρφωση η ένδειξη αναλογικής τάσης κυμαίνεται από 0V (γείωση) έως περίπου 5V (περίπου ίδια με την τάση τροφοδοσίας ρεύματος).

force___flex_fsrpulldownsch.gif
Λειτουργεί ως εξής: καθώς η αντίσταση του FSR μειώνεται, η συνολική αντίσταση του FSR και της αντίστασης pulldown μειώνεται από περίπου 100Kohm σε 10Kohm. Αυτό σημαίνει ότι το ρεύμα που ρέει μέσω και των δύο αντιστάσεων αυξάνεται, γεγονός που με τη σειρά του προκαλεί αύξηση της τάσης στη σταθερή αντίσταση 10K.

Αυτός ο πίνακας δείχνει την κατά προσέγγιση αναλογική τάση με βάση τη δύναμη/αντίσταση του αισθητήρα με τροφοδοσία 5V και αντίσταση pulldown 10K.

Αυτό το Arduino sketch θα λάβει την ένδειξη της αναλογικής τάσης και θα τη χρησιμοποιήσει για να προσδιορίσει το πόσο φωτεινό είναι το κόκκινο LED. Όσο πιο δυνατά πατάτε το FSR, τόσο πιο φωτεινό θα είναι το LED! Να θυμάστε ότι η λυχνία LED πρέπει να συνδεθεί σε έναν ακροδέκτη PWM για να λειτουργήσει, χρησιμοποιώ τον ακροδέκτη 11 σε αυτό το παράδειγμα.

 


int fsrAnalogPin = 0; // FSR is connected to analog 0
int LEDpin = 11;      // connect Red LED to pin 11 (PWM pin)
int fsrReading;      // the analog reading from the FSR resistor divider
int LEDbrightness;
 
void setup(void) {
  Serial.begin(9600);   // We'll send debugging information via the Serial monitor
  pinMode(LEDpin, OUTPUT);
}
 
void loop(void) {
  fsrReading = analogRead(fsrAnalogPin);
  Serial.print("Analog reading = ");
  Serial.println(fsrReading);
 
  // we'll need to change the range from the analog reading (0-1023) down to the range
  // used by analogWrite (0-255) with map!
  LEDbrightness = map(fsrReading, 0, 1023, 0, 255);
  // LED gets brighter the harder you press
  analogWrite(LEDpin, LEDbrightness);
 
  delay(100);
}

Απλός κώδικας για αναλογικές μετρήσεις FSR Ακολουθεί ένα παράδειγμα κώδικα για τη μέτρηση του FSR σε ένα αναλογικό pin. Αυτός ο κωδικός δεν κάνει υπολογισμούς, απλώς εκτυπώνει αυτό που ερμηνεύει ως την ποσότητα πίεσης με ποιοτικό τρόπο. Για τα περισσότερα έργα, αυτό είναι λίγο πολύ το μόνο που χρειάζεται!



int fsrPin = 0;     // the FSR and 10K pulldown are connected to a0
int fsrReading;     // the analog reading from the FSR resistor divider
 
void setup(void) {
  
  Serial.begin(9600);   
}
 
void loop(void) {
  fsrReading = analogRead(fsrPin);  
 
  Serial.print("Analog reading = ");
  Serial.print(fsrReading);     
 
  
  if (fsrReading < 10) {
    Serial.println(" - No pressure");
  } else if (fsrReading < 200) {
    Serial.println(" - Light touch");
  } else if (fsrReading < 500) {
    Serial.println(" - Light squeeze");
  } else if (fsrReading < 800) {
    Serial.println(" - Medium squeeze");
  } else {
    Serial.println(" - Big squeeze");
  }
  delay(1000);
}     

Προχωρημένη αναλογική μέτρηση
Αυτό το sketch του Arduino υποθέτει ότι έχετε το FSR καλωδιωμένο όπως παραπάνω, με 10K αντίσταση. Kατεβάστε την τιμή της αντίστασης και ο αισθητήρας διαβάζεται στο αναλογικό pin 0. Είναι αρκετά προηγμένο και θα μετρήσει την κατά προσέγγιση τη δύναμη Newton που ασκείται από το FSR. Αυτό μπορεί να είναι πολύ χρήσιμο για τη βαθμονόμηση της δύναμης που ασκείται στο FSR.


int fsrPin = 0;     // the FSR and 10K pulldown are connected to a0
int fsrReading;     // the analog reading from the FSR resistor divider
int fsrVoltage;     // the analog reading converted to voltage
unsigned long fsrResistance;  // The voltage converted to resistance, can be very big so make "long"
unsigned long fsrConductance; 
long fsrForce;       // Finally, the resistance converted to force
 
void setup(void) {
  Serial.begin(9600);   // We'll send debugging information via the Serial monitor
}
 
void loop(void) {
  fsrReading = analogRead(fsrPin);  
  Serial.print("Analog reading = ");
  Serial.println(fsrReading);
 
  // analog voltage reading ranges from about 0 to 1023 which maps to 0V to 5V (= 5000mV)
  fsrVoltage = map(fsrReading, 0, 1023, 0, 5000);
  Serial.print("Voltage reading in mV = ");
  Serial.println(fsrVoltage);  
 
  if (fsrVoltage == 0) {
    Serial.println("No pressure");  
  } else {
    // The voltage = Vcc * R / (R + FSR) where R = 10K and Vcc = 5V
    // so FSR = ((Vcc - V) * R) / V        yay math!
    fsrResistance = 5000 - fsrVoltage;     // fsrVoltage is in millivolts so 5V = 5000mV
    fsrResistance *= 10000;                // 10K resistor
    fsrResistance /= fsrVoltage;
    Serial.print("FSR resistance in ohms = ");
    Serial.println(fsrResistance);
 
    fsrConductance = 1000000;           // we measure in micromhos so 
    fsrConductance /= fsrResistance;
    Serial.print("Conductance in microMhos: ");
    Serial.println(fsrConductance);
 
    // Use the two FSR guide graphs to approximate the force
    if (fsrConductance <= 1000) {
      fsrForce = fsrConductance / 80;
      Serial.print("Force in Newtons: ");
      Serial.println(fsrForce);      
    } else {
      fsrForce = fsrConductance - 1000;
      fsrForce /= 30;
      Serial.print("Force in Newtons: ");
      Serial.println(fsrForce);            
    }
  }
  Serial.println("--------------------");
  delay(1000);
}    

Ανάγνωση μετρήσεων FSR χωρίς αναλογικά pins
Επειδή τα FSR είναι βασικά αντιστάσεις, είναι δυνατό να τα χρησιμοποιήσετε ακόμα κι αν δεν έχετε αναλογικά pins στον μικροελεγκτή σας. Ο τρόπος που το κάνουμε αυτό είναι εκμεταλλευόμενοι μια βασική ηλεκτρονική ιδιότητα των αντιστάσεων και των πυκνωτών. Αποδεικνύεται ότι εάν πάρετε έναν πυκνωτή που αρχικά δεν αποθηκεύει τάση και στη συνέχεια τον συνδέσετε στην τροφοδοσία μέσω μιας αντίστασης, θα φορτίσει μέχρι την τάση ισχύος αργά. Όσο μεγαλύτερη είναι η αντίσταση, τόσο πιο αργό είναι. Αυτό συμβαίνει επειδή ο πυκνωτής λειτουργεί σαν κάδος και η αντίσταση είναι σαν ένας λεπτός σωλήνας. Για να γεμίσετε έναν κουβά με έναν πολύ λεπτό σωλήνα χρειάζεται αρκετός χρόνος ώστε να καταλάβετε πόσο πλατύς είναι ο σωλήνας μετρώντας πόσο χρόνο χρειάζεται για να γεμίσει ο κάδος μέχρι τη μέση. Σε αυτήν την περίπτωση, ο «κάδος» μας είναι ένας κεραμικός πυκνωτής 0,1uF. Μπορείτε να αλλάξετε τον πυκνωτή σχεδόν με όποιον θέλετε, αλλά θα αλλάξουν και οι τιμές χρονισμού. Το 0,1uF φαίνεται να είναι ένα καλό μέρος για να ξεκινήσετε για αυτά τα FSR.


int fsrPin = 2;     // the FSR and cap are connected to pin2
int fsrReading;     // the digital reading
int ledPin = 13;    // you can just use the 'built in' LED
 
void setup(void) {
  // We'll send debugging information via the Serial monitor
  Serial.begin(9600);   
  pinMode(ledPin, OUTPUT);  // have an LED for output 
}
 
void loop(void) {
  // read the resistor using the RCtime technique
  fsrReading = RCtime(fsrPin);
 
  if (fsrReading == 30000) {
    // if we got 30000 that means we 'timed out'
    Serial.println("Nothing connected!");
  } else {
    Serial.print("RCtime reading = ");
    Serial.println(fsrReading);     // the raw analog reading
 
    // Do a little processing to keep the LED blinking
    fsrReading /= 10;
    // The more you press, the faster it blinks!
    digitalWrite(ledPin, HIGH);
    delay(fsrReading);
    digitalWrite(ledPin, LOW);
    delay(fsrReading);
  }
  delay(100);
}
 
// Uses a digital pin to measure a resistor (like an FSR or photocell!)
// We do this by having the resistor feed current into a capacitor and
// counting how long it takes to get to Vcc/2 (for most arduinos, thats 2.5V)
int RCtime(int RCpin) {
 int reading = 0;  // start with 0
 
  // set the pin to an output and pull to LOW (ground)
  pinMode(RCpin, OUTPUT);
  digitalWrite(RCpin, LOW);
 
  // Now set the pin to an input and...
  pinMode(RCpin, INPUT);
  while (digitalRead(RCpin) == LOW) { // count how long it takes to rise up to HIGH
    reading++;      // increment to keep track of time 
 
    if (reading == 30000) {
      // if we got this far, the resistance is so high
      // its likely that nothing is connected! 
      break;           // leave the loop
    }
  }
  // OK either we maxed out at 30000 or hopefully got a reading, return the count
 
  return reading;
}    

Foreach programming

Εγγραφείτε για να βλέπετε τα εξειδικευμένα άρθρα.