Archive for Senzory

Merkurino a akcelerometr 6050 i2c

Někdy vás možná napadlo, že by bylo užitečné vědět reálný náklon vozítka nebo ovladače.

K tomu se hodí integrovaný akcelerometr s gyroskopem a jako bonus navíc je digitální teploměr.

Data získáte pouze dvěma datovými vodiči plus napájení zem a 3-5V.
Vcc – in4(+5V)
GND – in4(gnd)
SCL – inA5a(data)
SDA – in4(data)

merkurino a gyroskop 6050 i2c 4w

Kód programu s výstupem na seriovou linku a LCD displej 16×2 je zde:

//upravený program: Test MPU6050 a LCD 16x2
// zdroj: http://blog.filipeflop.com/sensores/tutorial-acelerometro-mpu6050-arduino.html

//připojení knihoven
 #include<Wire.h>
 #include <LiquidCrystal.h>
// zapojení lcd
 LiquidCrystal lcd(13, 12, 8, 7, 4, 2);

//definice I2C MPU6050
 const int MPU=0x68;
 //proměnné pro akcelerometr a gyroskop
 int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
 void setup()
 {
   Serial.begin(115200);
   //Inicializace LCD
   lcd.begin(16, 2);
   Wire.begin();
   Wire.beginTransmission(MPU);
   Wire.write(0x6B);

  //Inicializace MPU-6050
   Wire.write(0);
   Wire.endTransmission(true);

  //Informacoes iniciais do display
   lcd.setCursor(0,0);
   lcd.print();
   lcd.setCursor(0,1);
   lcd.print();
   delay(1000);
 }
 void loop()
 {
   Wire.beginTransmission(MPU);
   Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
   Wire.endTransmission(false);
   //odeslání požadavku do snímače
   Wire.requestFrom(MPU,14,true);
   //čtení hodnot 
   AcX=Wire.read()<<8|Wire.read(); //0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) 
   AcY=Wire.read()<<8|Wire.read(); //0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
   AcZ=Wire.read()<<8|Wire.read(); //0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
   Tmp=Wire.read()<<8|Wire.read(); //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
   GyX=Wire.read()<<8|Wire.read(); //0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
   GyY=Wire.read()<<8|Wire.read(); //0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
   GyZ=Wire.read()<<8|Wire.read(); //0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

  //zápis hodnoty X z acelerometru na serial a LCD
   Serial.print(); Serial.print(AcX);
   lcd.setCursor(0,0);
   //lcd.print("X=");
   lcd.print(AcX/10);
   lcd.print();

  //zápis hodnoty Y z acelerometru na serial a LCD
   Serial.print(); Serial.print(AcY);
   lcd.setCursor(6,0);
   //lcd.print("Y=");
   lcd.print(AcY/10);
   lcd.print();

  //zápis hodnoty Z z acelerometru na serial a LCD
   Serial.print(); Serial.print(AcZ);
   lcd.setCursor(11,0);
   //lcd.print("Z=");
   lcd.print(AcZ/10);
   lcd.print();

  //zápis teploty na serial a přepočet na Celsius
   Serial.print(); Serial.print(Tmp/340.00+36.53);

  //zápis hodnoty X z gyroskopu na serial a LCD
   Serial.print(); Serial.print(GyX);
   lcd.setCursor(0,1);
   //lcd.print("X=");
   lcd.print(GyX/10);
   lcd.print();

  //zápis hodnoty X z gyroskopu na serial a LCD 
   Serial.print(); Serial.print(GyY);
   lcd.setCursor(6,1);
   //lcd.print(" Y=");
   lcd.print(GyY/10);
   lcd.print();

  //zápis hodnoty X z gyroskopu na serial a LCD
   Serial.print(); Serial.println(GyZ);
   lcd.setCursor(10,1);
   //lcd.print("Z=");
   lcd.print(GyZ/10);
   lcd.print();

  //zápis teploty na LCD
  lcd.setCursor(14,1);
   //lcd.print(" T:");
   lcd.print(Tmp/340.00+36.53);
   lcd.print();

  //počkej 300ms
   delay(300);
 }

 

Merkurino a infračervené dálkové ovládání – 1. díl

Merkurino, IR přijímač, IR vysílač

Jak přijímat signál z dálkového infračerveného ovladače?
Pořiďte si sadu se senzorem a malým dálkovým ovladačem.

Potřebné díly:

  • Merkurino 01 s USB kabelem
  • přijímací modul (snímač) např. s TSOP31238 nebo s HX1838
  • kompatibilní dálkový ovladač
  • 3 kablíky(vodiče) s dutinkami na obou koncích F-F

Merkurino propojíme s infračerveným snímačem pomocí kablíků a dáme si pozor na správné zapojení.

Pro funkci potřebujeme pouze 1 datový pin a 2 napájecí.
Datový pin zapojíme na D3 a napájecí Vcc na libovolných +5V a Gnd na zem(gnd).

Dálkový ovladač může být libovolný, ale kompatibilní se snímačem. Laicky řečeno jsou obvyklé 2 frekvence: 36 a 38kHz. Je to sice „skoro“ stejné, ale přijímač si vybere jen tu svoji. Další krok je dekodování – někteří výrobci si utvořili svůj způsob kodování a použitá knihovna některé umí dešifrovat. Pusťte si monitor a vyzkoušejte různé ovladače, které máte k dispozici nebo najdete po okolí. Pokud se vám po opakovaném stisknutí tlačítka objeví stejný řetězec (hex číslo), máte vyhráno – můžete ho použít.

Příště si povíme o praktickém použití.

Pro funkci programu potřebujeme nahrát/nainstalovat knihovnu IRremote.h

Kódy tlačítek jsou vypisovány přes USB port do terminálu Arduina: Ctrl+Shift+m

Příklad programu:

/*	
 Knihovnu získáte zde: https://github.com/shirriff/Arduino-IRremote
 Rozbalte (Unzip) adresář do  Libraries. Adresář přejmenujte na  IRremote
*/
#include <IRremote.h>
int input_pin = 3; //set D3 as input signal pin
IRrecv irrecv(input_pin);
decode_results signals;
void setup()
{
	Serial.begin(9600);
	irrecv.enableIRIn(); // enable input from IR receiver
}
void loop() {
if (irrecv.decode(&signals)) {
		Serial.println(signals.value, HEX);
		irrecv.resume(); // get the next signal
	}
}

Merkurino a ultrazvukový dálkoměr HC-SC04

Jak měřit vzdálenost 3,5cm až 3,5metru?
Jednoduché a poměrně přesné a spolehlivé řešení je s ultrazvukovým dálkoměrem HC-SC04.

Potřebné díly:

    • Merkurino 01 s USB kabelem
    • ultrazvukový dálkoměr HC-SC04
    • kablíky(vodiče) s dutinkami na obou koncích F-F

Merkurino propojíme s modulem HC-SC04 pomocí kablíků a dáme si pozor na správné zapojení.

Pro funkci potřebujeme pouze 2 datové piny a 2 napájecí.
Echopin zapojíme na D9, Trigpin na D10 a napájecí Vcc na libovolných +5V a Gnd na zem(gnd).

Vzdálenost je vypisována přes USB port do terminalu Arduina: Ctrl+Shift+m

Mimo měřící rozsah je vypisována 0.

Příklad programu:

#define ECHOPIN 9        // Echo pin z HC-SC04 na pin 9
#define TRIGPIN 10        // Trig pin z HC-SC04 na pin 10

void setup()
{
//Nastaví sériovou komunikaci
Serial.begin(9600);
//Nastaví pin 2 jako vstupní
pinMode(ECHOPIN, INPUT);
//Nastaví pin 3 jako výstupní
pinMode(TRIGPIN, OUTPUT); 
}

void loop()
{
 // Vyšle impuls do modulu HC-SR04
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  
  // Spočítá vzdálenost
  float distance = pulseIn(ECHOPIN, HIGH);
  distance = distance*0.017315f;
  
  // odešle informace na sérivý port
  Serial.print(distance);
  Serial.print("cm\n");
  
  //počká 1 sekundu
  delay(1000);  
}

 

Elektronický termostat k lednici – thermoswitch

Nalezl jsem zajímavý popis tepelného spínače , ideálně jako ledničkový termostat, například, když se originál odebere do technického nebe.

Funkce: schmittův klopný obvod (s hysterezí), senzor LM35 jako proudový zdroj.

Navrhnul jsem plošný spoj pro přišroubování na merkur, velikost 4x5cm.

Po úpravě odporu R3 lze spínat při jiných teplotách, zde 1k8 je kolem 5 stupňů C .
Hysterezi nastavuje R5 – 47k.

Napájení: stejnosměrné +5 až 6V

Drobné úpravy:

  • plošný spoj pro přišroubování na merkur, velikost 4x5cm
  • na plošný spoj přidána možnost potenciometru
  • přidána ochranná dioda do napájení
  • přidány indikační diody – napájení a sepnuto

Původní stránky: http://danyk.cz/tstat.html

Schema zapojení: termostat-rele-lm35-sch

Plošný spoj: termostat-rele-lm35 .pdf

Osazovák:

termostat-rele-lm35-osaz

Eagle: termostat-lednice .7z , .brd a .sch

Tvarovač signálu

Jak připojit optozávoru (optokopler, optickou závoru, reflexní čidlo, …) k procesoru?

Pokud máme jednoduchou dvojici LED – fototranzistor, můžete použít toto jednoduché zapojení.
Není to přímo Schmittův klopný obvod s hysterezí, ale velmi dobře ošetří vstupy MCU.

Optické závory jsem popisoval zde: http://merkurrobot.cz/?p=1280

Jako bonus je na této desce ještě ošetření „dorazů“ motoru.
Funkce je následující – na konci (dorazu) pohybu motoru se umístí přepínač, který se rozepne a motor se zastaví. Když potřebujeme opačný pohyb, proud teče přes připojenou diodu.

Schema:



Schéma sledovače s korekcí signálu


Osazená deska:


Tvarovač 5

Tvarovač 5 - pohled ze zdola


Enkoder – světelná závora a reflex

Jak zjistit přesný počet otáček a pootočení?
No přece pomocí enkoderu.


Světelná závora


Je to docela prosté zařízení:
na hřídelku připevníme kolečko se soustřednými otvory. Těmi svítíme na fototranzistor. Když se kolečko bude otáčet, fototranzistor bude spínat a rozepínat obvod a my ho budeme vyhodnocovat. Můžeme samosebou použít i mechanický přerušovač, záleží na použití.

Možnost připojení přes tvarovač: http://merkurrobot.cz/?p=1350

Model postavený z merkuru a světelné infračervené závory:


Enkoder - sestava


Pokud chceme zjistit, jestli se hřídel nebo kolo otáčí, musíme použít enkodery 2.
Enkoderová kola připevníme „skoro“ stejně, jen budou malinko oproti sobě pootočena, aby dávala posunuté signály pro vyhodnocení podle následující tabulky:


Enkoder - vyhodnocení směru


Pokud si takový pokus chcete vyzkoušet třeba s arduinem, můžete pak použít tento program na sestavě arduino+LCD display.
Program není zrovna nejrychlejší, proto je vhodný jen pro pomalé otáčení.
Vysokorychlostní enkodery popíšeme zase příště.

//---------PROGRAM PRO OBSLUHU 2 ENKODERU------------------------------------
#include <LiquidCrystal.h>
#include <LCDKeypad.h>

int sensorValue0 = 0;  // promenna pro cteni analog. tlacitek
int sensorValue1 = 0;  // variable to store the value coming from the sensor
int sensorValue2 = 0;  // vstup enkoderu 2
int sensorValue3 = 0;  // vstup enkoderu 3
int sensorValue4 = 0;  // variable to store the value coming from the sensor
int sensorValue5 = 0;  // variable to store the value coming from the sensor
int enkoder2 = 0;  // 0=sviti, 1=nesviti
int enkoder3 = 0;  // 0=sviti, 1=nesviti
int stav = 0; // enc2 enc3 stav
              //  0    0    1
              //  0    1    2
              //  1    0    3 
              //  1    1    4
