ELSA Online: 9. Frekvenčný vstup: Rozdiel medzi revíziami
Zo stránky 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…“ |
Bez shrnutí editace |
||
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 z 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!
Ukážka okna programu pre Processing, namerané hodnoty.
Č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
}
}