Operácie

Inteligentný ultrazvukový skener

Z SensorWiki

Verzia z 16:59, 22. máj 2018, ktorú vytvoril DVPS (diskusia | príspevky) (Zadanie)
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

MMA7455obr.jpg

                      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

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

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:

Ultrazvuk.jpg


Zapojenie arduina s akcelerometrom MMA7455:

MMA7455.jpg

Snímaný objekt:

Snimok1.jpg



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();
}

Základne zdroje použité na náš systém:

Arduino-MMA7455 MMA7455 MMA7455

Výsledok

Graf.jpg