int stav_old = 0; // minuly stav: 1..4, 0=pocatecni inicializace
int smer = 0; // stav 1->3 = vpred
              // stav 3->1 = vzad
int pozice = 0;  //kde se zrovna vozik nachazi            

LCDKeypad lcd;

void setup()    //------------------------------------------------------
{
 // int i,k;

  
  lcd.clear();lcd.begin(16, 2);
  lcd.print("cti analogove");
  lcd.setCursor(0,1);
  lcd.print("   vstupy");
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print("0:   1:   c:");
  lcd.setCursor(0, 1);
  lcd.print("2:   3:   4:   ");
  
}

void loop() {   // ------------------------------------------
                // ------ hlavni smycka ---------------------
                // ------------------------------------------
       cti_vstupy();
       vpred_vzad();
//    zobraz_vstupy();
    zobraz_pozici();

}  // ------ konec hlavni smycka ---------------------
   // ------------------------------------------------

void cti_vstupy()   //------------------------------------------------------
{
  sensorValue0 = analogRead(0);    // read the value from the sensorPin 0..5
  sensorValue1 = analogRead(1);    // read the value from the sensorPin 0..5
  sensorValue2 = analogRead(2);    // read the value from the sensorPin 0..5
    if (sensorValue2 > 500) {enkoder2=0;} else {enkoder2=1;}
  sensorValue3 = analogRead(3);    // read the value from the sensorPin 0..5
    if (sensorValue3 > 500) {enkoder3=0;} else {enkoder3=1;}
      
}  // --- konec cti_vstupy --------------------------
void zobraz_vstupy()   //------------------------------------------------------
{
  lcd.setCursor(2, 1);  // enkoder 2
     if (enkoder2==0) {lcd.print("o");} else {lcd.print(" ");}
  lcd.setCursor(3, 1);  // enkoder 3
     if (enkoder3==0) {lcd.print("o");} else {lcd.print(" ");}
  lcd.print(" ");
}

void zobraz_pozici()   //------------------------------------------------------
{
  lcd.setCursor(12, 0);
  lcd.print(pozice);lcd.print(" ");
  lcd.setCursor(14, 1);
  lcd.print(stav);
}

void vpred_vzad()   //------------------------------------------------------
{
  // enc2 enc3 stav
  //  0    0    1
  //  0    1    2
  //  1    0    3 
  //  1    1    4
  // smer -  stav 1->3 = vzad
  //         stav 3->1 = vpred
  // pozice - kde se zrovna vozik nachazi  
     if ( enkoder2 == 0 && enkoder3 == 0 ) stav = 1; // 1
     if ( enkoder2 == 0 && enkoder3 == 1 ) stav = 2; // 2
     if ( enkoder2 == 1 && enkoder3 == 0 ) stav = 3; // 3
     if ( enkoder2 == 1 && enkoder3 == 1 ) stav = 4; // 4
     
     if (stav_old != stav )
     {   
            if (stav_old == 1 && stav == 3) {++pozice;lcd.setCursor(13, 1);lcd.print("+"); lcd.print(stav_old); }
            if (stav_old == 3 && stav == 1) {--pozice;lcd.setCursor(13, 1);lcd.print("-"); lcd.print(stav_old); }
     }
     //else {}
     
     stav_old = stav;

}  // --- konec vpred_vzad ----------------------------

Schema zapojení:


Schéma optozávory


Varianta A:

optozávora U má vyvedeny vývody IR LED a fototranzistoru pouze na piny.
Úpravu signálu a připojení na napájení je nutné udělat externě, aby mohl být zpracováván procesorem.

Varianta B:

optozávora je zapojena způsobem „společný emitor“. Výstup možno zapojit třípinově rovnou do MCU.

Varianta C:

optozávora je zapojena způsobem „společný kolektor“. Výstup možno zapojit třípinově rovnou do MCU. Rozdíl oproti variantě B je, že lze pomocí odporu R6 nastavit výstup přesněji.

Možnost připojení přes tvarovač: http://merkurrobot.cz/?p=1350

Variantu A a B je možno zakoupit např. zde – Stavebnice.com a Snailinstrument.cz