Inhoudsopgave:

Aan de slag met I2C-sensorinterface?? - Interface uw MMA8451 met ESP32's: 8 stappen
Aan de slag met I2C-sensorinterface?? - Interface uw MMA8451 met ESP32's: 8 stappen

Video: Aan de slag met I2C-sensorinterface?? - Interface uw MMA8451 met ESP32's: 8 stappen

Video: Aan de slag met I2C-sensorinterface?? - Interface uw MMA8451 met ESP32's: 8 stappen
Video: How to use ESP32 WiFi and Bluetooth with Arduino IDE full details with examples and code 2024, Juli-
Anonim
Aan de slag met I2C-sensorinterface?? - Interface uw MMA8451 met ESP32's
Aan de slag met I2C-sensorinterface?? - Interface uw MMA8451 met ESP32's

In deze tutorial leer je alles over hoe je I2C-apparaat (versnellingsmeter) start, aansluit en laat werken met controller (Arduino, ESP32, ESP8266, ESP12 NodeMCU)

Stap 1: Aan de slag met I2C - Magnificent World of Inter IC Communication

De Arduino, ESP-serie, PIC, Rasberry PI, etc. zijn allemaal ongelooflijk. Maar wat doe je ermee als je er eenmaal een hebt?

Het beste is om sensoren en dergelijke toe te voegen. Tegenwoordig gebruikt veel van de hete nieuwe technologie het I2C-protocol om de computer, telefoons, tablets of microcontrollers de sensoren te laten praten. Smartphones zouden minder slim zijn als ze niet met die accelerometersensor zouden kunnen praten om te weten naar welke kant je telefoon kijkt.

Stap 2: Overzicht op I2C

I2C is een serieel, synchroon, half-duplex communicatieprotocol dat het naast elkaar bestaan van meerdere masters en slaves op dezelfde bus mogelijk maakt. De I2C-bus bestaat uit twee lijnen: seriële datalijn (SDA) en seriële klok (SCL). Beide lijnen vereisen pull-up weerstanden.

SDA (Serial Data) – De lijn voor de master en slave om gegevens te verzenden en te ontvangen. SCL (Serial Clock) – De lijn die het kloksignaal draagt. Met voordelen als eenvoud en lage fabricagekosten, wordt I2C meestal gebruikt voor communicatie van langzame randapparatuur over korte afstanden (binnen één voet).

Meer weten over I2C ?……

Stap 3: I²C-sensoren configureren

Voordat je aan het project begint, moet je een paar basisprincipes van je sensor begrijpen. Dus schenk jezelf een kopje koffie in voordat je erin duikt:)? …

De grote kracht van I2C is dat je zoveel sensoren op dezelfde vier draden kunt zetten. Maar voor units waarop meerdere vooraf gemaakte modules zijn aangesloten, moet u mogelijk een paar smd-weerstanden uit de breakouts verwijderen, anders kan de pull-up op de bus te agressief worden.

Welke informatie willen we van Datasheet??

  1. Sensorfunctionaliteit
  2. Pin-outs en pinnen-functionaliteit
  3. Interfacebeschrijving (Mis niet om te kijken op "I2c Address Selection table")
  4. Inschrijven!!

Alles is in orde, je zult het gemakkelijk vinden, maar registreert?? REGISTERS zijn eenvoudig geheugenlocaties in een I²C-apparaat. De samenvatting van hoeveel registers er in een bepaalde sensor zijn en wat ze besturen of bevatten, wordt een registerkaart genoemd. De meeste informatie op het gegevensblad van de sensor gaat over het uitleggen hoe elk register werkt, en het kan een hele opgave zijn om door te lezen omdat de informatie zelden op een directe manier wordt gepresenteerd.

Om u een idee te geven van wat ik daarmee bedoel: er zijn veel soorten registers, maar voor deze inleiding ga ik ze in twee algemene typen groeperen: controle- en gegevensregisters.

1) Controleregisters

De meeste sensoren veranderen hun werking op basis van de waarden die zijn opgeslagen in controleregisters. Zie besturingsregisters als banken met aan/uit-schakelaars, die u inschakelt door een bit op 1 te zetten en uitschakelt door dat bit op 0 te zetten. I²C-chipgebaseerde sensoren hebben vaak een tiental of meer operationele instellingen voor zaken als bit- Modes, interrupts, lees-schrijfbesturing, diepte, bemonsteringssnelheid, ruisonderdrukking, enz., dus u moet meestal bits in verschillende besturingsregisters instellen voordat u daadwerkelijk een meting kunt uitvoeren.

2) Gegevensregisters In tegenstelling tot een controle die bank-of-switches registreert, beschouw ik gegevensuitvoerregisters als containers met nummers die toevallig in binaire vorm worden opgeslagen. Dus u wilt gegevens weten, lees altijd gegevensregisters zoals wie ben ik registreer voor apparaatidentificatie, statusregister enz.

