Operácie

MEMS cvičenie 2: Rozdiel medzi revíziami

Z SensorWiki

(Úlohy)
 
(7 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
+
Poznamky 2022: https://stackoverflow.com/questions/7091294/how-to-build-a-lookup-table-in-c-sdcc-compiler-with-linear-interpolation
odoslať po sériovej linke do PC (v simulátore TinkerCAD).
+
 
 +
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).
  
  
Riadok 23: Riadok 23:
 
* 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
+
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
  
  
Riadok 31: Riadok 31:
 
</html>
 
</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].
+
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 -->
 
<!-- 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 positionSensor 0       // define your pin here 0
+
                              // 3: senzor sily
 +
                              // 5: senzor ohybu
  
 
int adcValue;
 
int adcValue;
Riadok 43: 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
 
 
/*  =======  replace this section with your code ===== */
 
 
 
outputValue = adcValue;     
 
 
 
/*  ================================================== */
 
 
 
Serial.println( outputValue );  // prints value over serial
 
 
 
delay(100);                    // delay in milliseconds
 
 
 
}
 
</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++)
+
   outputValue = adcValue;
  {
 
  state = state & ((PIND&0xF0)>>4); // make sure button held
 
  delay(5);                    // debounce 10 x 5 ms
 
  }
 
 
 
  DDRD  = 0b11111110; // return bus to outputs
 
 
    
 
    
   return(state);
+
   Serial.println(outputValue);       // prints value over serial
}
 
 
 
 
 
</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];
 
  
//-------------------------------------------------------------------------------------------
+
delay(100);                      // delay in milliseconds
  
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>
 
</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
 
 
 
-->
 
 
  
  
Riadok 398: Riadok 128:
 
* 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]]
Riadok 403: Riadok 134:
 
Hodnotenie: 5 bodov
 
Hodnotenie: 5 bodov
  
Deadline: <FONT COlor="red">'''1. 3. 2021 '''</font>
+
Deadline: <FONT COlor="red">'''8. 3. 2022 '''</font>
  
  

Aktuálna revízia z 09:22, 27. november 2022

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

}


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

Example2-1.png

Hodnotenie: 5 bodov

Deadline: 8. 3. 2022


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