NAZA OSD für ca. 20$

Status
Nicht offen für weitere Antworten.

JR63

Erfahrener Benutzer
Prima!
Die Horizont Geschichte gehts jetzt klasse mit den Pullups.


Eine Sache ist mir noch aufgefallen. Nach aufspielen deines Codes kann ich keine Character Files mehr aufspielen, hatte das vorher vergessen und musste jetzt nochmal die Orig Firmware aufspielen damit das klappte.
Dann wieder deine drauf und alles schaut so aus wie es soll. Toll!

Summensignal folgt dann demnächst auch.

Supi!


Das mit den Character Files hatte ich auch mal aber mit meinem anderen Projekt minRXOSD für mein Scherrer-LRS-RX OSD.

Beim minNAZAOSD hatte ich das noch nicht, werde das aber mal genau beobachten.


Wenn das mit dem Summensignal klappt, kannst Du mir dann bitte den Code senden? Dann kann ich den einchecken.


Und vielen Dank für Dein Feedback, das macht den minNAZAOSD Code rund und den Nachbau für Andere leichter.


Tschö
JR
 
Was hältst du denn davon?

NazaInt.h
Code:
#define PWM_PIN_SUM		7			// use pin 11 = PD7 = PCINT23	for throttle
#define PIN_READ_SUM		(PIND & 0b10000000)	// faster than digitalRead
#define CALL_CHECK_SUM		(port == 2 && mask & 0b10000000)	// call check macro
#define SUM_CH_THROTTLE			3			// throttle channel
#define SUM_CH_SCREENSITCH	        6			// screenswitch channel
NazaInt.ino
Code:
volatile long sum_start;				// start time
volatile long sum_pulse		= 1100;		        // pulse duration
volatile byte sum_nr = 0;				// start ch.

void int_sum(void) {
	if (PIN_READ_SUM)
		sum_start = micros();				// positive edge: start
	else 
		sum_pulse = micros() - sum_start;		// negative edge: calculate pulsewidth

        if (sum_pulse > 3000 || sum_nr > 14) 
              sum_nr = 0;  
        else {
              if (sum_nr == SUM_CH_THROTTLE)
                    throttle_pulse = pulseLength;  
               else if (sum_nr == SUM_CH_SCREENSWITCH)
                    screenswitch_pulse = pulseLength;  
              sum_nr++;
        }
          
}

void naza_int_init(void)
{
  	pinMode(PWM_PIN_SUM, INPUT);
	digitalWrite(PWM_PIN_SUM, HIGH);				// turn on pullup resistor
	PCattachInterrupt(PWM_PIN_SUM, int_sum, CHANGE);
...
Denke das werde ich heute abend ma testen, mal sehen wie ich das per IFDEF rein bekomme, bin in C nicht so fit.
 

JR63

Erfahrener Benutzer
Hi,

das sieht absolut sauber aus.


Zu 'mal sehen wie ich das per IFDEF rein bekomme' köntest Du noch im h file eine Auswahl per define einführen:

Code:
#define USE_SUM_SIGNAL

und dann im naza_int_init von dem define USE_SUM_SIGNAL abhängig entscheiden ob Summensignal oder 'normal' benutzt werden soll:

Code:
void naza_int_init(void)
{
#ifdef USE_SUM_SIGNAL
    pinMode(PWM_PIN_SUM, INPUT);
    digitalWrite(PWM_PIN_SUM, HIGH);                // turn on pullup resistor
    PCattachInterrupt(PWM_PIN_SUM, int_sum, CHANGE);
#else
    pinMode(PWM_PIN_THROTTLE, INPUT);
    digitalWrite(PWM_PIN_THROTTLE, HIGH);                // turn on pullup resistor
    PCattachInterrupt(PWM_PIN_THROTTLE, int_throttle, CHANGE);
    
    pinMode(PWM_PIN_SCREENSWITCH, INPUT);
    digitalWrite(PWM_PIN_SCREENSWITCH, HIGH);            // turn on pullup resistor
    PCattachInterrupt(PWM_PIN_SCREENSWITCH, int_screenswitch, CHANGE);
#endif
    pinMode(PWM_PIN_GIMBAL_F1, INPUT);
    digitalWrite(PWM_PIN_GIMBAL_F1, HIGH);                // turn on pullup resistor
    PCattachInterrupt(PWM_PIN_GIMBAL_F1, int_gimbal_f1, CHANGE);
    
    pinMode(PWM_PIN_GIMBAL_F2, INPUT);
    digitalWrite(PWM_PIN_GIMBAL_F2, HIGH);                // turn on pullup resistor
    PCattachInterrupt(PWM_PIN_GIMBAL_F2, int_gimbal_f2, CHANGE);
}


Tschö
JR
 

JR63

Erfahrener Benutzer
eine Kleinigkeit habe ich noch entdeckt:


sum_pulse anstatt pulseLength:


Code:
void int_sum(void) {
    if (PIN_READ_SUM)
        sum_start = micros();                // positive edge: start
    else 
        sum_pulse = micros() - sum_start;        // negative edge: calculate pulsewidth

        if (sum_pulse > 3000 || sum_nr > 14) 
              sum_nr = 0;  
        else {
              if (sum_nr == SUM_CH_THROTTLE)
                    throttle_pulse = sum_pulse;  
               else if (sum_nr == SUM_CH_SCREENSWITCH)
                    screenswitch_pulse = sum_pulse;  
              sum_nr++;
        }
}
 

JR63

Erfahrener Benutzer
Oh ja, danke, wäre beim kompilieren aufgefallen ;_)
jo, sowas merkt immer der phantasielose Compiler ;-)



Zum testen werde ich dann einfach mal throttle anzeigen lassen. ?
ja, da gibt es ja ein panel welches das throttle von 0-100% anzeigt.

Wenn die Werte nicht von 0-100% gehen weil andere Pulslängen als 1100-1900 im TX eingestellt sind, kannst Du die Pulslängen im h File noch anpassen:

Code:
#define THROTTLE_LOWEST            1100            // trim throttle lowest here
#define THROTTLE_HIGHEST        1900            // trim throttle highest here

Man kann sich dazu die Pulslängen auch anzeigen lassen wenn man folgendes einkommentiert:

Code:
#define NAZA_INT_DEBUG


Wie funktioniert das Umschalten mit dem Schaltkanal? Oben Screen1, unten Screen2 oder so?

ja, je nachdem wo Dein Schalter min und max hat.

Es gibt 3 Screens:

screen 1 wie im Konfig tool definiert

screen 2 wie im Konfig tool definiert

screen 3 keine Anzeige (oder wenn JR_SPECIAL definiert ist lat und lon in der 1. Zeile)


Tschö
JR
 

Karsten J.

Erfahrener Benutzer
Mann Mann Mann... ihr haut euch hier Codes um die Ohren, von dem Normal-Sterbliche keine Ahnung haben.... Einfach mal ein schnelles "RESPEKT" von mir :D
 

JR63

Erfahrener Benutzer
Mann Mann Mann... ihr haut euch hier Codes um die Ohren, von dem Normal-Sterbliche keine Ahnung haben.... Einfach mal ein schnelles "RESPEKT" von mir :D

Danke :)


Um das minNAZAOSD nachzubauen muss man dann aber auch nicht mehr coden können, sondern nur noch die gewünschte Variante durch ein/auskommentieren von ein paar #defines zusammenstellen (z.B. welcher GPS Typ) und dann compilieren.

Einen Link auf einen guten Einstieg ins Arduino Compilieren habe ich hier mal angegeben:

http://code.google.com/p/minnazaosd/wiki/Compiling

Das sollte nach ein wenig Einarbeitung ganz gut möglich sein.

Viele machen das ja auch z.B. bei der BruGi Firmware für das Martinez Board.

Geht hier im Prinzip genauso.

Tschö
JR
 
Beim Arduino ist es ja echt kein Problem.
Wer BruGi und Multiwii kann der kommt auch damit klar.
Projekt in Arduino Öffnen, GPS-Typ Einkommentieren und Upload drücken.

Evtl. könnte man wenns soweit "fertig" ist auch hex files für die GPS-Typen anbieten, dann kann man sie direkt übers OSD-Config Tool flashen.
 
So, der summensignal-code läuft soweit, nur was mich wundert ist das ich sowohl bei throttle als auch beim screenswitch nur Werte zwischen 600 und 1600 bekomme, es müssten aber 1000-2000 sein.
Wenn ich einfach 400 addiere passt soweit alles, ist nur die Frage warum...ob die ISR evtl zu lang ist mit meinem neuen code?

Zumindest funzt es so mal. Mehr dann ein andermal.

Kannst es ja mal so einbauen wenn du willst.

Anhang anzeigen NazaInt.zip
 

muerzi

Erfahrener Benutzer
Codeupload über config tool sollte kein problem sein.
Muss man halt vorcompilieren und auf google code uploaden. Das config tool soll sich dann die hex downloaden und via dropdown kann man dann wählen.

Bin e schon fleißig am basteln im config tool
 

JR63

Erfahrener Benutzer
So, der summensignal-code läuft soweit, nur was mich wundert ist das ich sowohl bei throttle als auch beim screenswitch nur Werte zwischen 600 und 1600 bekomme, es müssten aber 1000-2000 sein.
Wenn ich einfach 400 addiere passt soweit alles, ist nur die Frage warum...ob die ISR evtl zu lang ist mit meinem neuen code?

Zumindest funzt es so mal. Mehr dann ein andermal.

Kannst es ja mal so einbauen wenn du willst.

Anhang anzeigen 72633
cool, Danke für den Code, werde ich übernehmen.

Ist ja komisch mit den 600 bis 1600, bei Gelegenheit werde ich mir mal mit einem Oszi ansehen was meine PPM RXe ausgeben, ich habe Simprop GigaScan 5 und Scherrer RXe, damit kann ich es mal checken und mit dem vergleichen was mit Deinem Code dabei herauskommt.

Hast Du ein Oszi mit dem Du evtl. mal die PPM des RX checken kannst?

Tschö
JR
 
Hast Du ein Oszi mit dem Du evtl. mal die PPM des RX checken kannst?
Ja, hab n kleines Spielzeugoszi und ein Uraltes Analog ;_)
Bin mir ziemlich sicher das 1000-2000 rauskommen, wird ja im Multiwii, Naze32, Naza und Co auch so angezeigt.
Muss also an meinem Code liegen....

Code:
void int_sum(void) {
	if (PIN_READ_SUM)
		sum_start = micros();				// positive edge: start
	else {
    	  sum_pulse = micros() - sum_start;		// negative edge: calculate pulsewidth
  
          if (sum_pulse > 3000 || sum_nr > 14)
                sum_nr = 1;  
          else {
                if (sum_nr == SUM_CH_THROTTLE) 
                  throttle_pulse = sum_pulse;  
                else if (sum_nr == SUM_CH_SCREENSWITCH) 
                  screenswitch_pulse = sum_pulse; 
                sum_nr++;
          }
        }
        
}
Sehe aber da jetzt kein Problem.

Wenn ich richtig recherchiert habe dann hat FrSky eine Lücke (LOW) von 400ms nach jedem Kanal. Das würde ja den fehlenden 400ms entsprechen bei mir, nur verstehen tu ich es trotzdem nicht...
 
Zuletzt bearbeitet:

JR63

Erfahrener Benutzer
Ja, hab n kleines Spielzeugoszi und ein Uraltes Analog ;_)
Bin mir ziemlich sicher das 1000-2000 rauskommen, wird ja im Multiwii, Naze32, Naza und Co auch so angezeigt.
Muss also an meinem Code liegen....



Sehe aber da jetzt kein Problem.
ja komisch, werde ich mir bei Gelegenheit mal ansehen, kann aber so am Code auch erstmal nix Auffälliges sehen.
 
Hah, glaub ich habs, es Wird beim Summensignal die Lücke, sprich der LOW bereich mit gemessen:



Das würde dann bei mir genau den fehlenden 400ms entsprechen. Sprich ich müsste von positiver zu positiver Flanke messen.

Schaut im Multiwii Code auch so aus.
 
Zuletzt bearbeitet:

JR63

Erfahrener Benutzer
So sollte es ja dann gehen:

Code:
void int_sum(void) {
    if (PIN_READ_SUM) {  // positive edge
         sum_pulse = micros() - sum_start;		// calculate pulsewidth
         sum_start = micros();				// restart

         if (sum_pulse > 3000 || sum_nr > 14)
             sum_nr = 1;  
         else {
             if (sum_nr == SUM_CH_THROTTLE) 
                 throttle_pulse = sum_pulse;  
             else if (sum_nr == SUM_CH_SCREENSWITCH) 
                 screenswitch_pulse = sum_pulse; 
             sum_nr++;
          }
    }
}
 
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten