Welche Steckerbelegung hast du denn verwendet? Ich hab Probleme meinen an der T14 gebunden zu bekomme.hubidrops hat geschrieben:So, bei mir läuft jetzt alles SUPER!!!!![]()
T12FG Im Computer Modus am MCPX V2, was kann`s schöneres geben als die Blumen im Wohnzimmer zu stutzen.![]()
![]()
![]()
Eigenbau Spektrum Modul für Futaba T8
#436 Re: Eigenbau Spektrum Modul für Futaba T8
___________________________________________________________
Suzi-Hans, Henseleit MP-XL-E, Furion 6, Schlüter HeliBaby Baujahr 1975
Suzi-Hans, Henseleit MP-XL-E, Furion 6, Schlüter HeliBaby Baujahr 1975
#437 Eigenbau Spektrum Modul für Multiplex Royal
Hallo,
mein Modul (für meine Multiplex Royal 9) ist auch fertig und die ersten Flüge habe ich erfolgreich mit dem Blade MCPX V2 hinter mich gebracht.
Die Zuordnung der Kanäle hat bei mir ein paar Versuche geschluckt:
1-Roll - revese
2-Nick
3-Gas
4-Gear - reverse (Wichtig beim Binden im Computersendermode)
5- -
6-Pitch
Den Sender habe ich im Computersendermode neu gebunden, damit die Regler auch initalisieren.
Als Gehäuse habe ich zufällig eines gefunden , das unter dem Stützbügel mit der richtigen Spannung einrastet und daher mit nur einem Griff montierbar und wieder abnehmbar ist. Als Antennenhülle habe ich die Antenne einer alten Fritzbox genommen.
Mein "MPX Diodenkabel" habe ich steckbar ausgeführt, so das ich mit einem Adapterkabel ggf. auch andere Sender oder auch die geschlachtete DX4e anschließen kann. Da mein Gehäuse auch groß genug war habe ich den Arduino und das AMTX11 steckbar auf der Lochstreifenplatine.
Bilder:
Danke an alle für die super Vorlage !!!!
Gruß
Claus
mein Modul (für meine Multiplex Royal 9) ist auch fertig und die ersten Flüge habe ich erfolgreich mit dem Blade MCPX V2 hinter mich gebracht.
Die Zuordnung der Kanäle hat bei mir ein paar Versuche geschluckt:
1-Roll - revese
2-Nick
3-Gas
4-Gear - reverse (Wichtig beim Binden im Computersendermode)
5- -
6-Pitch
Den Sender habe ich im Computersendermode neu gebunden, damit die Regler auch initalisieren.
Als Gehäuse habe ich zufällig eines gefunden , das unter dem Stützbügel mit der richtigen Spannung einrastet und daher mit nur einem Griff montierbar und wieder abnehmbar ist. Als Antennenhülle habe ich die Antenne einer alten Fritzbox genommen.
Mein "MPX Diodenkabel" habe ich steckbar ausgeführt, so das ich mit einem Adapterkabel ggf. auch andere Sender oder auch die geschlachtete DX4e anschließen kann. Da mein Gehäuse auch groß genug war habe ich den Arduino und das AMTX11 steckbar auf der Lochstreifenplatine.
Bilder:
Danke an alle für die super Vorlage !!!!
Gruß
Claus
MPX Profi TX 16
... und alles was damit zum fliegen gebracht werden kann ...
... und alles was damit zum fliegen gebracht werden kann ...
#438 Re: Eigenbau Spektrum Modul für Futaba T8
Steckerbelegung? Na, die in dem Schaltplan angegeben ist.cobra hat geschrieben:Welche Steckerbelegung hast du denn verwendet? Ich hab Probleme meinen an der T14 gebunden zu bekomme.hubidrops hat geschrieben:So, bei mir läuft jetzt alles SUPER!!!!![]()
T12FG Im Computer Modus am MCPX V2, was kann`s schöneres geben als die Blumen im Wohnzimmer zu stutzen.![]()
![]()
![]()

Du schaust aber bei der Zeichnung von hinten auf den Stecker

Wenn Du binden willst aber auf jeden Fall in den Schülermodus gehen, sonst geht hier nichts (DSC-Modus)


Beim binden jetzt nur noch beim Einschalten Bindeknopf drücken, nach ca. 2 Sek. den Loslassen und den Heckrotor nach rechts steuern und halten bis der Bindevorgang abgeschlossen ist.

Ich werde demnächst im Sketch 3 und 6 tauschen, dann brauch ich es nicht in der Funke machen.

