Inhoudsopgave:

Realtime MPU-6050/A0 datalogging met Arduino en Android - Ajarnpa
Realtime MPU-6050/A0 datalogging met Arduino en Android - Ajarnpa

Video: Realtime MPU-6050/A0 datalogging met Arduino en Android - Ajarnpa

Video: Realtime MPU-6050/A0 datalogging met Arduino en Android - Ajarnpa
Video: Live Streaming Accelerometer Data Using an ESP32 2024, November
Anonim
Realtime MPU-6050/A0 datalogging met Arduino en Android
Realtime MPU-6050/A0 datalogging met Arduino en Android

Ik was geïnteresseerd in het gebruik van de Arduino voor machine learning. Als eerste stap wil ik een realtime (of redelijk dichtbij) dataweergave en logger bouwen met een Android-apparaat. Ik wil versnellingsmetergegevens van de MPU-6050 vastleggen, dus ik heb de build ontworpen om de HC-05 te gebruiken met 115200 baud. Met deze configuratie kunnen 4 datakanalen worden verzonden met 250 samples per seconde.

De build heeft een paar stappen:

  • Bouw het schild of breadboard
  • Programmeer de Arduino
  • Laad de Android-app van Google Play of vertak de GitHub en compileer deze zelf
  • Sluit de MPU-6050 aan op iets interessants dat trilt (ik gebruikte een RC-auto)
  • Gebruik het Android-apparaat om verbinding te maken met de Arduino
  • Plot de gegevens, sla op als je geïnteresseerd bent
  • Importeren in Python (of ander platform) voor verder gebruik

Laten we beginnen!

Stap 1: Bouw het schild/broodbord

Bouw het schild/broodbord
Bouw het schild/broodbord
Bouw het schild/broodbord
Bouw het schild/broodbord

Dit is het bedradingsschema voor de Arduino, HC-05 en de MPU-6050. Naast de MPU-6050 heb ik de analoge ingang A0 aangesloten op een lichtsensor om te laten zien dat de ADC werkt. Elk 0-5 volt signaal kan in de A0 ADC worden gebracht. Dit zijn de componenten die ik heb gebruikt voor de build:

  • Arduino Uno
  • HC-05 (De HC-06 zou ook moeten werken, maar mijn build was met de HC-05)
  • MPU-6050
  • Sparkfun fotoweerstand
  • 10kOhm weerstand (bruin-zwart-oranje)

De meeste HC-05 Bluetooth-modules zijn standaard ingesteld op 9600 baud. Om de gegevens met succes te verzenden, moet u deze opnieuw programmeren voor een baudrate van 115200. Er is een goede HC-05/HC-06 AT Command Instructable die uitlegt hoe het moet.

Stap 2: Programmeer de Arduino

Programmeer de Arduino
Programmeer de Arduino
Programmeer de Arduino
Programmeer de Arduino

Ik heb de Arduino IDE versie 1.6.7 gebruikt om de Arduino te programmeren. De code kan worden gedownload via de links in deze stap of vanuit de GitHub-repo. Ik heb drie versies toegevoegd: Firmware125.ino is de 125 hertz-versie, Firmware250.ino is de 250 hertz-versie en Firmware500.ino is de 500 hertz-versie. Om de Arduino op 500 hertz te laten fietsen, wordt de A0 ADC niet verzameld.

De firmware bevat een klok uit op Pin 9 die ik heb gebruikt om de timing te controleren. De trace laat zien dat de cyclustijd 4 ms is (gelijk aan 1/250 hertz). Ik heb ontdekt dat als er problemen met de seriële verbinding zijn, de timing niet uniform is.

De Arduino-code gebruikt bitmaskering om een kanaalnummer aan elk pakket toe te voegen, omdat samples soms over Bluetooth vallen. Ik gebruik de drie meest significante bits om een kanaalnummer op te slaan. Voor gehele getallen met teken is de meest significante bit (MSB) gereserveerd voor het teken. Omdat ik de MSB voor mijn adres wil gebruiken in plaats van het teken van het gehele getal, moet ik alle getekende accelerometerwaarden converteren naar niet-ondertekende gehele getallen. Ik doe dit door 32768 aan elke waarde toe te voegen (de MPU-accelerometer ADC-tellingen zijn +32768 tot -32768) en cast als niet-ondertekende gehele getallen:

