Anfängerfragen zu I2C / Digitale Steckplätze/ 9Dof Razor IMU

Hallo zusammen, ich habe einige Fragen. Bis jetzt habe ich hauptsächlich mit analogen Sensoren beschäftigt. Jetzt habe ich mir einen 9Dof Razir IMU gekauft. Mit einem FTDI bekomme ich den Sensor ans laufen. Mit einem Arduino Uno nicht. Kennt jemand eine gute Doku zu den Themen I2C und den 9Dof IMU Razor. Dann habe ich noch eine Frage. Mein Board hat ja nur einen TX und RX Steckplatz. Wie kann ich denn mehrere I2C Sensoren anschließen? Kann ich auch die anderen digitalen Steckplätze nutzen? es wäre nett wenn mir jemand einige Tipps geben könnte wie man auf i2C zugreift oder wo ich Infos finde.

Danke schon mal.

Hier ist ein Bild wie ich den Sensor angeschlossen habe. http://2.bp.blogspot.com/_9C3HteY9Xr4/TNW_bV35X7I/AAAAAAAAAQQ/bfhpnM-k64I/s320/Read9DOFRazorViaSeeeduinoMega.png Ich habe schon gegoogelt aber nichts gefunden.

Welche der beiden Versionen ?

9 Degrees of Freedom - Razor IMU - AHRS compatible https://www.sparkfun.com/products/9623 oder 9 Degrees of Freedom - Razor IMU https://www.sparkfun.com/products/10736

Beide Boards haben keinen Anschluss für I2C, dein Arduino kann also nur über RX und TX mit der IMU kommunizieren.

Arduino TX -> IMU RX Arduino RX -> IMU TX

Falls übersehen, das Board besitzt schon einen Atmega328.

Ist also eigentlich selber schon ein ganzer Arduino !

Hallo Megaionstorm, vielen Dank für Deine Antwort. Ich habe dieses Board http://www.geeetech.com/arduimu-9-degrees-of-freedom-p-535.html

@Beide Boards haben keinen Anschluss für I2C, dein Arduino kann also nur über RX und TX mit der IMU kommunizieren. Bedeutet das, dass ich nur einen Sensor anschließen kann? Ich habe das Board auch schon so angeschlossen. Siehe Bild unten. Das hat aber nicht funktioniert. Ich habe irgendwo gelesen das man CTS noch mit Reset verbinden soll.

@Falls übersehen, das Board besitzt schon einen Atmega328. Achtung Anfänger. Ja, habe ich gesehen. Wie hilft mir das weiter? Sicherlich habe ich gelesen das ich ein Bluetooth Mate oder XBee Explorer direkt anschließen kann. Mein Ziel ist es mehrere Sensoren an ein Arduino Bord anzuschließen.

Ich habe auch gelesen das man die Daten mit SPI über die digitalen Steckplätze 10-13 überragen kann. Sollte ich in dieser Richtung weiter suchen?

Oder noch ein Gedanke. Wenn ich das Bluetooth Mate nutze, kann ich mit einem Bluetooth Mate Empfänger (am Arduino Board) mehrere Sensoren gleichzeitig auslesen?

Du kannst mehrere IMU an einen Arduino anschließen. Du brauchst nur für jede eine eigene serielle Schnittstelle. Der Arduino Mega hat 4 Stück ansonsten SoftwareSerial Bibiothek.
Wieso Du mehrere IMU anschließen willst entzieht sich meinem Vorstellungsvermögen.

Grüße Uwe

Wenn Du die IMU alleine benutzt kannst DU eigentlich keine weiteren Sensoren anschliessen.

Wenn Du deine IMU jedoch in Verbindung mit einem weiteren Arduino benutzt kannst Du mit diesem natürlich auch I2C Sensoren benutzen und hast auch ISP.

Dann muss der Atmega auf der IMU allerdings so programmiert werden das er über TX die relevanten Sensordaten an den Arduino sendet !

ArduIMU 9 Degrees of Freedom Wiki

The outputs of all sensors are processed by an on-board ATmega328 and output over a serial interface.

http://www.geeetech.com/wiki/index.php/ArduIMU_9_Degrees_of_Freedom

Auf dem Bild ist IMU TX mit Arduino TX verbunden und IMU RX mit Arduino RX !

Das muss aber so sein: Arduino TX -> IMU RX Arduino RX -> IMU TX

Siehe auch hier: http://2.bp.blogspot.com/_9C3HteY9Xr4/TNW_bV35X7I/AAAAAAAAAQQ/bfhpnM-k64I/s1600/Read9DOFRazorViaSeeeduinoMega.png

the wiki page and the demo cods will guide you how to test and program it. You can use the Arduino IDE to program your code onto the 9DOF, just select the 'Arduino Pro ATmega328 as your board.

Das Ding hat schon ein Bootlaod und alles mit dabei ich würde sehen das man an dden I2C rankommt und dann kann man ja alles mit machen zusätzlich digital(PCF8574) und analogports(MAX 128, Max521).

Sonst koppeest du einen Arduino mit einem anderen Arduino :-)

Hallo zusammen. @Auf dem Bild ist IMU TX mit Arduino TX verbunden und IMU RX mit Arduino RX ! ja das ist mir auch aufgefallen und ich habe es bei mir korrigiert.

Ok da ich ja Anfänger ist bei mir folgendes angekommen.

Das Mega Board hat 4 Anschlüsse und ich kann 4 Sensoren anschließen. Wenn ich mehr anschließen will muss mir die SoftwareSerial Bibliothek ansehen. Ich gehe mal davon aus das ist eine h oder cpp Datei. Da das Mega 52 digitale Anschlüsse hat und ich 2 Anschlüsse pro Sensor benötigt sind das theoretisch 26 Sensoren. Nicht das ich das vor habe.

Was ich nicht so ganz verstanden habe ist. @Wenn Du deine IMU jedoch in Verbindung mit einem weiteren Arduino benutzt kannst Du mit diesem natürlich auch I2C Sensoren benutzen und hast auch ISP. Ich brauche also pro Sensor ein Arduino Board um es an ein ich nenne es mal Master Arduino Board anzuschließen.

Zu SPI habe ich noch folgendes Bild und Text gefunden.

To enable the SPI protocol edit the file SF9DOF_AHRS.ino and set the defined constant to 1.

define ENABLE_SPI 1

This disable the Serial communication.

Was mir bei meinem Uno noch aufgefallen ist. Wenn ich den Sensor angeschossen habe kann ich den Code nicht aufs Uno hochladen. Wenn ich die Sensor Kabel abklemme geht es. Ausgewähltes Board ist dann das Uno und der Serial Port stimmt auch.

Die serielle Schnittstelle kann nur einer benutzen. Programme werden auf den Arduino über die serielle Schnittstelle hochgeaden, das klappt jedoch nicht, wenn schon ein anderer Teilnehmer auf dieser Schnittstelle unterwegs ist.

Was ich nicht so ganz verstanden habe ist. @Wenn Du deine IMU jedoch in Verbindung mit einem weiteren Arduino benutzt kannst Du mit diesem natürlich auch I2C Sensoren benutzen und hast auch ISP. Ich brauche also pro Sensor ein Arduino Board um es an ein ich nenne es mal Master Arduino Board anzuschließen.

Nein. Jeweils 2 Pins eines Arduino-Boards kannst du als virtuelle serielle Schnittstelle verwenden und daran ein IMU-Board anschliessen. Du brauchst nicht ein Arduino pro Board.

Was man Dir aber auch versucht zu erklären ist, das Dein IMU-Board im Prinzip schon ein Arduino ist. Dort ist der gleiche Microcontroller verbaut wie auf dem Arduino selbst. Es fehlen nur die Anschlüsse nach draussen. Falls man also an die I2C-Anschlüsse des IMU-Boards heran kommen würde, könntest Du ohne Arduino I2C Sensoren direkt an das IMU-Board anschliessen. I2C ist ein Bussystem, bei dem mehrere Teilnehmer an der gleichen Leitung hängen können.

Hallo zusammen.

Was man Dir aber auch versucht zu erklären ist, das Dein IMU-Board im Prinzip schon ein Arduino ist. Dort ist der gleiche Microcontroller verbaut wie auf dem Arduino selbst. Es fehlen nur die Anschlüsse nach draussen. Falls man also an die I2C-Anschlüsse des IMU-Boards
heran kommen würde, könntest Du ohne Arduino I2C Sensoren direkt an das IMU-Board anschliessen. I2C ist ein Bussystem, bei dem mehrere Teilnehmer an der gleichen Leitung hängen können.

Das habe ich verstanden. Das ist glaube ich auch der unterschied zum 9Dof Sensor Stick.

