MEMS cvičenie 2: Rozdiel medzi revíziami
Zo stránky SensorWiki
| dBez shrnutí editace | |||
| (37 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 1: | Riadok 1: | ||
| Poznamky 2020:  https://www.qsl.net/om3cph/sw/pot.html  https://electronics.stackexchange.com/questions/231522/improving-the-linearity-of-a-potentiometer-after-loading | |||
| http://www.geofex.com/article_folders/potsecrets/potscret.htm | |||
| Poznamky 2022: https://stackoverflow.com/questions/7091294/how-to-build-a-lookup-table-in-c-sdcc-compiler-with-linear-interpolation | |||
| Na tomto cvičení je cieľom pripojiť odporový senzor k Arduinu a vylepšiť jeho prevodovú charakteristiku vybranou metódou a zlinearizovanú hodnotu zobraziť  | |||
| na nejakom miestnom displeji (LED, LCD a pod.) prípadne ju odoslať po sériovej linke do PC (v simulátore TinkerCAD). | |||
| == Potenciometrické snímače == | == Potenciometrické snímače == | ||
| # Poskladajte si odporový senzor polohy so stupnicou (ak nemáte, použite senzor v TinkerCADe).  | |||
| # Zmerajte prevodovú charakteristiku odporového senzora polohy pomocou ohmmetra (cvičenie 1). | |||
| # Senzor pripojte k A/D prevodníku mikropočítača a pomocou programu nižšie zmerajte prevodovú charakteristiku celého meracieho člena.  | |||
| # Prevodovú charakteristiku zlinearizujte a doložte úspešnosť porovnaním metrologických parametrov.  | |||
| [[Súbor:MEMS02-SchemaZapojenia21.png|300px|thumb|center|Schéma zapojenia]] | |||
| <!-- [[Súbor:MEMS02-SchemaZapojenia.png|300px|thumb|center|Schéma zapojenia]] --> | |||
| * Príklad na pripojenie analógového senzora: http://senzor.robotika.sk/sensorwiki/index.php/Acrob007 | |||
| * Arduino homepage https://www.arduino.cc/ | |||
| Na pridanie do TinkerCAD triedy (classroom) použite [https://www.tinkercad.com/joinclass/B5ZT5MYJJNZP tento link]. Ak od vás program pýta vstupný kód, je to B5ZT5MYJJNZP | |||
| <html> | |||
| <iframe width="725" height="453" src="https://www.tinkercad.com/embed/6Pg8q4b7Kst?editbtn=1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> | |||
| </html> | |||
| Ak sa vám nezobrazuje vložený simulátor správne, použite prosím, [https://www.tinkercad.com/things/6Pg8q4b7Kst tento link]. | |||
| <!-- Note to self: generovane linky z TinkerCADu expiruju po 336 hodinach - 14 dni --> | |||
| <source lang="cpp"> | <source lang="cpp"> | ||
| #define mySensor 0            // 0: potenciometer | |||
| #define  |                               // 3: senzor sily | ||
|                               // 5: senzor ohybu | |||
| int adcValue; | int adcValue; | ||
| Riadok 27: | Riadok 44: | ||
| void setup() | void setup() | ||
| { | {                              // monitor sa otvara dole vpravo  | ||
|   Serial.begin(9600);           //  |   Serial.begin(9600);           // typicke rychlosti su 9600 alebo 115200 | ||
| } | } | ||
| void loop() | void loop() | ||
| { | { | ||
|   adcValue = analogRead(mySensor); // read ADC value | |||
|   outputValue = adcValue; | |||
|   Serial.println(outputValue);        // prints value over serial | |||
|  delay(100);                       // delay in milliseconds | |||
| } | |||
| </source> | |||
| Lepší kód na poloautomatické meranie | |||
| <source lang="cpp"> | |||
| // Meranie na potenciometrickej doske v.2024 | |||
| // Tlacitko je na A5 a zapiseme nim meranie | |||
| // Potenciometer je na A4 a da sa citat 0/1023 | |||
| //   pricom ak zmenim prepinacom charakteristiku, tak | |||
| //   tym ze je to napatovy delic, funguje stale rovnako | |||
| unsigned long int sensorValue; | |||
| unsigned      int counter; | |||
| void setup()  | |||
| { | |||
|   Serial.begin(115200); | |||
|   pinMode(LED_BUILTIN, OUTPUT); | |||
|   pinMode(18, INPUT); | |||
|   pinMode(19, INPUT); | |||
|   Serial.println("*** MISA measurement (press Red PB to start): ***\n\n"); | |||
|   counter = 1; | |||
| } | } | ||
| void loop()  | |||
| { | |||
|   digitalWrite(13,HIGH);  // Led ON = Ready | |||
|   while ( digitalRead(19)== 1)  | |||
|      {/* wait here */} | |||
|   digitalWrite(13,LOW);  // Led OFF = Measuring... | |||
|   /* odmeraj N hodnot a vypocitaj priemer */ | |||
|   sensorValue = 0; | |||
|     for ( int i=1; i<=64; i++)  | |||
|       sensorValue += analogRead(A4); | |||
|   sensorValue = sensorValue / 64; | |||
|   Serial.print(counter++); | |||
|   Serial.print(","); | |||
|   Serial.println(sensorValue); | |||
|   delay(500);        // delay in between reads for stability | |||
| } | |||
| </source> | |||
| == Linearizácia prevodovej charakteristiky == | == Linearizácia prevodovej charakteristiky == | ||
| Riadok 63: | Riadok 123: | ||
|   const PROGMEM int table[] = {11,12,15,...}; |   const PROGMEM int table[] = {11,12,15,...}; | ||
|  return( table[adcValue] ); | |||
| </source> | </source> | ||
| Viac info tu: https://www.arduino.cc/en/Reference/PROGMEM | Viac info tu: https://www.arduino.cc/en/Reference/PROGMEM | ||
| === 2. Po častiach lineárna náhrada === | === 2. Po častiach lineárna náhrada === | ||
| <source lang="cpp"> | <source lang="cpp"> | ||
|   if (adcValue > x1) && (adcValue <= x2) |   /* segment 1 */ | ||
|     y = k2  |   if (adcValue > x0) && (adcValue <= x1) | ||
|    y = k1 * adcValue + q1; | |||
|   /* segment 2 */ | |||
| if (adcValue > x1) && (adcValue <= x2) | |||
|     y = k2 * adcValue + q2; | |||
|   return(y) |   return(y) | ||
| </source> | </source> | ||
| Dá sa použiť aj funkcia map v Arduine -  https://www.arduino.cc/reference/en/language/functions/math/map/ | |||
| === 3. Aproximácia funkcie === | |||
| == | <source lang="cpp"> | ||
|    y = a2 * adcValue^2 + a1 * adcValue + a0; | |||
|    return(y); | |||
| </source> | |||
| Riadok 89: | Riadok 160: | ||
| * https://www.gnu.org/software/gsl/manual/html_node/Example-programs-for-Nonlinear-Least_002dSquares-Fitting.html | * https://www.gnu.org/software/gsl/manual/html_node/Example-programs-for-Nonlinear-Least_002dSquares-Fitting.html | ||
| * https://www.gnu.org/software/octave/doc/interpreter/One_002ddimensional-Interpolation.html#One_002ddimensional-Interpolation | * https://www.gnu.org/software/octave/doc/interpreter/One_002ddimensional-Interpolation.html#One_002ddimensional-Interpolation | ||
| Riadok 105: | Riadok 178: | ||
| * Graf 2: chybové krivky (viď obr.) | * Graf 2: chybové krivky (viď obr.) | ||
| * Program pre mikroprocesor na linearizáciu | * Program pre mikroprocesor na linearizáciu | ||
| * Porovnať namerané výsledky s predošlými | |||
| [[Súbor:Example2-1.png|500px]] | [[Súbor:Example2-1.png|500px]] | ||
| Hodnotenie:  | Hodnotenie: 5 bodov | ||
| Deadline: <FONT COlor="red">''' | Deadline: <FONT COlor="red">'''8. 3. 2022 '''</font> | ||
Aktuálna revízia z 09:01, 21. február 2025
Poznamky 2020: https://www.qsl.net/om3cph/sw/pot.html https://electronics.stackexchange.com/questions/231522/improving-the-linearity-of-a-potentiometer-after-loading http://www.geofex.com/article_folders/potsecrets/potscret.htm
Poznamky 2022: https://stackoverflow.com/questions/7091294/how-to-build-a-lookup-table-in-c-sdcc-compiler-with-linear-interpolation
Na tomto cvičení je cieľom pripojiť odporový senzor k Arduinu a vylepšiť jeho prevodovú charakteristiku vybranou metódou a zlinearizovanú hodnotu zobraziť na nejakom miestnom displeji (LED, LCD a pod.) prípadne ju odoslať po sériovej linke do PC (v simulátore TinkerCAD).
Potenciometrické snímače
- Poskladajte si odporový senzor polohy so stupnicou (ak nemáte, použite senzor v TinkerCADe).
- Zmerajte prevodovú charakteristiku odporového senzora polohy pomocou ohmmetra (cvičenie 1).
- Senzor pripojte k A/D prevodníku mikropočítača a pomocou programu nižšie zmerajte prevodovú charakteristiku celého meracieho člena.
- Prevodovú charakteristiku zlinearizujte a doložte úspešnosť porovnaním metrologických parametrov.

- Príklad na pripojenie analógového senzora: http://senzor.robotika.sk/sensorwiki/index.php/Acrob007
- Arduino homepage https://www.arduino.cc/
Na pridanie do TinkerCAD triedy (classroom) použite tento link. Ak od vás program pýta vstupný kód, je to B5ZT5MYJJNZP
Ak sa vám nezobrazuje vložený simulátor správne, použite prosím, tento link.
#define mySensor 0            // 0: potenciometer
                              // 3: senzor sily
                              // 5: senzor ohybu
int adcValue;
float outputValue;
void setup()
{                              // monitor sa otvara dole vpravo 
 Serial.begin(9600);           // typicke rychlosti su 9600 alebo 115200
}
 
void loop()
{
  adcValue = analogRead(mySensor); // read ADC value
  
  outputValue = adcValue;
  
  Serial.println(outputValue);        // prints value over serial
 delay(100);                       // delay in milliseconds
}
Lepší kód na poloautomatické meranie
// Meranie na potenciometrickej doske v.2024
// Tlacitko je na A5 a zapiseme nim meranie
// Potenciometer je na A4 a da sa citat 0/1023
//   pricom ak zmenim prepinacom charakteristiku, tak
//   tym ze je to napatovy delic, funguje stale rovnako
unsigned long int sensorValue;
unsigned      int counter;
void setup() 
{
  Serial.begin(115200);
  
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(18, INPUT);
  pinMode(19, INPUT);
  Serial.println("*** MISA measurement (press Red PB to start): ***\n\n");
  counter = 1;
}
void loop() 
{
  digitalWrite(13,HIGH);  // Led ON = Ready
  while ( digitalRead(19)== 1) 
     {/* wait here */}
  
  digitalWrite(13,LOW);  // Led OFF = Measuring...
  /* odmeraj N hodnot a vypocitaj priemer */
  sensorValue = 0;
    for ( int i=1; i<=64; i++) 
      sensorValue += analogRead(A4);
  sensorValue = sensorValue / 64;
  Serial.print(counter++);
  Serial.print(",");
  Serial.println(sensorValue);
  
  delay(500);        // delay in between reads for stability
  
}
Linearizácia prevodovej charakteristiky
1. Look-up table
 #include <avr/pgmspace.h>
 const PROGMEM int table[] = {11,12,15,...};
 
 return( table[adcValue] );
Viac info tu: https://www.arduino.cc/en/Reference/PROGMEM
2. Po častiach lineárna náhrada
  /* segment 1 */
 if (adcValue > x0) && (adcValue <= x1)
   y = k1 * adcValue + q1;
  /* segment 2 */
if (adcValue > x1) && (adcValue <= x2)
   y = k2 * adcValue + q2;
 return(y)
Dá sa použiť aj funkcia map v Arduine - https://www.arduino.cc/reference/en/language/functions/math/map/
3. Aproximácia funkcie
   y = a2 * adcValue^2 + a1 * adcValue + a0;
   return(y);
- https://www.gnu.org/software/octave/doc/interpreter/Polynomial-Interpolation.html
- http://octave.sourceforge.net/optim/function/leasqr.html
- http://octave.sourceforge.net/optim/function/expfit.html
- https://www.gnu.org/software/gsl/manual/html_node/Example-programs-for-Nonlinear-Least_002dSquares-Fitting.html
- https://www.gnu.org/software/octave/doc/interpreter/One_002ddimensional-Interpolation.html#One_002ddimensional-Interpolation
Úlohy
Úlohy, ktoré treba odovzdať:
- Graf 1: prevodové charakteristiky
- Chyby podľa EN 60 770
- Nepresnosť
- Meraná chyba
- Nelinearita
- Hysteréza
- Neopakovateľnosť
 
- Graf 2: chybové krivky (viď obr.)
- Program pre mikroprocesor na linearizáciu
- Porovnať namerané výsledky s predošlými
Hodnotenie: 5 bodov
Deadline: 8. 3. 2022
