Egyszerű oszcilloszkóp



Nem rég találtam rá erre az oldalra: http://randomnerdtutorials.com/arduino-poor-mans-oscilloscope/

Ez egy nagyon alapverziós szkóp, de arduinoval működik ezért némi kísérletezést megér, biztos többen is tovább tudjátok majd fejleszteni. Maga a cikk Rui Santos által jött létre, az ő szellemi terméke.

Rui épített hozzá egy jeladó áramkört, de igazából ez egy elhanyagolható rész, ha valaki mégis szeretné összedugdosni az eredeti oldalról ezt lelesheti.

A szkóp működése nagyon egyszerű az arduino kódunk figyeli az A0-s bemenet változásait és ezt továbbítja a processing vizuális felületére.


Fontos! Az A0-s bemenet csak 0 és 5V közötti értékeket képes feldolgozni, tehát csak ilyen eszközök köthetők rá. Nem megengedett a negatív sem az 5V-nál nagyobb feszültség.
Az analóg-digitális konverter (ADC) 10bites, tehát az 5v-os értéktartományt 1024 részre tagolja.
Egy bitértékre 4.88 mV esik ez az ADC-nk pontossága, ennél kisebb változásokat csak előerősítő
áramkörön vagy nagyobb felbontású ADC-n keresztül mérhetünk.

Ide be illesztem az eredeti kódot, de ezt le is tölthetitek az adott oldalról.

A letöltés helye: https://gist.github.com/chrismeyersfsu/3270358#file-gistfile1-c

Arduino kód:

#define ANALOG_IN 0

void setup() {
Serial.begin(9600);
//Serial.begin(115200);
}

void loop() {
int val = analogRead(ANALOG_IN);
Serial.write( 0xff );
Serial.write( (val >> 8) & 0xff );
Serial.write( val & 0xff );
}

Processing kód helye: https://gist.github.com/chrismeyersfsu/3270419#file-gistfile1-c

a kód:

  /*
* Oscilloscope
* Gives a visual rendering of analog pin 0 in realtime.
*
* This project is part of Accrochages
* See http://accrochages.drone.ws
*
* (c) 2008 Sofian Audry (info@sofianaudry.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import processing.serial.*;

Serial port; // Create object from Serial class
int val; // Data received from the serial port
int[] values;
float zoom;

void setup()
{
size(1280, 480);
// Open the port that the board is connected to and use the same speed (9600 bps)
port = new Serial(this, Serial.list()[0], 9600);
values = new int[width];
zoom = 1.0f;
smooth();
}

int getY(int val) {
return (int)(height - val / 1023.0f * (height - 1));
}

int getValue() {
int value = -1;
while (port.available() >= 3) {
if (port.read() == 0xff) {
value = (port.read() << 8) | (port.read());
}
}
return value;
}

void pushValue(int value) {
for (int i=0; i<width-1; i++)
values[i] = values[i+1];
values[width-1] = value;
}

void drawLines() {
stroke(255);

int displayWidth = (int) (width / zoom);

int k = values.length - displayWidth;

int x0 = 0;
int y0 = getY(values[k]);
for (int i=1; i<displayWidth; i++) {
k++;
int x1 = (int) (i * (width-1) / (displayWidth-1));
int y1 = getY(values[k]);
line(x0, y0, x1, y1);
x0 = x1;
y0 = y1;
}
}

void drawGrid() {
stroke(255, 0, 0);
line(0, height/2, width, height/2);
}

void keyReleased() {
switch (key) {
case '+':
zoom *= 2.0f;
println(zoom);
if ( (int) (width / zoom) <= 1 )
zoom /= 2.0f;
break;
case '-':
zoom /= 2.0f;
if (zoom < 1.0f)
zoom *= 2.0f;
break;
}
}

void draw()
{
background(0);
drawGrid();
val = getValue();
if (val != -1) {
pushValue(val);
}
drawLines();
}

Persze ez az egész nem ér semmit ha nincs amin kipróbálhatjuk ezért kössünk be a az A0-s kimenetre egy 10kohmos poti középső lábát, az egyik szélső lábat az 5V-ra a másikat a GND-re.

Beüzemelve a processing szépen rajzolja a poti feszültség változásait. Ugyan így felhasználható bármelyik analóg szenzor értékeinek grafikus megjelenítésére is.


Nagyobb feszültségű jelmérésre feszültség osztókat használhatunk, de még egyszer maximum 5V
lehet a leosztott feszültség legmagasabb értéke.