Als erstes braucht man nen I²C-Treiber. Ich war faul und hab einfach ein fertiges Image genommen
In dem Artikel http://nathan.chantrell.net/20120519...c-io-expander/ verlinkt der Autor auf das Image: http://www.frank-buss.de/tmp/kernel.img
(Ist ein Debian, einfach das kernel.img in der Bootpartition ersetzen. Der in diesem Image enthaltene I2C-Treiber arbeitet zwar noch über Software-I2C, aber das reicht dicke. Es gibt auch einen Treiber der das Hardware-I2C nutzt, aber da muss man sich den Kernel erst mal selbst bauen und da hab ich grad kein Bock drauf. Ausserdem haben Kernel mit diesem Treiber bis jetzt mehr Probleme beim booten von SD-Karten)
Dann kann man relativ einfach das Device öffen, Slave-Adresse angeben und dann nach Lust und Laune schreiben und lesen:
Dieses Programm setzt die Geschwindigkeit jetzt eben auf 30/30. Für die ganzen Commands nehm ich mir die RP6Base_I2CSlave.c und die RP6Control_*I2C-XYZ-Master*.c aus den Beispielen zu Hilfe.Code:#include <linux/i2c-dev.h> #include <linux/i2c.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> // Commands: #define CMD_POWER_OFF 0 #define CMD_POWER_ON 1 #define CMD_CONFIG 2 #define CMD_SETLEDS 3 #define CMD_STOP 4 #define CMD_MOVE_AT_SPEED 5 #define CMD_CHANGE_DIR 6 #define CMD_MOVE 7 #define CMD_ROTATE 8 #define CMD_SET_ACS_POWER 9 #define CMD_SEND_RC5 10 #define CMD_SET_WDT 11 #define CMD_SET_WDT_RQ 12 int main() { bus = open( "/dev/i2c-0", O_RDWR ); // I2C öffnen if ( bus == -1 ) { // error } slave_addr = 0x05; // Slave Adresse (0x05 ist von der Base) ioctl( bus, I2C_SLAVE, slave_addr ); // Slave Adresse setzen char buffer[] = {0, CMD_MOVE_AT_SPEED, 30, 30}; // Command unsigned int bytes; bytes = write( bus, buffer, sizeof(buffer) ); // Rausschreiben close (bus); // I2C schließen return 0; }
Den Quelltext einfach in eine rp6ctrl.c oder sowas schreiben (am besten via SSH auf Raspi zugreifen und dann in Nano Strg+Alt+V). Dann das Programm übersetzen mit "gcc rp6ctrl.c -o rp6ctrl". Ausführen mit "sudo ./rp6ctrl". Da braucht man eben Root-Rechte, oder man includet den User in irgend eine Gruppe deren Namen ich jetzt nicht weis, die die Rechte zum I2C-Schreiben hat.







Zitieren


Lesezeichen