(unsigned int)((long)iAccelData+32767);

Het kanaalnummer is hetzelfde voor elke versnellingsmeter en de A0-poort, zodat een weggevallen pakket kan worden gedetecteerd als de kanaalnummers niet in orde zijn. Voor de pakketten die van de Bluetooth op de Arduino komen, is het binaire patroon (de tekens verschuiven bitsgewijs):

(xacc 3 adresbits = 0x00, 13bit unsigned) (yacc 3 adresbits = 0x01, 13bit unsigned) (zacc 3 adresbits = 0x02, 13bit unsigned) (3 adresbits = 0x03, iadc13bit unsigned)

(xacc 3 adresbits = 0x00, 13bit unsigned) (yacc 3 adresbits = 0x01, 13bit unsigned) (zacc 3 adresbits = 0x02, 13bit unsigned) (3 adresbits = 0x03, iadc13bit unsigned) (xacc 3 adresbits = 0x00, 13bit unsigned) (yacc 3 adresbits = 0x01, 13bit unsigned) (zacc 3 adresbits = 0x02, 13bit unsigned) (3 adresbits = 0x03, iadc13bit unsigned) …

Als u iets anders gebruikt dan de Accel Plot Android-app om de Bluetooth-gegevens te lezen, volgen hier de stappen om het adres te extraheren (ik gebruik de variabelenamen uit het Accel Plot Bluetooth.java-bestand uit de GitHub-repo):

- Lees de 16 niet-ondertekende int. in

- Extraheer de hoge byte en sla deze op in btHigh.

- Pak de lage byte uit en sla deze op in btLow.

- Haal het adres op van btHigh met: (btHigh >> 5) & 0x07. Deze instructie verschuift btHigh 5 bits naar rechts en verplaatst de drie adresbits naar de laagste drie registers. Het &-teken is een logische EN die ervoor zorgt dat bits 4 en hoger nul zijn en de laatste drie bits overeenkomen met de adresbits. Het resultaat van deze verklaring is uw adres.

U hoeft zich geen zorgen te maken over de adresextractie als u Accel Plot gebruikt.

Stap 3: Laad de Android-app van Google Play of vertak de GitHub

Laad de Android-app vanuit Google Play of vertak de GitHub
Laad de Android-app vanuit Google Play of vertak de GitHub

Je hebt een aantal keuzes om de Android-app op je apparaat te laden. Als u codering wilt vermijden, kunt u zoeken naar "Accel Plot" en de app zou in de Google Play Store moeten verschijnen. Volg de winkelinstructies voor installatie.

Mijn wens met deze Instructable is echt om anderen aan te moedigen projecten te bouwen, dus ik heb de code ook gepubliceerd in een GitHub-repo. Je zou dit naar eigen inzicht moeten kunnen vertakken, bouwen en aanpassen. Ik heb de code gepubliceerd onder de MIT-licentie, dus veel plezier!

Stap 4: Maak verbinding met de Arduino met iets interessants (ik gebruikte een R / C-auto)

Maak verbinding met de Arduino met iets interessants (ik gebruikte een R / C-auto)
Maak verbinding met de Arduino met iets interessants (ik gebruikte een R / C-auto)

Ik wil het apparaat uiteindelijk gebruiken voor wegdekdetectie, dus ik dacht dat een kleine op afstand bestuurbare (R/C) auto geschikt zou zijn. Ik denk dat het bij de volgende stap helpt als de versnellingen op iets kunnen staan dat beweegt of trilt.

Stap 5: Gebruik het Android-apparaat om verbinding te maken met de Arduino

