Problem beim Stapeln von Beschleunigungsmessern und SD-Kartenabschirmungen auf Arduino UNO

Ich habe einen ADXL345-Beschleunigungsmesser auf einem Makershield, der auf einem Seeed-SD-Kartenschild gestapelt ist . Beide sind auf einem Arduino UNO R2 gestapelt.

Ich habe jeden einzeln arbeiten lassen, aber wenn sie gestapelt sind, teilen sie sich Pin 12. Der SD-Kartenschild verwendet 12 für MISO von SPI und der ADXL345 verwendet ihn für die SDO/Alt-Adresse.

Ich bin neu bei Arduino und habe noch nie solche Schilde gestapelt. Ich bin mir nicht sicher, was die beste Vorgehensweise ist, um beide zum Laufen zu bringen. Letztendlich möchte ich die Daten vom Beschleunigungsmesser auf der SD-Karte protokollieren, aber das Wichtigste zuerst!

Ich wäre für jede Hilfe dankbar. Die Datenblätter für den ADXL345 und das SD-Shield habe ich oben verlinkt.

Wenn Sie "auf einem Makershield" sagen, meinen Sie so etwas wie ein Prototyping-Board, an das Sie den ADXL gelötet haben?

Antworten (1)

Es sollte kein Problem sein. Der Chipselect des Beschleunigungsmessers ist Pin 10 und der des SD-Kartenschilds ist 7.

Das bedeutet, dass Sie jeweils ein Board verwenden können, solange Sie dessen Chipselect auf HIGH setzen, wenn Sie damit fertig sind.

Grundsätzlich sieht der übliche Code für den Zugriff auf den Beschleunigungsmesser so aus (von hier aus nur die relevanten Teile):

int CSa=10; //Chipselect for accelerometer
void writeRegister(char registerAddress, char value){
  //Set Chip Select pin low to signal the beginning of an SPI packet.
  digitalWrite(CSa, LOW);
  //Transfer the register address over SPI.
  SPI.transfer(registerAddress);
  //Transfer the desired register value over SPI.
  SPI.transfer(value);
  //Set the Chip Select pin high to signal the end of an SPI packet.
  digitalWrite(CSa, HIGH);
}

//This function will read a certain number of registers starting from a specified address and store their values in a buffer.
//Parameters:
//  char registerAddress - The register addresse to start the read sequence from.
//  int numBytes - The number of registers that should be read.
//  char * values - A pointer to a buffer where the results of the operation should be stored.
void readRegister(char registerAddress, int numBytes, char * values){
  //Since we're performing a read operation, the most significant bit of the register address should be set.
  char address = 0x80 | registerAddress;
  //If we're doing a multi-byte read, bit 6 needs to be set as well.
  if(numBytes > 1)address = address | 0x40;

  //Set the Chip select pin low to start an SPI packet.
  digitalWrite(CSa, LOW);
  //Transfer the starting register address that needs to be read.
  SPI.transfer(address);
  //Continue to read registers until we've read the number specified, storing the results to the input buffer.
  for(int  SPI.transfer(0x00);
  }
  //Set the Chips Select pin high to end the SPI packet.
  digitalWrite(CSa, HIGH);
}

Beachten Sie, dass der CSa-Pin vor dem Lesen/Schreiben auf LOW gesetzt wird und auf HIGH gesetzt wird, sobald Sie damit fertig sind.

Stellen Sie sicher, dass Sie dasselbe für die Chipauswahl für das SD-Kartenschild tun – lassen Sie die Chipauswahl auf HIGH, wenn sie nicht verwendet wird, und auf LOW nur ​​für die Zeit, in der Sie mit ihr kommunizieren möchten.