RCK Ruđera Boškovića - mobilna / uslužna robotika

Druge sabirnice i periferija - I2C

Zadatak

Naučiti koristiti I2C sabirnicu.

Priprema

Za vježbu je potrebno:

Spajanje pločica

×
Koristit ćemo MRMS lidar 2 m, spojen putem I2C sabirnice.

Spojite SDA (žuto), SCL (bijelo), 3.3V (crveno) i GND (crno) pinove senzora s pinovima ESP32 pločice prema slici.

Program, biblioteke

      
#include <Wire.h>
#include "mrm-lid1.h"

...
Skinimo biblioteku s Githuba.

Kopirajmo ju u "C:\Users\[User name]\Documents\Arduino\libraries" direktorij.

Otvorimo "C:\Users\[User name]\Documents\Arduino\libraries\mrm-lid1\example\mrm-lid1\mrm-lid1.ino"

Na početku moramo prijaviti 2 zaglavlja:
  • "Wire.h" za ESP32 I2C biblioteku i
  • "mrm-lid1.h" za funkcije za lidar.

Program, objekt

#include <Wire.h>
#include "mrm-lid1.h"

VL53L0Xs lidars;

...
Deklariramo objekt "lidars", koji će u sebi držati sve lidare.

U našem slučaju će to biti jedan.

Program, setup()

#include <Wire.h>
#include "mrm-lid1.h"

VL53L0Xs lidars;

void setup()
{
  Wire.begin();
  Serial.begin(115200);
  delay(500);

  lidars.add(33, 0x30);
  lidars.begin();
  lidars.test();
}

...
Funkcija "setup()" se izvršava samo jednom.

"Wire.begin()" pokreće I2C.

Nakon toga slijedi pokretanje serijskoj sučelja, za ispis rezultata na monitor.

"lidars.add()" dodaje novi lidar u sistem. "33" je za jednu jedinicu nebitan parametar. Za više će biti pin za reset. "0x30" je I2C adresa lidara.

"lidars.begin()" pokreće lidare.

"lidars.test()" ulazi u beskonačnu petlju kojoj se ispisuje vrijednost mjerenja.

Program, loop()

#include <Wire.h>
#include "mrm-lid1.h"

VL53L0Xs lidars;

void setup()
{
  Wire.begin();
  Serial.begin(115200);
  delay(500);

  lidars.add(33, 0x30);
  lidars.add(25, 0x31);
  lidars.begin();
  lidars.test();
}

void loop(){}

...
"loop()" je prazna funkcija jer program nikad ne dođe do nje.

Program, error()

#include <Wire.h>
#include "mrm-lid1.h"

VL53L0Xs lidars;

void setup()
{
  Wire.begin();
  Serial.begin(115200);
  delay(500);

  lidars.add(33, 0x30);
  lidars.add(25, 0x31);
  lidars.begin();
  lidars.test();
}

void loop(){}

void error(String message){
  Serial.println(message);
  while(1);
}
"error()" je funkcija koja se poziva u slučaju greške.

Ispiše poruku greške.

Program, I2C naredbe

int VL53L0X_read_multi(uint8_t deviceAddress, uint8_t index, uint8_t *pdata, uint32_t count) {
  Wire.beginTransmission(deviceAddress);
  Wire.write(index);
  Wire.endTransmission();
  Wire.requestFrom(deviceAddress, (byte)count);
#ifdef I2C_DEBUG
  Serial.print("\tReading "); Serial.print(count); Serial.print(" from addr 0x"); Serial.print(index, HEX); Serial.print(": ");
#endif

  while (count--) {
    pdata[0] = Wire.read();
#ifdef I2C_DEBUG
    Serial.print("0x"); Serial.print(pdata[0], HEX); Serial.print(", ");
#endif
    pdata++;
  }
#ifdef I2C_DEBUG
  Serial.println();
#endif
  return VL53L0X_ERROR_NONE;
}
Želimo li naučiti kako bilioteka poziva I2C funkcije, pogledajmo datoteku "vl53l0x_i2c_comms.spp".

Namjena ove funkcije je upisati na sabirnicu jednu adresu (virtualni registri lidara) i nakon toga pročitati sa sabirnice niz bajtova koji se vrate.

Prve 3 funkcije rezultiraju pisanjem u ciljnu jedinicu:
  • Wire.beginTransmission() započinje prijenos,
  • Wire.write() šalje 1 bajt,
  • Wire.endTransmission je kraj poruke.
Sljedeće 2 čitaju sa sabirnice:
  • Wire.RequestFrom() traži od ciljne jedinice slanje danog broja bajtova,
  • Wire.read() čita bajt po bajt.

Primjedbe