Gebruik het Android-apparaat om verbinding te maken met de Arduino
Gebruik het Android-apparaat om verbinding te maken met de Arduino
Gebruik het Android-apparaat om verbinding te maken met de Arduino
Gebruik het Android-apparaat om verbinding te maken met de Arduino
Gebruik het Android-apparaat om verbinding te maken met de Arduino
Gebruik het Android-apparaat om verbinding te maken met de Arduino

Als je dit nog niet hebt gedaan, moet je de HC-05 eerst koppelen aan je Android-apparaat. Ik geloof dat je dit op de meeste apparaten kunt doen door naar instellingen te gaan. De standaardpin voor de meeste HC-05-apparaten is 1234 of 1111.

Open de AccelPlot-app op het Android-apparaat. Wanneer de app wordt geopend en voordat u verbinding maakt met de HC-05, kunt u de bemonsteringssnelheid (dit wordt ingesteld in de Arduino-code), de versnellingsmeterschalen (ook ingesteld in de Arduino-code) en het aantal monsters dat moet worden opgeslagen, wijzigen.

Zodra deze instellingen zijn gemaakt, klikt u op de knop "Verbinden". Het zou de Bluetooth-apparaten moeten oproepen en uw apparaat zou in de lijst moeten staan. Selecteer het en zodra de code de verbinding tot stand brengt, ziet u een "Verbonden" toast verschijnen.

Gebruik de pijl-terug-knop om terug te keren naar Accel Plot. Tik op de knop "Start Stream" om gegevens van het HC-05-apparaat weer te geven. Er moeten ook knoppen beschikbaar zijn om de gegevens op te slaan of de frequentiegemoduleerde inhoud af te spelen via de audio-aansluiting.

Stap 6: Verkrijg en plot de gegevens

Image
Image
Importeren in Python (of ander platform) voor verder gebruik
Importeren in Python (of ander platform) voor verder gebruik

De knop "Start Stream" moet zijn ingeschakeld. Tik erop om gegevens naar het scherm te streamen.

De knop "Gegevens opslaan" wordt ook ingeschakeld, tik erop om de gegevens op te slaan.

Accel Plot bevat ook een optie om een gemoduleerd signaal op de audiokanalen uit te voeren. De 2 kanalen in de Accel Plot-app verwijzen naar de linker- en rechterkanalen van de audio-uitgang op het Android-apparaat. Dit is handig als u de gegevens van de MPU-6050 in een apart dataloggingsysteem wilt opnemen, zoals een National Instruments.

De video toont een voorbeeld van het systeem dat gegevens verzamelt over een RC-auto.

Stap 7: Importeren in Python (of ander platform) voor verder gebruik

Importeren in Python (of ander platform) voor verder gebruik
Importeren in Python (of ander platform) voor verder gebruik

De bestanden worden opgeslagen op het Android-apparaat. De bestanden worden opgeslagen in de map "AccelPlot" voor Android API 18 en ouder. De code plaatst de.dat-bestanden in de map "\Tablet\Documents\AccelPlot" voor API 19 (KitKat 4.4) en hoger. Ik heb problemen gehad met sommige Android-apparaten die de bestanden weergeven wanneer ze via USB zijn aangesloten. In sommige gevallen moest ik het Android-apparaat opnieuw opstarten om ze te laten verschijnen. Ik weet niet zeker waarom dit zo is, maar er zouden vier bestanden moeten zijn, één voor elk kanaal. Ze kunnen worden gekopieerd naar een lokale map voor extra werk.

Ik heb Anaconda/Python 2.7 gebruikt om de bestanden te openen en de gegevens weer te geven. Het bestand "ExploratoryAnalysis.ipynb" heeft het IPython Notebook-bestand dat alle gegevensbestanden opent en de voorbeeldgegevens plot. Voorbeeldbestanden zijn opgenomen in de GitHub-opslagplaats. De gegevens worden opgeslagen als big-endian 4 byte floats ('>f'), dus elk analyseprogramma zou ze moeten kunnen openen.

Ik heb ook een eenvoudiger bestand met de naam "ReadDataFiles.ipynb" toegevoegd dat laat zien hoe een enkel bestand op naam kan worden gelezen.

Aanbevolen: