OpenLRS mit 434Mhz Long Range System

Status
Nicht offen für weitere Antworten.

sunny

Well-known member
Dirk hatte zu der ganzen Problematik ein paar Fakten im FT Forum geschrieben.
Als Dank für die Anregungen von Dirk, wurden seine Beiträge von Mr.F gelöscht.
Mein Account wurde einfach gelöscht und alle Beiträge ebenso.

Auch eine Art mit Kunden umzugehen!
 

Rangarid

Erfahrener Benutzer
So, ich guck mir grad den PPM-Code an. Warum basteln leute eigentlich was in Arduino, wenn sie die Arduino Funktionen aber nicht benutzen? Dann hätte man das ganze genauso gut auch mit nem normalen AVR machen können...

Hier mal der Code zum PPM-auslesen:
Code:
ISR(PPM_Signal_Interrupt){

unsigned int time_temp;
unsigned int servo_temp;
unsigned int servo_temp2;

if (PPM_Signal_Edge_Check) // Only works with rising edge of the signal
		    {
			time_temp = TCNT1; // read the timer1 value
                        TCNT1 = 0; // reset the timer1 value for next
			if (channel_no<14) channel_no++; 
                        
					
			if (time_temp > 8000) // new frame detection : >4ms LOW
				{	
				channel_count = channel_no;
				channel_no = 0;
				transmitted = 0;                               
				}
                                else
                                {
                                if ((time_temp>1500) && (time_temp<4500)) // check the signal time and update the channel if it is between 750us-2250us
                                  {
                                  //Servo_Buffer[(2*channel_no)-1] = (byte) (time_temp >> 8); // write the high byte of the value into the servo value buffer.
			          //Servo_Buffer[2*channel_no] =  (byte) (time_temp); // write the low byte of the value into the servo value buffer.                                    
                                  SetServoPos(channel_no-1,time_temp);
                                  }
                               }
			}

}
bei mir sieht der so aus:
Code:
  //wait for PPM frame to start
  while(pulseIn(input, HIGH) < 4000){} 
  //Read the pulses of the channels
  for(int i = 0; i < channelcount; i++) 
  {
    in[i] = pulseIn(input, HIGH);
  }
Bissl übersichtlicher....und ich hab keine Zucker bei mir drin...Iss bissl schwer zu lesen der Code, weil ich bisher nur die Arduino Sachen genutzt habe und nicht diese ganzen AVR typischen Zuweisungen...

Aufjedenfall voll seltsam, dass dem seine Timer Werte anscheinend doppelt so groß sind wie der Wert den er erwartet...Ich blick da grad noch nich so ganz durch...muss mir das mal nochmal genauer angucken...
 
Aufjedenfall voll seltsam, dass dem seine Timer Werte anscheinend doppelt so groß sind wie der Wert den er erwartet...Ich blick da grad noch nich so ganz durch...muss mir das mal nochmal genauer angucken...
Die sind nicht doppelt so groß, wie er erwartet!
Der µC läuft mit 16MHzs.
Der Timer läuft Vorteiler 8, also 2MHz / 0,5µs Schrittweite, da ist ein 1500ms Puls halt 3000 Ticks groß.

StompSC
 

mulder.fbi

Erfahrener Benutzer
Rangarid hat gesagt.:
Code:
  //wait for PPM frame to start
  while(pulseIn(input, HIGH) < 4000){} 
  //Read the pulses of the channels
  for(int i = 0; i < channelcount; i++) 
  {
    in[i] = pulseIn(input, HIGH);
  }
Misst du damit nicht einfach nur die Zeit der Impulse? Du musst doch die Zeit der Pausen messen ;) Und wie stellst du sicher das du den nächsten Frame wieder erwischst?
 

Rangarid

Erfahrener Benutzer
Code:
//wait for PPM frame to start
  while(pulseIn(input, HIGH) < 4000){}
  //Read the pulses of the channels
  for(int i = 0; i < channelcount; i++)
  {
    in[i] = pulseIn(input, HIGH);
  }

Hier sieht man ganz gut ein PPM-Signal. Die Länge des Startpuls bekommt man, indem man hier von den 22,5ms die Anzahl der Kanäle*2 abzieht (z.B. 8*2ms) und einmal 2ms für den Endpuls (hier zu sehen das LOW nach der 8). Ich Messe den Puls HIGH (siehe z.B. bei der 1), der hat die Länge 1.7ms, dann rechne ich die 0.3ms von dem LOW dazu, komme also auf gesamt 2ms --> Vollausschlag, die minimale Länge des Startimpulses ist also 22,5 - 8*2 - 2 = 4.5ms.

in = pulseIn(input, HIGH); macht also nichts anderes als die Länge von dem HIGH zurückzugeben. Intern rechne ich dann noch die 0.3ms drauf, die Länge des Impulses ist ja immer gleich lang. die while Schleife wartet auf den Start eines PPM-Frames, indem es einfach solange in der Schleife bleibt, bis ein Signal > 4ms gefunden wird.

Ist halt schwierig beim Aufbau vom PPM, da ich im Internet überall verschiedene Infos zum PPM finde. Der eine sagt das HIGH ist 0.3ms und der Rest dann maximal 1.7ms und der andere sagt das HIGH ist 0.5ms und der Rest maximal 1.5ms. Der eine sagt auch ein PPM-Frame ist 20ms, der andere sagt 22,5ms...Bei meiner Wfly z.B. ist das HIGH ~400ms. Eigentlich seltsam, da PPM ja standardisiert ist...Aber vielleicht red ich auch grad voll Bockmist...wäre mal an einer Seite interessiert, die PPM erklärt mit den Werten wie es wirklich sein soll. Ich habs bei meiner Funke halt ausprobiert und es funktioniert so.

Vor allem weißt ja nicht genau wie viele Pulse das Frame hat, is ja verschieden von Funke zu Funke.
Naja man kann sich das leben schwerer machen als man muss. Ich hab bei mir einfach in der config.h festgelegt, dass es 8 Kanäle sind. Wenn jemand mehr braucht kann er einfach ne 10 drausmachen. Funktioniert dann genauso, wenn das PPM-Signal soviele Kanäle hergibt.
 

mulder.fbi

Erfahrener Benutzer
Aber pulseIn(input, HIGH) wartet doch auf einen LOW->HIGH Übergang, startet dann den Timer und stoppt beim nächsten HIGH->LOW Übergang. Somit misst der Code doch nur die 0.5ms Peaks, oder hab ich gerade voll die Hirnblockade??? ;)
 

Rangarid

Erfahrener Benutzer
Ja, meins war invertiert...Naja ich weiß nich wer grad hier falsch denkt, ob du oder ich, jedenfalls funktioniert der Code...^^ Aber lest meinen Post nochmal, hab ihn geändert, leichter verständlich gemacht.
 

Rangarid

Erfahrener Benutzer
Dann ist ja gut :D...puh ich dacht grad ich red hier nurnoch Mist..^^

Code:
  #if defined(PPM_INVERTED)
  //wait for PPM frame to start
  while(pulseIn(input, HIGH) < 3000){} 
  //Read the pulses of the channels
  unsigned long time = millis();
  for(int i = 0; i < channelcount; i++) 
  {
    in[i] = pulseIn(input, HIGH);
  }
  #endif
  #if defined(PPM_NORMAL)
  //wait for PPM frame to start
  while(pulseIn(input, LOW) < 3000){} 
  //Read the pulses of the channels
  for(int i = 0; i < channelcount; i++) 
  {
    in[i] = pulseIn(input, LOW);
  }
  #endif
Vielleicht hätt ich es so posten sollen, dann hätteste es gesehn :D


Jetzt brauch ich aber trotzdem noch ne richtige Erläuterung von PPM...was iss denn nu richtig? Die 0.5ms oder die 0.3ms oder die 0.4ms wie bei meiner Wfly???
 

Rangarid

Erfahrener Benutzer
Vielleicht können wir ja das OLRS einfach in einer FPV-Community-Version neu programmieren. Ich würde gerne mithelfen. Die Funktionen für das Sendemodul können wir gerne beibehalten, den Rest machen wir aber neu?
 

Rangarid

Erfahrener Benutzer
Ich hab nen SVN-Server, wenn du willst mach ich dir ein Repo und helf dir dabei. Kannst ja mal grad in Chat kommen, dann reden wir drüber. Dann können wir direkt i2c mäßig meinen Headtracker den ich am bauen bin integrieren :D
 
Moin moin aus dem sonnigen Norden Deutschlands!

Ich war bereits kurz vor dem Bestücken meines Selbstgeätzten Open LRS bis ich auf euch gestoßen bin. Wenn ich es richtig verstehe, gibt es einige grundlegende Schwierigkeiten mit der technischen Zuverlässigkeit des OLRS.
Wenn ich mich recht an einige Inhalte in diesem Monsterthread erinnere kommen mir folgende Dinge wieder hoch:

1. Der Atmega328 bekommt für seine Taktung zu wenig Spannung (3,3V statt mindestens 4,5V bei 16Mhz).

2. Man sollte außerdem einen Kondensator (>400uF ??) vor den Atmega setzen damit er nicht schlapp macht

3. Software muss angepasst werden damit Das Servozittern ein Ende hat und das RSSI vernünftig dargestellt werden kann.

Bei flytron existiert seit ein paar Tagen eine V2 des OLRS. Aber ich bin mir nicht so ganz sicher wieviel sich geändert hat. Momentan mache ich noch einen auf 35Mhz aber langsam bin ich nicht mehr gewillt da noch ein Modell mit zu riskieren. Hier wo ich wohne ist ziemlich tote Hose was Funkanwendungen betrifft und außer ein paar Kühen, kann ich hier auch niemandem auf den Kopf fallen. Daher verspreche ich mir eine Zuverlässige Verbindung bis absolut maximal 3km. Mehr braucht man eh nicht um Spaß beim FPV zu haben.

@Mulder.fbi: Was hast du vor? Es scheint genau das zu sein was wir alle brauchen. Vllt dürfen wir es nicht aber wir brauchen es trotzdem =).
Ich bin jedenfalls gespannt wie ein Flitzebogen. Im aktuellen Frequenznutzungsplan für 08/2011 der BNA, ist als Eintrag 223005 die Fernsteuerung von Modellen vermerkt. 433,0875 - 434,7625 MHZ mit 500mW ERP und 25kHz Kanalraster. Zivile nutzung.

Viele Grüße!
 
ps: Auf dem Datenblatt (http://www.flytron.com/pdf/OpenLRS_RX2.pdf) des V2 Empfängers findet man weder einen dicken Kondensator für den Atmega, noch wird auf die Sache mit der etwas niedrigen Versorgungsspannung bei vorliegender Taktrate des Atmega eingegangen.
 
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten