- LiFePO4 Speicher Test         
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
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2020
    Ort
    Harz
    Alter
    75
    Beiträge
    8
    Hallo Hannes,
    zum letzten Mal heute Abend:
    Habe die Library von Peter Fleury heruntergeladen und entpackt.
    Doch wohin nun mit den einzelnen Dateien? Habe in die Anleitung geschaut,
    aber das sieht ja nun wieder ganz anders aus als in der Nibo-Bibliothek oder bei Arduino.
    Da werde ich mir wohl oder übel noch die letzten Haare raufen müssen...
    Aber ich will das Ganze auf meine alten Tage unbedingt noch lernen,
    dann kann ich mein Wissen auch noch an meinen Enkel weitergeben,
    der genau wie ich roboterbesessen ist.
    Gruß
    Klaus

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Du benötigst nur 2 Dateien, einmal die "i2cmaster.h" und die "twimaster.c".

    Diese beiden Dateien würde ich in den Projektordner kopieren (in der die C-Datei mit der "main" liegt).

    Wenn du dann das Projekt öffnest gibt es im Projektbaum (der Abschnitt mit den Ordnern "Source Files", "Header Files",...) den Ordner mit den verwendeten Source Files, dort musst du die C-Datei hinzufügen. Rechte Maustaste auf den Ordner "Source Files" und dann "Add existing Source File(s)". Jetzt wählst du die "twimaster.c" aus.
    In dem Ordner muss jetzt die C-Datei mit der "main" sein und die "twimaster.c" (eventuell noch mehrere C-Dateien).

    Anschließend musst du noch die Headerdatei integrieren. Es gibt 2 verschiedene Arten Headerdateien zu integrieren.
    1) die Datei wird in den Symbolen < und > geschrieben (z.B. #include <avr\interrupt.h>) => die Dateien sind in einem Ordner die dem AVR Studio bekannt sind, wie die Standartmäßigen Headerdateien.
    2) die Datei wird zwischen 2 "-Symbolen geschrieben (z.B. #include "i2cmaster.h") => die Dateien liegen im Projektordner

    Wenn du das Projekt dann übersetzt sollte unter "External Dependencies" die Headerdatei (in dem Fall die i2cmaster.h) zu finden sein.

    Wenn du soweit bist kannst du die einzelnen Funktionen der Library nutzen.
    Am Programmanfang musst du 1x den TWI initialisieren (damit die Bitrate richtig eingestellt ist). Hier würde ich auch die Einstellung für das IC machen.
    In der Loop kannst du dann die Werte auslesen.

    Ich hoffe das hilft dir weiter.

    MfG Hannes

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2020
    Ort
    Harz
    Alter
    75
    Beiträge
    8
    Hallo Hannes,
    auf ein Neues!!!
    Ich habe deine Hinweise beachtet und die beiden Dateien eingebunden. Dann habe ich mein kleines Projekt geschrieben. Es wurde fehlerfrei compiliert. Allerdings liest der Nibo2 nicht die Werte des Gyros.
    Ich dachte mir, vielleicht liegt es daran, dass die vorher vorhandenen i2c-Routinen für den eingebauten Abstandsmesser nds3 nicht mehr vorhanden sind. Habe also folglich die alten i2c-Dateien wieder eingebunden (wie es vorher war) und die neuen i2c-Dateien namenlich angepasst (i2c__master.h und die Routine i2c__init), damit nichts kollidiert.
    Es wird fehlerfrei compiliert, aber in der Textausgabe zum Schluss kommt nichts an. Wenn ich den Zugriff auf den Sensor auskommentiere (siehe Code), dann wird die Textausgabe (stellvertretend mit x=5, y=6, z=7) geschrieben.
    Nun bin ich mit meinem Latein wieder mal am Ende und bitte dich um Hilfe.

    Code:
    /*  Nibo2-Programm Test_Gyro_I2C, erstellt von Klaus Beutel  im Februar 2020                        */ 
    /********************** Bibliotheken einbinden ******************************************************/
    #include <math.h>
    #include <stdio.h>								// Standardein- und -ausgabefunktionen
    #include <avr/interrupt.h>						// Interrupts ermöglichen
    #include <stdlib.h>								// notwendig u.a. für die abs-Funktion
    #include <nibo/niboconfig.h>					// Konfiguration der Nibo-Bibliothek
    #include <nibo/display.h>               		// Ansprechen eines Displays
    #include <nibo/gfx.h>							// Ansteuerung eines LC-Grafik-Displays                
    #include <nibo/spi.h>							// Kommunikation über SPI.
    #include <nibo/copro.h>							// Ansprechen des Coprozessors
    #include <nibo/delay.h>							// Warteschleifen
    #include <nibo/iodefs.h>						// Zuordnung der physikalischen Pins zu symbolischen Namen
    #include <nibo/bot.h>							// allgemeine Funktionen des Roboters
    #include "i2c__master.h"						// Kommunikation ueber den I2C Bus
    #include <nibo/pwm.h>							// Erzeugung der PWM-Signale und der Systemzeit.
    #include <nibo/leds.h>							// Ansteuerung der LEDs
    #include <nibo/i2cmaster.h>						// Kommunikation ueber den I2C Bus
    #include <nibo/nds3.h>							// Kommunikation mit dem NDS3 Modul
    
    /************************* Konstante definieren *****************************************************/
    #define gyroaddr 0x0D							// i2c-Adresse für HMC5883
    
    /************************* Globale Variable definieren **********************************************/
    char text[22] = "                     ";		// Text-Ausgabe-Buffer
    uint16_t x,y,z; 								// triple axis data
    
    /************************* Hauptprogramm ************************************************************/
    int main()
    {
    /********************** Initialisierung *************************************************************/   
      	sei(); 										// Interrupts global erlauben
      	bot_init(); 								// Controller reseten
      	leds_init(); 								// LEDs initialisieren
      	pwm_init(); 								// PWM-Kanäle initialisieren
      	display_init(2); 							// Display initialisieren
      	spi_init(); 								// SPI initialisieren 	
    	gfx_init(); 								// Graphikdisplay initialisieren
    	i2c_init();									// i2c-Bus initialisieren
    	nds3_init();
    	i2c__init();
    
    /********************* Lokale Variable definieren ***************************************************/
    	
    /****************************************************************************************************/
      	nds3_move(82);								// nds3 auf Null-Position
        leds_set_displaylight(1024); 				// Display-Hintergrundsbeleuchtung einschalten
      	gfx_set_proportional(0); 					// Schrift auf normal setzen
    	gfx_move(0, 50);
    	gfx_print_text("S3: Start");
    
      	while (PIND&(1<<4)) 						// warten auf Betätigung von S3 zum Starten
    	{
        	delay(250); 							// alle grünen LEDs blinken
        	PORTC=0xFF;
        	delay(250);
        	PORTC=0x00;
      	}
    
      	gfx_fill(0x00); 							// Display leeren
    	gfx_move(0, 0);
    	gfx_print_text("      x    y    z");
     
    /*	i2c_start(gyroaddr+I2C_WRITE);       		// set device address and write mode
    	i2c_write(0x09);                       		// write address = 9
        i2c_write(0x1D);                       		// Define OSR = 512, Full Scale Range = 8 Gauss, ODR = 200Hz, set continuous measurement mode)
        i2c_write(0x0A);                       		// write address = 10
        i2c_write(0x40); 							// The I2C data pointer will automatically roll, 6.Bit = 1 setzen
    	i2c_write(0x0B);                       		// write address = 11
        i2c_write(0x01); 							// Define Set/Reset period
    	i2c_stop();                            		// set stop conditon = release bus
    */
      	while (1) 									// Hauptschleife
    	{
    /*		i2c_start_wait(gyroaddr+I2C_WRITE);     // set device address and write mode
            i2c_write(0x00);                        // write address = 0
            i2c_rep_start(gyroaddr+I2C_READ);       // set device address and read mode
            x = i2c_readAck()<<8;                   // read one byte from address 0	MSB  x 
            x |= i2c_readAck();                    	//  "    "    "    "     "    1	LSB  x 
            y = i2c_readAck()<<8;                   //  "    "    "    "     "    2	MSB  y
            y |= i2c_readAck();                    	//  "    "    "    "     "    3	LSB  y
    		z = i2c_readAck()<<8;                   //  "    "    "    "     "    4	MSB  z
            z |= i2c_readNak();                    	//  "    "    "    "     "    5	LSB  z
            i2c_stop();                            	// set stop condition = release bus
    */		x=5;
    		y=6;
    		z=7;
    		gfx_move(0, 10);
    		sprintf(text,"->  %04d %04d %04d", x, y, z);
    		gfx_print_text(text);
    
      	}
      	return 0;
    }
    Gruß
    Klaus

    P.S.: Die Adressen habe ich aus dem Datenblatt des IC entnommen. Vielleicht liegt ja da der Fehler?!?

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Man sollte nur eine Lib verwenden und nicht 2 oder noch mehr. Es könnte sein das sich die beiden Libs beeinflussen. Z.B. Lib 1 stellt in der Init die I2C Frequenz auf 100kHz und Lib 2 stellt es dann auf 400kHz.

    Das Problem ist das ich nicht herausgefunden habe welche Adresse das NDS3 hat. Dadurch benötigst du die originale I2C Lib.

    Das Problem das du aber mit dem Sensor hast ist ein anderes, du hast die falsche Adresse.

    Die Grundadresse ist die 0D, das ist aber nicht Bit 0-Bit 6 sondern Bit 1-Bit 7.

    Du musst die Adresse zuerst um 1 nach links schieben und dann 0 oder 1 an Bit 0 hinzufügen (vergleiche es mit der Makrofunktion im 1ten Post). Das geht entweder mit einer Addition oder einer Oder Verknüpfung. Achte auf die Adresse die ich im Post 4 geschrieben habe.
    Ich empfehle dir die Rechnung mit dem Windowsrechner zu prüfen, dort gibt es einen Punkt "Programmierer".

    Was mir auch noch aufgefallen ist, die Bytes sind verdreht.
    Im Arduinocode und auch in deinem steht im 1ten Byte das MSB und im 2ten Byte das LSB, laut Datenblatt ist aber im 1ten Byte das LSB und im 2ten Byte das MSB.
    Um das kann man sich aber dann später kümmern, wichtig ist aber das du erst einmal Daten bekommst.

    MfG Hannes

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2020
    Ort
    Harz
    Alter
    75
    Beiträge
    8
    Hallo Hannes,
    große Freude - ich kann den Sensor lesen!!! Habe deine Ratschläge beachtet, funktioniert so gut. Dass das MSB und das LSB im Datenblatt des Sensors in der umgekehrten Rehenfolge steht und nicht wie bei dem Arduino-Scetch-Beispiel, war mir gar nicht aufgefallen. Also nochmals vielen Dank für deine Hilfe!
    So, nun gehts weiter, nun muss ich mir etwas einfallen lassen, wie ich aus den Sensorwerten die Gradzahl des Winkels bekomme.
    Mein Vorhaben ist, wenn der Nibo2 im Labyrinth eine 90°-Drehung nach links machen soll, dann soll er das so lange machen, bis der Kompass-Sensor sagt, dass er die 90° erreicht hat. Ohne den Sensor, nur über die Umdrehungszahl der Motoren, wird alles zu ungenau, weil der Nibo2 auf dem Untergrund auch rutscht.
    Übrigens bin ich auch deiner Meinung, dass es ungünstig ist, den i2c-Bus über mehrere Libs anzusprechen, die sich stören könnten.
    Ich denke mir, es müsste doch möglich sein, die Routinen aus der i2cmaster.h-Datei, die du mir empfohlen hast, mit in die originale i2cmaster.h-Datei des Nibo2 zu übernehmen. Beim Syntax dürften die sich doch eigentlich nicht stören, so dass der nds3 weiter funktioniert und ich aber meine zusätzlichen Sensoren mit den neuen Routinen anspreche. Der Befehl i2c_init() wird dann natürlich nur einmal gegeben.
    Was hältst du von meiner Idee? Oder hast du einen besseren Vorschlag?
    Ich wünsche dir noch einen schönen Abend.
    Gruß
    Klaus

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Schön das es jetzt funktioniert.

    Ich würde mich auf eine Lib beschränken.

    Entweder versuchen den Kompass mit der Nibo Lib oder den NDS3 (und andere Komponenten falls vorhanden) mit der Lib von Peter Fleury.

    Die Adresse des NDS3 könntest du versuchen mit dem Simulator herauszufinden.
    Du startest den Simulator mit einem Programm das den NDS3 anspricht (z.B. Entfernung auslesen). Diesen Programmteil lässt du dann Schritt für Schritt abarbeiten. Die Initialisierung kannst du überspringen, indem du vor dem Kommando klickst (rechte Maustaste) und dann wählst du "Run to Cursor".
    Wenn der gelbe Pfeil dort angezeigt wird, drückst du F11 (Step Into) und schaust was in das TWI Datenregister geschrieben wird.
    Wenn du die vermeintliche Adresse hast könntest du es mit der Peter Fleury Lib testen, die einzelnen Kommandos und das Protokoll sind hier zu finden http://www.nibo-roboter.de/wiki/NDS3
    Du könntest dann eine eigene Library schreiben, die diese Funktionen enthält. Also eine eigene "NDS3.h" erstellen.

    Ich würde die Peter Fleury Lib nehmen, da du diese auch für andere Projekte (also wenn du den Nibo nicht verwendest) verwenden kannst. Die Nibo Lib ist speziell auf den Nibo zugeschneidert und ist dadurch nur schwer für andere Dinge zu gebrauchen.

    Ich wünsche dir ebenfalls einen schönen Abend
    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, 12:13
  2. Antworten: 3
    Letzter Beitrag: 17.12.2010, 23: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, 15:54
  4. Welche Sensoren kann ich dafür verwenden?
    Von blue_man im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 20.05.2005, 19:53
  5. Sensoren kommunizieren miteinander
    Von Andreas im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 01.05.2004, 00:51

Stichworte

Berechtigungen

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

Labornetzteil AliExpress