Wie bekomme ich denn den Code auf den Sensor. Es macht ja keinen Sinn den Chip ohne Anschlüsse zu verbauen. Es sei denn der Code ist schon drauf.
Jetzt ahne ich etwas. Kann es sein das der Sparkfun FTDI Basic Breakout - 3.3V dazu geeignet ist? (Wie gesagt, ich bin absoluter Anfänger in dem Bereich)
Wenn ja, dann habe ich meinen Code schon auf den Sensor hochgeladen.
Was ich schon geschafft habe ist folgendes. Ich habe den Code “Razor AHRS 1.4.0” den man hier https://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs/files bekommt stark gekürzt.
Das sieht dann bei mir so aus wie unten zu sehen ist. Angeschlossen an einem Sparkfun FTDI Basic Breakout - 3.3V kann ich mir die Werte der der Sensoren im Serial Monitor ansehen.

float accel[3];
float magnetom[3];
float gyro[3];
const int OUTPUT__BAUD_RATE = 9600;
const int OUTPUT__DATA_INTERVAL = 20;
#include <Wire.h>


void setup(){
  Serial.begin(OUTPUT__BAUD_RATE);
}

void loop(){ 
 read_sensors();
 output_sensors();
  delay(20);
}


void read_sensors() {
   I2C_Init();
  Read_Gyro(); // Read gyroscope
  Read_Accel(); // Read accelerometer
  Read_Magn(); // Read magnetometer
}


void output_sensors()
{
  Serial.print("#ACC=");
  Serial.print(accel[0]); Serial.print(",");
  Serial.print(accel[1]); Serial.print(",");
  Serial.print(accel[2]); 
  

  Serial.print("#MAG=");
  Serial.print(magnetom[0]); Serial.print(",");
  Serial.print(magnetom[1]); Serial.print(",");
  Serial.print(magnetom[2]); 

  Serial.print("#GYR=");
  Serial.print(gyro[0]); Serial.print(",");
  Serial.print(gyro[1]); Serial.print(",");
  Serial.print(gyro[2]); Serial.println();
}

void I2C_Init()
{
  Wire.begin();
}


// Sensor I2C addresses
#define ACCEL_ADDRESS ((int) 0x53) // 0x53 = 0xA6 / 2
#define MAGN_ADDRESS  ((int) 0x1E) // 0x1E = 0x3C / 2
#define GYRO_ADDRESS  ((int) 0x68) // 0x68 = 0xD0 / 2

// Arduino backward compatibility macros
#if ARDUINO >= 100
  #define WIRE_SEND(b) Wire.write((byte) b) 
  #define WIRE_RECEIVE() Wire.read() 
#else
  #define WIRE_SEND(b) Wire.send(b)
  #define WIRE_RECEIVE() Wire.receive() 
#endif

void Read_Gyro()
{
  int i = 0;
  byte buff[6];
  
  Wire.beginTransmission(GYRO_ADDRESS); 
  WIRE_SEND(0x1D);  // Sends address to read from
  Wire.endTransmission();
  
  Wire.beginTransmission(GYRO_ADDRESS);
  Wire.requestFrom(GYRO_ADDRESS, 6);  // Request 6 bytes
  while(Wire.available())  // ((Wire.available())&&(i<6))
  { 
    buff[i] = WIRE_RECEIVE();  // Read one byte
    i++;
  }
  Wire.endTransmission();
  
  if (i == 6)  // All bytes received?
  {
    gyro[0] = -1 * ((((int) buff[2]) << 8) | buff[3]);    // X axis (internal sensor -y axis)
    gyro[1] = -1 * ((((int) buff[0]) << 8) | buff[1]);    // Y axis (internal sensor -x axis)
    gyro[2] = -1 * ((((int) buff[4]) << 8) | buff[5]);    // Z axis (internal sensor -z axis)
  }
  else
  {
   
  }
}



// Reads x, y and z accelerometer registers
void Read_Accel()
{
  int i = 0;
  byte buff[6];
  
  Wire.beginTransmission(ACCEL_ADDRESS); 
  WIRE_SEND(0x32);  // Send address to read from
  Wire.endTransmission();
  
  Wire.beginTransmission(ACCEL_ADDRESS);
  Wire.requestFrom(ACCEL_ADDRESS, 6);  // Request 6 bytes
  while(Wire.available())  // ((Wire.available())&&(i<6))
  { 
    buff[i] = WIRE_RECEIVE();  // Read one byte
    i++;
  }
  Wire.endTransmission();
  
  if (i == 6)  // All bytes received?
  {
    // No multiply by -1 for coordinate system transformation here, because of double negation:
    // We want the gravity vector, which is negated acceleration vector.
    accel[0] = (((int) buff[3]) << 8) | buff[2];  // X axis (internal sensor y axis)
    accel[1] = (((int) buff[1]) << 8) | buff[0];  // Y axis (internal sensor x axis)
    accel[2] = (((int) buff[5]) << 8) | buff[4];  // Z axis (internal sensor z axis)
  }
  else
  {
    //num_accel_errors++;
    //if (output_errors) Serial.println("!ERR: reading accelerometer");
  }
}


void Read_Magn()
{
  int i = 0;
  byte buff[6];
 
  Wire.beginTransmission(MAGN_ADDRESS); 
  WIRE_SEND(0x03);  // Send address to read from
  Wire.endTransmission();
  
  Wire.beginTransmission(MAGN_ADDRESS); 
  Wire.requestFrom(MAGN_ADDRESS, 6);  // Request 6 bytes
  while(Wire.available())  // ((Wire.available())&&(i<6))
  { 
    buff[i] = WIRE_RECEIVE();  // Read one byte
    i++;
  }
  Wire.endTransmission();
  
  if (i == 6)  // All bytes received?
  {
// 9DOF Razor IMU SEN-10125 using HMC5843 magnetometer

    // MSB byte first, then LSB; Y and Z reversed: X, Z, Y
    magnetom[0] = -1 * ((((int) buff[4]) << 8) | buff[5]);  // X axis (internal sensor -y axis)
    magnetom[1] = -1 * ((((int) buff[0]) << 8) | buff[1]);  // Y axis (internal sensor -x axis)
    magnetom[2] = -1 * ((((int) buff[2]) << 8) | buff[3]);  // Z axis (internal sensor -z axis)

  }
  else
  {
    //num_magn_errors++;
    //if (output_errors) Serial.println("!ERR: reading magnetometer");
  }
}

Hallo zusammen, ich habe gestern viel gelesen. Hier sind meine Erkenntnisse. Ich hoffe die stimmen so. Es wäre nett wenn ihr nochmal euren Senf dazugeben könntet.

Mit dem FTDI Basic Breakout spiele ich den Arduino Code auf das Sensor Arduino Board. Wenn ich die Daten des Sensor Arduino auf meinem Uno übertragen möchte habe ich mehrere Möglichkeiten.

Ich kann den Output Bereich (der bist jetzt ein Serial.Print ausgibt) so umschreiben das ich die Daten über RX und TX an das Uno Board übertragen kann. Das geht standardmäßig erst mal nur über RX und TX Anschlüsse auf dem Uno Board. Möchte ich das ändern muss ich eine Softwarelösung auf dem Uno programmieren.

Eine weitere Möglichkeit ist die Daten mit SPI zu übertragen. Auch dazu muss ich den Ouput Code anpassen. Dann kann ich auch andere Digitale Anschlüsse nutzen. Standardmäßig sind dazu die digitalen Steckplätze 11-13 auf dem Uno Board vorgesehen. Möchte ich das ändern muss ich eine Softwarelösung auf dem Uno programmieren.

Was noch etwas unklar ist, sind die RX und TX des Uno belegt wenn das Uno an den PC anschließe?

Jetzt stellt sich die Frage wie erlerne ich das am besten? Könnt Ihr mir eine Webseite, ein gutes Buch oder einfach nur nützliche Suchbegriffe nennen?

Grüße uino

Sobald der UNo mit dem Recner verbunden ist sind die Hardware RX TX belegt. Du kannst aber eine Softwareschnitstelle erzeugen mit Software Serial Library (schon in der IDE integriert). Da kannst du dann frei wählen welche Pins die Softwareseite Serial belegen soll so bleibt dir die HardwareSerial zum debuggen.

Ich würde es so machen: Auf dem DOOF so umschreiben das er dir die Werte einfach an die RX/TX die Daten ausgibt. z.B. jede Sekunde einmal Auf dem UNO eine Software Serial einrichten und den mit dem DOOF verbinden. Die Empfangenen Daten auf dem Uno an die Hardware Serial ausgeben und mit dem Serial Monitor schauen ob alles so ankommt wie es soll. Dann weist du nämlich das die Kommunikation funktioniert. Und dann kannst du weiterarbeiten und schauen was du mit den Daten machen willst.

Ein Vorschlag. Dann 2 von diesen hier http://www.ebay.de/itm/Bluetooth-Module-Slave-RF-Wireless-Serial-4p-Port-For-Arduino-2560-UNO-R3-A062-/251101892223?pt=Wissenschaftliche_Ger%C3%A4te&hash=item3a76d6ce7f und dann bist du das Kabel los zwischen den beiden Ardu´s

Gruß Daniel

Und ? Funktioniert jetzt alles ?