Operácie

MEMS cvičenie 3: Rozdiel medzi revíziami

Z SensorWiki

(Úlohy)
Riadok 1: Riadok 1:
 +
[[Súbor:OpenSegmentDisplay.jpg|center|500px]]
 +
 +
Cieľom tohoto cvičenia je zobraziť meranú veličinu na grafickom displeji v počítači.
 +
 
__TOC__
 
__TOC__
 +
 +
 +
== Vysielač - Arduino ==
 +
 +
Meranú veličinu odmeriame procesorom, po prevode A/D prevodníkom a úprave linearizáciou z predošlých
 +
cvičení budeme hodnotu posielať po sériovej linke s parametrami 9600-N-8-1 do PC. Ak máte doma Arduino,
 +
môžete použiť program na vysielanie hodnoty z potenciometra pripojeného na niektorý analógový vstup,
 +
alebo len posielať náhodne vygenerované hodnoty. Program môže vyzerať napríklad takto:
 +
 +
<source lang="c">
 +
int adcValue = 0;
 +
 +
void setup() {
 +
 +
      Serial.begin(9600);
 +
}
 +
 +
 +
void loop()
 +
{
 +
 +
/* This part of code is for real measurement from Channel 0 */
 +
 +
  adcValue = 0;                          // Filter - average from 16 values
 +
  for (int i = 1; i<=16; i++)
 +
    adcValue = adcValue + analogRead(0);
 +
  adcValue = adcValue/16;
 +
 +
/* Uncomment this part of code, if you want just simulated values */
 +
/*
 +
    if (adcValue < 1023)
 +
          adcValue = adcValue + random(-1,2);
 +
      else
 +
          adcValue = 0;
 +
*/
 +
 +
  char tempString[10];                    // Used for sprintf
 +
  sprintf(tempString, "%4d",adcValue);    // Convert into a string that is right adjusted
 +
  //sprintf(tempString, "%d", adcValue);  // Convert into a string that is left adjusted (requires digit 1 command)
 +
  //sprintf(tempString, "%04d", adcValue); // Convert into a string with leading zeros
 +
  //sprintf(tempString, "%4X", adcValue);  // Convert int  HEX, right adjusted
 +
 
 +
 +
  Serial.println(tempString);              // Send the value using serial to PC
 +
 +
  delay(100);
 +
}
 +
 +
</source>
 +
 +
 +
Hodnoty, ktoré PC prijíma si môžete pozrieť v terminálovom okne priamo v prostredí Arduino, alebo použite
 +
radšej profesionálny sériový terminál (napr. Terminal).
 +
 +
 +
 +
=== Serial Terminal by Bray ===
 +
 +
[[Súbor:IconTerminal.png|left]] Na testovanie a prvé pokusy so sériovým rozhraním sa vám určite zíde aj nejaký terminálový program, masochisti môžu použiť aj Hyperterminál z Windows. Terminál je jednoduchý program, v ktorom sa zobrazujú všetky prijaté znaky a naopak, je možné nejaké iné znaky odvysielať. Dajú sa samozrejme aj nastaviť základné komunikačné parametre.
 +
 +
