Operácie

MEMS cvičenie 2: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Balogh (diskusia | príspevky)
dBez shrnutí editace
 
(34 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.  
# Poskladajte si odporový senzor polohy so stupnicou (ak nemáte, použite senzor v TinkerCADe).  
# Zmerajte prevodovú charakteristiku odporového senzora polohy pomocou ohmmetra.
# 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
# Senzor pripojte k A/D prevodníku mikropočítača a pomocou programu nižšie zmerajte prevodovú charakteristiku celého meracieho člena.  
prevodovú charakteristiku celého meracieho člena.  
# Prevodovú charakteristiku zlinearizujte a doložte úspešnosť porovnaním metrologických parametrov.  
# 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






[[Súbor:MEMS02-SchemaZapojenia.png|300px|thumb|center|Schéma zapojenia]]
<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 -->


* Príklad na pripojenie analógového senzora: http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob007
* Riadiaca doska Acrob http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob
* Arduino homepage https://www.arduino.cc/


<source lang="cpp">
<source lang="cpp">
 
#define mySensor 0            // 0: potenciometer
#define positionSensor 5      // define your pin here
                              // 3: senzor sily
                              // 5: senzor ohybu


int adcValue;
int adcValue;
Riadok 25: Riadok 44:


void setup()
void setup()
{
{                             // monitor sa otvara dole vpravo
  Serial.begin(9600);          // typical values are 9600 or 115200
  Serial.begin(9600);          // typicke rychlosti su 9600 alebo 115200
}
}
   
   
void loop()
void loop()
{
{
adcValue = analogRead(positionSensor); // read ADC value
  adcValue = analogRead(mySensor); // read ADC value
 
  outputValue = adcValue;
 
  Serial.println(outputValue);        // prints value over serial


  /*  =======  replace this section with your code ===== */
  delay(100);                      // delay in milliseconds


outputValue = adcValue;     
}
</source>


/*  ================================================== */


Serial.println( outputValue );  // prints value over serial
Lepší kód na poloautomatické meranie


delay(100);                    // delay in milliseconds
<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>
</source>


Riadok 57: 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 */
  if (adcValue > x0) && (adcValue <= x1)
  y = k1 * adcValue + q1;
 
  /* segment 2 */
if (adcValue > x1) && (adcValue <= x2)
   y = k2 * adcValue + q2;
   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 ===
=== 3. Aproximácia funkcie ===
<source lang="cpp">
  y = a2 * adcValue^2 + a1 * adcValue + a0;
  return(y);
</source>




Riadok 81: 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 97: 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: 3 body
Hodnotenie: 5 bodov


Deadline: <FONT COlor="red">'''27. 2. 2018 '''</font>
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

  1. Poskladajte si odporový senzor polohy so stupnicou (ak nemáte, použite senzor v TinkerCADe).
  2. Zmerajte prevodovú charakteristiku odporového senzora polohy pomocou ohmmetra (cvičenie 1).
  3. Senzor pripojte k A/D prevodníku mikropočítača a pomocou programu nižšie zmerajte prevodovú charakteristiku celého meracieho člena.
  4. Prevodovú charakteristiku zlinearizujte a doložte úspešnosť porovnaním metrologických parametrov.


Schéma zapojenia


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




Ú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


Návrat na zoznam cvičení...