Fliegende Kugel

ronco

User
Hi,

seh ich auch so, mit nem Arduino und WMC sollte das kein Thema sein.

soweit so gut :P nur wie macht mann das den jetzt damit ?
habe so ein fertiges board hier liegen und hab auch schon mal in die MWC 1_8 software geguckt. ich kann aber bisher "nur" javascript und php leider noch kein c :(

mein ansatz wäre den tricopter zu nehmen. da ist yaw ja schon auf einem servo... jetzt müsste man roll und pitch noch vom throttle lösen und auch jeweils auf ein servo legen.

wenn mir hier jemand ungefähr sagen könnte wo ich da ansetzen müsste würde ich mich daran geben..


gruß

felix
 

ronco

User
sorry für den doppelpost :(

aber habe mal angefangen am code rum zu basteln ... breuchte aber hilfe .. throttle von allen axen entkoppeln hat schonmal gelappt hab auch für die anderen drei servos schon was kopiert .. aber die zeigen keine reaktion..

was mir (denke ich) noch fehlt ist, wie ich die definirten servos mit dem atomicServo verbinde..

hier meine änderungen

config.h
Code:
/* For Flying Ball */
#define FBALL


/* The type of multicopter */
//#define GIMBAL
//#define BI
//#define TRI
//#define QUADP
//#define QUADX
//#define Y4
//#define Y6
//#define HEX6
//#define HEX6X
//#define OCTOX8 //beta
//#define OCTOFLATP //beta
//#define OCTOFLATX //beta
//#define FLYING_WING //experimental

...
...
#define YAW_DIRECTION 1 // if you want to reverse the yaw correction direction
//#define YAW_DIRECTION -1

#define PITCH_DIRECTION 1 // if you want to reverse the pitch correction direction <- neu von mir
//#define YAW_DIRECTION -1

#define ROLL_DIRECTION 1 // if you want to reverse the roll correction direction <- neu von mir
//#define YAW_DIRECTION -1
...
...

/* you can change the tricopter servo travel here */
#define TRI_YAW_CONSTRAINT_MIN 1020
#define TRI_YAW_CONSTRAINT_MAX 2000
#define TRI_YAW_MIDDLE 1500

/* you can change the Flying Ball servo travel here */
#define FBALL_YAW_CONSTRAINT_MIN 1020
#define FBALL_YAW_CONSTRAINT_MAX 2000
#define FBALL_YAW_MIDDLE 1500

#define FBALL_PITCH_CONSTRAINT_MIN 1020
#define FBALL_PITCH_CONSTRAINT_MAX 2000
#define FBALL_PITCH_MIDDLE 1500

#define FBALL_ROLL_CONSTRAINT_MIN 1020
#define FBALL_ROLL_CONSTRAINT_MAX 2000
#define FBALL_ROLL_MIDDLE 1500

in der def.h
Code:
...
#if defined(PROMINI)
  #define LEDPIN_PINMODE             pinMode (13, OUTPUT);
  #define LEDPIN_SWITCH              PINB |= 1<<5;     //switch LEDPIN state (digital PIN 13)
  #define LEDPIN_OFF                 PORTB &= ~(1<<5);
  #define LEDPIN_ON                  PORTB |= (1<<5);
  #define BUZZERPIN_PINMODE          pinMode (8, OUTPUT);
  #define BUZZERPIN_ON               PORTB |= 1;
  #define BUZZERPIN_OFF              PORTB &= ~1;
  #define POWERPIN_PINMODE           pinMode (12, OUTPUT);
  #define POWERPIN_ON                PORTB |= 1<<4;
  #define POWERPIN_OFF               PORTB &= ~(1<<4); //switch OFF WMP, digital PIN 12
  #define I2C_PULLUPS_ENABLE         PORTC |= 1<<4; PORTC |= 1<<5;   // PIN A4&A5 (SDA&SCL)
  #define I2C_PULLUPS_DISABLE        PORTC &= ~(1<<4); PORTC &= ~(1<<5);
  #define PINMODE_LCD                pinMode(0, OUTPUT);
  #define LCDPIN_OFF                 PORTD &= ~1;
  #define LCDPIN_ON                  PORTD |= 1;
  #define STABLEPIN_PINMODE          ;
  #define STABLEPIN_ON               ;
  #define STABLEPIN_OFF              ;
 
  #define DIGITAL_SERVO_FBALL_YAW_PINMODE  pinMode(3,OUTPUT);
  #define DIGITAL_SERVO_FBALL_YAW_HIGH     PORTD |= 1<<3;
  #define DIGITAL_SERVO_FBALL_YAW_LOW      PORTD &= ~(1<<3);
  #define DIGITAL_SERVO_FBALL_ROLL_PINMODE  pinMode(10,OUTPUT); 
  #define DIGITAL_SERVO_FBALL_ROLL_HIGH     PORTD |= 1<<3;
  #define DIGITAL_SERVO_FBALL_ROLL_LOW      PORTD &= ~(1<<3);
  #define DIGITAL_SERVO_FBALL_PITCH_PINMODE  pinMode(11,OUTPUT);
  #define DIGITAL_SERVO_FBALL_PITCH_HIGH     PORTD |= 1<<3;
  #define DIGITAL_SERVO_FBALL_PITCH_LOW      PORTD &= ~(1<<3);

...
...

  #define MULTITYPE 4
#elif defined(FBALL)
  #define MULTITYPE 5 //wird zwar net klappen für die GUI aber denke gimbal kommt dem am nächsten
#elif defined(GIMBAL)

...
...

in Output

Code:
#if defined(BI) || defined(TRI) || defined(SERVO_TILT) || defined(GIMBAL) || defined(FLYING_WING) || defined(CAMTRIG) || defined(FBALL)
  #define SERVO
#endif

#if defined(GIMBAL) || defined(FLYING_WING)
  #define NUMBER_MOTOR 0
#elif defined(FBALL)
  #define NUMBER_MOTOR 1 // nur ein motor
#elif defined(BI)
  #define NUMBER_MOTOR 2
#elif defined(TRI)
  #define NUMBER_MOTOR 3
#elif defined(QUADP) || defined(QUADX) || defined(Y4)
  #define NUMBER_MOTOR 4
#elif defined(Y6) || defined(HEX6) || defined(HEX6X)
  #define NUMBER_MOTOR 6
#elif defined(OCTOX8) || defined(OCTOFLATP) || defined(OCTOFLATX)
  #define NUMBER_MOTOR 8
#endif

...
...

#if defined(SERVO)
void initializeServo() {
  #if defined(TRI)
    DIGITAL_SERVO_TRI_PINMODE
  #endif
  
  #if defined(FBALL)
    DIGITAL_SERVO_FBALL_ROLL_PINMODE
    DIGITAL_SERVO_FBALL_PITCH_PINMODE
    DIGITAL_SERVO_FBALL_YAW_PINMODE
  #endif
  
  #if defined(SERVO_TILT) || defined(GIMBAL) || defined(FLYING_WING)
    DIGITAL_TILT_ROLL_PINMODE
    DIGITAL_TILT_PITCH_PINMODE
  #endif
  #if defined(CAMTRIG)
    DIGITAL_CAM_PINMODE
  #endif
  #if defined(BI)
    DIGITAL_SERVO_TRI_PINMODE
    DIGITAL_BI_LEFT_PINMODE
  #endif
  TCCR0A = 0; // normal counting mode
  TIMSK0 |= (1<<OCIE0A); // Enable CTC interrupt
}
...
...
void mixTable() {
  int16_t maxMotor,a;
  uint8_t i,axis;

  #define PIDMIX(X,Y,Z) rcCommand[THROTTLE] + axisPID[ROLL]*X + axisPID[PITCH]*Y + YAW_DIRECTION * axisPID[YAW]*Z

  #if NUMBER_MOTOR > 3
    //prevent "yaw jump" during yaw correction
    axisPID[YAW] = constrain(axisPID[YAW],-100-abs(rcCommand[YAW]),+100+abs(rcCommand[YAW]));
  #endif
  #ifdef FBALL
    motor[0] = PIDMIX(0, 0, 0);      
    servo[0]  = constrain(FBALL_YAW_MIDDLE + YAW_DIRECTION * axisPID[YAW], FBALL_YAW_CONSTRAINT_MIN, FBALL_YAW_CONSTRAINT_MAX); //YAW
    servo[1]  = constrain(FBALL_ROLL_MIDDLE + ROLL_DIRECTION * axisPID[ROLL], FBALL_ROLL_CONSTRAINT_MIN, FBALL_ROLL_CONSTRAINT_MAX); //ROLL
    servo[2]  = constrain(FBALL_PITCH_MIDDLE + PITCH_DIRECTION * axisPID[PITCH], FBALL_PITCH_CONSTRAINT_MIN, FBALL_PITCH_CONSTRAINT_MAX); //PITCH
  #endif


ich hab nochnet ganz verstanden was diese ISR funktionen? so machen .. vllt. liegt auch da das problem

hoffe hier weiss jemmand was ich falsch mache :P vllt. tappe ich ja auch total im dunkeln -.- ist mein erster versuch in C.

gruß

felix
 

ronco

User
hmm schade :(

bin aber ein bischen vorran gekommen...

habe jetzt das yaw servo am leufen :D habe also auch rausgefunden wo ich die servos noch einragen muss nur leider giebts immer komische sachen wenn ich pitch und roll dazu tun will :(

habe auch den namen von FBALL in SINGLE geändert ... also nicht wundern ;P

in Output
Code:
...
...

ISR(TIMER0_COMPA_vect) {
  static uint8_t state = 0;
  static uint8_t count;
  if (state == 0) {
    //http://billgrundmann.wordpress.com/2009/03/03/to-use-or-not-use-writedigital/
    #if defined(TRI) || defined (BI)
      DIGITAL_SERVO_TRI_HIGH
    #endif
     /////////////////////////////////////////////////////////
    #if defined(SINGLE) //<- hier auf high
      DIGITAL_SERVO_SINGLE_YAW_HIGH
    #endif
    ///////////////////////////////////////////////////////////////////
    OCR0A+= 250; // 1000 us
    state++ ;
  } else if (state == 1) {
    OCR0A+= atomicServo[0]; // 1000 + [0-1020] us
    state++;
  } else if (state == 2) {
    #if defined(TRI) || defined (BI)
      DIGITAL_SERVO_TRI_LOW
    #endif
    ////////////////////////////////////////////////////////////////////
    #if defined(SINGLE) //<- hier auf low
      DIGITAL_SERVO_SINGLE_YAW_LOW
    #endif
    /////////////////////////////////////////////////////////////////////////////
    #if defined(BI)
      DIGITAL_BI_LEFT_HIGH
    #endif
    #if defined(SERVO_TILT) || defined(GIMBAL) || defined(FLYING_WING)
      DIGITAL_TILT_PITCH_HIGH
    #endif
    OCR0A+= 250; // 1000 us
    state++;
  } else if (state == 3) {
    OCR0A+= atomicServo[1]; // 1000 + [0-1020] us
    state++;
  } else if (state == 4) {
    #if defined(SERVO_TILT) || defined(GIMBAL) || defined(FLYING_WING)
      DIGITAL_TILT_PITCH_LOW
      DIGITAL_TILT_ROLL_HIGH      
    #endif
    #if defined(BI)
      DIGITAL_BI_LEFT_LOW
    #endif
    state++;
    OCR0A+= 250; // 1000 us
  } else if (state == 5) {
    OCR0A+= atomicServo[2]; // 1000 + [0-1020] us
    state++;
  } else if (state == 6) {
    #if defined(SERVO_TILT) || defined(GIMBAL) || defined(FLYING_WING)
      DIGITAL_TILT_ROLL_LOW
    #endif 
    #if defined(CAMTRIG)
      DIGITAL_CAM_HIGH
    #endif
    state++;
    OCR0A+= 250; // 1000 us
  } else if (state == 7) {
    OCR0A+= atomicServo[3]; // 1000 + [0-1020] us
    state++;
  } else if (state == 8) {
    #if defined(CAMTRIG)
      DIGITAL_CAM_LOW
    #endif
    count = 10; // 12 x 1000 us
    state++;
    OCR0A+= 250; // 1000 us
  } else if (state == 9) {
    if (count > 0) count--;
    else state = 0;
    OCR0A+= 250;
  }
}
#endif
habe das yaw servo ja wie das vom tri eingeordnet ... nur wenn ich jetzt pitch und roll wie z.b. DIGITAL_TILT_PITCH und ROLL einordne bleiben die servos aus und das yaw servo spinnt :(

naja werde mich da durch wursteln ;) .. über hilfe würde ich mich dennoch freuen :)


gruß

felix
 

ronco

User
wieder ein stück weiter..

kann jetzt alle achsen auf ein servo tun :S

Code:
 #define DIGITAL_SERVO_SINGLE_YAW_PINMODE  pinMode(3,OUTPUT);
  #define DIGITAL_SERVO_SINGLE_YAW_HIGH     PORTD |= 1<<11;
  #define DIGITAL_SERVO_SINGLE_YAW_LOW      PORTD &= ~(1<<11);
  #define DIGITAL_SERVO_SINGLE_ROLL_PINMODE  pinMode(10,OUTPUT); 
  #define DIGITAL_SERVO_SINGLE_ROLL_HIGH     PORTD |= 1<<10;
  #define DIGITAL_SERVO_SINGLE_ROLL_LOW      PORTD &= ~(1<<10);
  #define DIGITAL_SERVO_SINGLE_PITCH_PINMODE  pinMode(11,OUTPUT);
  #define DIGITAL_SERVO_SINGLE_PITCH_HIGH     PORTD |= 1<<3;
  #define DIGITAL_SERVO_SINGLE_PITCH_LOW      PORTD &= ~(1<<3);

immer da wo ich für low und high PORTD ... 3 vergebe gehts .. halt auch auf pin 3 nur reagieren die anderen net .... hier muss ich warscheinlich irgentwas anderes einstellen

vllt weiß ja wer was :P

gruß

felix
 

ronco

User
So habs :D

werde am WE mal sowas bauen und testen .. die GUI wurd wohl nicht dammit funktionieren .. aber mal sehn.. wenn noch jemmand testen will einfach ne PN mit der email an mich .. das ist leider zu groß ums hier hochzuladen.

die lösung

Code:
  #define DIGITAL_SERVO_SINGLE_YAW_PINMODE  pinMode(3,OUTPUT);
  #define DIGITAL_SERVO_SINGLE_YAW_HIGH     PORTD |= 1<<3;
  #define DIGITAL_SERVO_SINGLE_YAW_LOW      PORTD &= ~(1<<3);
  #define DIGITAL_SERVO_SINGLE_ROLL_PINMODE  pinMode(10,OUTPUT); 
  #define DIGITAL_SERVO_SINGLE_ROLL_HIGH     PORTB |= 1<<2;
  #define DIGITAL_SERVO_SINGLE_ROLL_LOW      PORTB &= ~(1<<2);
  #define DIGITAL_SERVO_SINGLE_PITCH_PINMODE  pinMode(11,OUTPUT);
  #define DIGITAL_SERVO_SINGLE_PITCH_HIGH     PORTB |= 1<<3;
  #define DIGITAL_SERVO_SINGLE_PITCH_LOW      PORTB &= ~(1<<3);

gruß felix...
 

Claus Eckert

Moderator
Teammitglied
Hi

Klasse Idee so etwas "Lowcost" nachzubauen.

Was man mit Depron, Elektronik und Hirnschmalz alles anstellen kann. ;)

Lustig finde ich immer die Marketing-Ideen. Unter den Labeln "Terrorbekämpfung" und "Katastropheneinsatz" läßt sich Vieles verkaufen.
Spätestens wenn es um Lautlosigkeit bei Terrorbekämpfung oder Wärmebildkameras, Messsonden etc. für Katastropheneinsätze geht, schlägt die Physik und die Gravitation grausam zu und solche Projekte verschwinden in der Aservatenkammer.

Als spaßiges Flugmodell mit außergewöhnlichem Experimentier-Status, taugt es aber allemal. ;)
 

ronco

User
ja werde wenns fliegt mal ein video machen ..

dachte grade noch die WMC software wäre in der ausführung auch ein super autopilot für flächenmodelle .. laufen alle 3 achsen drüber. gas kann man ja direckt nehmen wenn man mag.. oder als torque hilfe für anfänger :P


gruß felix
 

ronco

User
Erste tests :D

habe die software nochmal umgeschrieben .. so das es jetzt mit 4 servos gehen soll .. jeh ein servo pro klappe. soweit geht das auch schon. habe auch mal sowas aus selitron gebaut .. ist aber glaub ich zu wackelig also fliegt sehr unstabiel ..

werde also nochmal von vorne anfangen..

habe bisher nur ein kleines video von der servo / gyro reaktion

ich tendiere aber doch immer mehr dazu mir einen tri zu bauen :P

naja wiegesagt die geänderte MWC software gibts auf pn anfrage ..



gruß felix
 

ronco

User
Hi,

ich habe damit noch nicht weiter gemacht. hatte ein WMCboard mit der software als letztes in nem kleinen flieger .. der hoverte super ;) .. wiegesagt .. ich denke von der software seite her sollte das gehn .. mann müsste sich nur mal mühe beim aufbau geben

gruß

felix
 
Hi Leute

gibts irgendwelche Neuigkeiten zu dem Thema.
Hätte im Moment etwas Zeit und würde mir sowas gerne bauen.
am besten auf MWC Basis.

Evtl finden sich ja noch paar Leute die mitmachen.

Gruß
Manuel
 
Ansicht hell / dunkel umschalten
Oben Unten