NAZA OSD für ca. 20$

Status
Nicht offen für weitere Antworten.

JR63

Erfahrener Benutzer
Hi,

throttle, screen-switch und gimbal-roll sind getestet und funktionieren.

An gimbal-pitch muss ich nochmal ran, das funktioniert momentan noch nicht, wird irgendetwas mit dem interrupt mapping sein.

Auf folgender Seite ab etwa der Mitte habe ich letztens auch ein paar Bilder eingestellt auf denen man eine mögliche Variante der notwendigen Lötungen dafür sehen kann:

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


Achtung: Die Belegung hat sich etwas geändert: gimbal-pitch ist nun an Pin 2 und nicht mehr so wie hier noch dargestellt:

Solder_010.jpg


Jetzt ersteinmal gut's Nächtle....
 
Zuletzt bearbeitet:

muerzi

Erfahrener Benutzer
Ein tutorial für die tilt compensation des kompass findest du hier http://www.loveelectronics.co.uk/Tutorials/13/tilt-compensated-compass-arduino-tutorial

Um den nicht vollständig lesen zu müssen, hier die formel:
Xh = XM * cos(Pitch) + ZM * sin(Pitch)
Yh = XM * sin(Roll) * sin(Pitch) + YM * cos(Roll) - ZM * sin(Roll) * cos(Pitch)

Und nun das heading mit arctan(Yh/Xh) berechnen, fertig.

Roll und pitch holst am besten mit analogmap von den gimbal ausgängen

Code:
float CalculateHeadingTiltCompensated(MagnetometerScaled mag, AccelerometerScaled acc)
{
  // We are swapping the accelerometers axis as they are opposite to the compass the way we have them mounted.
  // We are swapping the signs axis as they are opposite.
  // Configure this for your setup.
  float accX = -acc.YAxis;
  float accY = -acc.XAxis;
  
  float rollRadians = asin(accY);
  float pitchRadians = asin(accX);
  
  // We cannot correct for tilt over 40 degrees with this algorthem, if the board is tilted as such, return 0.
  if(rollRadians > 0.78 || rollRadians < -0.78 || pitchRadians > 0.78 || pitchRadians < -0.78)
  {
    return 0;
  }
  
  // Some of these are used twice, so rather than computing them twice in the algorithem we precompute them before hand.
  float cosRoll = cos(rollRadians);
  float sinRoll = sin(rollRadians);  
  float cosPitch = cos(pitchRadians);
  float sinPitch = sin(pitchRadians);
  
  float Xh = mag.XAxis * cosPitch + mag.ZAxis * sinPitch;
  float Yh = mag.XAxis * sinRoll * sinPitch + mag.YAxis * cosRoll - mag.ZAxis * sinRoll * cosPitch;
  
  float heading = atan2(Yh, Xh);
    
  return heading;
}
 
Zuletzt bearbeitet:

JR63

Erfahrener Benutzer

JR63

Erfahrener Benutzer
Im Wiki habe ich jetzt mal den LED adaptor Widerstand von 100k auf 47k geändert, nachdem der Frickler da ja ein Problem gefunden hatte.

Heute abend messe ich dann nochmal die Werte aus und ändere dann auch die 3 #defines im Code entsprechend.

Tschö
JR
 

JR63

Erfahrener Benutzer
Hi,

kurze Info zum Gimbal-Pitch Problem.

Das liegt daran, dass der Pin den ich dafür nutze schon mit SPI SlaveSelect belegt ist und da der Atmel SPI Master spielt, muss das als Output konfiguriert sein.

Somit habe ich in meiner im Wiki gezeigten Belegung leider eine Doppelbelegung.

Daher die Gimbal Dinge ersteinmal nicht nachbauen, bis ich eine Lösung habe!


Denkbare Lösungen:

a. Checken ob man den SPI SlaveSelect ummappen kann
b. Anderen Pin für Gimbal-Pitch benutzen.


Variante b. ist aber Prio 2, da ich das schon gelötet habe, mal sehen ob Variante a. klappt, evtl. hat ja jemand einen Tipp?


Ich sage bescheid, wenn die Lösung fest steht.


Tschö
JR
 

muerzi

Erfahrener Benutzer
Hab mal gelesen das der pin immer definiert sein muss. Sonst funktioniert das spi nicht.

Mach besser variante b.

Besser b als du bringst den osd chip auser konzept...
 

JR63

Erfahrener Benutzer
Hab mal gelesen das der pin immer definiert sein muss. Sonst funktioniert das spi nicht.

Mach besser variante b.

Besser b als du bringst den osd chip auser konzept...
ja, aber wenn im master mode der pin als input definiert ist, scheint es zu reichen im Interrupt ihn wieder als master zu konfigurieren:

SPCR |= (1<<MSTR);

Rein aus Interesse probiere ich das heute abend mal aus, man wird ja nicht dümmer dadurch ;-)

Natürlich checke ich dann auch ob es die SPI Kommunikation mit dem MAX7456 stört.

Falls ja, kommt Variante b. als Fallback.

Tschö
JR
 

JR63

Erfahrener Benutzer
Ok, Plan a. hat leider nicht funktioniert, daher Fallback zu Plan b.: Verlegen von Gimbal-Pitch auf einen anderen Pin. Das ist nun der Pin 2 am Atmel geworden.

Die Belegung sieht nun so aus:

Code:
Pin  2 = PD4 = PCINT20   for gimbal F2
Pin 11 = PD7 = PCINT23   for throttle
Pin 12 = PB0 = PCINT0    for screen switching
Pin 13 = PB1 = PCINT1    for gimbal F1
Das werde ich Anfang nächster Woche auch noch in den Diagrammen im Wiki anpassen.


Die Thresholds für den LED Interpreter sind nun auch angepasst und getestet.


Tschö
JR
 

JR63

Erfahrener Benutzer
Prima! Im code ist die Änderung schon drin? Dann test ich das am we evtl mal.
jau, Code ist schon committed.

Die Diagramme im Wiki sind ersteinmal grob angepasst, kommt Montag noch eine schönere Version.

Die Tage erweitere ich noch die Variante der Kalibriersoftware, dann kann man Spannung, Strom Offset und den Strom mit throttle und screenswitch mit ener spezial Kalibriersoftware in einem Rutsch kalibrieren, wenn man throttle und screenswitch gelötet hat.

Tschö
JR
 
Evtl schau ich mir das mal an bei Gelegenheit, sollte ja nicht viel mehr Platz kosten ob ich nun einen Pulse per Interrupt einlese oder mehrere hintereinander und mit den x. rausnehme.
Könnte man ja in der Config per define aktivieren und nicht per GUI.
 

JR63

Erfahrener Benutzer
Evtl schau ich mir das mal an bei Gelegenheit, sollte ja nicht viel mehr Platz kosten ob ich nun einen Pulse per Interrupt einlese oder mehrere hintereinander und mit den x. rausnehme.
Könnte man ja in der Config per define aktivieren und nicht per GUI.
Ja, wäre super wenn Du das mal checken könntest.

Dabei sollte man aber auch mit mehr als 8 Kanälen testen.

Das soll ja, zumindest bei Futaba PPM, nicht ganz so einfach sein.

Wenn der Speicher zu knapp wird, könnte man ja z.B. auf Radar verzichten, das war ja eher mal so eine Spielerei von mir :)

Radar ist per conditional define komplett 'entfernbar'.

Tschö
JR
 

JR63

Erfahrener Benutzer
Evtl schau ich mir das mal an bei Gelegenheit, sollte ja nicht viel mehr Platz kosten ob ich nun einen Pulse per Interrupt einlese oder mehrere hintereinander und mit den x. rausnehme.
Könnte man ja in der Config per define aktivieren und nicht per GUI.

Noch ein Hinweis:

Kannst Du bitte den PPM_PIN 3 nehmen, der liegt nämlich auf dem PAL Pin auf der Rückseite vom MinimOSD und der ist dann auch für Leute lötbar, die nicht so geübt sind.

Zum Beispiel so:

Code:
#define PPM_PIN        3            // MinimOSD PAL pin
#define PPM_INT        1

#define PPM_PIN_READ    (PIND & 0b00001000)    // faster than digitalRead

Momentan habe ich da eine PWM Abfrage drauf, welche auch per conditional define abschaltbar ist.


Tschö
JR
 
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten