Go Down

Topic: Spektrum Sat. Empfänger am 2650 (Read 1 time) previous topic - next topic

microller

hi


ich habe mal wieder ein kleines Proplem . Ich habe folgenden code um einen Spektrum Sataliten Empfänger auszuwerten :
Code: [Select]

#include <SatelliteRecive.h>
#include <Servo.h>

#define ledPin 13
SatelliteRecive reciver;
Servo myServo;
int time = 0;

void setup(){
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  myServo.attach(3);
}

void loop()
{
  if (Serial.available() > 0) {
    reciver.regByte(Serial.read());
  }
  // Will fail after a while. Maby to high baudrate. Could use SoftwareSerial for this dump to pc.
  if(millis() - time > 100){
    Serial.print(reciver.getThro());
    Serial.print("\t");
    Serial.print(reciver.getAile());
    Serial.print("\t");
    Serial.print(reciver.getElev());
    Serial.print("\t");
    Serial.print(reciver.getRudd());
    Serial.print("\t");
    Serial.print(reciver.getGear());
    Serial.print("\t");
    Serial.print(reciver.getFlap());
    Serial.println();
 
    time = millis();
  }
 
 
  myServo.write(map(reciver.getAile(),RXMIN,RXMAX,0,179));
 
  if(reciver.getGear() > RXCENTER) digitalWrite(ledPin,1);
  else digitalWrite(ledPin,0);
 
}


Der code funktioniert ohne Propleme auf meinem mini pro , allerdings nicht auf dem 2650 ... meine Vermutung ist das man im code noch angeben muss an welchen der 4 uarts des 2650 der Empfänger dran hängt.
jetzt zu meiner Frage : wie bestimme ich den Uart andem der Empfänger dran kommt ? bzw. ist überhaupt das , das proplem warum es nicht geht ?

ich hoffe ihr könnt mir helfen

MfG   



uwefed

Serial ist der erste UART, der über den ATmega8U2 mit der USB-Schnittstele verbunden ist.
Seriel1 ist die 2te UART usw. siehe http://arduino.cc/en/Reference/Serial.

Der Mini PRO hat kein USB-Iinterface und die Pins 0 und 1 sind frei.
Versuch mal den Satelitenempfänger am MEGA den UAR2 mit Serial1 an den ppins 19 (RX) und 18 (TX).
Sonst habe ich keine Ahnung was das Problem sein könnte.
Grüße Uwe

 

microller

#2
Mar 05, 2011, 11:48 pm Last Edit: Mar 05, 2011, 11:57 pm by microller Reason: 1
hi

ich hab schon alle 3 uarts getestet aber bei keinem geht es .
muss ich wenn ich uart2 (seriel1) nutzen möchte noch was im code ändern ?

MfG


edit :
so hab jezt nochmal den code geändert .... so sollte es gehen oder ? werde es morgen testen


Code: [Select]

#include <SatelliteRecive.h>
#include <Servo.h>

#define ledPin 13
SatelliteRecive reciver;
Servo myServo;
int time = 0;

void setup(){
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  myServo.attach(3);
}

void loop()
{
  if (Serial1.available() > 0) {
    reciver.regByte(Serial1.read());
  }
  // Will fail after a while. Maby to high baudrate. Could use SoftwareSerial for this dump to pc.
  if(millis() - time > 100){
    Serial.print(reciver.getThro());
    Serial.print("\t");
    Serial.print(reciver.getAile());
    Serial.print("\t");
    Serial.print(reciver.getElev());
    Serial.print("\t");
    Serial.print(reciver.getRudd());
    Serial.print("\t");
    Serial.print(reciver.getGear());
    Serial.print("\t");
    Serial.print(reciver.getFlap());
    Serial.println();
 
    time = millis();
  }
 
 
  myServo.write(map(reciver.getAile(),RXMIN,RXMAX,0,179));
 
  if(reciver.getGear() > RXCENTER) digitalWrite(ledPin,1);
  else digitalWrite(ledPin,0);
 
}

uwefed

Überall wo Serial steht mußt Du Serial1 schreiben;
also Serial1.begin ecc.
Grüeß Uwe

microller

hi

so habs hinbekommen ... jezt gehts :)

hier der code falls jemand ihn nutzen möchte :

Code: [Select]

#include <SatelliteRecive.h>
#include <Servo.h>

#define ledPin 13
SatelliteRecive reciver;
Servo myServo;
int time = 0;

void setup(){
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  Serial1.begin(115200);
  myServo.attach(3);
}

void loop()
{
  if (Serial1.available() > 0) {
    reciver.regByte(Serial1.read());
  }
 
  if(millis() - time > 100){
    Serial.print(reciver.getThro());
    Serial.print("\t");
    Serial.print(reciver.getAile());
    Serial.print("\t");
    Serial.print(reciver.getElev());
    Serial.print("\t");
    Serial.print(reciver.getRudd());
    Serial.print("\t");
    Serial.print(reciver.getGear());
    Serial.print("\t");
    Serial.print(reciver.getFlap());
    Serial.println();
 
    time = millis();
  }
 
 
  myServo.write(map(reciver.getAile(),RXMIN,RXMAX,0,179));
 
  if(reciver.getGear() > RXCENTER) digitalWrite(ledPin,1);
  else digitalWrite(ledPin,0);
 
}

uwefed


microller

hi

so der code funzt 1A ... allerdings hängt er sich manchmal auf wenn ich beide uarts gleichzeitig nutze . aber das ist erstmal nebensache !

ich hab noch eine andere frage :
weiss jemand wie das Protokoll des satempfänger´s aussieht oder kann mir jemand sagen wie ich das was an seriell 2 ankommt an seriell 1 ausgebe ?

mit
serial.println(serial2);

funktioniert es nicht 

MfG

uwefed

#7
Mar 07, 2011, 07:07 pm Last Edit: Mar 07, 2011, 09:32 pm by uwefed Reason: 1
Quote
mit serial.println(serial2); funktioniert es nicht  

Glaube ich Dir gerne
So müßte es gehen:
Code: [Select]
if (Serial2.available() > 0) {
   serial.print(Serial2.read());
 }


2 Auchtungen:
* Habs nicht ausprobiert;
* Auf diese Weise kanst Du die Daten nicht mitlesen; alles was an serial2 reinkommt wird an serial rausgeschrieben und ist somit gleich wieder verschwunden.
Zur Datenanalyse reichts aber.

Grüße Uwe

microller

hi 


danke :)
werde es nachher mal testen ...

Schönen Abend noch

microller

hi

hab mal eine frage :

unzwar habe ich den code jezt auf 5 kanäle erweitert , und gebe sie einzeln  als servo singnal aus .
Jezt möchte ich das ganze als Summensingnal ausgeben , kann mir jemand sagen wie ich das ganze programmiere bzw kann mir jemand ein code beispiel geben ?

were super

Danke


Schönen Abend noch 

uwefed

Was verstehst Du unter Summensingnal?
Grüße Uwe

microller

hi
summensingnal ist ein singnal was aus den einzelnen kanälen besteht bsp . :


     
Summensingnal :
      +---+  +--+  +------+  +-+
      |    | |    | |        | |  |
  ---+    +-+    +-+        +-+  +----------------



                 +---+
  Kanal 1     |    |
             ---+    +---------------------------------------

                         +---+
  Kanal 2             |    |
             ----------+    +--------------------------------

                                  +------+
  Kanal 3                      |       |
             -----------------+        +---------------------

                                               +--+
  Kanal 4                                   |  |
             ----------------------------+  +----------------

also muss man die 4 kanäle auf ein singnal quetschen ....... ich hoffe ihr könnt mmir helfen

uwefed

Von welchen Pulsdauer reden wird da?
Grüße Uwe

microller

hi

hier mal ein post aus einem anderen forum (nich von mir )
Code: [Select]


Auf jedem Kanal wiederholt sich der Puls alle 20 Millisekunden aber die
Pulse sind zueinander versetzt.
Der Grund dafür ist:
Es gibt keinen Grund allen Servos einen Signalpuls anzubieten, der bei
allen Servos gleichzeitig die steigende Flanke aufweist.
Da das nicht notwendig ist, muss man auch den ganzen Aufwand dafür nicht
treiben.
Da man den Aufwand nicht treiben muss, ist die Aufteilung des
Summensignals auf die einzelnen Kanäle trivial
Trivial ist gut, da es dann zuverlässig läuft.

Um also diese 4 Kanäle wieder zu einem Summensignal zusammenzubringen,
genügt es völlig die einfach alle miteinander zu verodern und man erhält
...


               +----+ +----+ +--------+ +--+
               |    | |    | |        | |  |
            ---+    +-+    +-+        +-+  +----------------

... das Summensignal (in genau der Form, wie es über die Funkstrecke
übertragen wurde)



vllt hilft dir ja das weiter :)

uwefed

Aha Du redest von Servoansteuerung.
Du willst mehrere Kanäle auf einer Leitung übertragen und dann wieder trennen.
Da rate ich Dir eine Servosteuerung zb die von Pololu. Da mußt Du nicht die Kanäle vereinen um sie dann wieder zu trennen.
zB: http://www.watterott.com/de/Pololu-Micro-Serial-Servo-Controller?xca2d4=mrt3vd27v6b4jn5fa40m2v6ve6
oder andere für 6 bis 24 Servos.
Grüße Uwe

Go Up