Működéséről egy cikk a hobbielektronikán:
2012.11.14.
19:52
Írta: harsanyireka
Szenzorok, érzékelők
"Az érzékelő vagy szenzor olyan elem, amely egy mérendő tulajdonságtól függő jelet szolgáltat. A mérendő tulajdonság és a jel egyaránt lehet fizikai, kémiai, biológiai stb. jellegű. Fontos, hogy a mérendő tulajdonság, és az érzékelő által szolgáltatott jel egymásnak kölcsönösen egyértelmű függvényei legyenek."
http://hu.wikipedia.org/wiki/%C3%89rz%C3%A9kel%C5%91
Amit érzékelhet: fény, mozgás, mágneses tér, távolság, gyorsulás, páratartalom, hőmérséklet, nyomás, érintés, stb. A fizikai, kémiai vagy biológiai változásokat elektromos jelekké alakítják.
Az alábbi lista nem teljes, inkább csak ízelítő:
Mozgás érzékelése
Mozgásérzékelő
Adott területen érzékeli a mozgást, áltlában infrávörös fénnyel működik. PIR-nek is hívják (passive infrared). Arduinohoz is kapható, 5-12V-on működik:
példa: http://www.ladyada.net/learn/sensors/pir.html
Mágneses kapcsoló
Ajtóra, ablakra stb szerelhető. Működése: http://www.hw2sw.com/2012/09/07/connecting-a-magnetic-reed-door-switch-into-arduino/
példa: http://m.instructables.com/id/simpleTweet01python/?ALLSTEPS
Digitális mágneses érzékelő modul
DFR0033 típus.
példa: http://www.dfrobot.com/wiki/index.php/Digital_magnetic_sensor_(SKU:_DFR0033)
(DIY elektromágneses mező érzékelése: http://hackaday.com/2010/12/31/arduino-emf-sensor/)
Digitális dőlés szenzor modul
példa: http://www.dfrobot.com/wiki/index.php?title=DFRobot_Tilt_Sensor_(SKU:DFR0028)
Giroszkóp
Tinkerkit 2 tengelyes T000060
Gyorsulásmérő
példa: http://www.robotshop.com/gorobotics/articles/microcontrollers/arduino-5-minute-tutorials-lesson-7-accelerometers-gyros-imus
példa Arduino MEGA-hoz: http://lex.iguw.tuwien.ac.at/toysrus/index.php/Accelerometer_Tinkerkit
Digitális rezgés érzékelő modul
Ebből is több fajta van, pl.
Az utóbbihoz manual itt: http://www.dfrobot.com/wiki/index.php?title=DFRobot_Digital_Vibration_Sensor_(SKU:DFR0027)
Érintés vagy megnyomás érzékelése
Nyomásérzékeny ellenállás
FSR = Force Sensitive resistor
példa: http://garagelab.com/profiles/blogs/tutorial-force-sensitive-resistor-and-arduino
DIY verzió: http://www.instructables.com/id/DIY-Force-Sensitive-Resistor-FSR/
Hajlás szenzor (flex, bend)
Példa: flex szenzor LEDsorral: http://arduinobasics.blogspot.hu/2011/05/arduino-uno-flex-sensor-and-leds.html
Nyúlás szenzor (stretch)
DIY verzió: http://www.instructables.com/id/Connecting-a-textile-analog-sensor-to-Arduino/?ALLSTEPS
Kapacitív érzékelő
Az arduino capacitive sensing library-jével akár egy alufólia darabbal is készíthetünk érintés szenzort:
http://www.arduino.cc/playground/Code/CapacitiveSensor
http://arduino.cc/playground/Main/CapacitiveSensor?from=Main.CapSense
Vagy egyéb hardwerekkel felerősíthetjük a jelet, pl. MPR121 (touch senor):
http://bildr.org/2011/05/mpr121_arduino/
Érintés érzékelő modul (touch)
Kapacitív érzékelő ez is.
Másodikhoz példa: http://www.dfrobot.com/wiki/index.php/DFRobot_Capacitive_Touch_Sensor_(SKU:DFR0030)
Piezoelektromos szenzor
Olyan anyagból készül amiben összenyomás hatására feszültség keletkezik. Burkolattal és anélkl is kapható.
Példa lejjebb - hang érzékelőknél.
Távolság érzékelése
Infrás távolságérzékelő
Sharp infravörös távolságérzékelő szenzor
"A robotikában használt egyik speciális szenzor a Sharp infravörös távolságérzékelő szenzor. Amint az alábbi képről is jól látható többféle szenzor is létezik, különböző méréstartománnyal. A szenzor az ún. háromszögeléses módszerrel működik. A szenzor egy keskeny infravörös fénnyalábot bocsát ki (az IR fény hullámhossza 850nm ± 70nm). A kibocsátott IR fény a tárgyakról visszaverődik. Az érzékelő egy optikával leképezi a visszavert fényt egy CCD-re. Attól függően hogy milyen messze van a céltárgy, más-más szögben érkezik vissza a visszavert fény, és ennek megfelelően más-más CCD pixelre fókuszálódik. Ebből már meghatározható a távolság. Van analóg és digitális kimenetű szenzor is. Az analóg szenzor egy, a távolsággal fordítottan arányos, nemlineáris, analóg kimeneti feszültségjelet ad."
http://www.hobbielektronika.hu/cikkek/will-i_v20_robotika_es_avr_kezdoknek.html?pg=6
Ultrahangos távolságérzékelő
Tutorial: http://arduino.cc/en/Tutorial/Ping?from=Tutorial.UltrasoundSensor
IR vevő modul
Kell hozzá egy infra kibocsátó egység is amit érzékelni tud, pl. Infra LED. Magában is kapható. Példa az oldal közepén: http://www.diyphonegadgets.com/2012/04/tutorial-how-to-control-ir-helicopter.html
Fény érzékelése
LDR, Fotóellenállás
A fotoellenállások fénytől függő ellenállások. A fényérzékeny rétegek kialakítására nagyon erős fényelektromos tulajdonságokkal bíró anyagokat (kadmium-szulfid CdS, ólomszulfid PbS stb.) használnak. Minél jobban megvilágítunk egy fotoellenállást, annál inkább csökken az ellenállása. A fotoellenállás meghatározott fényerősséghez tartozó ellenállásértéke azonos típusoknál is meghatározott tartományban szór, ez a tartomány az ún. szórási sáv. A fotoellenállás meghatározott fényhullámhossznál éri el a legnagyobb érzékenységet, ezt spektrális érzékenységnek nevezzük. Vannak olyan fotoellenállások amelyek kimondottan speciális hullámhosszra, azaz színekre érzékenyek.
Analóg pinbe kötve analogRead-del kiolvassuk az értékeket. Lehet esetleg kalibrálni is:
http://arduino.cc/en/Tutorial/Calibration
Modul formában is létezik:
Színszenzor modul
TCS3200, arduino kódja letölthető innen: http://www.dfrobot.com/index.php?route=product/product&product_id=540#.UKPlTeOe-0I
Hang érzékelése
Piezo elektromos szenzor (lásd feljebb)
Példa - érzékelőkét: kopogás érzékelése bejegyezés.
Másik példa- hangforrásként: http://www.adafruit.com/blog/2009/05/19/piezo-with-an-arduino-photoresistor/
Hang érzékelő modul
példa: http://www.emartee.com/product/42148/Mini%20Sound%20Sensor%20%20Arduino%20Compatible
Hőmérséklet érzékelése
Digitális hőmérő modul
Másodikhoz példa: http://www.emartee.com/product/41849/Arduino%20Temperature%20Sensor%20DS18B20
DS18B20
DS18B20
Hőmérséklet mérése LM35-tel:
http://www.danielandrade.net/2008/07/05/temperature-sensor-arduino/
Hőmérséklet és páratartalom szenzor
példa: http://garagelab.com/profiles/blogs/tutorial-humidity-and-temperature-sensor-with-arduino
Digitális hőmérséklet és páratartalom szenzor
példa: http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=&products_id=450
Analóg páratartalom szenzor
Hozzá az Arduino Library: http://code.google.com/p/arduino-humidity-sensor-library/
HUMIDITY SENSOR HIH4030
4-5.8V
arduino példa kód serial motorral: http://itp.nyu.edu/physcomp/sensors/Reports/ArduinoCode
Nyomásérzékelő
MPX4115A
példa: http://www.oz9aec.net/index.php/arduino/343-mpx4115a-pressure-sensor-with-arduino
Barometrikus nyomás érzékelő
BMP085 Breakout
példa: http://www.sparkfun.com/tutorials/253
példa: http://garagelab.com/profiles/blogs/tutorial-how-to-use-a-barometric-pressure-sensor-with-arduino
Szólj hozzá!
Címkék: szenzorok
2012.11.12.
20:23
Írta: harsanyireka
Tinkerkit 2 tengelyes giroszkóp
A digitális giroszkóp egy 3d-s gyorsulásérzékelő chip. A Föld mágneses pólusait (Észak, Dél) érzékeli és abból számolja az elmozdulást. Ebben a példában a dölés szöget és az mozdulat sebességét tudjuk kiolvasni serial monitoron.
A tinkerkit library-t is telepíteni kel hozzá, innen:
http://tinkerkit.com/en/Tutorials/Home
Hivatkozások:
TKGyro gyro(I0,I1,TK_4X);
gyro.getXAxis();
//x tengely értéke 0-1023gyro.getYAxis();
//y tengely értéke 0-1023gyro.getXAxisRate();
//x tengely fizikai helyzete: -6000°/s-tól 6000°/s-iggyro.getYAxisRate();
//y tengely fizikai helyzete: -6000°/s-tól 6000°/s-ig
TinkerKit Gyroscope 2 Axis sensitivity 1X
Bekötése:
x tengely A0
y tengely A1
+ pinek 5V-ba mindkettő
- pinek Gnd-be mindkettő
Arduino kód a hivatalos Manual-ból:
/* TinkerKit! Gyroscope [T000060-64]
*
* This sketch shows how to read this 2-axis gyroscope,
* turning in a given angular velocity and then converting it
* in the simplest way in an angular position (/inclination).
*
* Connect: the X-axis to the Analog Input Pin 0 (I0)
* the Y-axis to the Analog Input Pin 1 (I1)
* Optional: connect a servo to Analog Output Pin 9 (O2)
*
* created by Federico Vanzati / f.vanzati@arduino.cc
* in September 2011
*
* inspired from www.arduino.cc/playground/Main/Gyro
* by eric barch / ericbarch.com
*/
#include <Servo.h>
// Pin used in this example
#define SERVO 9
#define X_GYRO 0
#define Y_GYRO 1
#define ADCresolution 4.89f // = 5000mV/1023counts: Arduino analog pins resolution expressed in mV/count
#define Sensitivity 0.67f // [mV/dps] sensitivity of the sensor, took from datasheet (4x output mode)
// Conversion coefficient, we do here because is a constant! so we'll not do the calculation every loop
#define K ADCresolution/Sensitivity // the constant!
#define nrSamples 6 // Number of samples that we take for each measure
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
// Timing variables
unsigned long time, sampleTime = 12;
unsigned long printTime = 0, serialRefresh_time = 500;
float deltaT = (float)sampleTime*nrSamples/1000;
//Gyroscope variables
int roll_zeroVoltage, pitch_zeroVoltage;
int roll_rawADC[nrSamples], pitch_rawADC[nrSamples]; // store 3 values...just to avverage
float roll_rate, pitch_rate; //
float roll_angle = 0, pitch_angle = 0;
int c=0; // just a counter to count the samples
int pos; // variable to store the servo position
void setup()
{
delay(1000);
myservo.attach(SERVO); // attaches the servo on pin 9 to the servo object
myservo.write(pos);
Serial.begin(57600);
Serial.print("TinkerKit! Gyroscope [T000062] Test Example\n\n");
int correctionY=0, correctionX=0;
for (int i=0; i<50; i++)
{
correctionY += analogRead(Y_GYRO);
correctionX += analogRead(X_GYRO);
delay(20);
}
roll_zeroVoltage = correctionY/50;
pitch_zeroVoltage = correctionX/50;
Serial.print(roll_zeroVoltage);
Serial.print(" ");
Serial.println(pitch_zeroVoltage);
time = millis();
}
void loop()
{
// Every 40ms take a sample from gyro
if(millis() - time > sampleTime)
{
time = millis();
roll_rawADC[c] = analogRead(Y_GYRO);
pitch_rawADC[c] = analogRead(X_GYRO);
c++;
}
if(c==nrSamples) // Well, we have 3 samples
{
// Transform the raw data into an angular velocity
roll_rate = (filterGyro(roll_rawADC) - roll_zeroVoltage) * K;
pitch_rate = (filterGyro(pitch_rawADC) - pitch_zeroVoltage)*K;
// Integrate the angular veloity to obtain angular position (or inclination)
// Using the trapeziod method for numerical integration
// sampleTime*nrSamples
// The variable that take mind of the integration time is deltaT = --------------------
// 1000
// - we multiply for nrSamples because
// - divide for 1000 because angular velocity is expessed in seconds,
// but sampleTime is expressed in milliseconds
roll_angle += roll_rate*deltaT/2;
pitch_angle += pitch_rate*deltaT/2;
//Keep our angle between 0-359 degrees
if (roll_angle < 0)
roll_angle += 360;
else if (roll_angle > 359)
roll_angle -= 360;
if (pitch_angle < 0)
pitch_angle += 360;
else if (pitch_angle > 359)
pitch_angle -= 360;
// Now we control the servo: home position is setted in the center at 90 degrees
if(roll_angle >= 0 && roll_angle <= 90) // counterclockwise rotation of the gyro...
pos = 90 + (int)roll_angle; // ...produces rotation from 90 to 180 deg on servo
if(roll_angle >= 270) // clockwike rotation of the gyro...
pos = (int)roll_angle - 270; // ...produces rotation from 90 to 0 deg on servo
myservo.write(pos); // send the position to servo
if(millis() - printTime > serialRefresh_time)
{
printTime = millis();
Serial.print("Roll speed: "); Serial.print((int)roll_rate);
Serial.print("\t Angle: "); Serial.print((int)roll_angle);
Serial.print("\t Pitch speed: ");Serial.print((int)pitch_rate);
Serial.print("\t Angle: ");Serial.println((int)pitch_angle);
Serial.print("Servo: "); Serial.println(pos);
}
c=0; // reset the counter
}
}
int filterGyro(int buffer[])
{
int mean=0;
for(byte i=0; i<nrSamples; i++)
mean += buffer[i];
mean /= nrSamples;
return mean;
}
Egy példa, grafikus interfész processingben, ami a giró adatait mutatja: http://scuola.arduino.cc/en/content/realizziamo-uninterfaccia-grafica-modulo-giroscopio-tinkerkit
forrás
http://www.tinkerkit.com/bp/reference/, http://tinkerkit.com/en/Tutorials/Home, http://sensorwiki.org/doku.php/sensors/gyroscope
Szólj hozzá!
Címkék: szenzorok
2012.11.11.
19:40
Írta: harsanyireka
Sharp IR 2Y0A21 távolságérzékelő
10-80 cm között mér. Feszültség ellátás 4.5-5.5 V és áramfogyasztás 30mA.
Bekötése:
Datasheet: http://www.sharpsma.com/webfm_send/1489
balról jobbra: analóg 0, földelés, 5V
Adat kiolvasása Serial Monitorral:
int sensorpin = 0;
// az analóg 0-ba van kötve a sharp szenzor
int val = 0;
// változó ami a szenzor értékeit tárolja
// inicializáljuk 0-ként
void setup(){
Serial.begin(9600);
// serial monitor elindítása
}
void loop(){
val = analogRead(sensorpin);
// érték kiolvasása a szenzorból
Serial.println(val);
// érték kiírása serial monitorral
delay(500);
// fél mp vár mielőtt újra kiolvassa az értéket
}
Szólj hozzá!
Címkék: szenzorok
2012.11.08.
09:52
Írta: harsanyireka
Hivatkozások 10.: Változók, Adat típusok
void
A függvények deklarálásához használt kulcsszó. Saját függvényt írhatunk vele, amit csak meghívunk egy másik helyen a kódban.
http://arduino.cc/en/Reference/Void
boolean
Két értéke lehet: igaz vagy hamis. Minden boolean változó egy byte-ot foglal el a memóriában.
http://arduino.cc/en/Reference/BooleanVariables
char
Ez az adat típus egy byte memóriát foglal el, karakter érték tárolására alkalmas, tehát 1 karakter értékét tárolja. A betűket szimmpla idézőjelbe, a karakter stringeket dupla idézőjelbe írjuk: 'A' "ABC" Típusátalakításhoz használatos kulcsszó. Előjeles adat típus, ez azt jelenti hogy -128 és 127 közötti étékeket tárolhat.
A karaktereket számként tároljuk, a betűk decimális értéke visszakereshető az ASCII karakter szabványban: http://arduino.cc/en/Reference/ASCIIchart De pl. Serial.println parancs segítségével kiirattathatjuk a többi számrendsezrben is serail monitor segítségével, így megnézhetjük azok értékeit is.
char myChar = 'A';
char myChar = 65; //a két sor ugyanaz jelenti
http://arduino.cc/en/Reference/Char
unsigned char
Ugyanaz mint a byte. 0 és 255 közötti számokat lehet belekódolni. A következetesség kedvéért használd a byte-ot.
unsigned char myChar = 240;
http://arduino.cc/en/Reference/UnsignedChar
byte
8 biten (= 1 byte) tárol nem előjeles számokat, 0 és 255 között.
byte b = B10010; // "B" bináris formázó (B10010 = 18 tizes számrendszerben)
http://arduino.cc/en/Reference/Byte
int
Elsődleges adat típus számok tárolásához. Az Arduino Uno-n az integer 16 bit értéket tárol, -32 768 és 32 767 között. Az Arduino Due 32 biten működik, így 2 147 483 648 és 2 147 483 647 közötti értéket tárol. Aritmetikai operátorokkal a hagyományos módon működnek. Bitenkénti operátorokat is használhatunk velük, csak ilyenkor figyelni kell mert azok kettes számredszerben tolják alrétt a bitértékeket.
szintaxis:
int var = val; // integer változóneve = értékmegadás
példa:
int a = 5; // binary: 0000000000000101
int b = a << 14; // binary: 0100000000000000
http://arduino.cc/en/Reference/Int
unsigned int
Előjel nélküli egész számok tárolására alkalmas. Mivel ugyanúgy 2 byte-on működik mint az integer, nagyobb pozitív értéket tud tárolni: 0 és 65 535 között az ATMega alapú arduinoknál. Due típuson 4 byte-tel működik így 0 és 4 294 967 295 között használható.
szintaxis:
unsigned int var = val; // előjeles integer változóneve = értékmegadás
Ha a változó eléri az egyik szélső értéket, akkor átugrik a másik végére és ott folytatódik a számítás, tehát:
unsigned int x x = 0; x = x - 1; // x most65535 - negatív irányba ugrott érték x = x + 1; // x most 0 - pozitív irányba ugrott érték
http://arduino.cc/en/Reference/UnsignedInt
word
Ugyan az mint az unsigned int, tehát 16 biten tárol előjel nélkül számokat, 0-tól 65 535-ig.
példa:
word w = 10000;
http://arduino.cc/en/Reference/Word
long
32 biten tárol számértéket -2 147 483 648 és 2 147 483 647 között.
példa:
long speedOfLight = 186000L; // 'L' kifejezést az Integer Állandók-nál nézd meg
szintaxis:
long var = val;
http://arduino.cc/en/Reference/Long
unsigned long
Ugyanúgy 32 biten tárol számértéket mint a long, de nincs előjele, így 0-tól 4 294 967 295 (2^32 - 1) -ig terjedhet az értéke.
szintaxis:
unsigned long var = val;
http://arduino.cc/en/Reference/UnsignedLong
short
16 bites adat típus, ATMega és ARM alapú Arduinokhoz. Tárolt érték -32 768 és 32 767 között.
szintaxis:
short var = val;
http://arduino.cc/en/Reference/Short
float
Tizedes ponttal rendelkező számok. Lebegőpontos érték tárolására alkalmasak, 32 biten. (lásd. Állandók) Maximális értéke 3.4028235E+38 és minimális értéke -3.4028235E+38.
A float kifejezésben csak 6-7 tizedes számjegy van. Ez az összes számjegyre értendő, nem a tizedespont jobb oldalára.
A lebegőpontos számok nem precízek, furcsa eredményt adhatnak összehasonlításnál. Pl. 6.0 / 3.0 nem egyenlő 2.0-val, mert a számok abszolút értékének különbsége kevesebb lehet néhány kicsi számnál.
szintaxis:
float var = val;
http://arduino.cc/en/Reference/Float
double
Lebegőpontos számérték. Uno-n és ATMega alpú boardokon 4 byte-os, Due-n 8byte-os.
http://arduino.cc/en/Reference/Double
string - char array
Kétféleképpen ábrázolható, egyrészt használhatjuk mint a 0019 verzióba beépített String adat típust, másrészt létrehozhatunk stringet egy karakterlánc tömbbel. inf.: http://hu.wikipedia.org/wiki/String
Ezeket a következő példák szerint lehet deklarálni, mindegyik érvényes:
char Str1[15]; char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'}; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino";
http://arduino.cc/en/Reference/String
A karaktertömbök utolsó eleme a 0 (nulla), innen ismeri meg a fordítóprogram a sting végét.
String - object
Szöveg alapú stringeket manipulálhatunk a következő függvények által:
- String()
- charAt()
- compareTo()
- concat()
- endsWith()
- equals()
- equalsIgnoreCase()
- getBytes()
- indexOf()
- lastIndexOf()
- length()
- replace()
- setCharAt()
- startsWith()
- substring()
- toCharArray()
- toLowerCase()
- toUpperCase()
- trim()
http://arduino.cc/en/Reference/StringObject
Tömb. Adathalmazt tárolhatunk memóriában és műveleteket végezhetünk el rajtuk. A tömbök elemeire mindig az indexelés operátorával ([]) hivatkozunk (pl. x[3]).
szintaxisa:
típus tömbnév[elemszam];
Tömb deklarálása a következő módokon történhet:
int myInts[6]; int myPins[] = {2, 4, 8, 3, 6}; int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = "hello";
Érték hozzárendelése a tömb egy eleméhez:
mySensVals[0] = 10;
Érték kiolvasása a tömb egy eleméből:
x = mySensVals[4];
http://arduino.cc/en/Reference/Array