Operácie

Meranie odporov

Z SensorWiki

Ak už máte doma všetky potrebné súčiastky a podarilo sa vám rozchodiť základný Merací systém s Arduino Nano, môžeme pokračovať meraniami odporov.

Súčiastky je vhodné si usporiadať do nejakej krabičky, alebo aspoň pooznačovať.


Ďalej je potrebné súčiastky, ktoré máte v balíčku nejako roztriediť a identifikovať. S väčšinou asi problém nebudete mať, ale odpory by bolo vhodné nejako premerať, aby ste mali istotu, že použijete potom ten správny.


Meranie 1: Určovanie odporov

Na meranie veľkosti odporu rezistorov použijeme jednoduchý odporový delič. V balíčku máte odpory 10 kΩ, ktoré viete jednoznačne určiť, pretože ich je 6ks. Preto známy odpor R1 v deliči bude tvorený práve týmto odporom. Druhý odpor bude postupne každý z tých ostatných. Náš merací systém Arduino vie merať len napätia, preto budeme merať napätie na hornom konci rezistora R1 (malo by byť stále rovnaké: +5,0 V) a napätie na deliči. Z rozdielu napätí na rezistore R1 vieme pri jeho známej hodnote vypočítať, aký prúd I cez delič preteká. Zo známosti prúdu a napätia na rezistore R2 vieme určiť jeho hodnotu. Takéto meranie nebude celkom presné, ale na určenie hodnoty rezistora, resp. jej potvrdenie (lebo pásikmi si viete určiť aký odpor by to asi mal byť) bude postačovať.


Meranie 2: Vnútorný odpor batérie

Na jednom z predošlých cvičaní sme počítali vnútorný odpor batérie. Tentoraz si ho vyskúšame odmerať. Pre tento účel máte medzi súčiastkami jeden rezistor s naozaj malou hodnotou odporu 2,6 Ω. Zmerajte napätie "tužkovej" batérie AA 1,5 V najprv naprázdno a potom pri zaťažení týmto rezistorom. POZOR: meranie s rezistorom treba spraviť rýchlo a dávajte si pri tom pozor na teplotu!!! Rezistor sa veľmi rýchlo zohreje a mohli by ste sa ľahko popáliť!!! Takisto je možné, že pri dlhšom zaťažení prekročíte maximálny dovolený stratový výkon 0,25W a odporová vrstva prehorí, takže meranie nebudete vedieť zopakovať.

Z rozdielov napätí naprázdno a pri známej záťaži 2,6 Ω vypočítajte vnútorný odpor batérie.

Na stránke https://www.battery.reviews/disposable/AA/500 alebo inde na internete nájdite údaj o vnútornom odpore a porovnajte s vlastným meraním.

MeranieELSA02 SchemaZapojenia.png

Úloha

Výsledky oboch meraní spracujte vo forme referátu a odovzdajte cez Google Classroom.


Software

Nižšie nájdete software, potrebný na meranie. Najprv treba preložiť a nahrať program do Arduina, potom spustiť program v Processingu. Nezabudnite nastaviť správny sériový port!

ELSA Screen02.png

Ukážka okna programu pre Processing, namerané hodnoty pre rezistor R2 s hodnotou 4k7

Časť programu vľavo, s posuvníkom na ovládanie výstupného napätia v tomto cvičení nebudeme používať. Aby ste dostali rovnaký vzhľad programu ako na obrázku vyššie, musíte si v adresári so zdrojákom vytvoriť priečinok data, do ktorého uložíte font a farebnú schému. Alebo si rovno stiahnite 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="V";                  // jednotky pre prvy kanal
String Unit1="V";                  // 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(580, 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");
  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(2.5f, 0f, 5.0f);  // init value, min, max
  VoltageSlider.setNumberFormat(G4P.DECIMAL, 2);
  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("A0:", 200, 150);
  fill(250, 0, 0); 
  text("A1:", 200, 350);

  textFont(Segment);      // zobraznie samotnej veliciny
  fill(20, 30, 20);       // grey
  text("8.88", 500, 150);
  fill(0, 250, 0);  
  text(nf(adcValue0,1,2).replace(',', '.'), 500, 150);
  fill(30, 20, 20);       // grey
  text("8.88", 500, 350);
  fill(250, 0, 0); 
  text(nf(adcValue1,1,2).replace(',', '.'), 500, 350);
                          // musime nahradit v stringu des. ciarku bodkou 
  
  textFont(Units);        // zobraz prislusne jednotky
  fill(0, 250, 0); 
  text(Unit0, 565, 65);
  fill(250, 0, 0); 
  text(Unit1, 565, 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);
    }
  }
}


/* 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() + " V");
       dcValueS = VoltageSlider.getValueS();
       dcValueS = dcValueS.replace(',', '.');
       dcValueF = float(dcValueS);
       dcValueF = map(dcValueF, 0.0, 5.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  A0 and A1 and setd D3 + D11 pwm outputs */

void setup() 
{
  TCCR2B = (TCCR2B & B11111000) | B001;  // setup Timer2 for higher frequency than usually
  
  Serial.begin(9600);                   // setup serial communication interface speed
  while (!Serial) 
  { 
    ; // wait for serial port to connect. Needed for native USB port only
  }

}



 long int adcVal0 = 0;     // ADC 0 value
 long int adcVal1 = 0;     // ADC 1 value
 int incomingByte = 0;     // value received from Processing, used for output

 
void loop() {

 adcVal0 = 0;              // clear ADC values
 adcVal1 = 0;
 for (int i=1;i<=64;i++)   // measure 64x and calculate mean value   
  { 
    adcVal0 += analogRead(0);
    adcVal1 += analogRead(1);
  }
  adcVal0 = adcVal0>>6;   // Shift right 6 bits is equivalent to division by 64
  adcVal1 = adcVal1>>6;   

  
Serial.print(adcVal0);    // Send the comma separated values to the PC
Serial.print(",");
Serial.println(adcVal1);

delay(300);  
 
}


void serialEvent()      // called on incoming data received
{
  while (Serial.available()) 
  {
    incomingByte = Serial.read();
    analogWrite( 3,incomingByte);  // set PWM output on pin 3
    analogWrite(11,incomingByte);  // set PWM output on pin 11
     
  }
}