Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
-
Techum
- Beiträge: 175
- Registriert: 25 Dez 2014, 20:50
-
Kontaktdaten:
Beitrag
von Techum » 09 Sep 2026, 22:27
Hallo Torsten
genau so mache ich es ja auch

Es klappt trotzdem _noch_ nicht, wie es soll.
Ich teste also am Wochenende den C++ Code mit einem AS5600. Wenns funktioniert schicke ich den Code -
Ist irgendetwas zu beachten? Ich würde auslesen und den Winkel ausgeben.
ich hätte auch einen BMX055 hier, allerdings noch einen mit 10Pin Anschluss - für den Fall, dass Du in Erwägung ziehst, dass bei Deinem die I2C Schnittstelle spinnt.
Mehr habe ich an I2C noch nicht im Sortiment. Ggf macht noch jemand mit, vielleicht @Calliope?
Schönen Abend
Frank
-
Torsten
- Beiträge: 340
- Registriert: 29 Jun 2015, 23:08
- Wohnort: Gernsheim (Rhein-Main-Region)
Beitrag
von Torsten » 10 Sep 2026, 07:19
Hallo Frank,
Techum hat geschrieben: ↑09 Sep 2026, 22:27
Ich teste also am Wochenende den C++ Code mit einem AS5600. Wenns funktioniert schicke ich den Code -
Ist irgendetwas zu beachten? Ich würde auslesen und den Winkel ausgeben.
Ja, so machen wir's
Viele Grüße
Torsten
-
calliope
- Beiträge: 214
- Registriert: 11 Mär 2025, 12:02
Beitrag
von calliope » 10 Sep 2026, 20:46
Techum hat geschrieben: ↑09 Sep 2026, 22:27
Mehr habe ich an I2C noch nicht im Sortiment. Ggf macht noch jemand mit, vielleicht @Calliope?
Ich programmiere nur ROBO Pro Coding und die 3 aktuellen Controller. Alles andere war vor meiner fischertechnik Zeit.
Außerhalb von fischertechnik Controllern habe ich vom Heimcomputer Z 9001 bis Calliope aber auch schon viel gemacht.
Für I²C Programmierung bevorzuge ich die Datenblätter mit Register-Map und verwende fast nie Code Beispiele aus GitHub. Es geht nämlich meistens viel einfacher. Und funktioniert dafür auf TXT 4.0 und RX. Es wird nur das Projekt konvertiert.
-
Techum
- Beiträge: 175
- Registriert: 25 Dez 2014, 20:50
-
Kontaktdaten:
Beitrag
von Techum » 10 Sep 2026, 21:56
Hallo Torsten
Torsten hat geschrieben: ↑10 Sep 2026, 07:19
Ja, so machen wir's
Läuft wie geschmiert:
Code: Alles auswählen
#include <cstdint>
#include <cstring>
#include <iostream>
#include <stdexcept>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
constexpr uint8_t AS5600_ADDRESS = 0x36;
constexpr uint8_t RAW_ANGLE_REG = 0x0C;
int main()
{
// Open the TXT 4.0 I2C bus
int fd = open("/dev/i2c-3", O_RDWR);
if (fd < 0) {
perror("Cannot open /dev/i2c-3");
return 1;
}
try {
uint16_t previous = 0;
bool havePrevious = false;
while (true) {
uint8_t reg = RAW_ANGLE_REG;
uint8_t data[2] = {0, 0};
// Combined write + read transaction
i2c_msg messages[2];
messages[0].addr = AS5600_ADDRESS;
messages[0].flags = 0;
messages[0].len = 1;
messages[0].buf = ®
messages[1].addr = AS5600_ADDRESS;
messages[1].flags = I2C_M_RD;
messages[1].len = 2;
messages[1].buf = data;
i2c_rdwr_ioctl_data transaction;
transaction.msgs = messages;
transaction.nmsgs = 2;
if (ioctl(fd, I2C_RDWR, &transaction) < 0) {
perror("AS5600 I2C read failed");
close(fd);
return 1;
}
uint16_t raw =
(((uint16_t)data[0] << 8) | data[1]) & 0x0FFF;
double angle = raw * 360.0 / 4096.0;
if (havePrevious) {
int delta = static_cast<int>(raw) -
static_cast<int>(previous);
// Correct for 0° / 360° wrap-around
if (delta > 2048)
delta -= 4096;
else if (delta < -2048)
delta += 4096;
const char* direction;
if (delta > 0)
direction = "CW";
else if (delta < 0)
direction = "CCW";
else
direction = "STOP";
std::cout
<< "raw=" << raw
<< " angle=" << angle
<< " delta=" << delta
<< " direction=" << direction
<< std::endl;
}
previous = raw;
havePrevious = true;
usleep(10000); // 10 ms = 100 samples/second
}
}
catch (...) {
close(fd);
throw;
}
}
über SSH auf dem TXT4.0 gestartet

- output from ssh
- ssh_output.png (52.7 KiB) 13 mal betrachtet
sollte Ok sein, denke ich.
Schönen Abend
Frank