Het initialiseren van een I²C-sensor is dus een proces dat uit meerdere stappen bestaat en de juiste volgorde van bewerkingen wordt vaak uitgelegd in omgekeerde richting, in plaats van eenvoudig in het gegevensblad. lijst die nooit zegt "Om een meting van deze sensor te krijgen, doe (1), (2), (3), (4), enz", maar je vindt beschrijvingen van de besturingsregisterbits die zeggen "voordat je bit x instelt in deze register moet u bit y in dit andere controleregister zetten”.

Toch vind ik altijd dat een datasheet interactiever is dan de meeste tekst. als u ernaar verwijst voor een specifiek stuk of stukjes informatie en het geeft u alle details, verbindingen en referenties. Ga gewoon zitten en lees om al uw referenties eruit te halen.:)

Stap 4: Begin met beweging - versnellingsmeter

Moderne versnellingsmeters zijn Micro Electro-Mechanical Systems (MEMS)-apparaten, wat betekent dat ze op een kleine chip in de kleinste gadgets passen. Een methode om de versnelling te meten die door MEMS-versnellingsmeters wordt gebruikt, is het gebruik van een kleine geleidende massa die op veren is opgehangen. De versnelling van het apparaat zorgt ervoor dat de veren uitrekken of samentrekken, en de doorbuiging van de geleidende massa kan worden gemeten door een verandering in capaciteit naar nabijgelegen, vaste platen.

