MEMS cvičenie 2: Rozdiel medzi revíziami
Z SensorWiki
(→Úlohy) |
|||
(17 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 | 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 | http://www.geofex.com/article_folders/potsecrets/potscret.htm | ||
+ | --> | ||
+ | |||
+ | Na tomto cvičení je cieľom pripojiť odporový senzor k Arduinu a zobraziť jeho zlinearizovanú hodnotu 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 prevodovú charakteristiku celého meracieho člena. | # 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. | # 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]] | + | <!-- [[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 | * Príklad na pripojenie analógového senzora: http://senzor.robotika.sk/sensorwiki/index.php/Acrob007 | ||
− | |||
− | |||
* Arduino homepage https://www.arduino.cc/ | * Arduino homepage https://www.arduino.cc/ | ||
+ | |||
+ | Na pridanie do TinkerCAD triedy (classroom) použite [https://www.tinkercad.com/joinclass/1R5VXPBESZZT tento link]. Ak od vás program pýta vstupný kód, je to 1R5VXPBESZZT | ||
+ | |||
+ | |||
+ | |||
+ | <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-misa-basicdemo/editel?sharecode=skOOqybTv7dIz26TpdC7Eigv5BGxx1k0V5tL7xRWX7k tento link]. | ||
+ | <!-- Note to self: generovane linky z TinkerCADu expiruju po 336 hodinach - 14 dni --> | ||
+ | |||
<source lang="cpp"> | <source lang="cpp"> | ||
− | #define positionSensor | + | #define positionSensor 0 // define your pin here 0 |
int adcValue; | int adcValue; | ||
Riadok 49: | Riadok 63: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | |||
+ | == Pripojenie LCD a LED displeja a lokálne zobrazenie meranej veličiny == | ||
+ | |||
+ | |||
+ | |||
+ | V tejto časti cvičenia zobrazíme meranú veličinu na miestnom LED alebo LCD displeji mikropočítača. Z tejto časti vám nevyplýva žiadna úloha, len si pozrite príklady | ||
+ | aby ste ich vedeli prípadne implementovať na svojom vlastnom reálnom Arduine s nejakým displejom. | ||
+ | |||
+ | |||
+ | |||
+ | === Sedemsegmentový zobrazovač === | ||
+ | |||
+ | <html> | ||
+ | <iframe width="725" height="453" src="https://www.tinkercad.com/embed/7X46oojlMjd?editbtn=1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> | ||
+ | </html> | ||
+ | <BR> | ||
+ | Ak sa vám príklad nezobrazí správne priamo tu, použite [https://www.tinkercad.com/things/7X46oojlMjd-misa-7-segment-4-digit-led-display/editel?sharecode=4ygjI4gH8xhMVXSfDyxGeZS8eGEbDSuEEmrfXKvw_to tento odkaz]. | ||
+ | <BR> | ||
+ | <BR> | ||
+ | |||
+ | |||
+ | <html> | ||
+ | <iframe width="725" height="453" src="https://www.tinkercad.com/embed/gjGgeC1wSPg?editbtn=1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> | ||
+ | </html> | ||
+ | |||
+ | Ak sa vám príklad nezobrazí správne priamo tu, použite [https://www.tinkercad.com/things/gjGgeC1wSPg-misa-lcddemo/editel?sharecode=In_RCwIxVqMhXSORfP1HGFq724LNdf4-8hn1Yr6oN0g tento odkaz]. | ||
+ | |||
+ | == Programovateľný LCD displej == | ||
+ | |||
+ | |||
+ | * LCD zobrazovač. Klávesnica. <BR>[http://ap.urpi.fei.stuba.sk/mmp/prednaska02.pdf Obšírnejšie informácie o displejoch] (prednáška z predmetu MMP) | ||
+ | |||
+ | |||
+ | <!-- | ||
+ | |||
+ | === LCD Modul === | ||
+ | |||
+ | [[Obrázok:ParallaxLCDAppMod.jpg|left]] | ||
+ | '''Vlastnosti:''' | ||
+ | |||
+ | * 2x8 LCD Displej bez podsvetlenia | ||
+ | * 4 Tlačítka | ||
+ | * Trimer na zmenu kontrastu | ||
+ | |||
+ | '''Technické parametre:''' | ||
+ | |||
+ | * Napájanie: 5 V @ 15 mA | ||
+ | * Pripojenie: 4-Bit parallel interface (Hitachi HD44780 compatible) | ||
+ | * Rozmery: 60 x 50 x 20 mm | ||
+ | * Pracovná teplota: 0 až +70 °C | ||
+ | |||
+ | |||
+ | |||
+ | [[Obrázok:Acrob_LCD_Schematic.png|center]] | ||
+ | |||
+ | [[Obrázok:Acrob_LCD_Schema2.png|800px|center]] | ||
+ | |||
+ | |||
+ | Najprv sa snažte pochopiť, ako je vytvorený vzorový program, ako sa konfiguruje pripojenie LCD k portom, skontrolujte konfiguráciu. Potom modifikujte program z predošlého cvičenia tak, aby | ||
+ | sa meraná hodnota polohy potenciometra zobrazila na displeji. Zobrazte aj inžinierske jednotky. | ||
+ | |||
+ | === Literatúra === | ||
+ | |||
+ | * Katalógové listy | ||
+ | ** Radič Hitachi [http://ap.urpi.fei.stuba.sk/mmp/HD44780.pdf HD44780] | ||
+ | ** Displej 2x16 [http://ap.urpi.fei.stuba.sk/mmp/DEM16216SYH-LY.pdf DEM 16216 SYH-LY] | ||
+ | ** Displej 2x16 [http://ap.urpi.fei.stuba.sk/mmp/DEM20231SYH-PY.pdf DEM 20231 SYH-PY] | ||
+ | ** 2x16 Parallel LCD [http://www.parallax.com/Portals/0/Downloads/docs/prod/audiovis/lcd2x16par.pdf datasheet] | ||
+ | ** Podrobné manuály sú aj u [http://www.hantronix.com/page/index/products/character výrobcu Hantronix]. | ||
+ | |||
+ | * Peter Ouwehand: '''[http://home.iae.nl/users/pouweha/lcd/lcd.shtml How to control a HD44780-based Character-LCD]''' | ||
+ | * Ian Harries: ''[http://www.doc.ic.ac.uk/%7Eih/doc/lcd/ HD44780-Based LCD Modules]''' | ||
+ | * Tomáš Dresler: '''[http://www.hw.cz/ART632-Inteligentni-displeje-a-jejich-pripojeni-k-PC.html Inteligentní displeje a jejich připojení k PC]'''. [hw.cz] | ||
+ | * Nuts & Volts: [http://www.parallax.com/dl/docs/cols/nv/vol1/col/nv31.pdf Demystifying Character Based LCDs] | ||
+ | * Stamp Works - pp. 73 and more [http://www.parallax.com/Portals/0/Downloads/docs/books/sw/Web-SW-v2.1.pdf] | ||
+ | |||
+ | |||
+ | |||
+ | === Arduino === | ||
+ | |||
+ | Nasledovný príklad je pre Arduino. | ||
+ | |||
+ | Pozn.: Ak budete vypisovať najprv štvorciferné číslo a potom trojciferné, nezabudnite to štvorciferné najprv vymazať, inak vám tam posledná cifra bude "visieť". Vymazať sa dá napríklad takto: | ||
+ | // 12345678 | ||
+ | lcd.print(" "); | ||
+ | |||
+ | |||
+ | * [https://www.arduino.cc/en/Reference/LiquidCrystal LCD Library] | ||
+ | <source lang="c"> | ||
+ | /* | ||
+ | LiquidCrystal Library - Hello World | ||
+ | |||
+ | Demonstrates the use a 8x2 LCD display. | ||
+ | |||
+ | The circuit: | ||
+ | * LCD RS pin to digital pin 3 | ||
+ | * LCD R/W pin to digital pin 2 | ||
+ | * LCD Enable pin to digital pin 1 | ||
+ | * LCD D4 pin to digital pin 4 | ||
+ | * LCD D5 pin to digital pin 5 | ||
+ | * LCD D6 pin to digital pin 6 | ||
+ | * LCD D7 pin to digital pin 7 | ||
+ | */ | ||
+ | |||
+ | #include <LiquidCrystal.h> // include the library | ||
+ | |||
+ | // initialize the library with the numbers of the interface pins | ||
+ | // LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) | ||
+ | LiquidCrystal lcd( 3, 2, 1, 4, 5, 6, 7); | ||
+ | |||
+ | void setup() { | ||
+ | // set up the LCD's number of columns and rows: | ||
+ | lcd.begin(8, 2); | ||
+ | // Print a message to the LCD. | ||
+ | lcd.print("Ahoj!"); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // set the cursor to column 0, line 1 | ||
+ | // (note: line 1 is the second row, since counting begins with 0): | ||
+ | lcd.setCursor(0, 1); | ||
+ | // print the number of seconds since reset: | ||
+ | lcd.print(millis()/1000); | ||
+ | // print the status of buttons: | ||
+ | lcd.setCursor(6, 0); | ||
+ | lcd.print(ReadButtons(),HEX); | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | /* ------------------------------------------------------- */ | ||
+ | /* Read and debounce the LCD AppMod buttons */ | ||
+ | /* */ | ||
+ | /* Returns 0 if nothing is pressed */ | ||
+ | /* Returns 1 if button A is pressed */ | ||
+ | /* Returns 2 if button B is pressed */ | ||
+ | /* Returns 4 if button C is pressed */ | ||
+ | /* Returns 8 if button D is pressed */ | ||
+ | /* Returns combination if more is pressed (e.g. 6 for B+C)*/ | ||
+ | /* */ | ||
+ | /* ------------------------------------------------------- */ | ||
+ | |||
+ | unsigned char ReadButtons() | ||
+ | { | ||
+ | DDRD = 0b00001110; // make LCD bus inputs | ||
+ | unsigned char state = 0xFF; // assume nothing pressed | ||
+ | |||
+ | for(int scan = 1; scan<=10; scan++) | ||
+ | { | ||
+ | state = state & ((PIND&0xF0)>>4); // make sure button held | ||
+ | delay(5); // debounce 10 x 5 ms | ||
+ | } | ||
+ | |||
+ | DDRD = 0b11111110; // return bus to outputs | ||
+ | |||
+ | return(state); | ||
+ | } | ||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | Misc: | ||
+ | * [http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html LCD Display Simulator] | ||
+ | * [http://www.geocities.com/dinceraydin/lcd/charcalc.htm Custom Character Calculator] | ||
+ | |||
+ | Prečo je takto napísaná a ako vlastne funguje lepšie zistíte, keď si preštudujete schému zapojenia: | ||
+ | |||
+ | [[Obrázok:LCD_App_Mod_Schematic.png|center|450px]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | == Sedemsegmentový 4-miestny LED displej == | ||
+ | * 4-miestny 7-segmentový displej | ||
+ | ** Product page http://www.gme.sk/hd-m324rd-p512-924 | ||
+ | ** Datasheet http://www.gme.sk/img/cache/doc/512/924/hd-m324rd-datasheet-1.pdf | ||
+ | ** Animácia k 7seg displeju: http://www.uize.com/examples/seven-segment-display.html | ||
+ | |||
+ | === Programovanie === | ||
+ | |||
+ | Z tejto časti nemusíte mať obavy, programovanie je jednoduché a budeme využívať existujúce | ||
+ | programy s knižnicami, ktoré si len zľahka modifikujete pre svoje potreby. | ||
+ | |||
+ | * Programovací jazyk aj prostredie: [https://www.arduino.cc/ Arduino] | ||
+ | * Knižnica SevSeg: https://github.com/sparkfun/SevSeg | ||
+ | |||
+ | Ukážkové programy: | ||
+ | |||
+ | <source lang=c> | ||
+ | #include <SevSeg.h> | ||
+ | |||
+ | SevSeg MyDisp; //Instantiate a seven segment controller object | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | byte numDigits = 4; | ||
+ | byte digitPins[] = {2, 3, 4, 5}; // Digits: 1,2,3,4 | ||
+ | byte segmentPins[] = {6, 7, 8, 11, 12, 13, 14, 15}; // Segments: A,B,C,D,E,F,G,Period | ||
+ | |||
+ | MyDisp.begin(COMMON_ANODE, numDigits, digitPins, segmentPins); | ||
+ | MyDisp.setBrightness(80); | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | MyDisp.setNumber(1234,9); // Second argument is decimal place | ||
+ | |||
+ | MyDisp.refreshDisplay(); // Must run repeatedly | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | <source lang="c"> | ||
+ | #include "SevSeg.h" | ||
+ | SevSeg myDisplay; | ||
+ | |||
+ | #define FOUR_DIGITS 4 | ||
+ | #define A1 2 | ||
+ | #define A2 3 | ||
+ | #define A3 4 | ||
+ | #define A4 5 | ||
+ | #define SegA 6 | ||
+ | #define SegB 7 | ||
+ | #define SegC 8 | ||
+ | |||
+ | int value; | ||
+ | int oldvalue; | ||
+ | char tempString[5]; | ||
+ | |||
+ | //------------------------------------------------------------------------------------------- | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | value = 0; | ||
+ | oldvalue = 0; | ||
+ | |||
+ | myDisplay.Begin(COMMON_ANODE, FOUR_DIGITS, A1, A2, A3, A4, SegA, SegB, SegC, 11, 12, 13, 14, 15); | ||
+ | myDisplay.SetBrightness(100); //Set the display to 100% brightness level | ||
+ | } | ||
+ | //------------------------------------------------------------------------------------------- | ||
+ | void loop() | ||
+ | { | ||
+ | value = analogRead(5); // measurement | ||
+ | value = (15*oldvalue + value)/16; // simple filter | ||
+ | sprintf(tempString, "%4d", (long)value, DEC); // create output string | ||
+ | myDisplay.DisplayString(tempString, 0); // display value on disp | ||
+ | oldvalue = value; | ||
+ | |||
+ | } | ||
+ | //------------------------------------------------------------------------------------------- | ||
+ | |||
+ | </source> | ||
+ | |||
+ | Rozličné neusporiadané linky: | ||
+ | |||
+ | * Animácia k 7seg displeju: http://www.uize.com/examples/seven-segment-display.html | ||
+ | * Nas displej: | ||
+ | ** Product page http://www.gme.sk/hd-m324rd-p512-924 | ||
+ | ** Datasheet http://www.gme.sk/img/cache/doc/512/924/hd-m324rd-datasheet-1.pdf | ||
+ | * Schema zapojenia Arduino https://www.arduino.cc/en/uploads/Main/Arduino-Pro-schematic.pdf | ||
+ | |||
+ | |||
+ | --> | ||
+ | |||
+ | |||
== Linearizácia prevodovej charakteristiky == | == Linearizácia prevodovej charakteristiky == | ||
Riadok 98: | Riadok 380: | ||
* 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 | ||
+ | |||
+ | |||
+ | |||
+ | |||
== Úlohy == | == Úlohy == | ||
Riadok 115: | Riadok 401: | ||
[[Súbor:Example2-1.png|500px]] | [[Súbor:Example2-1.png|500px]] | ||
− | Hodnotenie: | + | Hodnotenie: 5 bodov |
− | Deadline: <FONT COlor="red">''' | + | Deadline: <FONT COlor="red">'''1. 3. 2021 '''</font> |
Verzia zo dňa a času 13:54, 23. február 2021
Na tomto cvičení je cieľom pripojiť odporový senzor k Arduinu a zobraziť jeho zlinearizovanú hodnotu na nejakom miestnom displeji (LED, LCD a pod.) prípadne ju
odoslať po sériovej linke do PC (v simulátore TinkerCAD).
Obsah
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 1R5VXPBESZZT
Ak sa vám nezobrazuje vložený simulátor správne, použite prosím, tento link.
#define positionSensor 0 // define your pin here 0
int adcValue;
float outputValue;
void setup()
{
Serial.begin(9600); // typical values are 9600 or 115200
}
void loop()
{
adcValue = analogRead(positionSensor); // read ADC value
/* ======= replace this section with your code ===== */
outputValue = adcValue;
/* ================================================== */
Serial.println( outputValue ); // prints value over serial
delay(100); // delay in milliseconds
}
Pripojenie LCD a LED displeja a lokálne zobrazenie meranej veličiny
V tejto časti cvičenia zobrazíme meranú veličinu na miestnom LED alebo LCD displeji mikropočítača. Z tejto časti vám nevyplýva žiadna úloha, len si pozrite príklady aby ste ich vedeli prípadne implementovať na svojom vlastnom reálnom Arduine s nejakým displejom.
Sedemsegmentový zobrazovač
Ak sa vám príklad nezobrazí správne priamo tu, použite tento odkaz.
Ak sa vám príklad nezobrazí správne priamo tu, použite tento odkaz.
Programovateľný LCD displej
- LCD zobrazovač. Klávesnica.
Obšírnejšie informácie o displejoch (prednáška z predmetu MMP)
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
Hodnotenie: 5 bodov
Deadline: 1. 3. 2021