Operácie

Inteligentný ultrazvukový skener: Rozdiel medzi revíziami

Zo stránky SensorWiki

DVPS (diskusia | príspevky)
Balogh (diskusia | príspevky)
Bez shrnutí editace
 
(28 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených)
Riadok 1: Riadok 1:
__NOTOC__
'''Balogh:'''
* popis senzorov je OK.
* výstup by mohol byť aj podrobnejšie pospísaný, uvital by som viac ako jedno jediné meranie a
  zobrazenie mohlo byť viac zautomatizované
* chýba opis postupu ako z nameraných dát získať graf
* celkovo: je z tejto dokumentácie niekto schopný pochopiť oba senzory a použiť ich vo svojom projekte?
{|
{|
|Autori:      || '''Maroš Kolibaš, Balázs Sebo a Ján Sapura'''  
|Autori:      || '''Maroš Kolibaš, Balázs Sebo a Ján Sapura'''  
Riadok 8: Riadok 18:


* Zrealizujte projekt na snímanie polohy a zobrazenie objektu v 3D grafe pomocou vhodne zvolených senzorov cez I2C komunikáciu pomocou arduino.
* Zrealizujte projekt na snímanie polohy a zobrazenie objektu v 3D grafe pomocou vhodne zvolených senzorov cez I2C komunikáciu pomocou arduino.
[http://www.example.com link title]




'''Literatúra:'''  
'''Literatúra:'''  
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
* [https://www.parallax.com/sites/default/files/downloads/28526-MMA7455-3-Axis-Accelerometer-Documentation-v1.1.pdf MMA7455]
* [https://www.robot-electronics.co.uk/htm/srf08tech.htmlCODE: https://www.arduino.cc/en/Tutorial/SFRRangerReader SRF08]
* [http://www.fgcvme.co.uk/MUSRF05%20Data%20Sheet.pdfhttp://coecsl.ece.illinois.edu/ge423/DevantechSRF08UltraSonicRanger.pdf SRF08]
* [http://www.robot-electronics.co.uk/i2c-tutorial I2C]
* [http://blogs.iad.zhdk.ch/embodied-interaction-basics-hs11/mma-7455-beschleunigungssensor/ o senzoroch]


__TOC__
__TOC__
Riadok 38: Riadok 50:
[[Súbor:MMA7455obr.jpg]]
[[Súbor:MMA7455obr.jpg]]


'''3D modul akcelerometra MMA7455'''
                      '''Obr. 1. 3D modul akcelerometra MMA7455'''
 
 
'''SRF08:'''
 
Komunikácia s ultrazvukovým diaľkovým ovládačom SRF08 je cez zbernicu I2C. Toto je k dispozícii na populárnych riadiacich jednotkách, ako napríklad OOPic. Predvolená odoslaná adresa SRF08 je 0xE0. Používateľ môže zmeniť na ktorúkoľvek z 16 adries E0, E2, E4, E6, E8, EA, EK, EE, F0, F2, F4, F6, F8, FA, FC alebo FE. Môže sa použiť 16 sonarov. Okrem vyššie uvedených adries budú všetky sonary na zbernici I2C odpovedať na adresu 0. 
Linky SCL a SDA by mali mať každý pull-up rezistor na + 5v niekde na I2C zbernici.. Oni sú SRF08 je vždy slave - nikdy master zbernica.
 
'''Kľúčové vlastnosti:'''
*Napätie: 5v
*Frekvencia: 40KHz
*Maximálny rozsah: 6 m
*Minimálny rozsah: 3 cm
*Pripojenie: zbernica I2C
*Rozmery: 43 mm x 20 mm  x 17 mm
 
[[Súbor:SRF08.jpg]]
 
            '''Obr. 2. SRF08 Ultra sonic range finder'''
 
 
'''I2C ZBERNICA: '''
 
Zariadenia na zbernici I2C sú buď typu majster alebo slave. Master je vždy zariadenie, ktoré riadi SCL. Slave zariadenia sú zariadenia, ktoré reagujú na master. Slave nie je schopný iniciovať prenos cez zbernicu I2C, to môže urobiť iba master. Na zbernici I2C môžu byť pripojených zvyčajne viac zariadení, avšak zvyčajne existuje len jeden master. V našom systéme bude hlavným kontrolórom náš počítač (arduino) a slave zariadenia budú naše moduly ako SRF08 alebo MMA7455. Slave zariadenia nikdy nezačnú prevod. Master aj slave dokážu prenášať dáta cez I2C zbernicu, ale tento prenos je vždy riadený hlavným operátorom.


== Popis riešenia ==
== Popis riešenia ==
Riadok 53: Riadok 88:


[[Súbor:MMA7455.jpg]]
[[Súbor:MMA7455.jpg]]
'''Snímaný objekt:'''
[[Súbor:snimok1.jpg]]




Riadok 58: Riadok 98:
=== Algoritmus a program ===
=== Algoritmus a program ===


Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.


Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
 
      
Connections:
     printf("Hello, World!\n");   
  MMA7455      Arduino
     return(0);   
  GND          GND
  VDD          5V
  I2C DATA*    SDA
  I2C CLK*       
*/
 
#include <Wire.h>                      //Include the Wire library
#include <MMA_7455.h>                  //Include the MMA_7455 library
 
MMA_7455 accel = MMA_7455();            // Make MMA7455 object
 
char xVal, yVal, zVal;                  // Return value variables
int reading = 0;
float distance, time_s;
 
#define SRF_ADDRESS_SDA 0x7F            // READ DIGITAL ADDRESS ONLY VALUE OF SRF 012      | HEX 0x7F
#define MMA_7455_ADDRESS 0x1D          //I2C Adsress for the sensor
#define MMA_7455_MODE_CONTROLL 0x16    //Call the sensors Mode Control
 
#define X_OUT 0x06 //Register for reading the X-Axis
#define Y_OUT 0x07 //Register for reading the Y-Axis
#define Z_OUT 0x08 //Register for reading the Z-Axis
 
/*
* Setup Arduino and connected devices.
*/
void setup() {
  Serial.begin(9600);          // Use the Serial Monitor window at 9600 baud
 
  // Set the g force sensitivity: 2=2g, 4=4g, 8-8g
  accel.initSensitivity(2);
 
  // Update the numbers with your own values from the MMA7455_CalibrateOffset sketch.
  accel.calibrateOffset(0, 0, 0);
}
 
/*
* Acan avaliable address of connected device to arduino.
*/
void scan_addresses(){
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
     // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
     if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
   
  delay(5000);          // wait 5 seconds for next scan
}
 
/*
* Read Values from Ultrasound RFS
* @remarks: Begin transmission on spcific address.
*/
void srf_read_echos(){
  //Serial.println("Raeding echos...");
    // step 1: instruct sensor to read echoes
  Wire.beginTransmission(SRF_ADDRESS_SDA); // transmit to device #29 (0x1D)
 
  Wire.write(0x00);      // sets register pointer to the command register (0x00)
  distance=Wire.write(0x51);      // command sensor to measure in "centimeters" (0x51)
  time_s=Wire.write(0x52);      // command sensor to measure in "ping microseconds" (0x51)
 
  Wire.endTransmission();      // stop transmitting
 
  // step 2: wait for readings to happen
  delay(70);                  // datasheet suggests at least 65 milliseconds
 
  // step 3: instruct sensor to return a particular echo reading
  Wire.beginTransmission(SRF_ADDRESS_SDA); // transmit to device #29
  Wire.write(0x02);      // sets register pointer to echo #1 register (0x02)
  Wire.endTransmission();      // stop transmitting
 
  // step 4: request reading from sensor
  Wire.requestFrom(SRF_ADDRESS_SDA, 2);    // request 2 bytes from slave device #29
 
  // step 5: receive reading from sensor
  if (2 <= Wire.available())
  { // if two bytes were received
     reading = Wire.read();  // receive high byte (overwrites previous reading)
    //Serial.println(reading);  // print the reading
    reading = reading << 8;    // shift high byte to be high 8 bits
    reading |= Wire.read(); // receive low byte as lower 8 bits
    //Serial.print(" ");
    //Serial.print(reading);  // print the reading
  } 
  //Wire.endTransmission();
  //delay(1000);                 // wait a bit since people have to read the output :)
}
 
/*
* Read Values from Acclerometer
  * @remarks: call included library for accelerometer. Open transmissiinon for reading3
*/
void read_acc_vals(){
    // Get the X, Y, anx Z axis values from the device
  xVal = accel.readAxis('x');  // Read X Axis
  yVal = accel.readAxis('y');  // Read Y Axis
  zVal = accel.readAxis('z');  // Read Z Axis
 
// Display the in the Serial Monitor window.
  Serial.print(" ");
  Serial.print(xVal, DEC);
  Serial.print(" ");
  Serial.print(yVal, DEC);
  Serial.print(" ");
  Serial.print(zVal, DEC);
  Serial.print(" ");
  Serial.print(reading);
  Serial.print("\n");
}
}
</source>


Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
/*
* run program in loop
*/
void loop() {
  read_acc_vals();
  delay(1000);
  srf_read_echos();
}


Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
</source>


[[Médiá:MojProgram.c|program.c]]
'''Odkaz na zdrojové programy:'''


[https://playground.arduino.cc/Main/MMA7455 Arduino-MMA7455]
[https://github.com/eklex/MMA_7455 MMA7455]
[https://github.com/mlda065/MMA7455-Arduino-Library/blob/master/MMA7455.ino MMA7455]


=== Výsledok ===
Výsledkom nasnímaného objektu je 3D graf, ktorý bol vykreslený v prostredí matlab


[[Súbor:graf.jpg]]


=== Overenie ===


Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,
odfotografujte ho.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.




[[Category:MEMS2018]] [[Category:AVR]]
[[Category:MEMS2018]] [[Category:AVR]]

Aktuálna revízia z 09:17, 29. máj 2018


Balogh: 
* popis senzorov je OK. 
* výstup by mohol byť aj podrobnejšie pospísaný, uvital by som viac ako jedno jediné meranie a 
  zobrazenie mohlo byť viac zautomatizované
* chýba opis postupu ako z nameraných dát získať graf
* celkovo: je z tejto dokumentácie niekto schopný pochopiť oba senzory a použiť ich vo svojom projekte?


Autori: Maroš Kolibaš, Balázs Sebo a Ján Sapura
Študijný odbor: Aplikovaná mechatronika a elektromobilita 1. Ing. (2018)

Zadanie

  • Zrealizujte projekt na snímanie polohy a zobrazenie objektu v 3D grafe pomocou vhodne zvolených senzorov cez I2C komunikáciu pomocou arduino.


Literatúra:

Analýza

Použité komponenty:

  • 3D modul akcelerometra MMA7455
  • Ultrazvuk na meranie vzdialensti SRF08
  • Arduino
  • I2C ZBERNICA

MMA7455:

je 3D akcelerometer, ktorý je nízkonapäťový mikro snímač s digitálnym výstupom pomocou ktorého vieme snímať akceleráciu v 3 osiach. Ponúka niekoľko výhodných integrovaných funkcií, analógový digitálny prevodník (ADC), digitálný dolnopriepustný filter a určovanie citlivosti v rozsahu ±2g, ±4g, or ±8g. Tento modul je vhodný takmer pre ktorýkoľvek mikroradič vďaka vnútro systémovému napäťovému regulátoru a I / O meničov úrovni napätia. Pracuje v širokom rozsahu napájacieho napätia od 2,5 VDC do 5,5 VDC a komunikuje prostredníctvom sériového periférneho rozhrania (SPI) alebo integrovaného obvodu (I2C) zbernice.

Kľúčové vlastnosti:

  • Požiadavky na napájanie: 2,5 - 5,5 VDC; 26 μA v pohotovostnom režime, 0,5 - 3 mA aktívny
  • Komunikácia: SPI alebo I2C
  • Rozmery: 12,7 x 15,2 x 11,7 mm
  • Prevádzková teplota: -40 až +85 ° C

                      Obr. 1. 3D modul akcelerometra MMA7455


SRF08:

Komunikácia s ultrazvukovým diaľkovým ovládačom SRF08 je cez zbernicu I2C. Toto je k dispozícii na populárnych riadiacich jednotkách, ako napríklad OOPic. Predvolená odoslaná adresa SRF08 je 0xE0. Používateľ môže zmeniť na ktorúkoľvek z 16 adries E0, E2, E4, E6, E8, EA, EK, EE, F0, F2, F4, F6, F8, FA, FC alebo FE. Môže sa použiť 16 sonarov. Okrem vyššie uvedených adries budú všetky sonary na zbernici I2C odpovedať na adresu 0. Linky SCL a SDA by mali mať každý pull-up rezistor na + 5v niekde na I2C zbernici.. Oni sú SRF08 je vždy slave - nikdy master zbernica.

Kľúčové vlastnosti:

  • Napätie: 5v
  • Frekvencia: 40KHz
  • Maximálny rozsah: 6 m
  • Minimálny rozsah: 3 cm
  • Pripojenie: zbernica I2C
  • Rozmery: 43 mm x 20 mm x 17 mm

           Obr. 2. SRF08 Ultra sonic range finder


I2C ZBERNICA:

Zariadenia na zbernici I2C sú buď typu majster alebo slave. Master je vždy zariadenie, ktoré riadi SCL. Slave zariadenia sú zariadenia, ktoré reagujú na master. Slave nie je schopný iniciovať prenos cez zbernicu I2C, to môže urobiť iba master. Na zbernici I2C môžu byť pripojených zvyčajne viac zariadení, avšak zvyčajne existuje len jeden master. V našom systéme bude hlavným kontrolórom náš počítač (arduino) a slave zariadenia budú naše moduly ako SRF08 alebo MMA7455. Slave zariadenia nikdy nezačnú prevod. Master aj slave dokážu prenášať dáta cez I2C zbernicu, ale tento prenos je vždy riadený hlavným operátorom.

Popis riešenia

Nižšie je uvedená schéme zapojenia pre konkrétne náš snímač SRF08 alebo tiež možné nastavenie pre snímač SRF02 pre Arduino. Jedinými dodatočnými obvodmi sú dva pull-up odpory 1,8 kOhm, ako môžete vidieť nižšie.

Zapojenie arduina s ultrazvukom:


Zapojenie arduina s akcelerometrom MMA7455:

Snímaný objekt:



Algoritmus a program

 Connections:
  MMA7455      Arduino
  GND          GND
  VDD          5V
  I2C DATA*    SDA
  I2C CLK*        
*/

#include <Wire.h>                       //Include the Wire library
#include <MMA_7455.h>                   //Include the MMA_7455 library

MMA_7455 accel = MMA_7455();            // Make MMA7455 object

char xVal, yVal, zVal;                  // Return value variables
int reading = 0;
float distance, time_s;

#define SRF_ADDRESS_SDA 0x7F            // READ DIGITAL ADDRESS ONLY VALUE OF SRF 012      | HEX 0x7F
#define MMA_7455_ADDRESS 0x1D           //I2C Adsress for the sensor
#define MMA_7455_MODE_CONTROLL 0x16     //Call the sensors Mode Control

#define X_OUT 0x06 //Register for reading the X-Axis
#define Y_OUT 0x07 //Register for reading the Y-Axis
#define Z_OUT 0x08 //Register for reading the Z-Axis

/*
 * Setup Arduino and connected devices.
 */
void setup() {
  Serial.begin(9600);           // Use the Serial Monitor window at 9600 baud
  
  // Set the g force sensitivity: 2=2g, 4=4g, 8-8g
  accel.initSensitivity(2);

  // Update the numbers with your own values from the MMA7455_CalibrateOffset sketch.
  accel.calibrateOffset(0, 0, 0);
}

/*
 * Acan avaliable address of connected device to arduino.
 */
void scan_addresses(){
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

/*
 * Read Values from Ultrasound RFS
 * @remarks: Begin transmission on spcific address.
 */
void srf_read_echos(){
  //Serial.println("Raeding echos...");
     // step 1: instruct sensor to read echoes
  Wire.beginTransmission(SRF_ADDRESS_SDA); // transmit to device #29 (0x1D)

  Wire.write(0x00);      // sets register pointer to the command register (0x00)
  distance=Wire.write(0x51);      // command sensor to measure in "centimeters" (0x51)
  time_s=Wire.write(0x52);      // command sensor to measure in "ping microseconds" (0x51)

  Wire.endTransmission();      // stop transmitting
  
  // step 2: wait for readings to happen
  delay(70);                   // datasheet suggests at least 65 milliseconds

  // step 3: instruct sensor to return a particular echo reading
  Wire.beginTransmission(SRF_ADDRESS_SDA); // transmit to device #29
  Wire.write(0x02);      // sets register pointer to echo #1 register (0x02)
  Wire.endTransmission();      // stop transmitting

  // step 4: request reading from sensor
  Wire.requestFrom(SRF_ADDRESS_SDA, 2);    // request 2 bytes from slave device #29

  // step 5: receive reading from sensor
  if (2 <= Wire.available())
  { // if two bytes were received
    reading = Wire.read();  // receive high byte (overwrites previous reading)
    //Serial.println(reading);   // print the reading
    reading = reading << 8;    // shift high byte to be high 8 bits
    reading |= Wire.read(); // receive low byte as lower 8 bits
    //Serial.print(" ");
    //Serial.print(reading);   // print the reading
  }  
 
  //Wire.endTransmission();
  //delay(1000);                  // wait a bit since people have to read the output :)
}

/*
 * Read Values from Acclerometer
 * @remarks: call included library for accelerometer. Open transmissiinon for reading3
 */
void read_acc_vals(){
    // Get the X, Y, anx Z axis values from the device
  xVal = accel.readAxis('x');   // Read X Axis
  yVal = accel.readAxis('y');   // Read Y Axis
  zVal = accel.readAxis('z');   // Read Z Axis
  
// Display the in the Serial Monitor window.
  Serial.print(" ");
  Serial.print(xVal, DEC);
  Serial.print(" ");
  Serial.print(yVal, DEC);
  Serial.print(" ");
  Serial.print(zVal, DEC);
  Serial.print(" ");
  Serial.print(reading);
  Serial.print("\n");
}

/*
 * run program in loop
 */
void loop() {
  read_acc_vals();
  delay(1000);
  srf_read_echos();
}

Odkaz na zdrojové programy:

Arduino-MMA7455 MMA7455 MMA7455

Výsledok

Výsledkom nasnímaného objektu je 3D graf, ktorý bol vykreslený v prostredí matlab