Ach so, ich habe alle Kanäle auf Rev. bei Futaba stehen, ist besonders beim Heckrotor wichtig, ansonsten klappt das Binden im Computermodus nicht!!!!!
Ich fliege Mode 4 Pitch gezogen. Jaja, spart euch die Kommentare

Nun viel Spaß damit!

#439 Re: Eigenbau Spektrum Modul für Futaba T8
Hallo,
habe mir jetzt auch ein Spektrum-Modul für meine T8 gebaut. Habe aber folgendes Problem. Nach dem einschalten (Schalter hängt zwischen 4 und 5 vor der Diode) brennt die rote Led am Gehäuse permanent, die grüne Led sagt nichts. Die rote Led auf dem Arduino leuchtet auch und die grüne blinkt. Kann den Heli binden, der aber in kürzester Zeit die Bindung wieder verliert. Habe schon alles kontrolliert, das HF-Modul gegen ein anders getauscht, den Taster getauscht, die Firmware mehrmals geflasht usw. Habe jetzt leider keine Ahnung mehr woran es liegen könnte...habt Ihr eine Idee? Vielleicht der Arduino selber.....?
Danke
Gruß Roger
habe mir jetzt auch ein Spektrum-Modul für meine T8 gebaut. Habe aber folgendes Problem. Nach dem einschalten (Schalter hängt zwischen 4 und 5 vor der Diode) brennt die rote Led am Gehäuse permanent, die grüne Led sagt nichts. Die rote Led auf dem Arduino leuchtet auch und die grüne blinkt. Kann den Heli binden, der aber in kürzester Zeit die Bindung wieder verliert. Habe schon alles kontrolliert, das HF-Modul gegen ein anders getauscht, den Taster getauscht, die Firmware mehrmals geflasht usw. Habe jetzt leider keine Ahnung mehr woran es liegen könnte...habt Ihr eine Idee? Vielleicht der Arduino selber.....?
Danke
Gruß Roger
Blade 300X mit YGE60
Spektrum DX8
Spektrum DX8
#440 Re: Eigenbau Spektrum Modul für Futaba T8
Hallo Roger.
Hast Du die T8 auf Trainer geschaltet?
Du kannst auch mal in dem Sketch den Debug-Mode aktivieren. Wenn Du dann den FTDI ansteckst und in der Arduinosoftware das Terminal anschaltest, dann kannst Du sehen, ob der Arduino arbeitet und Daten vom Sender bekommt. Denke daran die richtige Baudrate einzustellen.
Hast Du die T8 auf Trainer geschaltet?
Du kannst auch mal in dem Sketch den Debug-Mode aktivieren. Wenn Du dann den FTDI ansteckst und in der Arduinosoftware das Terminal anschaltest, dann kannst Du sehen, ob der Arduino arbeitet und Daten vom Sender bekommt. Denke daran die richtige Baudrate einzustellen.
#441 Re: Eigenbau Spektrum Modul für Futaba T8
Auf jeden Fall geht die T8 automatisch an wenn ich den Schalter betätige und das HF-Modul ist aus.....die LED an der T8 blinkt. Meinst Du das oder kann man noch etwas einstellen am Sender?
Das mit dem Degub-Mode habe ich auch schon gelesen. Muss ich alle Kabel dazu ablöten oder kann ich das so anschließen?
Danke
Gruß Roger
Das mit dem Degub-Mode habe ich auch schon gelesen. Muss ich alle Kabel dazu ablöten oder kann ich das so anschließen?
Danke
Gruß Roger
Blade 300X mit YGE60
Spektrum DX8
Spektrum DX8
#442 Re: Eigenbau Spektrum Modul für Futaba T8
so ins blaue geraten würde ich sagen Pin 1 anstatt Pin 3 erwischt ... Bei der T8 ist die Buchse verdreht eingebaut , das PPM in also PIN8 am Arduino muss auf PIN 3 der T8 in dem Falle ganz unten rechts!Havet hat geschrieben: brennt die rote Led am Gehäuse permanent
Wenn die Rote LED leuchtet, liegt kein PPM Signal an. Dass der Heli Bindet und danach die Bindung verliert ist genau dieses Verhalten.
grüße Michael
----------------------------------------------------------
Flying is the best fun you can have - with your pants on
T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten
----------------------------------------------------------
Flying is the best fun you can have - with your pants on

