Meranie odporov
Zo stránky 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.
Ď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.
Ú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!
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();
}
}
void setup() {
Serial.begin(9600);
while (!Serial)
{
; // wait for serial port to connect. Needed for native USB port only
}
}
long int adcVal0 = 0;
long int adcVal1 = 0;
int incomingByte = 0;
void loop() {
adcVal0 = 0;
adcVal1 = 0;
for (int i=1;i<=64;i++)
{
adcVal0 += analogRead(0);
adcVal1 += analogRead(1);
}
adcVal0 = adcVal0>>6;
adcVal1 = adcVal1>>6;
Serial.print(adcVal0);
Serial.print(",");
Serial.println(adcVal1);
delay(300);
}
void serialEvent()
{
while (Serial.available())
{
incomingByte = Serial.read();
analogWrite(3,incomingByte);
analogWrite(11,incomingByte);
}
}