ELSA Online: 9. Frekvenčný vstup: Rozdiel medzi revíziami
Z SensorWiki
(Vytvorená stránka „Na dnešnom cvičení si ukážeme možnosti merania signálov, v ktorých je nositeľom informácie buď frekvencia, alebo strieda. == Datasheety == * [https://ww…“) |
|||
Riadok 1: | Riadok 1: | ||
Na dnešnom cvičení si ukážeme možnosti merania signálov, v ktorých je nositeľom informácie buď frekvencia, alebo strieda. | Na dnešnom cvičení si ukážeme možnosti merania signálov, v ktorých je nositeľom informácie buď frekvencia, alebo strieda. | ||
+ | |||
+ | |||
+ | == Software == | ||
+ | |||
+ | Nižšie nájdete software, potrebný na meranie. Keďže meriame frekvenciu a nie napätie, museli sme predošlé programy trocha upraviť. | ||
+ | Ako obvykle, treba najprv preložiť a nahrať program do Arduina, potom spustiť program v Processingu. '''Nezabudnite nastaviť správny sériový port!''' | ||
+ | |||
+ | <div style='text-align: center;'> | ||
+ | [[Súbor:ELSA_Screen09.png|center]]<BR> | ||
+ | ''Ukážka okna programu pre Processing, namerané hodnoty.'' | ||
+ | </div> | ||
+ | |||
+ | Časť programu vľavo, s posuvníkom tentoraz slúži na generovanie šírkovo modulovaného frekvenčného signálu na pine 3. Môžete ho použiť na otestovanie svojho pracoviska, prepojte na Arduino Nano vstup na PIN 2 s frekvenčným výstupom na PIN 3. | ||
+ | |||
+ | Ako obvykle, software si môžete ľubovoľne upravovať. A tiež máte k dispozícii aj všetko potrebné v jednom .zip archíve: | ||
+ | |||
+ | * [[Médiá:software09.zip|Software pre cvičenie 9]] | ||
+ | |||
+ | <tabs> | ||
+ | <tab name="Processing"><source lang="java"> | ||
+ | import processing.serial.Serial; // kniznica pre seriovu komunikaciu s Arduinom | ||
+ | import g4p_controls.*; // graficka kniznica pre posuvnik | ||
+ | import java.awt.Font; // kniznica pre pracu s fontami | ||
+ | |||
+ | /* ***************************************************************** */ | ||
+ | /* Tento riadok treba upravit podla toho, na ktorom porte je Arduino */ | ||
+ | /* ***************************************************************** */ | ||
+ | static final int PORT_INDEX = 1, BAUDS = 9600; | ||
+ | |||
+ | GCustomSlider VoltageSlider; // posuvnik pre napatie | ||
+ | GLabel VoltageLabel; // zobrazovanie hodnoty posuvnika | ||
+ | |||
+ | float adcValue0 = 0; // value received from Serial | ||
+ | float adcValue1 = 0; // value received from Serial | ||
+ | String Unit0="µs"; // jednotky pre prvy kanal | ||
+ | String Unit1="µs"; // jednotky pre druhy kanal | ||
+ | // String Unit="kΩ"; | ||
+ | // String Unit="°C"; // can use Unicode chars directly | ||
+ | |||
+ | Serial myPort; | ||
+ | PFont Segment, Units; | ||
+ | |||
+ | boolean writeFlag=false; | ||
+ | PrintWriter logFile; | ||
+ | |||
+ | void setup() // Setup the display window | ||
+ | { | ||
+ | size(910, 380); // Size of the window | ||
+ | Segment = createFont("DSEG7Classic-BoldItalic.ttf", 112); // Assign fonts and size | ||
+ | Units = createFont("Arial", 40); | ||
+ | textFont(Segment); | ||
+ | textAlign(RIGHT); // Text align | ||
+ | fill(250, 250, 0); // Font color is yellow = red + green | ||
+ | |||
+ | logFile = createWriter("myData.txt"); | ||
+ | |||
+ | |||
+ | 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()[PORT_INDEX], BAUDS); | ||
+ | // don't generate a serialEvent() unless you get a newline character: | ||
+ | myPort.bufferUntil('\n'); | ||
+ | |||
+ | |||
+ | VoltageLabel = new GLabel(this, 0, 0, 130, 80); | ||
+ | VoltageLabel.setTextAlign(GAlign.CENTER, GAlign.MIDDLE); | ||
+ | VoltageLabel.setText("Output 3"); | ||
+ | VoltageLabel.setOpaque(false); | ||
+ | VoltageLabel.setFont(new Font("Arial", Font.PLAIN, 24)); | ||
+ | |||
+ | //============================================================= | ||
+ | // Slider with another custom skin | ||
+ | // constructor is `Parent applet', the x, y position and length | ||
+ | VoltageSlider = new GCustomSlider(this, 20, 350, 260, 80, "purple18px"); | ||
+ | // show opaque ticks value limits | ||
+ | VoltageSlider.setShowDecor(false, true, true, true); | ||
+ | VoltageSlider.setShowValue(true); | ||
+ | VoltageSlider.setNbrTicks(6); | ||
+ | VoltageSlider.setStickToTicks(false); | ||
+ | VoltageSlider.setEasing(10); | ||
+ | VoltageSlider.setLimits(0.0f, 0f, 100.0f); // init value, min, max | ||
+ | VoltageSlider.setNumberFormat(G4P.DECIMAL, 0); | ||
+ | VoltageSlider.setTextOrientation(G4P.ORIENT_RIGHT); | ||
+ | VoltageSlider.setRotation(-PI/2); | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | void draw() // Let's start to display | ||
+ | { | ||
+ | background(0, 0, 0); // set the background color black | ||
+ | |||
+ | textFont(Units); // nastav farbu a cislo kanala | ||
+ | fill(0, 250, 0); | ||
+ | text("T", 180, 150); | ||
+ | text("H", 210, 165); | ||
+ | fill(250, 0, 0); | ||
+ | text("T", 180, 350); | ||
+ | text("L", 210, 365); | ||
+ | |||
+ | textFont(Segment); // zobraznie samotnej veliciny | ||
+ | fill(20, 30, 20); // grey | ||
+ | text("8888888", 850, 150); | ||
+ | fill(0, 250, 0); | ||
+ | text((int)adcValue0, 850, 150); | ||
+ | fill(30, 20, 20); // grey | ||
+ | text("8888888", 850, 350); | ||
+ | fill(250, 0, 0); | ||
+ | text((int)adcValue1, 850, 350); | ||
+ | // musime nahradit v stringu des. ciarku bodkou | ||
+ | |||
+ | textFont(Units); // zobraz prislusne jednotky | ||
+ | fill(0, 250, 0); | ||
+ | text(Unit0, 895, 65); | ||
+ | fill(250, 0, 0); | ||
+ | text(Unit1, 895, 265); | ||
+ | |||
+ | |||
+ | // write data to text file | ||
+ | if (writeFlag) | ||
+ | { | ||
+ | logFile.println(adcValue0 + ";" + adcValue1); | ||
+ | writeFlag=false; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* Toto je kod, ktory sa vykona ak pride nieco po seriovej linke */ | ||
+ | |||
+ | void serialEvent(Serial port) { | ||
+ | |||
+ | String data=port.readStringUntil('\n'); // precitaj vsetko po koniec riadku | ||
+ | |||
+ | if(data!=null) { | ||
+ | String[] vals = split(trim(data),','); // rozdel data podla ciarky | ||
+ | |||
+ | if(vals.length==2){ | ||
+ | // adcValue0 = map(int(vals[0]), 0, 1023, 0, 5); // prevod 0-1023 na 0-5 Volt | ||
+ | // adcValue1 = map(int(vals[1]), 0, 1023, 0, 5); | ||
+ | adcValue0 = int(vals[0]); | ||
+ | adcValue1 = int(vals[1]); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | /* Tento kod sa zavola vzdy, ked niekto pohybe posuvnikom */ | ||
+ | public void handleSliderEvents(GValueControl slider, GEvent event) { | ||
+ | String dcValueS; | ||
+ | float dcValueF; | ||
+ | int dcValueN; | ||
+ | |||
+ | if (slider == VoltageSlider) // je to ten spravny posuvnik? | ||
+ | if (event == GEvent.VALUE_STEADY) // ak uz prestnes hybat posuvatkom | ||
+ | { | ||
+ | VoltageLabel.setText(VoltageSlider.getValueS() + " %"); | ||
+ | dcValueS = VoltageSlider.getValueS(); | ||
+ | dcValueS = dcValueS.replace(',', '.'); | ||
+ | dcValueF = float(dcValueS); | ||
+ | dcValueF = map(dcValueF, 0.0, 100.0, 0.0, 255.0); | ||
+ | dcValueN = int(dcValueF); | ||
+ | println(VoltageSlider.getValueS() + " " + dcValueN + " " + event); | ||
+ | myPort.write(dcValueN); // toto posle Arduinu po seriovej linke data | ||
+ | // myPort.write('\n'); | ||
+ | writeFlag=true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* Tento kod sa vyvola vzdy, ked niekto stlaci nejaky klaves */ | ||
+ | void keyPressed() | ||
+ | { | ||
+ | if ((key == ENTER)) | ||
+ | { | ||
+ | logFile.flush(); | ||
+ | logFile.close(); | ||
+ | } | ||
+ | } | ||
+ | </source></tab> | ||
+ | <tab name="Arduino"><syntaxhighlight lang=c style="background: Cornsilk"> | ||
+ | /* Program for communication with Processing: sends measured TH and TL and setd D3 pwm output */ | ||
+ | |||
+ | int freqIn = 2; // vstup meranej frekvencie je na PIN 2 | ||
+ | |||
+ | int incomingByte = 0; // premenna na data z Processingu | ||
+ | unsigned long duration; // premenna v ktorej mame nameranu dlzku impulzu | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | pinMode(3,OUTPUT); // pin 3 sluzi na pomocny vystup PWM | ||
+ | pinMode(freqIn, INPUT); // toto bude vstup meraneho signalu | ||
+ | Serial.begin(9600); // data posielame po seriovej linke 9600 bps | ||
+ | while (!Serial) | ||
+ | { | ||
+ | ; // wait for serial port to connect. Needed for native USB port only | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | duration = pulseIn(freqIn, HIGH, 2000000L); // zmeraj dlzku TH a cakaj max. 2 sekundy | ||
+ | Serial.print(duration); | ||
+ | Serial.print(","); | ||
+ | |||
+ | duration = pulseIn(freqIn, LOW, 2000000L); // zmeraj dlzku TL a cakaj max. 2 sekundy | ||
+ | Serial.println(duration); | ||
+ | |||
+ | delay(300); // data staci posielat 3x za sekundu | ||
+ | } | ||
+ | |||
+ | |||
+ | void serialEvent() // tato funkcia sa zavola ak z Processingu nieco pride | ||
+ | { | ||
+ | while (Serial.available()) | ||
+ | { | ||
+ | incomingByte = Serial.read(); // data precitame | ||
+ | analogWrite(3,incomingByte); // a posleme na PIN3 | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight></tab> | ||
+ | </tabs> | ||
+ | |||
+ | |||
+ | |||
+ | |||
Verzia zo dňa a času 18:24, 7. november 2020
Na dnešnom cvičení si ukážeme možnosti merania signálov, v ktorých je nositeľom informácie buď frekvencia, alebo strieda.
Software
Nižšie nájdete software, potrebný na meranie. Keďže meriame frekvenciu a nie napätie, museli sme predošlé programy trocha upraviť. Ako obvykle, treba najprv preložiť a nahrať program do Arduina, potom spustiť program v Processingu. Nezabudnite nastaviť správny sériový port!
Časť programu vľavo, s posuvníkom tentoraz slúži na generovanie šírkovo modulovaného frekvenčného signálu na pine 3. Môžete ho použiť na otestovanie svojho pracoviska, prepojte na Arduino Nano vstup na PIN 2 s frekvenčným výstupom na PIN 3.
Ako obvykle, software si môžete ľubovoľne upravovať. A tiež máte k dispozícii aj všetko potrebné v jednom .zip archíve:
import processing.serial.Serial; // kniznica pre seriovu komunikaciu s Arduinom
import g4p_controls.*; // graficka kniznica pre posuvnik
import java.awt.Font; // kniznica pre pracu s fontami
/* ***************************************************************** */
/* Tento riadok treba upravit podla toho, na ktorom porte je Arduino */
/* ***************************************************************** */
static final int PORT_INDEX = 1, BAUDS = 9600;
GCustomSlider VoltageSlider; // posuvnik pre napatie
GLabel VoltageLabel; // zobrazovanie hodnoty posuvnika
float adcValue0 = 0; // value received from Serial
float adcValue1 = 0; // value received from Serial
String Unit0="µs"; // jednotky pre prvy kanal
String Unit1="µs"; // jednotky pre druhy kanal
// String Unit="kΩ";
// String Unit="°C"; // can use Unicode chars directly
Serial myPort;
PFont Segment, Units;
boolean writeFlag=false;
PrintWriter logFile;
void setup() // Setup the display window
{
size(910, 380); // Size of the window
Segment = createFont("DSEG7Classic-BoldItalic.ttf", 112); // Assign fonts and size
Units = createFont("Arial", 40);
textFont(Segment);
textAlign(RIGHT); // Text align
fill(250, 250, 0); // Font color is yellow = red + green
logFile = createWriter("myData.txt");
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()[PORT_INDEX], BAUDS);
// don't generate a serialEvent() unless you get a newline character:
myPort.bufferUntil('\n');
VoltageLabel = new GLabel(this, 0, 0, 130, 80);
VoltageLabel.setTextAlign(GAlign.CENTER, GAlign.MIDDLE);
VoltageLabel.setText("Output 3");
VoltageLabel.setOpaque(false);
VoltageLabel.setFont(new Font("Arial", Font.PLAIN, 24));
//=============================================================
// Slider with another custom skin
// constructor is `Parent applet', the x, y position and length
VoltageSlider = new GCustomSlider(this, 20, 350, 260, 80, "purple18px");
// show opaque ticks value limits
VoltageSlider.setShowDecor(false, true, true, true);
VoltageSlider.setShowValue(true);
VoltageSlider.setNbrTicks(6);
VoltageSlider.setStickToTicks(false);
VoltageSlider.setEasing(10);
VoltageSlider.setLimits(0.0f, 0f, 100.0f); // init value, min, max
VoltageSlider.setNumberFormat(G4P.DECIMAL, 0);
VoltageSlider.setTextOrientation(G4P.ORIENT_RIGHT);
VoltageSlider.setRotation(-PI/2);
}
void draw() // Let's start to display
{
background(0, 0, 0); // set the background color black
textFont(Units); // nastav farbu a cislo kanala
fill(0, 250, 0);
text("T", 180, 150);
text("H", 210, 165);
fill(250, 0, 0);
text("T", 180, 350);
text("L", 210, 365);
textFont(Segment); // zobraznie samotnej veliciny
fill(20, 30, 20); // grey
text("8888888", 850, 150);
fill(0, 250, 0);
text((int)adcValue0, 850, 150);
fill(30, 20, 20); // grey
text("8888888", 850, 350);
fill(250, 0, 0);
text((int)adcValue1, 850, 350);
// musime nahradit v stringu des. ciarku bodkou
textFont(Units); // zobraz prislusne jednotky
fill(0, 250, 0);
text(Unit0, 895, 65);
fill(250, 0, 0);
text(Unit1, 895, 265);
// write data to text file
if (writeFlag)
{
logFile.println(adcValue0 + ";" + adcValue1);
writeFlag=false;
}
}
/* Toto je kod, ktory sa vykona ak pride nieco po seriovej linke */
void serialEvent(Serial port) {
String data=port.readStringUntil('\n'); // precitaj vsetko po koniec riadku
if(data!=null) {
String[] vals = split(trim(data),','); // rozdel data podla ciarky
if(vals.length==2){
// adcValue0 = map(int(vals[0]), 0, 1023, 0, 5); // prevod 0-1023 na 0-5 Volt
// adcValue1 = map(int(vals[1]), 0, 1023, 0, 5);
adcValue0 = int(vals[0]);
adcValue1 = int(vals[1]);
}
}
}
/* Tento kod sa zavola vzdy, ked niekto pohybe posuvnikom */
public void handleSliderEvents(GValueControl slider, GEvent event) {
String dcValueS;
float dcValueF;
int dcValueN;
if (slider == VoltageSlider) // je to ten spravny posuvnik?
if (event == GEvent.VALUE_STEADY) // ak uz prestnes hybat posuvatkom
{
VoltageLabel.setText(VoltageSlider.getValueS() + " %");
dcValueS = VoltageSlider.getValueS();
dcValueS = dcValueS.replace(',', '.');
dcValueF = float(dcValueS);
dcValueF = map(dcValueF, 0.0, 100.0, 0.0, 255.0);
dcValueN = int(dcValueF);
println(VoltageSlider.getValueS() + " " + dcValueN + " " + event);
myPort.write(dcValueN); // toto posle Arduinu po seriovej linke data
// myPort.write('\n');
writeFlag=true;
}
}
/* Tento kod sa vyvola vzdy, ked niekto stlaci nejaky klaves */
void keyPressed()
{
if ((key == ENTER))
{
logFile.flush();
logFile.close();
}
}
/* Program for communication with Processing: sends measured TH and TL and setd D3 pwm output */
int freqIn = 2; // vstup meranej frekvencie je na PIN 2
int incomingByte = 0; // premenna na data z Processingu
unsigned long duration; // premenna v ktorej mame nameranu dlzku impulzu
void setup()
{
pinMode(3,OUTPUT); // pin 3 sluzi na pomocny vystup PWM
pinMode(freqIn, INPUT); // toto bude vstup meraneho signalu
Serial.begin(9600); // data posielame po seriovej linke 9600 bps
while (!Serial)
{
; // wait for serial port to connect. Needed for native USB port only
}
}
void loop() {
duration = pulseIn(freqIn, HIGH, 2000000L); // zmeraj dlzku TH a cakaj max. 2 sekundy
Serial.print(duration);
Serial.print(",");
duration = pulseIn(freqIn, LOW, 2000000L); // zmeraj dlzku TL a cakaj max. 2 sekundy
Serial.println(duration);
delay(300); // data staci posielat 3x za sekundu
}
void serialEvent() // tato funkcia sa zavola ak z Processingu nieco pride
{
while (Serial.available())
{
incomingByte = Serial.read(); // data precitame
analogWrite(3,incomingByte); // a posleme na PIN3
}
}