T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten
#443 Re: Eigenbau Spektrum Modul für Futaba T8
Nein muss nichts abgelötet werden. Einfach das FTDI-Modul anstecken und Debug enablen.Havet hat geschrieben:Das mit dem Degub-Mode habe ich auch schon gelesen. Muss ich alle Kabel dazu ablöten oder kann ich das so anschließen?
#444 Re: Eigenbau Spektrum Modul für Futaba T8
Hallo Michael,
habe mal meinen Stecker geöffnet und ein Foto gemacht. Habe es nach dem beigefügten Schema angeschlossen. Am Stecker war Pol 3 und 2 (GND) schon verkabelt....wurde ja als Simkabel gekauft. Habe dann nur die Lötbrücke 4/5 geöffnet und den Schalter eingelötet.
Danke
Gruß Roger
habe mal meinen Stecker geöffnet und ein Foto gemacht. Habe es nach dem beigefügten Schema angeschlossen. Am Stecker war Pol 3 und 2 (GND) schon verkabelt....wurde ja als Simkabel gekauft. Habe dann nur die Lötbrücke 4/5 geöffnet und den Schalter eingelötet.
Danke
Gruß Roger
- Dateianhänge
-
- DSCF3763.JPG (84.41 KiB) 2436 mal betrachtet
Zuletzt geändert von Havet am 03.02.2012 14:30:50, insgesamt 1-mal geändert.
Blade 300X mit YGE60
Spektrum DX8
Spektrum DX8
#445 Re: Eigenbau Spektrum Modul für Futaba T8
OK ,
welchen Arduino hast du ? 16 oder 8 Mhz ?
und dann , welchen Sketch?
Btw. bitte das erste Bild nur verlinken wenns nicht deins ist!
welchen Arduino hast du ? 16 oder 8 Mhz ?
und dann , welchen Sketch?
Btw. bitte das erste Bild nur verlinken wenns nicht deins ist!
grüße Michael
----------------------------------------------------------
Flying is the best fun you can have - with your pants on
T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten
----------------------------------------------------------
Flying is the best fun you can have - with your pants on

T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten
#446 Re: Eigenbau Spektrum Modul für Futaba T8
Geordert habe ich die 8Mhz Version mit 3,3 Volt....kann man das überprüfen?
Sketch ist dieser:
/*
PPM to DSM v1.07 - June 2011
Sends DSM2 signal using low power MLP4DSM Spektrum TX module
Based on the code by daniel_arg, modifications by AS aka c2po.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*#include "WProgram.h"*/
#include <avr/interrupt.h>
#define DE_BUG // Change this to #define DEBUG if needed
typedef enum {
NULL_ST = -1, NOT_SYNCHED, ACQUIRING, READY, FAILSAFE
} State_t;
#define TICKS_PER_uS 1 // number of timer ticks per 1 microsecond with prescaler = 8 and CPU 8MHz
#define MAX_CHANNELS 8 // maximum number of channels we can store, don't increase this above 8
#define MIN_IN_PULSE ( 750 * TICKS_PER_uS) // valid pulse must be at least 750us
#define MAX_IN_PULSE (2250 * TICKS_PER_uS) // valid pulse must be less than 2250us
#define SYNC_GAP_LEN (5000 * TICKS_PER_uS) // we assume a space at least 5000us is sync
#define VALID_FRAMES 10 // must have this many consecutive valid frames to transition to the ready state.
#define DSM2_CHANNELS 6 // Max number of DSM2 Channels transmitted
#define BINDING_PIN 4 // Pin used to bind
#define BINDING_LED 5 // Pin used for Binding in process LED
#define PPM_OK_LED 6 // Pin used for PPM Ok signal LED
#define RF_OK_PIN 7 // Pin used for RF Ok signal
#define GREEN_LED 13 // Pin used for board LED
#define FLASH_LED 250 // LED flash interval in ms
static int Pulses[ MAX_CHANNELS + 1]; // array holding channel pulses width value in microseconds
static int Failsafe[MAX_CHANNELS + 1]; // array holding channel fail safe values
static byte ChannelNum; // number of channels detected so far in the frame (first channel is 1)
static byte ChannelCnt; // the total number of channels detected in a complete frame
static State_t State; // this will be one of the following states: Null, Not_Synched, Acquiring, Ready, Failsafe
static byte stateCount; // counts the number of times this state has been repeated
static byte DSM2_Header[2];
static byte DSM2_Channel[DSM2_CHANNELS*2] = {0x00,0xAA,0x05,0xFF,0x09,0xFF,0x0D,0xFF,0x13,0x54,0x14,0xAA};
static byte DSM2_Sent = 0;
static byte ChanIndex[] = {3,1,2,4,5,6}; //PPM to DSM2 Channel Mapping Table
static byte count;
static int pulse;
/* ---------- ---------- ---------- Sync ---------- ---------- ---------- */
static void processSync() { // sync pulse was detected so reset the channel to first and update the system state
Pulses[0] = ICR1 / TICKS_PER_uS; // save the sync pulse duration for debugging
if(State == READY) {
if( ChannelNum != ChannelCnt) // if the number of channels is unstable, go into failsafe
State = FAILSAFE;
}
else {
if(State == NOT_SYNCHED) {
State = ACQUIRING; // this is the first sync pulse, we need one more to fill the channel data array
stateCount = 0;
} else {
if( State == ACQUIRING) {
if(++stateCount > VALID_FRAMES) {
State = READY; // this is the second sync and all channel data is ok so flag that channel data is valid
ChannelCnt = ChannelNum; // save the number of channels detected
}
} else
if( State == FAILSAFE) {
if(ChannelNum == ChannelCnt) // did we get good pulses on all channels?
State = READY;
}
}
}
ChannelNum = 0; // reset the channel counter
}
/* ---------- ---------- ---------- Interrupt ---------- ---------- ---------- */
ISR(TIMER1_OVF_vect) {
if(State == READY) {
State = FAILSAFE; // use fail safe values if signal lost
ChannelNum = 0; // reset the channel count
}
}
ISR(TIMER1_CAPT_vect) { // we want to measure the time to the end of the pulse
TCNT1 = 0; // reset the counter
if(ICR1 >= SYNC_GAP_LEN) // is the space between pulses big enough to be the SYNC
processSync();
else
if(ChannelNum < MAX_CHANNELS) { // check if its a valid channel pulse and save it
if((ICR1 >= MIN_IN_PULSE) && (ICR1 <= MAX_IN_PULSE)) // check for valid channel data
Pulses[++ChannelNum] = ICR1 / TICKS_PER_uS; // store pulse length as microseconds
else
if(State == READY) {
State = FAILSAFE; // use fail safe values if input data invalid
ChannelNum = 0; // reset the channel count
}
}
}
/* ---------- ---------- ---------- Class ---------- ---------- ---------- */
class PPM_Decode {
public:
PPM_Decode() { // Constructor
// empty
}
void begin() {
pinMode(8, INPUT); // Timer1 interrupt handler uses pin 8 as input, do not change it
ChannelNum = 0;
State = NOT_SYNCHED;
TCCR1A = 0x00; // COM1A1=0, COM1A0=0 => Disconnect Pin OC1 from Timer/Counter 1
// PWM11=0, PWM10=0 => PWM Operation disabled
// TCCR1B = (1<<ICES1) | (1<<CS11); // capture using rising edge, prescaler = 8
TCCR1B = (1<<CS11); // capture using falling edge, prescaler = 8
// 8MHz clock with prescaler 8 means TCNT1 increments every 1 uS
TIMSK1 = _BV(ICIE1)|_BV (TOIE1); // enable input capture and overflow interrupts for timer 1
for(byte ch = 1; ch <= MAX_CHANNELS; ch++) {
Failsafe[ch] = Pulses[ch] = 1500; // set midpoint as default values for pulses and failsafe
}
Failsafe[3] = Pulses[3] = 1100; // set channel 3 failsafe pulse width to min throttle
}
State_t getState() {
return State;
}
byte getChannelCnt() {
return ChannelCnt;
}
void setFailsafe(byte ch, int value) { // pulse width to use if invalid data, value of 0 uses last valid data
if((ch > 0) && (ch <= MAX_CHANNELS))
Failsafe[ch] = value;
}
void setFailsafe() { // setFailsafe with no arguments sets failsafe for all channels to their current values
if(State == READY) // useful to capture current tx settings as failsafe values
for(byte ch = 1; ch <= MAX_CHANNELS; ch++)
Failsafe[ch] = Pulses[ch];
}
int getChannelData(uint8_t channel) { // this is the access function for channel data
int result = 0; // default value
if(channel <= MAX_CHANNELS) {
if((State == FAILSAFE) && (Failsafe[channel] > 0 ))
result = Failsafe[channel]; // return the channels failsafe value if set and State is Failsafe
else
if((State == READY) || (State == FAILSAFE)) {
cli(); // disable interrupts
result = Pulses[channel]; // return the last valid pulse width for this channel
sei(); // enable interrupts
}
}
return result;
}
};
PPM_Decode Receiver = PPM_Decode();
void setup() {
delay(100);
#ifdef DEBUG
Serial.begin(115200); // print values on the screen
#else
Serial.begin(125000); // closest speed for DSM2 module, otherwise it won't work
#endif
Receiver.begin();
pinMode(BINDING_PIN, INPUT);
pinMode(BINDING_LED, OUTPUT);
pinMode(PPM_OK_LED, OUTPUT);
pinMode(RF_OK_PIN, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
delay(100);
DSM2_Header[0] = 0x80;
DSM2_Header[1] = 0;
digitalWrite(BINDING_LED, HIGH); // turn on the binding LED
while(digitalRead(BINDING_PIN) == LOW) { // if bind button pressed at the power up
if(millis()%FLASH_LED > FLASH_LED/2)
digitalWrite(BINDING_LED, HIGH); // flash binding LED
else
digitalWrite(BINDING_LED, LOW);
sendDSM2();
delay(20);
}
digitalWrite(BINDING_LED,LOW); // turn off the binding LED
DSM2_Header[0] = 0;
count = 50;
while(Receiver.getState() != READY && count-- > 0) // wait 5 sec or until PPM data is stable and ready
delay(100);
}
void loop() {
if(millis()%(FLASH_LED*4) < FLASH_LED/16)
digitalWrite(GREEN_LED, HIGH); // flash the board LED - we are alive
else
digitalWrite(GREEN_LED, LOW);
if(Receiver.getState() == READY) { // if PPM is ready
if(millis()%(FLASH_LED*4) < FLASH_LED/16)
digitalWrite(PPM_OK_LED, HIGH); // flash the PPM OK LED
else
digitalWrite(PPM_OK_LED, LOW);
digitalWrite(BINDING_LED, LOW); // turn off binding LED
digitalWrite(RF_OK_PIN, LOW); // turn on RF OK LED in the radio
} else {
digitalWrite(BINDING_LED, HIGH); // turn on binding LED
digitalWrite(PPM_OK_LED, LOW); // turn off the PPM OK LED
digitalWrite(RF_OK_PIN, HIGH); // turn off RF OK LED in the radio, alarm will sound
}
if(Receiver.getState() == READY || Receiver.getState() == FAILSAFE) {
if(ChannelNum == 0 || ChannelNum == ChannelCnt) { // during sync pulse or in failsafe
if(DSM2_Sent == 0) { // if DSM2 frame is not sent yet
for (byte i=0; i<DSM2_CHANNELS; i++) { // get receiver data
pulse = Receiver.getChannelData(ChanIndex) - 1000;
pulse = constrain(pulse, 0, 0x3FF);
DSM2_Channel[i*2] = (byte)(i<<2) | highByte(pulse);
DSM2_Channel[i*2+1] = lowByte(pulse);
}
sendDSM2(); // send frame
DSM2_Sent = 1; // frame sent flag
} else {
if(Receiver.getState() == FAILSAFE) {
delay(20); // in case of failsafe
DSM2_Sent = 0; // reset flag after delay
}
}
} else {
if(ChannelNum == 1) // after first channel is received
DSM2_Sent = 0; // reset flag for the next frame
}
}
}
#ifndef DEBUG
void sendDSM2() {
Serial.write(DSM2_Header, 2);
Serial.write(DSM2_Channel, DSM2_CHANNELS*2);
}
#else
void sendDSM2() {
Serial.print(DSM2_Header[0], HEX);
Serial.print(" ");
Serial.print(DSM2_Header[1], HEX);
Serial.print(" ");
for(byte i=0; i < DSM2_CHANNELS; i++) { // print channels 1 to 6 in Hex and Dec
serialPrintHex(DSM2_Channel[i*2]);
Serial.print(" ");
serialPrintHex(DSM2_Channel[i*2+1]);
Serial.print(" (");
Serial.print((DSM2_Channel[i*2]&0x03)<<8 | DSM2_Channel[i*2+1], DEC);
Serial.print(") ");
}
Serial.print(Receiver.getChannelData(7), DEC); // channel 7
Serial.print(" ");
Serial.print(Receiver.getChannelData(8), DEC); // channel 8
Serial.print(" ");
Serial.print(Receiver.getChannelData(0), DEC); // sync pulse length
Serial.print(" ");
Serial.println(" ");
delay(200);
}
void serialPrintHex(byte b) {
byte b1 = (b >> 4) & 0x0F;
byte b2 = (b & 0x0F);
char c1 = (b1 < 10) ? ('0' + b1) : 'A' + b1 - 10;
char c2 = (b2 < 10) ? ('0' + b2) : 'A' + b2 - 10;
Serial.print(c1);
Serial.print(c2);
}
#endif
Sketch ist dieser:
/*
PPM to DSM v1.07 - June 2011
Sends DSM2 signal using low power MLP4DSM Spektrum TX module
Based on the code by daniel_arg, modifications by AS aka c2po.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*#include "WProgram.h"*/
#include <avr/interrupt.h>
#define DE_BUG // Change this to #define DEBUG if needed
typedef enum {
NULL_ST = -1, NOT_SYNCHED, ACQUIRING, READY, FAILSAFE
} State_t;
#define TICKS_PER_uS 1 // number of timer ticks per 1 microsecond with prescaler = 8 and CPU 8MHz
#define MAX_CHANNELS 8 // maximum number of channels we can store, don't increase this above 8
#define MIN_IN_PULSE ( 750 * TICKS_PER_uS) // valid pulse must be at least 750us
#define MAX_IN_PULSE (2250 * TICKS_PER_uS) // valid pulse must be less than 2250us
#define SYNC_GAP_LEN (5000 * TICKS_PER_uS) // we assume a space at least 5000us is sync
#define VALID_FRAMES 10 // must have this many consecutive valid frames to transition to the ready state.
#define DSM2_CHANNELS 6 // Max number of DSM2 Channels transmitted
#define BINDING_PIN 4 // Pin used to bind
#define BINDING_LED 5 // Pin used for Binding in process LED
#define PPM_OK_LED 6 // Pin used for PPM Ok signal LED
#define RF_OK_PIN 7 // Pin used for RF Ok signal
#define GREEN_LED 13 // Pin used for board LED
#define FLASH_LED 250 // LED flash interval in ms
static int Pulses[ MAX_CHANNELS + 1]; // array holding channel pulses width value in microseconds
static int Failsafe[MAX_CHANNELS + 1]; // array holding channel fail safe values
static byte ChannelNum; // number of channels detected so far in the frame (first channel is 1)
static byte ChannelCnt; // the total number of channels detected in a complete frame
static State_t State; // this will be one of the following states: Null, Not_Synched, Acquiring, Ready, Failsafe
static byte stateCount; // counts the number of times this state has been repeated
static byte DSM2_Header[2];
static byte DSM2_Channel[DSM2_CHANNELS*2] = {0x00,0xAA,0x05,0xFF,0x09,0xFF,0x0D,0xFF,0x13,0x54,0x14,0xAA};
static byte DSM2_Sent = 0;
static byte ChanIndex[] = {3,1,2,4,5,6}; //PPM to DSM2 Channel Mapping Table
static byte count;
static int pulse;
/* ---------- ---------- ---------- Sync ---------- ---------- ---------- */
static void processSync() { // sync pulse was detected so reset the channel to first and update the system state
Pulses[0] = ICR1 / TICKS_PER_uS; // save the sync pulse duration for debugging
if(State == READY) {
if( ChannelNum != ChannelCnt) // if the number of channels is unstable, go into failsafe
State = FAILSAFE;
}
else {
if(State == NOT_SYNCHED) {
State = ACQUIRING; // this is the first sync pulse, we need one more to fill the channel data array
stateCount = 0;
} else {
if( State == ACQUIRING) {
if(++stateCount > VALID_FRAMES) {
State = READY; // this is the second sync and all channel data is ok so flag that channel data is valid
ChannelCnt = ChannelNum; // save the number of channels detected
}
} else
if( State == FAILSAFE) {
if(ChannelNum == ChannelCnt) // did we get good pulses on all channels?
State = READY;
}
}
}
ChannelNum = 0; // reset the channel counter
}
/* ---------- ---------- ---------- Interrupt ---------- ---------- ---------- */
ISR(TIMER1_OVF_vect) {
if(State == READY) {
State = FAILSAFE; // use fail safe values if signal lost
ChannelNum = 0; // reset the channel count
}
}
ISR(TIMER1_CAPT_vect) { // we want to measure the time to the end of the pulse
TCNT1 = 0; // reset the counter
if(ICR1 >= SYNC_GAP_LEN) // is the space between pulses big enough to be the SYNC
processSync();
else
if(ChannelNum < MAX_CHANNELS) { // check if its a valid channel pulse and save it
if((ICR1 >= MIN_IN_PULSE) && (ICR1 <= MAX_IN_PULSE)) // check for valid channel data
Pulses[++ChannelNum] = ICR1 / TICKS_PER_uS; // store pulse length as microseconds
else
if(State == READY) {
State = FAILSAFE; // use fail safe values if input data invalid
ChannelNum = 0; // reset the channel count
}
}
}
/* ---------- ---------- ---------- Class ---------- ---------- ---------- */
class PPM_Decode {
public:
PPM_Decode() { // Constructor
// empty
}
void begin() {
pinMode(8, INPUT); // Timer1 interrupt handler uses pin 8 as input, do not change it
ChannelNum = 0;
State = NOT_SYNCHED;
TCCR1A = 0x00; // COM1A1=0, COM1A0=0 => Disconnect Pin OC1 from Timer/Counter 1
// PWM11=0, PWM10=0 => PWM Operation disabled
// TCCR1B = (1<<ICES1) | (1<<CS11); // capture using rising edge, prescaler = 8
TCCR1B = (1<<CS11); // capture using falling edge, prescaler = 8
// 8MHz clock with prescaler 8 means TCNT1 increments every 1 uS
TIMSK1 = _BV(ICIE1)|_BV (TOIE1); // enable input capture and overflow interrupts for timer 1
for(byte ch = 1; ch <= MAX_CHANNELS; ch++) {
Failsafe[ch] = Pulses[ch] = 1500; // set midpoint as default values for pulses and failsafe
}
Failsafe[3] = Pulses[3] = 1100; // set channel 3 failsafe pulse width to min throttle
}
State_t getState() {
return State;
}
byte getChannelCnt() {
return ChannelCnt;
}
void setFailsafe(byte ch, int value) { // pulse width to use if invalid data, value of 0 uses last valid data
if((ch > 0) && (ch <= MAX_CHANNELS))
Failsafe[ch] = value;
}
void setFailsafe() { // setFailsafe with no arguments sets failsafe for all channels to their current values
if(State == READY) // useful to capture current tx settings as failsafe values
for(byte ch = 1; ch <= MAX_CHANNELS; ch++)
Failsafe[ch] = Pulses[ch];
}
int getChannelData(uint8_t channel) { // this is the access function for channel data
int result = 0; // default value
if(channel <= MAX_CHANNELS) {
if((State == FAILSAFE) && (Failsafe[channel] > 0 ))
result = Failsafe[channel]; // return the channels failsafe value if set and State is Failsafe
else
if((State == READY) || (State == FAILSAFE)) {
cli(); // disable interrupts
result = Pulses[channel]; // return the last valid pulse width for this channel
sei(); // enable interrupts
}
}
return result;
}
};
PPM_Decode Receiver = PPM_Decode();
void setup() {
delay(100);
#ifdef DEBUG
Serial.begin(115200); // print values on the screen
#else
Serial.begin(125000); // closest speed for DSM2 module, otherwise it won't work
#endif
Receiver.begin();
pinMode(BINDING_PIN, INPUT);
pinMode(BINDING_LED, OUTPUT);
pinMode(PPM_OK_LED, OUTPUT);
pinMode(RF_OK_PIN, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
delay(100);
DSM2_Header[0] = 0x80;
DSM2_Header[1] = 0;
digitalWrite(BINDING_LED, HIGH); // turn on the binding LED
while(digitalRead(BINDING_PIN) == LOW) { // if bind button pressed at the power up
if(millis()%FLASH_LED > FLASH_LED/2)
digitalWrite(BINDING_LED, HIGH); // flash binding LED
else
digitalWrite(BINDING_LED, LOW);
sendDSM2();
delay(20);
}
digitalWrite(BINDING_LED,LOW); // turn off the binding LED
DSM2_Header[0] = 0;
count = 50;
while(Receiver.getState() != READY && count-- > 0) // wait 5 sec or until PPM data is stable and ready
delay(100);
}
void loop() {
if(millis()%(FLASH_LED*4) < FLASH_LED/16)
digitalWrite(GREEN_LED, HIGH); // flash the board LED - we are alive
else
digitalWrite(GREEN_LED, LOW);
if(Receiver.getState() == READY) { // if PPM is ready
if(millis()%(FLASH_LED*4) < FLASH_LED/16)
digitalWrite(PPM_OK_LED, HIGH); // flash the PPM OK LED
else
digitalWrite(PPM_OK_LED, LOW);
digitalWrite(BINDING_LED, LOW); // turn off binding LED
digitalWrite(RF_OK_PIN, LOW); // turn on RF OK LED in the radio
} else {
digitalWrite(BINDING_LED, HIGH); // turn on binding LED
digitalWrite(PPM_OK_LED, LOW); // turn off the PPM OK LED
digitalWrite(RF_OK_PIN, HIGH); // turn off RF OK LED in the radio, alarm will sound
}
if(Receiver.getState() == READY || Receiver.getState() == FAILSAFE) {
if(ChannelNum == 0 || ChannelNum == ChannelCnt) { // during sync pulse or in failsafe
if(DSM2_Sent == 0) { // if DSM2 frame is not sent yet
for (byte i=0; i<DSM2_CHANNELS; i++) { // get receiver data
pulse = Receiver.getChannelData(ChanIndex) - 1000;
pulse = constrain(pulse, 0, 0x3FF);
DSM2_Channel[i*2] = (byte)(i<<2) | highByte(pulse);
DSM2_Channel[i*2+1] = lowByte(pulse);
}
sendDSM2(); // send frame
DSM2_Sent = 1; // frame sent flag
} else {
if(Receiver.getState() == FAILSAFE) {
delay(20); // in case of failsafe
DSM2_Sent = 0; // reset flag after delay
}
}
} else {
if(ChannelNum == 1) // after first channel is received
DSM2_Sent = 0; // reset flag for the next frame
}
}
}
#ifndef DEBUG
void sendDSM2() {
Serial.write(DSM2_Header, 2);
Serial.write(DSM2_Channel, DSM2_CHANNELS*2);
}
#else
void sendDSM2() {
Serial.print(DSM2_Header[0], HEX);
Serial.print(" ");
Serial.print(DSM2_Header[1], HEX);
Serial.print(" ");
for(byte i=0; i < DSM2_CHANNELS; i++) { // print channels 1 to 6 in Hex and Dec
serialPrintHex(DSM2_Channel[i*2]);
Serial.print(" ");
serialPrintHex(DSM2_Channel[i*2+1]);
Serial.print(" (");
Serial.print((DSM2_Channel[i*2]&0x03)<<8 | DSM2_Channel[i*2+1], DEC);
Serial.print(") ");
}
Serial.print(Receiver.getChannelData(7), DEC); // channel 7
Serial.print(" ");
Serial.print(Receiver.getChannelData(8), DEC); // channel 8
Serial.print(" ");
Serial.print(Receiver.getChannelData(0), DEC); // sync pulse length
Serial.print(" ");
Serial.println(" ");
delay(200);
}
void serialPrintHex(byte b) {
byte b1 = (b >> 4) & 0x0F;
byte b2 = (b & 0x0F);
char c1 = (b1 < 10) ? ('0' + b1) : 'A' + b1 - 10;
char c2 = (b2 < 10) ? ('0' + b2) : 'A' + b2 - 10;
Serial.print(c1);
Serial.print(c2);
}
#endif
Blade 300X mit YGE60
Spektrum DX8
Spektrum DX8
#447 Re: Eigenbau Spektrum Modul für Futaba T8
Hier ein Bild von meinem Arduino....
- Dateianhänge
-
- DSCF3764.JPG (360.5 KiB) 2411 mal betrachtet
Blade 300X mit YGE60
Spektrum DX8
Spektrum DX8
#448 Re: Eigenbau Spektrum Modul für Futaba T8
welches HF Modul hast du verwendet?
Das kleine aus ner LP4DSM oder aus der DX4e ?
Zeig mal da nochn Bild...
Das kleine aus ner LP4DSM oder aus der DX4e ?
Zeig mal da nochn Bild...
grüße Michael
----------------------------------------------------------
Flying is the best fun you can have - with your pants on
T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten
----------------------------------------------------------
Flying is the best fun you can have - with your pants on

T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten
#449 Re: Eigenbau Spektrum Modul für Futaba T8
Es läuft....habe mal einen anderen Sketch raufgezogen und danch nochmal den PPMtoDSM...........war das eine schwere Geburt. Danke für den Beistand und eurer Hilfe.
Habe trotzdem noch eine Frage. Mein Modul wird über einen Schalter aktiviert und der Sender geht automatisch in den Schüler-Modus. Wenn ich den Sender zuerst anmache ohne das Modul zu starten springt das Modul ja immer mit an. Kann man das unterbinden? Ist warscheinlich beim fliegen mit dem Fasst System nicht nötig das Modul abzuschalten aber schöner fände ich es
Gruß Roger
Habe trotzdem noch eine Frage. Mein Modul wird über einen Schalter aktiviert und der Sender geht automatisch in den Schüler-Modus. Wenn ich den Sender zuerst anmache ohne das Modul zu starten springt das Modul ja immer mit an. Kann man das unterbinden? Ist warscheinlich beim fliegen mit dem Fasst System nicht nötig das Modul abzuschalten aber schöner fände ich es

Gruß Roger
- Dateianhänge
-
- 03022012738.jpg (1004.44 KiB) 2349 mal betrachtet
Zuletzt geändert von Havet am 03.02.2012 18:00:08, insgesamt 4-mal geändert.
Blade 300X mit YGE60
Spektrum DX8
Spektrum DX8
#450 Re: Eigenbau Spektrum Modul für Futaba T8
na also 

grüße Michael
----------------------------------------------------------
Flying is the best fun you can have - with your pants on
T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten
----------------------------------------------------------
Flying is the best fun you can have - with your pants on

T8FG mit SpeckDrumm MOD/ T9CP,MCPx @T8FG SpeckDrumm,TT Mini Titan FBL ,GAUI EP200 FBL,
TREX 500 FBL, suche Sponsor für MicroBeast Test ....
Status: Rundflug mit Kunstflugeinlagen manchmal Tic und weniger Toc
Besucht uns auf HeliChat.de - Von Helipiloten für Helipiloten