Operácie

ELSA Online: 9. Frekvenčný vstup

Z SensorWiki

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

SchemaNE555.png

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!

ELSA Screen09.png

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
  }
}





Datasheety