ELSA Online: 9. Frekvenčný vstup: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
Riadok 3: | Riadok 3: | ||
'''Úlohy''' | '''Úlohy''' | ||
* Navrhnite si oscilátor s obvodom 555 pracujúci na | * Navrhnite si oscilátor s obvodom 555 pracujúci na ľubovoľnej, vami vybranej frekvencii v rozsahu 2 Hz až 20 kHz. | ||
* Navrhnite príslušné hodnoty rezistorov R1, R2 a kondenzátora C. Ostatné súčiastky použite podľa odporúčania výrobcu. | * Navrhnite príslušné hodnoty rezistorov R1, R2 a kondenzátora C. Ostatné súčiastky použite podľa odporúčania výrobcu. | ||
* Vypočítajte frekvenciu, TH a TL a plnenie. | * Vypočítajte frekvenciu, TH a TL a plnenie. |
Verzia z 14:16, 9. 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.
Úlohy
- Navrhnite si oscilátor s obvodom 555 pracujúci na ľubovoľnej, vami vybranej frekvencii v rozsahu 2 Hz až 20 kHz.
- Navrhnite príslušné hodnoty rezistorov R1, R2 a kondenzátora C. Ostatné súčiastky použite podľa odporúčania výrobcu.
- Vypočítajte frekvenciu, TH a TL a plnenie.
- Zmerajte hodnoty vášho obvodu a porovnajte.
- Zapojovací diagram s drôtikmi pošlem len na požiadanie. Pokúste sa najprv zapojiť obvod podľa schémy zapojenia.
Schéma zapojenia
Schéma zapojenia je na nasledovnom obrázku. Zapojovací diagram s drôtikmi pošlem len na požiadanie. Pokúste sa najprv zapojiť obvod podľa schémy zapojenia.
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
}
}