Ansluta öppen loger och accelerometer
Jag skriver detta så jag kan komma ihåg hur man gör detta senare. Detta är ett hack som jag för några år sedan och bara drog ur garderoben för att använda igen.
BAKRUND
Det är vanligt att du vill spara data från en accelerometer med en enhet som är liten. Jag använder två brädor från Spark kul; Öppnar logg och MMA8452 Breakout (dvs accelerometer, som i din smartphone).
Styrelsens MMA8452 breakout är en låg kostnad 3-axlig accelerometer monterad på en liten tryckt kretskort. Rubriken innehåller meddelande stiften (I2C (tror jag)). Det finns exempel på hur du ansluter och använder detta med en arduino utveckling ombord.
IDÉN
Den öppna logg styrelser är i grunden en arduino med en microSD-kortplats kopplad. Arduinoen tar emot seriella data från TX/RX linjer och sparar det till microSD-kortet. Stiften tog fram huvudet är precis vad du behöver att koppla till en arduino mini - så avsedda användning är att använda detta för att läsa några utdata från en annan arduino krets.
SLADDAR
Så om du bara vill läsa och spara data accelerometer, klokt det att koppla den direkt till den data loggern. Du måste bara klura ut vilket stift gå där...
MMA8452: OpenLog(atmega328) motsvarande stift använder Arduino IDE
3.3V---Vcc huvudet
SDA---Pin 27 atmega 328---A4 (gula kabeln i foto)
SCL---stift 28 på atmega 328---A5 (vit tråd i foto)
GND---GND
Obs: arduino pinut diagram http://forum.arduino.cc/index.php?topic=132130.0
atmegaTQFP
Program öppna loggen med en 3.3V FTDI grundläggande. De flesta av stiften ansluta direkt från huvud till huvud--utom du behöver byta TX/RX raderna. Så OpenLogTXO går till FTDI_RXI.
Här är ledningarna
OpenLog FTDI Basic
BLK---BLK
GND---GND
VCC---3.3V
TXO---RXI (inte rakt över)
RXI---TXO (inte sundet över)
GND---GND
används inte---BLK
KOD - bibliotek som är nödvändiga
Du behöver biblioteket för accelerometern:
https://github.com/Sparkfun/MMA8452_Accelerometer/...
Sätta filen den biblioteken fil i sketchbook katalog. För att hitta skissbok, på arduino IDE, Välj Arkiv -> Inställningar och det är högst upp. Sedan stänger arduino IDE och öppnar igen.
(massor av info här:)
https://learn.Sparkfun.com/tutorials/mma8452q-acce...
KOD - skriver accelerometer utdata till SD-kort.
Det finns några mycket bra kod för användning med den öppna loggern, det låter dig ändra parametrar och göra nya filer, jag använder inte det just nu. Helt enkelt lagt till SD-kortet skrivning till exemplet grundläggande accelerometer. Detta har catch - det måste vara fil som heter datalog.txt på SD kortet. Det är den filen data kommer att gå till.
Koden ska kopplas.
Den heter: MMA8452_Plus_SDLogger
LÄNKAR:
https://github.com/Sparkfun/MMA8452_Accelerometer
https://github.com/Sparkfun/OpenLog
OBS:
koden verkar inte till att lägga upp... så här det är som text.
Accelerometer plus data logger kod / / /
ändrat av MPC Marc Cryan / / /
/ * MMA8452Q grundläggande exempel kod Nathan Seidle SparkFun elektronik 5 November 2012 licens: denna kod är allmän egendom men du köpa mig en öl om du använder detta och vi träffas en dag (Beerware licens). Denna exempelkod visar hur du läsa X/Y/Z accelerationer och grundläggande funktioner i MMA5842. Det lämnar ut alla snygga finesser denna IC kan (tap, orientering och inerrupts) och bara visar X/Y/Z. Se avancerade exempelkoden att se fler funktioner. Installation av maskinvara: MMA8452 Breakout---Arduino 3.3V---3.3V SDA---^ ^ (330) ^ ^---A4 SCL---^ ^ (330) ^ ^---A5 GND---GND The MMA8452 är 3.3V så vi rekommenderar att du använder 330 eller 1 k motstånd mellan en 5V Arduino och MMA8452 utbrytning. MMA8452 har inbyggd pull-up motstånd för I2C så du inte behöver ytterligare pull-ups. */
#include < Wire.h > / / används för I2C / / The SparkFun breakout styrelsen standardvärdet 1, ange 0 om SA0 jumper på undersidan av styrelsen är inställd
#define MMA8452_ADDRESS 0x1D / / 0x1D om SA0 är hög, 0x1C om låg / / definiera några av de journaler som vi kommer att komma åt på MMA8452
#define OUT_X_MSB 0x01
#define XYZ_DATA_CFG 0x0E
#define WHO_AM_I 0x0D
#define CTRL_REG1 0x2A
#define GSCALE 2 / / uppsättningar fullskaligt utbud till +/-2, 4 eller 8g. Brukade calc verkliga g values.///datalogger
#include < SD.h >
På Ethernet Shield är CS stift 4. Observera att även om det inte är / / begagnade som CS stift, hårdvara CS stift (10 på de flesta Arduino styrelser, / / 53 på Mega) måste lämnas som en utgång eller SD biblioteket / / funktioner kommer inte work.constint chipSelect = 10;
Annullerasetup)
{
Seriella.begin(57600);
Seriella.println ("MMA8452 grundläggande exempel");
Wire.BEGIN(); Gå med bussen som en mästare
initMMA8452(); Testa och initierades inte MMA8452
SDLogger
Seriella.print ("initiera SD-kortet...");
se till att den standard chip välja stiftet är inställd
utgång, även om du inte använder det:
pinMode (10, OUTPUT);
se om kortet är närvarande och kan initieras:
IF (!. SD.begin(chipSelect)) {
Seriella.println ("kort misslyckades, eller inte finns");
inte göra något mer:
hemkomst.
}
Seriella.println ("kort initierats.");
/////////////////////
}
Ogiltigloop)
{
int accelCount [3]. Innehåller 12-bitars signerat
readAccelData(accelCount); Läs x/y/z adc värdena
Nu ska vi beräkna accleration värdet till faktiska Gunnarssons
float accelG [3]. Lagrar värdet verkliga accel i Gunnarssons
för (int jag = 0; jag < 3; i ++)
{
accelG [i] = (float) accelCount [i] / ((1 << 12)/(2*GSCALE)); får faktiska g värde, detta beror på skalan sätts
}
Skriva ut värden
för (int jag = 0; jag < 3; i ++)
{
Seriella.print (accelG [i], 4); Skriva ut g-värden
Seriella.print("\t"); tabbar mellan axlarna
}
Seriella.println();
data till SD-kort
Öppna filen. Observera att endast en fil kan vara öppna samtidigt,
så du måste stänga detta en innan du öppnar en annan.
Fil dataFile = SD.open ("datalog.txt", FILE_WRITE);
om filen är tillgänglig, skriva till det:
om (dataFile) {
för (int jag = 0; jag < 3; i ++)
{
dataFile.print (accelG [i], 4); Skriva ut g-värden
dataFile.print("\t"); tabbar mellan axlarna
dataFile.close();
}
}
om filen inte är öppen, dyker upp ett felmeddelande:
annat {
Seriella.println ("fel öppna datalog.txt");
}
//////////////
Delay(10); Dröjsmål här för synlighet
}
void readAccelData(int *destination)
{
byte \Data [6]. x/y/z accel registrera data som lagras här
readRegisters (OUT_X_MSB, 6, \Data); Läs sex rådata registren till data array
Slinga för att beräkna 12-bitars ADC och g värde för varje område
för (int jag = 0; jag < 3; i ++)
{
int gCount = (\Data [jag * 2] << 8) | \Data [(i*2) + 1]; Kombinera två 8-bitars register till en 12-bitars tal
gCount >> = 4; Registren är Vänsterjustera, här vi rätt anpassa 12-bitars heltal
Om talet är negativt, vi måste göra det manuellt (ingen 12-bitars datatyp)
om (\Data [jag * 2] > 0x7F)
{
gCount = ~ gCount + 1;
gCount * = -1; Omvandla till negativ 2 komplettera #
}
destination [i] = gCount; Spela in denna gCount i arrayen 3 int
}
}
Initiera MMA8452 registren / / se de många program anteckningarna för mer info om att alla dessa register: / / http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8452Qvoid initMMA8452()
{
byte c = readRegister(WHO_AM_I); Läs WHO_AM_I register
om (c == 0x2A) / / WHO_AM_I bör alltid 0x2A
{
Seriella.println ("MMA8452Q är online...");
}
annat
{
Seriella.print ("kunde inte ansluta till MMA8452Q: 0 x");
Seriella.println (c, HEX).
While(1); Slinga för evigt om kommunikation inte sker
}
MMA8452Standby(); Måste vara i standby-läge att ändra register
Ställ in full skala till 2, 4 eller 8g.
byte fsr = GSCALE;
om (fsr > 8) fsr = 8. Lätt misstag kontroll
FSR >> = 2; Snyggt knep, se sidan 22. 00 = 2 G, 01 = 4A, 10 = 8 G
writeRegister (XYZ_DATA_CFG, fsr);
Standard datahastigheten är 800Hz och vi ändra inte den i detta exempelkod
MMA8452Active(); Anges som aktivt att börja läsa
}
Anger MMA8452 till standby-läge. Det måste vara i standby-läge att ändra de flesta register settingsvoid MMA8452Standby()
{
byte c = readRegister(CTRL_REG1);
writeRegister (CTRL_REG1, c & ~ (0x01)); Rensa den aktiva bit att gå in i vänteläge
}
Anger MMA8452 till aktivt läge. Måste vara i detta läge att mata datavoid MMA8452Active()
{
byte c = readRegister(CTRL_REG1);
writeRegister (CTRL_REG1, c | 0x01); Ange active bit att börja upptäcka
}
Läs bytesToRead sekventiellt, börjar på addressToRead till dest byte arrayvoid readRegisters (byte addressToRead, int bytesToRead, byte * dest)
{
Wire.beginTransmission(MMA8452_ADDRESS);
Wire.write(addressToRead);
Wire.endTransmission(false); endTransmission men hålla anslutningen aktiv
Wire.requestFrom (MMA8452_ADDRESS, bytesToRead); Be om byte, en gång gjort, buss är släppt som standard
While(Wire.available() < bytesToRead); Hänga ut tills vi får # byte vi förväntar oss
för (int x = 0; x < bytesToRead; x ++)
dest [x] = Wire.read();
}
Läsa en enda byte från addressToRead och lämna tillbaka det som en bytebyte readRegister (addressToRead byte)
{
Wire.beginTransmission(MMA8452_ADDRESS);
Wire.write(addressToRead);
Wire.endTransmission(false); endTransmission men hålla anslutningen aktiv
Wire.requestFrom (MMA8452_ADDRESS, 1); Be om 1 byte, en gång gjort, buss är släppt som standard
tag (!. Wire.available()); Vänta att komma tillbaka
returnWire.read(); Returnera denna en byte
}
Skriver en enda byte (bytesAttSkriva) i addressToWritevoid writeRegister (byte addressToWrite, byte bytesAttSkriva)
{
Wire.beginTransmission(MMA8452_ADDRESS);
Wire.write(addressToWrite);
Wire.write(dataToWrite);
Wire.endTransmission(); Stoppa överföring
}