Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Donnerstag, 2. Dezember 2010, 20:47

FrSky Telemetrie

Hallo,

Über FrSky-Telemetrie gibts viel zu lesen, aber keine nachbaubaren Projekte.

Um das zu ändern habe ich im 1. Schritt per STK500 und DOGM-Display einen
Telemetrie-Anzeige für GPS realisiert.
GPS-Empfänger ist eine NAVILOCK 552 mit MAX232. Der NAVILOCK550 sollte ohne Zusatzschaltung anschließbar sein.

Das kleine C-Programm dekodiert die Datenpackete. U1, U2 und RSSI werden in Variablen geschrieben und die Nutzdaten über UART ausgegeben.
Nebenbei werden die GPS-Daten gescannt, Position, Höhe,Geschwindigkeit in Text-Feldern abgelegt und Daten auf dem Display angezeigt.

Da die GPS-Daten nur ASCII-Text enthalten ist das “byte stuffing” noch nicht integriert.

Viele Grüße Sven

// FrSky-Telemetie V2
// Datenstrom + GPS auf DOGM-Display
// PORTB1 RS Display
// PORTB2 SEL Display
// PORTB3 SDI Display
// PORTB5 SCK Display

#define RS 1
#define SCK 5
#define SDI 3
#define SEL 2

#define F_CPU 8000000
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

typedef uint8_t BYTE;
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef uint64_t QWORD;

uint8_t Text[32];
uint8_t status=0;
uint8_t RX_z=0;
volatile uint8_t neu=0;
volatile uint8_t U1=0;
volatile uint8_t U2=0;
volatile uint8_t RSSI=0;
uint8_t z=0;

volatile BYTE GPS[5][10] =
{ { '0','0','0','0','0','0','0','0','0','0'},//Lat
{ '-','-','0','0','0','0','0','0','0','0'},//Long
{ '-','-','0','0','0','0','0','0','0','0'},//Höhe
{ '-','-','-','-','0','0','0','0','-','-'},//Richtung
{ '-','-','-','-','0','0','-','-','-','-'} //Speed
};

BYTE Pos =0;
BYTE Typ =0;
BYTE Komma =0;
BYTE Stopp =1;
BYTE FIX ='0';
volatile BYTE Blink =0;


void Data (BYTE temp)
{ Pos++;
if (temp=='$')
{ Pos =0;
Komma =0;
Typ =0;
}
if (temp==',')
{ Komma++;
Pos =0;
}
if ((Komma==0)&&(Pos==4))
{ if (temp=='G') Typ=1;
if (temp=='T') Typ=2;
}
if (Typ==1) // GGA
{ if ((Komma==2)&&(Pos>0)) GPS[0][Pos-1]=temp;
if ((Komma==4)&&(Pos>0)) GPS[1][Pos-1]=temp;
if ((Komma==6)&&(Pos==1)) FIX=temp;
if ((Komma==9)&&(Pos>0)) GPS[2][Pos-1]=temp;
}
if (Typ==2) // VTG
{ if ((Komma==1)&&(Pos>0)) GPS[3][Pos-1]=temp;
if ((Komma==7)&&(Pos>0)) GPS[4][Pos-1]=temp;
if ((Komma==8)&&(Pos==0)) Stopp =1;
}
}

void spi_init(void)
{ DDRB |= (1<<SEL)|(1<<SDI)|(1<<SCK);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void spi_send(uint8_t send)
{ DDRB |= (1<<SEL)|(1<<SDI)|(1<<SCK);
PORTB&=~(1<<SEL);
SPDR = send;
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
while(!(SPSR & (1<<SPIF)));
PORTB|= (1<<SEL);
}

void LCD_CMD (uint8_t send)
{ PORTB&= ~(1<<RS);
DDRB|= (1<<RS);
spi_send(send);
_delay_ms(1);
}
void LCD_TXT (uint8_t send)
{ PORTB|= (1<<RS);
spi_send(send);
_delay_ms(1);
}

void USART_ini (void)
{ UCSRB=(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0<<RXB8)|(0<<TXB8);
UBRRL=51;
}

ISR (USART_RXC_vect)
{ BYTE temp=UDR;
switch (status)
{ case 0:
if(temp==0x7E) status++;
break;
case 1:
if(temp==0xFD) status=11;
else
{ if (temp==0xFE) status++;
else
{ if (temp==0x7E) status=1;
else status=0;
}
}
break;
case 2:
status++;
U1=temp;
break;
case 3:
status++;
U2=temp;
break;
case 4:
status++;
RSSI=temp;
break;
case 5: case 6: case 7:case 8: case 9: case 12:
status++;
break;
case 10:
if (temp==0x7E) neu=1;
status=0;
break;
case 11:
RX_z=temp+10;
status++;
break;
case 13: case 14: case 15: case 16: case 17: case 18:
RX_z--;
if (RX_z > 9)
{ //UDR=temp; // serielle Ausgabe
Data (temp); // GPS-Auswertung
}
status++;
break;
case 19:
status=0;
break;
default:
status=0;
break;
}
}

void Dezi_Zahl (uint16_t Zahl,uint8_t Pos)
{ if (Zahl<10000) Text[Pos]=' ';
else Text[Pos]=48+(Zahl/10000);
Zahl=Zahl-(abs(Zahl/10000)*10000);
if ((Zahl<1000)&(Text[Pos]==' ')) Text[Pos+1]=' ';
else Text[Pos+1]=48+(Zahl/1000);
Zahl=Zahl-(abs(Zahl/1000)*1000);
if ((Zahl<100)&(Text[Pos+1]==' ')) Text[Pos+2]=' ';
else Text[Pos+2]=48+(Zahl/100);
Zahl=Zahl-(abs(Zahl/100)*100);
if ((Zahl<10)&(Text[Pos+2]==' ')) Text[Pos+3]=' ';
else Text[Pos+3]=48+(Zahl/10);
Text[Pos+4]=48+Zahl-(abs(Zahl/10)*10);
}

void USART_in (void)
{
UCSRA=0;
UCSRB=(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0<<RXB8)|(0<<TXB8);
UBRRL=51;
DDRD=2;
}

int main (void)
{ OSCCAL=0xAB;//pgm_read_byte(0x1fff); // Calibrationsbyte schreiben
_delay_ms(100); // kann nicht schaden
spi_init(); // Display initialisieren
LCD_CMD(0x39); // 8bit 2 lines
LCD_CMD(0x1C); // Bias set
LCD_CMD(0x52);
LCD_CMD(0x69);
LCD_CMD(0x74);
LCD_CMD(0x38);
LCD_CMD(0x0f);
LCD_CMD(0x01);
LCD_CMD(0x06);
USART_ini();
sei();
for(;;)
{ if (neu==1) //neu Daten U1,U2,RSSI
{ neu=0;
Dezi_Zahl (U1,11);
Dezi_Zahl (U2,27);
Dezi_Zahl (RSSI,24);
}
//GPS-Auswertung
for(z=0;z<10;z++)
{ Text[z]=GPS[0][z];
Text[z+16]=GPS[1][z];
}
// Ausgabe auf Display
LCD_CMD(0x02);
for(z=0;z<16;z++) LCD_TXT(Text[z]);
LCD_CMD(0xc0);
for(z=0;z<16;z++) LCD_TXT(Text[z+16]);
}
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »sven.stoecker« (2. Dezember 2010, 21:13)


2

Donnerstag, 2. Dezember 2010, 21:21

RE: FrSky Telemetrie

In php-tags besser lesbar: (Font setzen geht leider nicht...)

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
// FrSky-Telemetie V2  
// Datenstrom + GPS auf DOGM-Display 
// PORTB1    RS  Display
// PORTB2     SEL Display
// PORTB3   SDI Display
// PORTB5   SCK Display

#define RS    1
#define SCK 5
#define SDI 3
#define SEL 2

#define  F_CPU  8000000
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

typedef uint8_t        BYTE;      
typedef uint16_t       WORD;      
typedef uint32_t       DWORD;    
typedef uint64_t       QWORD;        

            uint8_t    Text[32];
            uint8_t    status=0;
            uint8_t RX_z=0;
volatile    uint8_t neu=0;
volatile    uint8_t U1=0;
volatile    uint8_t U2=0;
volatile    uint8_t RSSI=0;
            uint8_t z=0;            

volatile     BYTE GPS[5][10] =
            {    {    '0','0','0','0','0','0','0','0','0','0'},//Lat
                {    '-','-','0','0','0','0','0','0','0','0'},//Long
                {    '-','-','0','0','0','0','0','0','0','0'},//Höhe
                {    '-','-','-','-','0','0','0','0','-','-'},//Richtung
                {    '-','-','-','-','0','0','-','-','-','-'//Speed
            };

            BYTE    Pos        =0;
            BYTE    Typ        =0;
            BYTE    Komma    =0;
            BYTE    Stopp   =1;    
            BYTE    FIX        ='0';    
volatile    BYTE    Blink   =0;


void    Data (BYTE temp)
{    Pos++;
    if    (temp=='$')
    {    Pos        =0;
        Komma    =0;
        Typ        =0;
    }
    if    (temp==',')
    {    Komma++;
        Pos    =0;
    }
    if    ((Komma==0)&&(Pos==4))
    {    if    (temp=='G'Typ=1;
        if  (temp=='T'Typ=2;
    }
    if    (Typ==1// GGA    
    {    if ((Komma==2)&&(Pos>0))    GPS[0][Pos-1]=temp;
        if ((Komma==4)&&(Pos>0))    GPS[1][Pos-1]=temp;
        if ((Komma==6)&&(Pos==1))    FIX=temp;
        if ((Komma==9)&&(Pos>0))    GPS[2][Pos-1]=temp;
    }
    if    (Typ==2// VTG    
    {    if ((Komma==1)&&(Pos>0))    GPS[3][Pos-1]=temp;
        if ((Komma==7)&&(Pos>0))    GPS[4][Pos-1]=temp;
        if ((Komma==8)&&(Pos==0)) Stopp   =1;
    }
}    

void spi_init(void)
{    DDRB |= (1<<SEL)|(1<<SDI)|(1<<SCK);
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void spi_send(uint8_t send)
{    DDRB |= (1<<SEL)|(1<<SDI)|(1<<SCK);
    PORTB&=~(1<<SEL);
    SPDR send;
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    while(!(SPSR & (1<<SPIF)));
    PORTB|= (1<<SEL);
}

void LCD_CMD (uint8_t send)
{    PORTB&= ~(1<<RS);       
    DDRB|= (1<<RS);
    spi_send(send);
    _delay_ms(1);
}
void LCD_TXT (uint8_t send)
{    PORTB|= (1<<RS);      
    spi_send(send);
    _delay_ms(1);
}

void USART_ini (void)
{    UCSRB=(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0<<RXB8)|(0<<TXB8);
    UBRRL=51;
}

ISR (USART_RXC_vect)    
{    BYTE temp=UDR;
    switch (status)
    {    case 0:            
            if(temp==0x7Estatus++;
        break; 
        case 1:            
            if(temp==0xFDstatus=11;
            else    
            {    if (temp==0xFEstatus++;    
                else    
                {    if (temp==0x7Estatus=1;
                    else status=0;
                }    
            }
        break;
        case 2:            
            status++;
            U1=temp;
        break;
        case 3:            
            status++;
            U2=temp;
        break;
        case 4:            
            status++;
            RSSI=temp;
        break;
        case 5:    case 6:    case 7:case 8:    case 9:    case 12:                
            status++;
        break;
        case 10:            
            if (temp==0x7Eneu=1;
            status=0;
        break;
        case 11:            
            RX_z=temp+10;
            status++;
        break;
        case 13: case 14: case 15: case 16:    case 17: case 18:        
            RX_z--;
            if (RX_z 9) 
            {    //UDR=temp;        // serielle Ausgabe
                Data (temp);    // GPS-Auswertung
            }
            status++;
        break;
        case 19:            
            status=0;
        break;
        default:    
            status=0;
        break;
    }
}

void Dezi_Zahl (uint16_t Zahl,uint8_t Pos)
{    if (Zahl<10000Text[Pos]=' ';
    else    Text[Pos]=48+(Zahl/10000);
    Zahl=Zahl-(abs(Zahl/10000)*10000);
    if ((Zahl<1000)&(Text[Pos]==' '))    Text[Pos+1]=' ';
    else    Text[Pos+1]=48+(Zahl/1000);
    Zahl=Zahl-(abs(Zahl/1000)*1000);
    if ((Zahl<100)&(Text[Pos+1]==' '))    Text[Pos+2]=' ';
    else    Text[Pos+2]=48+(Zahl/100);
    Zahl=Zahl-(abs(Zahl/100)*100);
    if ((Zahl<10)&(Text[Pos+2]==' '))    Text[Pos+3]=' ';
    else    Text[Pos+3]=48+(Zahl/10);
    Text[Pos+4]=48+Zahl-(abs(Zahl/10)*10);
}

void USART_in (void)
{
UCSRA=0;
UCSRB=(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0<<RXB8)|(0<<TXB8);
UBRRL=51;
DDRD=2;
}

int main (void)
{   OSCCAL=0xAB;//pgm_read_byte(0x1fff);            // Calibrationsbyte schreiben
    _delay_ms(100);                            // kann nicht schaden
    spi_init();                                // Display initialisieren
    LCD_CMD(0x39);                            // 8bit 2 lines
    LCD_CMD(0x1C);                            // Bias set
    LCD_CMD(0x52);
    LCD_CMD(0x69);
    LCD_CMD(0x74);
    LCD_CMD(0x38);
    LCD_CMD(0x0f);
    LCD_CMD(0x01);
    LCD_CMD(0x06);
    USART_ini();
    sei();
    for(;;)
    {     if (neu==1//neu Daten U1,U2,RSSI
        {    neu=0;
            Dezi_Zahl (U1,11);
            Dezi_Zahl (U2,27);    
            Dezi_Zahl (RSSI,24);
        }            
        //GPS-Auswertung
        for(z=0;z<10;z++) 
        {    Text[z]=GPS[0][z];
            Text[z+16]=GPS[1][z];
        }
        // Ausgabe auf Display
        LCD_CMD(0x02);
        for(z=0;z<16;z++) LCD_TXT(Text[z]);
        LCD_CMD(0xc0);
        for(z=0;z<16;z++) LCD_TXT(Text[z+16]);    
    }   
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DrM« (2. Dezember 2010, 21:22)


Space

RCLine User

Wohnort: Hasloh b. Hamburg

  • Nachricht senden

3

Montag, 6. Dezember 2010, 23:33

Hy Sven,

ich bin auch an dem Thema interessiert. Ich möchte allerdings die GPS Daten auf SD (oder in einen andere Speicherform) zu schreiben um bei Modellverlust den letzen Kurs des Modells zu haben.

Ich bin etwas irritiert, über den GPS Empfänger mit RS232 Schnittstelle.

Laut dem Frsky PDF (Two-way system protocoi) ist es RS232 Level. Abgebildet wird aber eine einfache Schaltung um von RS232 auf TTL(3.3v) zu wandeln.
Gruß

Thomas

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Space« (6. Dezember 2010, 23:35)


4

Mittwoch, 8. Dezember 2010, 19:04

Hallo Space,

Die Schaltung scheint die Innenbeschaltung des RX zu sein.

Du kannst RX und Sendemodul direkt mit COM am PC verbinden.

SD-Card ist eine gute Idee. Werd ich meinem Telemetiedisplay jetzt auch spendieren.
Ich habe noch einen älteren U-Blox-Empfänger. Der ist fürs Flugzeug zu träge und kommt mit ins Telemetiedisplay. Damit sollte sich eine Modell-Such-Funktion realisieren lassen.
Display wird ein EA DOGM 128x64 large mit Touch-Panel.

Gruß Sven

5

Montag, 20. Dezember 2010, 18:29

Display

Hallo,

Im obigen Code wurde ein EA-DOGM16x2 Display verwendet. Jetzt habe ich den Code geändert und benutze eine EA DOGM 128x64 Grafik-Display. Drei Schriftgrößen sind programmiert. Das Grafik-Feld rechts wird im RAM gehalten, das sonst nicht das setzen und Löschen einzelner Punkte geht. Der verwendete M16 hat leider nur 512 Byte S-Ram.

Gruß Sven
»sven.stoecker« hat folgendes Bild angehängt:
  • glcd 002.jpg

6

Samstag, 25. Dezember 2010, 10:48

Probleme

Hallo,

Ich habe eine Problem mit meinem FrSky V2.

Dem Empfänger werden Daten mit 9600,8,N,1 übergeben, ohne Flusskontrolle, und dann am Sendemodul in Päckchen verpackt wieder ausgegeben. Am Sendemodul werden ca. 4x so viele Daten ausgegeben werden als am Empfänger übergeben.

Das führt dazu, dass die NMEA-Daten mit einigen Lücken unten ankommen. Besonders bei $GPGGA gibt es Probleme, da es genau im Bereich der "Höhe" fast immer zu Lücken kommt. Dort fehlen dann 6 bis über 20 Zeichen. Es kommt kein GGA Datenpacket vollständig an! Um trotzdem Daten nutzen zu können lese ich immer 5 Zeichen "Höhe" und erhalte fast immer eine brauchbare Angabe.

Habt Ihr Erfahrungen mit FrSky? Oder Links?

Ich werde jetzt die GPS-Daten am GPS-Empfänger per M8 auswerten und die relevanten Angaben mehrfach senden. :-(

Gruß Sven

Seagull

RCLine Neu User

Beruf: Dipl. Ing.

  • Nachricht senden

7

Samstag, 25. Dezember 2010, 12:40

FrSky Protocol

Hi Sven,

vielleicht hilft Dir der Anhang?

Season’s greetings
Hartmut
»Seagull« hat folgende Datei angehängt:

8

Samstag, 25. Dezember 2010, 15:11

Protokoll

Hallo,

danke Hartmut, das hilft ein Wenig weiter.

Der entscheidende Tipp steht eigentlich im FrSky Protocol for Two Way System.doc

Notice: Pure data throughput should NOT exceed 1200bps, MAY experience BYTE DISCARD.

Wobei immer noch unklar ist wie ich dem Empfänger füttern muss, also wie groß der Puffer ist. Da wäre eine Angabe wie "Block < 100Byte" hilfreich.

Egal. Ich habe den GPS-Empfänger eben einen M8 spendiert. Das NMEA-Protokoll wird dekodiert und nur das notwendige über Telemetrie übertragen. Damit funktioniert es fehlerfrei.

Anders als erhofft (ich hätte vorher genauer lesen sollen:-( Muss ich leider feststellen

Ein GPS-Empfänger geht nicht direkt an FRSky! Es muss ein Prozessor dazwischen!

Gruß Sven

Space

RCLine User

Wohnort: Hasloh b. Hamburg

  • Nachricht senden

9

Samstag, 25. Dezember 2010, 18:32

Auszug aus dem Anhang von Hartmut:

Incoming raw User Data of a Packet are buffered. The buffer is cyclically (time
triggered) scanned and up to 6 bytes are sent in one frame. Empty buffer is never
sent.

Event: buffer written
Buffer length TBD, but at least 8 (tested) bytes.
Scan Cycle is TBD, but assumed to be H 36 ms
.

Der Buffer hat bei der V2 wohl nur 8 Byte. Wenn ich mal rechne 8 Byte alle 36ms, komme ich auf rechnerisch 2222 Bit/s (8n1) als permanenter Datenstrom.

Wenn man aber nur die 6 Byte annimmt, welche pro Frame übertragen werden, sind es nur 1666 Bit/s. Die genannten 1200 sind dann der in der üblichen Bitraten Reihung der nächste keinere Wert.

Interessantes Dokument. Hier ist auch ein eindeutigere Aussaage zur phys. Schnittstellen Parameter drinn. TTL Pegel invertiert, geht also offiziell auch.
Gruß

Thomas

10

Samstag, 25. Dezember 2010, 20:34

Hallo Space,

Mein Englisch reicht für den Ausschnitt nicht, ich kanns nicht interpretieren:-(

rein rechnerisch gebe ich dir recht. Dann hätte aber der erste Versuch total schief gehen müssen. Der Puffer ist also größer:-)

Ich verwende zwischen TTL-GPS-Empfänger und FRSky-Empfänger als auch zwischen Sendermodul und Display je einen Transistor mit 2R als Inverter. Frsky liefer von der Spannung laut Oszi TTL-Pegel.

Für die Sensoren wird es eine Timer-Interupt-gesteuerte Datenausgabe. Der Prozessor hat sonst nicht viel zu tun:-)

Der Touchpanel von DOGM arbeitet perfekt. Einfach an 4ADC Ports angeschlossen. Beim aktiven ADC den Pull-Up ein...

Jetzt werde ich mal die Anzeige etwas "aufräumen" und paar Sensoren entwerfen:-)
Sonst wird es dieses Jahr noch langweilig:-)

Viele Grüße Sven

ja, in Kürze dokumentiere ich die Projekte auf meiner HP. Dann gibt es paar Bilderchen, C-Code und Eagle-Datein.

Space

RCLine User

Wohnort: Hasloh b. Hamburg

  • Nachricht senden

11

Sonntag, 26. Dezember 2010, 00:41

Zitat

Original von sven.stoecker
ja, in Kürze dokumentiere ich die Projekte auf meiner HP. Dann gibt es paar Bilderchen, C-Code und Eagle-Datein.

Super, freue mich schon drauf... :ok:
Gruß

Thomas

Seagull

RCLine Neu User

Beruf: Dipl. Ing.

  • Nachricht senden

12

Sonntag, 26. Dezember 2010, 12:45

Mein Dashboard

Hallo Sven und Thomas,

der max. Durchsatz von 1200 baud ist in meinem Dok untergegangen, wird aber in der FrSky protocol description erwähnt. Man kann aber, wie von Space richtig getan, den max möglichen Durchsatz selbst abschätzen. Berücksichtigt man noch Reserven für „Byte Stuffing“ und Verabeitungszeiten im RX haut das mit den 1200 baud hin.

Größere Buffer als 8 Byte (resp. 8 byte pakets) haben wir, mein Sohn und ich, nicht getestet.

Mein „Dashbord“ verarbeitet beide Frame-Typen „user data“ und „receiver strength“ back to back. Mein Hub sendet eine Message , 32 byte ASCII und ein „alert level byte“ eingeschlossen in Start-Message und End-Message Chars., in 6 Paketen. Das Dashboard baut die Message wieder zusammen und sendet den ASCII-String an ein externes Display. Der „alert level“ dient zur Generierung von Audio-Alarmen.


@ Sven,
ich vermute dass dein GPS –Modul effektiv mehr als 1200 baud sendet. Somit hast Du zwangsläufig einen Datenverlust . Falls Dein Dashboard nicht „back to back“ verkraftet hast Du noch weitere Verluste. M.E. brauchst Du zwischen GPS –Modul und Rx einen Hub (uP) der den Datenfluss auf 1200 baud reduziert und ein geeignetes Message-Protokoll zur Verfügung stellt.

LG Hartmut

13

Sonntag, 26. Dezember 2010, 14:41

Sensor

Hallo Hartmut, hallo Space,

ich habe gestern die Datenreduzierung per Prozessor erfolgreich umgesetzt. Noch durch "ausmisten" der NMEA-Daten. Das ging recht einfach.
Wenn ich von ca 150 Zeichen/sec ausgehe wäre im M8 genug Speicher um die Daten 1sec zu Puffern. Die reale Puffergrüße von FrSky werde ich testen sobals es relevant wird:-)

Da vorm GPS jetzt ein M8 sitzt werde ich die NMEA-Auswertung im GPS-Sensor erledigen und die Position per eigenem Protokoll nach unten senden. Ich denke dabei an ein Protokoll mit flexiblen Datensätzen. In etwa so:

Byte Startindikator
Byte Datensatzbezeichnung, Byte Daten, Byte Daten
...
Byte Datensatzbezeichnung, Byte Daten, Byte Daten
Byte Endindikator
Prüfsumme

Wobei jeder Datensatzbezeichnung ein Messwert und Datenbyte-Anzahl fest zugeordnet wird.

z.B
1 4Byte Breitengrad
2 4Byte Längengrad
3 2Byte Höhe
4 2 Byte U1
5 2Byte U2
...

Dazu hab ich eben eine Sensor-LP entworfen. Vorerst mit GPS-Eingang, 6xADC zur Akkuüberwachung, Drehzahlmesseingang und Pegelwandler für FrSky.

Gruß Sven
»sven.stoecker« hat folgendes Bild angehängt:
  • v09 001s.jpg

14

Sonntag, 26. Dezember 2010, 20:19

Puffer

Hallo,

Meine NMEA-Ausmistroutine sende einen GGA-Datensatz von 59 Byte und nach 0,5sec einen VTG-Datensatz von 42 Byte. Der Puffer also nicht nur 8 Byte:-)

Der neue GPS-Datensatz wird nur noch 21 Byte lang und soll wie folgt aussehen:

0xaa Startkennung
0x00 GPS-Kennung
4Byte Länge
4Byte Beite
2Byte Höhe
2Byte Richtung
2Byte Speed
1Byte Status/Satellitenanzahl
3Byte Zeit
EOR

Der Datensatz 6S+ Drehzahl (Hubisensor)

0xaa Startkennung
0x00 6s-Sensor-Kennung
2Byte U1
2Byte U2
2Byte U3
2Byte U4
2Byte U5
2Byte U6
2 Byte Drehzahl
EOR

Wobei immer 0xffff für ungenutzte Werte steht.

Mein obiger Sensor schickt wenn notwendig 2 verschiedene Datensätze.
Die Hardware ist einsatzbereit. Am 1.1 ist Testfliegen. Bis dahin muss die neue Software funktionieren:-)

Meinungen, Vorschläge?

Gruß Sven

15

Montag, 27. Dezember 2010, 17:20

Mrpm

Hallo,

Der MRPM-Messung, ADC-Messung und das oben beschriebene "Hubisensor Datenformat" habe ich für den Sensor umgesetzt. Für den MRPM reicht eine 1R+1Z-Diode als Eingangsbeschaltung.

Fürs Display wird noch die Rotordrehzahl berechnet. Der Sensor für den 450er ist einsatzbereit.

Viele grüße Sven
»sven.stoecker« hat folgendes Bild angehängt:
  • v09s.jpg

Space

RCLine User

Wohnort: Hasloh b. Hamburg

  • Nachricht senden

16

Mittwoch, 29. Dezember 2010, 15:32

Respekt, wie schnell du zu einem vorzeigbaren Ergebnis kommst :ok:

Ich stelle mir gerade die Frage, was du mit dem Touchpanel vor hast?

Und die MRPM Messung erfolgt an einer Phases des Brushless Motors?
Gruß

Thomas

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Space« (29. Dezember 2010, 15:37)


17

Mittwoch, 29. Dezember 2010, 23:07

Touch

Hallo Space,

das Touchpanel ersetzt die Taster. z.Z wird mit ganz rechts bzw ganz links aufs Display tippen zwischen verschiedenen Anzeigen gewechselt.
Da wäre:
1. Einschatbildschirm mit Rssi, U1,U2 als Balken und etwas Eigenwerbung:-)
2. wie auf dem Bild für meinen 450er RSSi, Zelle1, Zelle2, Zelle3 und Drehzahl
3. Rssi und 6 Zellen
4. GPS-Pos
5. Speed, Entfernung, Höhe relativ zum Startpunkt.

Wenn keine GPS-Daten kommen wird Anzeige 4 und 5 gesperrt.
die Drehzahlmessung erfolgt per Motorphase wie bei Jeti-Telemetrie beschrieben.

Es gibt noch genügend Programmstellen an denen "gefeilt" werden muss.

Gruß Sven

18

Montag, 3. Januar 2011, 22:14

Fertig wirds nie:-)

Hi,

Sensor, Datenübertragung und Display sind "fertig" zum Test im Flugmodell.

Der Sensor hat 3 Funktionen: MRPM, 6S-Akkuüberwachnung und GPS-Eingang.
Am Display kann man zwischen 6 Anzeigen per Touchpanel wechseln.

Eine Dokumentation des Projektes gibt in paar Tagen auf meiner HP.

Gruß Sven
»sven.stoecker« hat folgendes Bild angehängt:
  • G-Box 004.jpg

19

Montag, 3. Januar 2011, 22:15

Akkustatistik
»sven.stoecker« hat folgendes Bild angehängt:
  • G-Box 003.jpg

20

Montag, 3. Januar 2011, 22:16

GPS
»sven.stoecker« hat folgendes Bild angehängt:
  • G-Box 002.jpg