* [https://sites.google.com/site/terminalbpp/ Terminal by Bray++], neinštaluje sa, len spustí.
 +
* [http://senzor.robotika.sk/zp/Terminal.exe Terminal] -- lokálna kópia
 +
 +
[[Súbor:TerminalExampleMEMS.png]]
 +
 +
''Ukážka práce s Terminalom vrátane správneho nastavenia parametrov''
 +
 +
 +
 +
== Prijímač - Processing ==
 +
 +
 +
Ak hodnoty chodia tak ako potrebujeme (skontrolujte nastavenie parametrov rýchlosť-parita-počet bytov-počet stopbitov)
 +
navrhneme si krajší zobrazovací program (appku, ak chcete).
 +
 +
Na to využijeme prostredie Processing, ktoré vyzerá veľmi podobne ako to Arduinovské, ale generuje
 +
program pre Windows (alebo aj pre linux, či iOS). Prostredie Processing je na počítačoch v laboratóriu už nainštalované,
 +
doma si môžete nainštalovať odtiaľto: https://processing.org/
 +
 +
Okrem toho si stiahnite a nainštalujte do svojho OS tento pekný font https://fontlibrary.org/en/font/segment7
 +
ktorým budeme veličinu vypisovať.
 +
 +
[[Súbor:Segement7Font.png]]
 +
 +
 +
V prostredí processing preložte a spustite nasledovný program
 +
 +
<source lang="c">
 +
import processing.serial.*;
 +
 +
int adcValue = 0;        // value received from Serial
 +
// String Unit="mA";
 +
// String Unit="kΩ";
 +
// String Unit="°C";    // We can use Unicode chars directly
 +
String Unit="\u00B0C";  // Unicode codes may be entered as well
 +
 +
Serial myPort;
 +
PFont Segment, Units;
 +
 +
void setup() {
 +
                          // Setup the display window
 +
  size(480, 180);        // Size of the window
 +
  Segment = createFont("Segment7", 150);  // Assign fonts and size
 +
  Units = createFont("Arial", 40);
 +
  textFont(Segment);
 +
  textAlign(RIGHT);        // Text align
 +
  fill(250,250,0);        // Font color is yellow = red + green
 +
 +
  println(Serial.list());    // List all the available serial ports
 +
  // Then open the port  you're using, my is the first, i.e. '0'
 +
  myPort = new Serial(this, Serial.list()[0], 9600);
 +
// don't generate a serialEvent() unless you get a newline character:
 +
  myPort.bufferUntil('\n');
 +
}
 +
 +
void draw()
 +
{                      // Let's start to display
 +
  background(0,0,0);  // set the background color black
 +
 +
  textFont(Segment);
 +
  text(adcValue, 400, 150);
 +
 
 +
  textFont(Units);
 +
  text(Unit,465,65);
 +
}
 +
 +
 +
void serialEvent(Serial myPort)
 +
{
 +
String inString = myPort.readStringUntil('\n');    // get the ASCII string:
 +
if (inString != null)
 +
    {
 +
    inString = trim(inString);    // trim off any whitespace
 +
    adcValue = int(inString);      // convert into an integer
 +
    adcValue =int(map(adcValue, 0, 1023, 0, 1023));  // possible range adjusting
 +
    }
 +
}
 +
 +
</source>
 +
 +
 +
[[Súbor:OpenSegmentScreenshot.png|center|500px]]
 +
 +
Preštudujte aj komentované časti programov!
 +
 +
 +
 +
== Pomôcky ==
 +
 +
 +
 +
=== Ako si v Processingu vyberiem, na ktorý port bude pripojený? ===
 +
 +
 +
Po spustení programu príkazom println(Serial.list()); do konzoly vypíšeme zoznam dostupných portov.
 +
 +
[[Súbor:ProcessingPortList.png|350px]]
 +
 +
Na obrázku vyššie vidno, že máme dostupné tri porty, COM1:, COM2: a COM3:
 +
 +
Ak chceme komunikovať cez COM2:, musíme pri otváraní použiť index 1, t.j. Serial.list()[1] a nastaviť rýchlosť 9600.
 +
 +
 +
=== Ako si v Processingu vyberiem font? ===
 +
 +
Font musíte najprv normálne nainštalovať do operačného systému (stiahnuť font, kliknúť, zobrazí sa ukážka, nainštalovať).
 +
Potom príkazom Segment = createFont("Segment7", 150); spravíte smerník na príslušný font, ale musíte vedieť,
 +
ako sa volá. Niekedy je problém v tom, že súbor s fontom sa nazýva inak, ako samotný font.
 +
Napokon treba v menu Processing zvoliť Tools -> Create Font. Tým sa vytvorí v priečinku so zdrojákom vášho programu
 +
podadresár 'data' a v ňom potrebné bitmapy pre váš program.
 +
 +
== Nemám doma Arduino! ==
 +
 +
Ak nemáte Arduino, môžete si program v Processingu vyskúšať aj tak. Nainštalujete si dvojicu virtuálnych sériových portov
 +
napr. https://www.eltima.com/products/vspdxp/ - stačí základnú verziu Standard, ktorá je bezplatne k dispozícii 14 dní.
 +
V systéme vám vzniknú dva nové sériové porty. Jeden otvoríte v termináli, cez neho budete posielať čísla, ktoré chcete
 +
zobraziť. Druhý port použijete ako prijímací v Processingu.
 +
 +
[[Súbor:VirtualSerialPort.png|1000px]]
 +
 +
<source lang="c">
 +
</source>
 +
 +
 +
== Nepovinne: Grafické priebehy na PC --Serial Plotter ===
 +
 +
[[Súbor:IconSerialPlotter.png|left]] Serial Plotter je trocha sofistikovanejší program ako Terminal, jeho úlohou je zakresliť graficky všetky prijaté informácie. Najjednoduchšie je posielať mu čísla, pričom ich môže byť aj viac, oddelených čiarkami. Každá jedna n-tica hodnôt musí končíť znakom pre nový riadok. V knižnici Serial použite bloky Serial Write Number pre čísla, Serial Write String pre čiarky a Serial Write Line pre ukončenie riadka. Neposielajte hodnoty príliš často, aby sa nepreplnil vstupný buffer.
 +
* [https://hackaday.io/project/5334-serialplot-realtime-plotting-software Domovská stránka programu]
 +
* [http://senzor.robotika.sk/zp/serialplot.zip Lokálna kópia]
 +
 +
<BR><BR>
 +
 +
[[Súbor:SerialPlotter01.png]]
 +
 +
<BR>
 +
<BR>
 +
 +
 +
* Graphics in Arduino IDE: http://www.idogendel.com/en/archives/489
 +
* https://rheingoldheavy.com/new-arduino-serial-plotter/
 +
 +
Trocha zlozitejsie:
 +
 +
* http://arduino.stackexchange.com/questions/1180/serial-data-plotting-programs
 +
* https://github.com/nprasan/ardugraph
 +
 +
 +
  
 
    
 
    
Riadok 58: Riadok 270:
 
'''Úlohy, ktoré treba odovzdať:'''  
 
'''Úlohy, ktoré treba odovzdať:'''  
  
* Graf 1: prevodové charakteristiky
+
* 1. cvičenie: reálna alebo nasimulovaná charakteristika snímača
* Chyby podľa EN 60 770
+
* 2. cvičenie: linearizovaná reálna alebo simulovaná charakteristika
** Nepresnosť
+
* '''3. cvičenie: screenshot alebo video z prenosu dát do PC'''
** Meraná chyba
 
** Nelinearita
 
** Hysteréza
 
** Neopakovateľnosť
 
* Graf 2: chybové krivky (viď obr.)
 
* Program pre mikroprocesor na linearizáciu
 
 
 
[[Súbor:Example2-1.png|500px]]
 
  
 
Hodnotenie: 3 body
 
Hodnotenie: 3 body
  
Deadline: <FONT COlor="red">'''17. 3. 2020 '''</font>
+
Deadline: <FONT COlor="red">'''14. 3. 2021 '''</font>
 
 
== Grafické priebehy na PC --Serial Plotter ===
 
 
 
[[Súbor:IconSerialPlotter.png|left]] Serial Plotter je trocha sofistikovanejší program ako Terminal, jeho úlohou je zakresliť graficky všetky prijaté informácie. Najjednoduchšie je posielať mu čísla, pričom ich môže byť aj viac, oddelených čiarkami. Každá jedna n-tica hodnôt musí končíť znakom pre nový riadok. V knižnici Serial použite bloky Serial Write Number pre čísla, Serial Write String pre čiarky a Serial Write Line pre ukončenie riadka. Neposielajte hodnoty príliš často, aby sa nepreplnil vstupný buffer.
 
* [https://hackaday.io/project/5334-serialplot-realtime-plotting-software Domovská stránka programu]
 
* [http://senzor.robotika.sk/zp/serialplot.zip Lokálna kópia]
 
 
 
<BR><BR>
 
 
 
[[Súbor:SerialPlotter01.png]]
 
 
 
<BR>
 
<BR>
 
 
 
 
 
* Graphics in Arduino IDE: http://www.idogendel.com/en/archives/489
 
* https://rheingoldheavy.com/new-arduino-serial-plotter/
 
 
 
Trocha zlozitejsie:
 
 
 
* http://arduino.stackexchange.com/questions/1180/serial-data-plotting-programs
 
* https://github.com/nprasan/ardugraph
 
 
 
 
 
  
  

Verzia zo dňa a času 07:02, 2. marec 2021

OpenSegmentDisplay.jpg

Cieľom tohoto cvičenia je zobraziť meranú veličinu na grafickom displeji v počítači.


Vysielač - Arduino

Meranú veličinu odmeriame procesorom, po prevode A/D prevodníkom a úprave linearizáciou z predošlých cvičení budeme hodnotu posielať po sériovej linke s parametrami 9600-N-8-1 do PC. Ak máte doma Arduino, môžete použiť program na vysielanie hodnoty z potenciometra pripojeného na niektorý analógový vstup, alebo len posielať náhodne vygenerované hodnoty. Program môže vyzerať napríklad takto:

int adcValue = 0;

void setup() {

      Serial.begin(9600);
}


void loop() 
{

 /* This part of code is for real measurement from Channel 0 */

  adcValue = 0;                           // Filter - average from 16 values 
  for (int i = 1; i<=16; i++)
    adcValue = adcValue + analogRead(0);
  adcValue = adcValue/16;
 
/* Uncomment this part of code, if you want just simulated values */
/*
     if (adcValue < 1023)
          adcValue = adcValue + random(-1,2);
      else
          adcValue = 0;
*/
 
  char tempString[10];                     // Used for sprintf
  sprintf(tempString, "%4d",adcValue);     // Convert into a string that is right adjusted
  //sprintf(tempString, "%d", adcValue);   // Convert into a string that is left adjusted (requires digit 1 command)
  //sprintf(tempString, "%04d", adcValue); // Convert into a string with leading zeros
  //sprintf(tempString, "%4X", adcValue);  // Convert int  HEX, right adjusted
  
 
  Serial.println(tempString);              // Send the value using serial to PC

  delay(100);
}


Hodnoty, ktoré PC prijíma si môžete pozrieť v terminálovom okne priamo v prostredí Arduino, alebo použite radšej profesionálny sériový terminál (napr. Terminal).


Serial Terminal by Bray

IconTerminal.png
Na testovanie a prvé pokusy so sériovým rozhraním sa vám určite zíde aj nejaký terminálový program, masochisti môžu použiť aj Hyperterminál z Windows. Terminál je jednoduchý program, v ktorom sa zobrazujú všetky prijaté znaky a naopak, je možné nejaké iné znaky odvysielať. Dajú sa samozrejme aj nastaviť základné komunikačné parametre.

TerminalExampleMEMS.png

Ukážka práce s Terminalom vrátane správneho nastavenia parametrov


Prijímač - Processing

Ak hodnoty chodia tak ako potrebujeme (skontrolujte nastavenie parametrov rýchlosť-parita-počet bytov-počet stopbitov) navrhneme si krajší zobrazovací program (appku, ak chcete).

Na to využijeme prostredie Processing, ktoré vyzerá veľmi podobne ako to Arduinovské, ale generuje program pre Windows (alebo aj pre linux, či iOS). Prostredie Processing je na počítačoch v laboratóriu už nainštalované, doma si môžete nainštalovať odtiaľto: https://processing.org/

Okrem toho si stiahnite a nainštalujte do svojho OS tento pekný font https://fontlibrary.org/en/font/segment7 ktorým budeme veličinu vypisovať.

Segement7Font.png


V prostredí processing preložte a spustite nasledovný program

import processing.serial.*;

 int adcValue = 0;        // value received from Serial 
 // String Unit="mA";
 // String Unit="kΩ";
 // String Unit="°C";     // We can use Unicode chars directly
 String Unit="\u00B0C";   // Unicode codes may be entered as well
 
 Serial myPort;
 PFont Segment, Units; 

 void setup() {
                          // Setup the display window 
  size(480, 180);         // Size of the window
  Segment = createFont("Segment7", 150);  // Assign fonts and size 
  Units = createFont("Arial", 40);
  textFont(Segment);
  textAlign(RIGHT);        // Text align 
  fill(250,250,0);         // Font color is yellow = red + green

  println(Serial.list());    // List all the available serial ports
  // Then open the port  you're using, my is the first, i.e. '0'
   myPort = new Serial(this, Serial.list()[0], 9600);
 // don't generate a serialEvent() unless you get a newline character:
   myPort.bufferUntil('\n');
 }

void draw()
{                      // Let's start to display
  background(0,0,0);   // set the background color black

  textFont(Segment);
  text(adcValue, 400, 150);
  
  textFont(Units);
  text(Unit,465,65);
}


void serialEvent(Serial myPort) 
{
 String inString = myPort.readStringUntil('\n');    // get the ASCII string:
 if (inString != null) 
    {
     inString = trim(inString);     // trim off any whitespace
     adcValue = int(inString);      // convert into an integer
     adcValue =int(map(adcValue, 0, 1023, 0, 1023));  // possible range adjusting
    }
 }


OpenSegmentScreenshot.png

Preštudujte aj komentované časti programov!


Pomôcky

Ako si v Processingu vyberiem, na ktorý port bude pripojený?

Po spustení programu príkazom println(Serial.list()); do konzoly vypíšeme zoznam dostupných portov.

ProcessingPortList.png

Na obrázku vyššie vidno, že máme dostupné tri porty, COM1:, COM2: a COM3:

Ak chceme komunikovať cez COM2:, musíme pri otváraní použiť index 1, t.j. Serial.list()[1] a nastaviť rýchlosť 9600.


Ako si v Processingu vyberiem font?

Font musíte najprv normálne nainštalovať do operačného systému (stiahnuť font, kliknúť, zobrazí sa ukážka, nainštalovať). Potom príkazom Segment = createFont("Segment7", 150); spravíte smerník na príslušný font, ale musíte vedieť, ako sa volá. Niekedy je problém v tom, že súbor s fontom sa nazýva inak, ako samotný font. Napokon treba v menu Processing zvoliť Tools -> Create Font. Tým sa vytvorí v priečinku so zdrojákom vášho programu podadresár 'data' a v ňom potrebné bitmapy pre váš program.

Nemám doma Arduino!

Ak nemáte Arduino, môžete si program v Processingu vyskúšať aj tak. Nainštalujete si dvojicu virtuálnych sériových portov napr. https://www.eltima.com/products/vspdxp/ - stačí základnú verziu Standard, ktorá je bezplatne k dispozícii 14 dní. V systéme vám vzniknú dva nové sériové porty. Jeden otvoríte v termináli, cez neho budete posielať čísla, ktoré chcete zobraziť. Druhý port použijete ako prijímací v Processingu.

VirtualSerialPort.png



Nepovinne: Grafické priebehy na PC --Serial Plotter =

IconSerialPlotter.png
Serial Plotter je trocha sofistikovanejší program ako Terminal, jeho úlohou je zakresliť graficky všetky prijaté informácie. Najjednoduchšie je posielať mu čísla, pričom ich môže byť aj viac, oddelených čiarkami. Každá jedna n-tica hodnôt musí končíť znakom pre nový riadok. V knižnici Serial použite bloky Serial Write Number pre čísla, Serial Write String pre čiarky a Serial Write Line pre ukončenie riadka. Neposielajte hodnoty príliš často, aby sa nepreplnil vstupný buffer.



SerialPlotter01.png




Trocha zlozitejsie:



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ť:

  • 1. cvičenie: reálna alebo nasimulovaná charakteristika snímača
  • 2. cvičenie: linearizovaná reálna alebo simulovaná charakteristika
  • 3. cvičenie: screenshot alebo video z prenosu dát do PC

Hodnotenie: 3 body

Deadline: 14. 3. 2021


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