Versnellingsmeters worden gespecificeerd door de volgende kenmerken:

  1. Het aantal assen, van één tot drie assen, aangeduid met X, Y en Z in de specificatiediagrammen. Merk op dat sommige versnellingsmeters 6-assen of 9-assen worden genoemd, maar dat betekent alleen dat ze zijn gebundeld met andere MEMS-apparaten zoals gyroscopen en/of magnetometers. Elk van die apparaten heeft ook drie assen, daarom zijn er 3, 6 of 9-assige Inertial Measurement Units (IMU's).
  2. Het type uitgang, analoog of digitaal. Een digitale versnellingsmeter zorgt voor het formatteren van de versnellingsgegevens in een digitale weergave die kan worden uitgelezen via I2C of SPI.
  3. Het versnellingsbereik gemeten in g's, waarbij 1g de versnelling is als gevolg van de zwaartekracht van de aarde.
  4. Coprocessors die een deel van de berekeningen kunnen uitvoeren die nodig zijn om de onbewerkte gegevens van de MCU te analyseren. De meeste versnellingsmeters hebben een eenvoudige onderbrekingsmogelijkheid om een versnellingsdrempel (schok) en een toestand van 0 g (vrije val) te detecteren. Anderen kunnen geavanceerde verwerking van de onbewerkte gegevens uitvoeren om meer betekenisvolle gegevens aan de MCU te bieden.

Stap 5: Interface met controller

Omdat we ESP-microcontrollers in de trend kennen, zullen we ESP32 als voorbeeld gebruiken. Dus eerst heb je een Nodemcu-32s nodig.

Geen zorgen als je nog andere ESP-borden of zelfs Arduino hebt!!! Je hoeft alleen maar je Arduino IDE en configuratie in te stellen volgens je ontwikkelborden, voor Arduino, ESP NodeMCU, ESP32's enz … Je hebt ook een soort I2C-onderdelen nodig, meestal op een breakout-bord. In deze tutorial ga ik MMA8451 gebruiken digitale Accelerometer breakout board.

En weinig jumper draden….

Stap 6: Aansluitingen

Verbindingen
Verbindingen

En hier is een lay-out.

Ik gebruikte de volgende verbinding van de bovenstaande module naar mijn Nodemcu-32s-module.

ESP32's -- Module

3v3 -- Vin

Gnd -- Gnd

SDA 21 -- SDA

SCL 22 -- SCL

"Vergeet niet dat meestal niet alle ontwikkelborden (meestal in ESP's) een goede duidelijke pin-out hebben om te helpen bepalen welke pinnen worden gebruikt !! Dus identificeer vóór het aansluiten de juiste pinnen van je bord om te gebruiken welke pinnen voor SDA en SCL zijn."

Stap 7: Coderen

Dit vereist de Adafruit-bibliotheek

van

Download, unzip en je vindt de map met voorbeelden, in de map open je gewoon MMA8451demo in je Arduino IDE en hier ga je ….

u ziet de volgende code voor uw MMA8451-sensorinterface met uw controller:

#erbij betrekken

#include #include Adafruit_MMA8451 mma = Adafruit_MMA8451(); void setup (void) { Serial.begin (9600); Draad.begin(4, 5); /* join i2c bus met SDA=D1 en SCL=D2 van NodeMCU */ Serial.println ("Adafruit MMA8451 test!"); if (! mma.begin()) { Serial.println("Kon niet starten"); terwijl (1); } Serial.println("MMA8451 gevonden!"); mma.setRange(MMA8451_RANGE_2_G); Serial.print("Bereik = "); Serial.print(2 << mma.getRange()); Serieel.println("G"); } void loop() { // Lees de 'onbewerkte' gegevens in 14-bits tellingen mma.read(); Serial.print("X:\t"); Seriële.afdruk(mma.x); Serial.print("\tY:\t"); Seriële.afdruk(mma.y); Serial.print("\tZ:\t"); Serial.print(mma.z); Serieel.println(); /* Een nieuwe sensorgebeurtenis ophalen */ sensors_event_t gebeurtenis; mma.getEvent(&event); /* Geef de resultaten weer (versnelling wordt gemeten in m/s^2) */ Serial.print("X: \t"); Serial.print(gebeurtenis.acceleration.x); Serieel.print("\t"); Serial.print("Y: \t"); Serial.print(gebeurtenis.acceleration.y); Serieel.print("\t"); Serial.print("Z: \t"); Serial.print(gebeurtenis.acceleration.z); Serieel.print("\t"); Serial.println("m/s^2 "); /* Haal de oriëntatie van de sensor op */ uint8_t o = mma.getOrientation(); switch (o) { case MMA8451_PL_PUF: Serial.println ("Portret vooraan"); pauze; case MMA8451_PL_PUB: Serial.println ("Portret omhoog achter"); pauze; zaak MMA8451_PL_PDF: Serial.println ("Portret aan de voorkant"); pauze; case MMA8451_PL_PDB: Serial.println ("Portret omlaag achter"); pauze; case MMA8451_PL_LRF: Serial.println ("Landschap Rechts Voor"); pauze; case MMA8451_PL_LRB: Serial.println ("Landschap Rechts Achter"); pauze; case MMA8451_PL_LLF: Serial.println ("Landschap linksvoor"); pauze; case MMA8451_PL_LLB: Serial.println ("Landschap linksachter"); pauze; } Serieel.println(); vertraging (1000); }

Opslaan, verifiëren en uploaden……

Open de seriële monitor en je ziet zoiets als dit, ik was de sensor aan het verplaatsen, vandaar de verschillende metingen

X: -2166 Y: 1872 Z: 2186

X: -2166 Y: 1872 Z: 2186X: -4,92 Y: 5,99 Z: 4,87 m/s^2

Liggend Links Voor

X: -224 Y: -2020 Z: 3188

X: -5,10 Y: -3,19 Z: 7,00 m/s^2

Portret vooraan

Als alles is gegaan zoals het zou moeten, dan heb je nu de basis van I2C en hoe je je apparaat kunt aansluiten..

Maar apparaat werkt niet??

Ga gewoon met de volgende stap……

Stap 8: Laat uw I2C-apparaat werken

Basisstappen om het I2C-apparaat te laten werken

Laten we onderzoeken….

  • Bedrading is correct..(controleer het opnieuw)
  • Programma is correct..(Ja, het is een testvoorbeeld..)

Begin met fasen om op te lossen…..

Fase 1: Voer het I2C-apparaatscannerprogramma uit om het apparaatadres te controleren en eerst is uw I2C-apparaat in orde

U kunt schets downloaden en uitvoer controleren.

Resultaat - Apparaat werkt en Sensoradres is juist

I2C-scanner. Scannen …

Gevonden adres: 28 (0x1C) Klaar. 1 apparaat(en) gevonden.

Stap 2: Controleer de sensorbibliotheek

Open het bestand Adafruit_MMA8451.h en zoek het apparaatadres

Resultaat - Adres wijkt af van mijn apparaat??

/*================================================ ========================= I2C-ADRES/BITS --------------------- -------------------------------------------------- */ #define MMA8451_DEFAULT_ADDRESS (0x1D) //!< Standaard MMA8451 I2C-adres, als A GND is, is het 0x1C /*====================== ================================================== */

Doen - Bestand bewerken vanuit Kladblok (adres wijzigen) + Opslaan + IDE opnieuw starten

Het werkt. U kunt uw metingen krijgen.

Toch niet…..???

Stap 3: Controleer of Wire.begin is overschreven?

Open het bestand Adafruit_MMA8451.c en zoek Wire.begin.

Resultaat - Deze verklaring is overschreven

/************************************************** *************************//*! @brief Stelt de HW in (lees coëfficiënten, etc.) */ /*********************************** ****************************************/ bool Adafruit_MMA8451::begin(uint8_t i2caddr) { Draad.begin(); _i2caddr = i2caddr;

Doen - Bewerk bestand vanuit Kladblok (commentaar) + Opslaan + Herstart IDE

En tot slot werkt het apparaat …

Ik overbelast deze tutorial bijna omdat het belangrijkste doel was om uit te leggen hoe te beginnen, gegevens uit de datasheet te halen, verbinding te maken en het I2C-apparaat te laten werken met een zeer eenvoudig voorbeeld. Ik hoop dat alles zal gaan zoals het hoort, en het zal nuttig zijn om uw Sensor te starten.

Aanbevolen: