Arduino Library für Jeti EX Eigenbau-Telemetrie
- sierra_uniform
- Offline
- Elite Mitglied
- Beiträge: 275
- Dank erhalten: 138
Herzlichen Dank, es funktioniert )
von sierra_uniform
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Sepp62
- Offline Autor
- Elite Mitglied
- Beiträge: 294
- Dank erhalten: 153
Die Version 1.0.4 steht bereit:
sourceforge.net/projects/jetiexsensorcpplib/
Hier nochmals meinen Dank an ThomasL, der mich mit Vorschlägen und Tests unterstützt hat.
Änderungen:
- Für die Jetibox (-Emulation) werden nun auch Tastenkombinationen und nicht nur Einzeltasten gemeldet
- Der Empfänger ist beim Systemstart erstmal ausgeschaltet, damit er keine falschen Zeichen aufsammelt, bis der Empfänger die Telemetrie detektiert hat.
- Das Sensorverzeichnis wird vor dem eigentlichen Start einmal vollständig gesendet. Damit sollte die Sensorerkennung im Sender nach einem Telemetrie-Reset zuverlässiger funktionieren.
- Sensoren können dynamisch aktiviert oder deaktiviert werden
Viele Grüße
Bernd
sourceforge.net/projects/jetiexsensorcpplib/
Hier nochmals meinen Dank an ThomasL, der mich mit Vorschlägen und Tests unterstützt hat.
Änderungen:
- Für die Jetibox (-Emulation) werden nun auch Tastenkombinationen und nicht nur Einzeltasten gemeldet
- Der Empfänger ist beim Systemstart erstmal ausgeschaltet, damit er keine falschen Zeichen aufsammelt, bis der Empfänger die Telemetrie detektiert hat.
- Das Sensorverzeichnis wird vor dem eigentlichen Start einmal vollständig gesendet. Damit sollte die Sensorerkennung im Sender nach einem Telemetrie-Reset zuverlässiger funktionieren.
- Sensoren können dynamisch aktiviert oder deaktiviert werden
Viele Grüße
Bernd
von Sepp62
Folgende Benutzer bedankten sich: 0n3 70uch, Ecstacy, IG-Modellbau
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- sierra_uniform
- Offline
- Elite Mitglied
- Beiträge: 275
- Dank erhalten: 138
Hallo zusammen,
mein weiter oben kurz beschriebener Sensor funktioniert zwischenzeitlich problemlos sowohl mit meinem DC-16 Sender als auch mit einem alten MC 16 Sender mit Jeti HF-Modul und Jetibox. Wenn ich den Sensor direkt an die Jetibox anschließe, klappt auch alles. Schließe ich ihn an eine Jetibox mini an, dann komme ich über die Meldung "Waiting for Dev." nicht hinaus. Ab und zu blitzt ganz kurz eine zweizeilige Meldung mit völlig unsinnigen Zeichen auf. Die ist aber so schnell wieder weg, dass man nicht wirklich entziffern kann, was da eigentlich ausgegeben wird. An was könnte das Fehlverhalten beim Betrieb mit der Minibox liegen? Coding siehe Anhang.
Viele Grüße SU
mein weiter oben kurz beschriebener Sensor funktioniert zwischenzeitlich problemlos sowohl mit meinem DC-16 Sender als auch mit einem alten MC 16 Sender mit Jeti HF-Modul und Jetibox. Wenn ich den Sensor direkt an die Jetibox anschließe, klappt auch alles. Schließe ich ihn an eine Jetibox mini an, dann komme ich über die Meldung "Waiting for Dev." nicht hinaus. Ab und zu blitzt ganz kurz eine zweizeilige Meldung mit völlig unsinnigen Zeichen auf. Die ist aber so schnell wieder weg, dass man nicht wirklich entziffern kann, was da eigentlich ausgegeben wird. An was könnte das Fehlverhalten beim Betrieb mit der Minibox liegen? Coding siehe Anhang.
Viele Grüße SU
Last Edit:10 Aug. 2017 13:49
von sierra_uniform
Letzte Änderung: 10 Aug. 2017 13:49 von sierra_uniform.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Sepp62
- Offline Autor
- Elite Mitglied
- Beiträge: 294
- Dank erhalten: 153
Vielleicht versteht die Jetibox-Mini kein EX Protokoll ?
Kommentier doch bitte mal die unten gezeigte Zeile aus und probier das Ganze mit der Minibox.
uint8_t JetiExProtocol::DoJetiSend()
{
// send every 150 ms only
if( ( m_tiLastSend + 150 ) <= millis() )
{
...
// EX frame...
else if( m_pSensorsConst )
{
// SendExFrame( m_frameCnt++ );
}
// followed by "simple text" frame
SendJetiboxTextFrame();
}
return 0;
}
Kommentier doch bitte mal die unten gezeigte Zeile aus und probier das Ganze mit der Minibox.
uint8_t JetiExProtocol::DoJetiSend()
{
// send every 150 ms only
if( ( m_tiLastSend + 150 ) <= millis() )
{
...
// EX frame...
else if( m_pSensorsConst )
{
// SendExFrame( m_frameCnt++ );
}
// followed by "simple text" frame
SendJetiboxTextFrame();
}
return 0;
}
von Sepp62
Folgende Benutzer bedankten sich: sierra_uniform
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- sierra_uniform
- Offline
- Elite Mitglied
- Beiträge: 275
- Dank erhalten: 138
Hallo Bernd,
vielen Dank für den Vorschlag. Habe ich so getestet, führt zum gleichen Ergebnis. Für diesen und alle vorherigen Tests habe ich einen Empfängerakku an den Anschluss mit dem Kabel gesteckt und den Sensor in die EXT Buchse. Später habe ich die Minibox mal an meiner MC16 mit Jeti HF-Modul getestet. Anschluss des HF-Modul Ausgangs an EXT und Akku ans Kabel, Sensor an den Empfänger. Das hat so funktioniert. Irgendwie kam mir das aber blöd vor, weil ich für die Minibox ja einen zusätzlichen Akku benutzen müsste. Deshalb habe ich versuchsweise den Kabelanschluss direkt an den HF-Modul Ausgang gesteckt. Und siehe da, es hat auch ohne Akku funktioniert. Nächster Test war dann wieder der direkte Anschluss des Sensors an die Jetibox. Hierbei habe ich sowohl den Akku als auch den Sensor über ein V-Kabel an das Kabel der Minibox angeschlossen. Und damit funktioniert das Ganze dann.
Im Vergleich zur Jeti Box ist das aus meiner Sicht etwas seltsam. Dort gibt es ja einen Anschluss für den Akku und einen für den Sensor. Aber egal, wichtig ist es funktioniert. Wenn auch etwas umständlicher mit V-Kabel.
Gruß SU
vielen Dank für den Vorschlag. Habe ich so getestet, führt zum gleichen Ergebnis. Für diesen und alle vorherigen Tests habe ich einen Empfängerakku an den Anschluss mit dem Kabel gesteckt und den Sensor in die EXT Buchse. Später habe ich die Minibox mal an meiner MC16 mit Jeti HF-Modul getestet. Anschluss des HF-Modul Ausgangs an EXT und Akku ans Kabel, Sensor an den Empfänger. Das hat so funktioniert. Irgendwie kam mir das aber blöd vor, weil ich für die Minibox ja einen zusätzlichen Akku benutzen müsste. Deshalb habe ich versuchsweise den Kabelanschluss direkt an den HF-Modul Ausgang gesteckt. Und siehe da, es hat auch ohne Akku funktioniert. Nächster Test war dann wieder der direkte Anschluss des Sensors an die Jetibox. Hierbei habe ich sowohl den Akku als auch den Sensor über ein V-Kabel an das Kabel der Minibox angeschlossen. Und damit funktioniert das Ganze dann.
Im Vergleich zur Jeti Box ist das aus meiner Sicht etwas seltsam. Dort gibt es ja einen Anschluss für den Akku und einen für den Sensor. Aber egal, wichtig ist es funktioniert. Wenn auch etwas umständlicher mit V-Kabel.
Gruß SU
von sierra_uniform
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- wiff
- Offline
- Premium Mitglied
- Wolfgang
- Beiträge: 83
- Dank erhalten: 25
Liebe Jeti-Sensor Gurus,
im Zuge der Umrüstung eines alten E-Seglers bin ich bin per Zufall auf diesen Regler gestossen, der eigentlich für Drohnen gebaut wurde:
www.rcgroups.com/forums/showthread.php?2...n-Flyduino-32bit-ESC
Die Specs sind interessant und ausserdem spuckt der Regler seine Betriebsdaten über ein dokumentiertes Protokoll aus!
Im obigen Link findet Ihr den Arduino-Code für das Auslesen der Daten.
Ich möchte diesen Regler gerne an die Jeti-Telemetrie anschliessen, allerdings möchte ich einen Teenys dafür verwenden.
Der Arduino Code ist ziemlich hardwarenahe - habt Ihr einen Tipp für mich, wie ich das für den Teensy anpassen muss....
Gruss & Dank
Wolfgang
im Zuge der Umrüstung eines alten E-Seglers bin ich bin per Zufall auf diesen Regler gestossen, der eigentlich für Drohnen gebaut wurde:
www.rcgroups.com/forums/showthread.php?2...n-Flyduino-32bit-ESC
Die Specs sind interessant und ausserdem spuckt der Regler seine Betriebsdaten über ein dokumentiertes Protokoll aus!
Im obigen Link findet Ihr den Arduino-Code für das Auslesen der Daten.
Ich möchte diesen Regler gerne an die Jeti-Telemetrie anschliessen, allerdings möchte ich einen Teenys dafür verwenden.
Der Arduino Code ist ziemlich hardwarenahe - habt Ihr einen Tipp für mich, wie ich das für den Teensy anpassen muss....
Gruss & Dank
Wolfgang
Code:
/*
KISS ESC 24A Serial Example Code for Arduino.
made for a nanowii / promicro / arduino leonardo / atmega32µ4 arduino compatible boards as it uses tim 1 compare 1 and serial 1 RX.
connect the ESC's PWM signal to pin D9 and the telemetrie pin of the ESC to the RX(I)/D0 pin
connect a signal source to pin D7 (servotester or RX or something else to give a throttle signal.. the oneshot 125 reading of the arduino will jitter a lot because of slow arduino ISR and SW reading)
use a serial monitor (arduino serial monitor) with 9600 baud to view the ESC's telemetry
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <Wire.h>
//Global Variables
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int16_t ESC_telemetrie[5]; // Temperature, Voltage, Current, used mAh, eRpM
static uint16_t requestTelemetrie = 0;
static uint16_t regularThrottleSignal = 1000;
static uint8_t receivedBytes = 0;
//Setup
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
// init timer 1
pinMode(9,OUTPUT);
TCNT1 = 0; TCCR1C = 0; TIMSK1 = 0;
TCCR1A = B10101010; // PWM_WaveformMode=14 -> Fast_PWM, TOP=ICRn, PWM_OutputMode=non-inverting
TCCR1B = B00011001; // Prescaler=clk/1 / Imp=125.. 250us @11Bit oder Imp=1000.. 2000us @14Bit
ICR1 = 0xFFFF; // set TOP TIMER1 to max
DDRE &= ~(1 << 6); // pin 7 to input
PORTE |= (1 << 6); // enable pullups
EIMSK |= (1 << INT6); // enable interuppt
EICRB |= (1 << ISC60);
Serial.begin(9600); // open seria0 for serial monitor
Serial1.begin(115200); // open Serial1 for ESC communication
}
//Main Loop
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
static uint32_t loopTime = 0;
static uint8_t tlemetrieCounter = 0;
if(micros()-loopTime > 2000){ // 2000Hz looptime
loopTime = micros();
receiveTelemtrie(); // look for incoming telemetrie
if(++tlemetrieCounter == 20){ // get telemetrie with 25Hz
tlemetrieCounter = 0;
receivedBytes = 0; // reset bytes counter
// request telemetrie with a 30µs signal
OCR1A = 30<<4;
}else{
OCR1A = regularThrottleSignal<<1;
}
//print the telemetry
if(tlemetrieCounter == 10){
Serial.println("Requested Telemetrie");
Serial.print("Temperature (C): ");
Serial.println(ESC_telemetrie[0]);
Serial.print("Voltage: (V) /100: ");
Serial.println(ESC_telemetrie[1]);
Serial.print("Current (A) /100: ");
Serial.println(ESC_telemetrie[2]);
Serial.print("used mA/h: ");
Serial.println(ESC_telemetrie[3]);
Serial.print("eRpM *100: ");
Serial.println(ESC_telemetrie[4]);
Serial.println(" ");
Serial.println(" ");
}else{
//fire oneshot only when not sending the serial datas .. arduino serial library is too slow
TCNT1 = 0xFFFF; OCR1A=0;
}
}
}
// get the Telemetrie from the ESC
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void receiveTelemtrie(){
static uint8_t SerialBuf[10];
if(receivedBytes < 9){ // collect bytes
while(Serial1.available()){
SerialBuf[receivedBytes] = Serial1.read();
receivedBytes++;
}
if(receivedBytes == 10){ // transmission complete
uint8_t crc8 = get_crc8(SerialBuf, 9); // get the 8 bit CRC
if(crc8 != SerialBuf[9]) return; // transmission failure
// compute the received values
ESC_telemetrie[0] = SerialBuf[0]; // temperature
ESC_telemetrie[1] = (SerialBuf[1]<<8)|SerialBuf[2]; // voltage
ESC_telemetrie[2] = (SerialBuf[3]<<8)|SerialBuf[4]; // Current
ESC_telemetrie[3] = (SerialBuf[5]<<8)|SerialBuf[6]; // used mA/h
ESC_telemetrie[4] = (SerialBuf[7]<<8)|SerialBuf[8]; // eRpM *100
}
}
}
// 8-Bit CRC
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
uint8_t update_crc8(uint8_t crc, uint8_t crc_seed){
uint8_t crc_u, i;
crc_u = crc;
crc_u ^= crc_seed;
for ( i=0; i<8; i++) crc_u = ( crc_u & 0x80 ) ? 0x7 ^ ( crc_u << 1 ) : ( crc_u << 1 );
return (crc_u);
}
uint8_t get_crc8(uint8_t *Buf, uint8_t BufLen){
uint8_t crc = 0, i;
for( i=0; i<BufLen; i++) crc = update_crc8(Buf[i], crc);
return (crc);
}
// read input PWM on D7
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ISR(INT6_vect){
static uint16_t now,diff;
static uint16_t last = 0;
now = micros();
if(!(PINE & (1<<6))){
delayMicroseconds(5);
if((PINE & (1<<6))) return;
uint16_t newDiff = now - last;
diff = (diff+diff+diff+newDiff)>>2; // filter
if(diff < 275 && diff > 100){ // oneshot125
regularThrottleSignal = diff<<3;
}else if(diff < 2250 && diff > 850){ // normal PWM
regularThrottleSignal = diff;
}else regularThrottleSignal = 1000;
}else{
delayMicroseconds(5);
if(!(PINE & (1<<6))) return;
last = now;
}
}
Wolfgang
Last Edit:11 Aug. 2017 17:08
von wiff
Letzte Änderung: 11 Aug. 2017 17:08 von wiff.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
Ladezeit der Seite: 1.047 Sekunden