-         
Ergebnis 1 bis 10 von 16

Thema: Wie kann ich mit i2c-Sensoren für Nibo2 kommunizieren?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2020
    Ort
    Harz
    Alter
    71
    Beiträge
    8

    Wie kann ich mit i2c-Sensoren für Nibo2 kommunizieren?

    Hallo zusammen,

    ich bin hier neu im Forum, weil ich dringend eure Hilfe benötige!!!

    Ich besitze einen Nibo2-Roboter (ja, den gibt es immer noch!) und habe schon recht viel mit ihm angestellt und durch ihn gelernt.
    Jetzt wage ich den nächsten Schritt:
    Ich kaufte mir einen GY-271 DA5883 Kompassmodul - 3-Achse Magnetometer Sensor und baute diesen in meinen Nibo2 ein.
    So weit, so gut. Doch es gelingt mir beim besten Willen nicht, mit diesem über das i2c-Protokoll zu kommunizieren.
    Mir stehen aus der Nibo2-Bibliothek die folgenden Befehle zur Verfügung:

    i2cmaster.h-Dateireferenz

    Routinen zur Kommunikation ueber den I2C Bus.
    #include <stdint.h>

    Makrodefinitionen
    #define I2C_TX(ADDR) ((ADDR)<<1)

    #define I2C_RX(ADDR) (((ADDR)<<1)+1)

    Aufzählungen
    enum { I2C_BUSY, I2C_IDLE, I2C_SUCCESS, I2C_ERROR =0x10 }

    Funktionen
    void i2c_init (void)

    uint8_t i2c_start_transmission (void)

    uint8_t i2c_status (void)

    uint8_t i2c_wait_transmission (void)

    Variablen
    volatile uint8_t i2c_size

    uint8_t i2c_buf [I2C_BUF_SIZE]

    volatile uint8_t i2c_last_TWSR

    volatile uint8_t i2c_pos


    Daher meine Bitte: Wer kann mir mit einem konkreten Code-Beispiel helfen, mittels I2C die Daten aus dem Sensor in den Roboter zu bekommen?

    Vielen Dank schon im Voraus!
    Gruß
    Klaus

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    09.10.2014
    Beiträge
    5.076
    hallo!
    ich würde den Nibo2 in der Arduino-IDE programmieren, da hast du sehr viele praktische Libs zur Verfügung mit einfacher Ansteuerung (ebenfalls in C/C++):
    https://www.roboter.cc/index.php?opt...2333&Itemid=20

    wenn du diese verwendest und Fragen hast, stell ggf. nochmal die Frage neu hier im Arduino-Unterforum!
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2020
    Ort
    Harz
    Alter
    71
    Beiträge
    8
    Hallo HaWe,
    vielen Dank für deine schnelle Antwort.
    Ich habe bisher immer das AVRStudio4 verwendet und komme gut klar damit.
    Wenn ich nun weiter mit der Arduino-IDE programmiere, muss ich ja wohl alle meine Codes wieder neu erstellen, oder?!?
    Ich will doch den Gyro-Sensor in ein bestehendes Projekt einbinden.
    Gibt es nicht die Möglichkeit, die i2c-Routinen, die die Nibo2-Bibliothek mir bietet, zu nutzen?
    Gruß
    Klaus

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    32
    Beiträge
    4.905
    Wenn du auf die Arduino IDE umsteigst, musst du die Programme neu schreiben oder zumindest anpassen. Ich weiß nicht ob man C Programme importieren kann.

    Die Library kenne ich nicht, aber du könntest versuchen auf eine andere I2C Library umsteigen. Eine häufig verwendete Library ist die von Peter Fleury.
    die "i2cmaster" Library von hier http://www.peterfleury.epizy.com/avr-software.html#libs

    Wichtig ist das du Pullup Widerstände zwischen VCC (+5V) und SCL bzw VCC und SDA hast. Entweder du nimmst externe Widerstände oder schaltest die internen Pullup Widerstände ein.
    Ohne Widerstände funktioniert der Bus nicht.

    Zusätzlich ist noch der Ablauf wichtig.
    Die Unterscheidung zwischen Lesen und Schreiben wird mit dem niederwertigsten Bit bei der Adresse angegeben. Eine "0" bedeutet das du schreiben willst, eine "1" bedeutet lesen.
    https://www.roboter-bausatz.de/media...asheet-1-0.pdf
    Wenn das dieses IC ist hast du die I2C Grundadresse "0D" => 0001101
    Somit hast du als Schreibadresse 00011010 => 1A
    und die Leseadresse 00011011 => 1B
    Hier der Ablauf in Pseudocode.

    Beim Schreiben:
    Code:
    I2C Start
    I2C Schreibadresse
    I2C Register (im Datenblatt des ICs nachschauen)
    I2C Daten (Daten die du ins Register schreiben willst, z.B. Einstellungen)
    I2C Stopp
    Beim Lesen:
    Code:
    I2C Start
    I2C Schreibadresse
    I2C Register (Register aus dem du lesen willst)
    I2C Start  (bzw repeated start)
    I2C Leseadresse
    Daten in Variable lesen mit ACK => wenn weitere Daten gelesen werden sollen, Registeradresse wird automatisch um 1 erhöht
    Daten in Variable lesen mit NACK => wenn keine weiteren Daten gelesen werden sollen
    I2C Stopp
    Du hast oben Makrodefinitionen angegeben (aus der Headerdatei). Dort steht z.B. "#define I2C_TX(ADDR) ((ADDR)<<1)".
    In diesem Fall müsstest du bei "ADDR" die "0D" angeben und nicht "1A" bzw "1B", weil dieses Makro das Linksschieben übernimmt.

    MfG Hannes

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2020
    Ort
    Harz
    Alter
    71
    Beiträge
    8
    Hallo Hannes,
    toll, dass du dich um mein Problem bemühst! Danke.
    Ja, das istder IC, den ich gekauft habe, und auch von diesem Shop.
    Das mit dem Links-Schieben wusste ich nicht. Bin eben ein Neuling auf diesem Gebiet.
    Ich habe folgenden Beispielsketch für Arduino Kompassmodul GY-282 HMC5983 gefunden:

    #include <Wire.h> //I2C Arduino Library
    #define addr 0x1E //I2C Address for The HMC5883
    void setup(){
    Serial.begin(9600);
    Wire.begin();
    Wire.beginTransmission(addr); //start talking
    Wire.write(0x02); // Set the Register
    Wire.write(0x00); // Tell the HMC5883 to Continuously Measure
    Wire.endTransmission();
    }
    void loop()
    {
    int x,y,z; //triple axis data
    //Tell the HMC what regist to begin writing data into
    Wire.beginTransmission(addr);
    Wire.write(0x03); //start with register 3.
    Wire.endTransmission();
    //Read the data.. 2 bytes for each axis.. 6 total bytes
    Wire.requestFrom(addr, 6);
    if(6<=Wire.available()){
    x = Wire.read()<<8; //MSB x
    x |= Wire.read(); //LSB x
    z = Wire.read()<<8; //MSB z
    z |= Wire.read(); //LSB z
    y = Wire.read()<<8; //MSB y
    y |= Wire.read(); //LSB y
    }
    // Show Values
    Serial.print("X Value: ");
    Serial.println(x);
    Serial.print("Y Value: ");
    Serial.println(y);
    Serial.print("Z Value: ");
    Serial.println(z);
    Serial.println();
    delay(500);
    }


    Könnte man diesen Code nicht so umschreiben,
    dass er mit den Befehlen der Nibo2-Bibliothek (wie im 1. Post beschrieben)
    ausführbar ist?!?
    Würdest du mir dabei bitte auch behilflich sein?
    Gruß
    Klaus

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    32
    Beiträge
    4.905
    Das ist ein Code der für die Arduino IDE, der ist so nicht kompatibel mit dem AVR Studio.
    Dort wird die "wire.h" verwendet, die ist Teil der Arduino IDE.

    Der Code, den du gepostet hast, liest die Werte der 3 Achsen aus und sendet es mittels UART an die USB Schnittstelle (über UART/USB Wandler).
    Die Adresse ist auch eine andere, warum weiß ich aber nicht.

    Die Nibo Library kenne ich überhaupt nicht. Die Lib die ich gepostet habe habe ich zu Testzwecken schon verwendet, habe aber noch nicht viel gemacht.

    Ich würde die von mir gepostete Library herunterladen und diese verwenden. Die ist relativ leicht zu bedienen.

    Wenn du Code postest, bitte in Code Tags posten. Entweder unter "Erweitert" und dann das #-Symbol oder du schreibst den Code zwischen [ code] und [ /code] (du musst die Leerzeichen entfernen).

    Beim Code selbst kann ich dir aber helfen, programmiere zwar mittlerweile mit dem aktuellen AVR Studio, habe aber mit der Version 4 angefangen.

    MfG Hannes

Ähnliche Themen

  1. Suche Microcontroller welcher mit Android kommunizieren kann
    Von Mr.P. im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 10
    Letzter Beitrag: 04.10.2012, 11:13
  2. Antworten: 3
    Letzter Beitrag: 17.12.2010, 22:03
  3. Wie kann Mega8 mit ProfiLab Expert kommunizieren?
    Von mikro-VIIV im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 15.12.2007, 14:54
  4. Welche Sensoren kann ich dafür verwenden?
    Von blue_man im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 20.05.2005, 18:53
  5. Sensoren kommunizieren miteinander
    Von Andreas im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 30.04.2004, 23:51

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •