Crapcopter

Alles was nicht mit Final Fantasy XI zu tun hat.

Moderator: Dev

Post Reply
Message
Author
User avatar
fussel
Tiamat
Posts: 1595
Joined: 03.09.2004, 22:53

Crapcopter

#1 Post by fussel » 27.08.2010, 09:43

Moin.

Bin mal wieder am basteln. XD

Image

Der Name kommt daher, weil das Ding zu 99% aus billigem Scheiss (Bauteilekosten ohne Sender bisher <150 Euro) und zu 1% aus Awesomeness besteht.
Der Apostroph, auch Auslassungszeichen genannt, wird in der deutschen Sprache genau dann verwendet, wenn - kann man's ahnen! - ein Zeichen ausgelassen wird. Sonst nicht.

Aodat
Beach Boy
Posts: 731
Joined: 01.09.2004, 16:53
Location: Hannover

Re: Crapcopter

#2 Post by Aodat » 07.09.2010, 11:05

Wenns fliegt ^^

bekommst sicher ne bessere Cam drauf als das 44k model X)
Hakuna Matata Club Mitglied !!!

Die Weisheit baut ihr Haus , Torheit reist es nieder.

Aida-Fan http://www.aidafans.de
___________________________________________________________________________
2003 : Östliches Mittelmeer Nord-Route (7Tage) 2006 : Nordsee (5 Tage)
2007 : Westliches Mittelmeer (7Tage) 2008 : Östliches Mittelmeer Süd-Route (7Tage)
2009 : Karibik (14 Tage) 2010 : Östliches Mittelmeer Nord-Route (7Tage)
2011 : in Planung (14Tage Kombourlaub Aida u. Strand Kanaren

User avatar
fussel
Tiamat
Posts: 1595
Joined: 03.09.2004, 22:53

Re: Crapcopter

#3 Post by fussel » 07.09.2010, 11:45

Aodat wrote: bekommst sicher ne bessere Cam drauf als das 44k model X)
Naja. Aeh. Inzwischen sieht's so aus:

Image

Muss mal weiterbasteln, doofe ff14 beta. XD
Der Apostroph, auch Auslassungszeichen genannt, wird in der deutschen Sprache genau dann verwendet, wenn - kann man's ahnen! - ein Zeichen ausgelassen wird. Sonst nicht.

Aodat
Beach Boy
Posts: 731
Joined: 01.09.2004, 16:53
Location: Hannover

Re: Crapcopter

#4 Post by Aodat » 07.09.2010, 13:25

OMG es mutiert X)
Hakuna Matata Club Mitglied !!!

Die Weisheit baut ihr Haus , Torheit reist es nieder.

Aida-Fan http://www.aidafans.de
___________________________________________________________________________
2003 : Östliches Mittelmeer Nord-Route (7Tage) 2006 : Nordsee (5 Tage)
2007 : Westliches Mittelmeer (7Tage) 2008 : Östliches Mittelmeer Süd-Route (7Tage)
2009 : Karibik (14 Tage) 2010 : Östliches Mittelmeer Nord-Route (7Tage)
2011 : in Planung (14Tage Kombourlaub Aida u. Strand Kanaren

User avatar
fussel
Tiamat
Posts: 1595
Joined: 03.09.2004, 22:53

Re: Crapcopter

#5 Post by fussel » 07.09.2010, 18:02

Aodat wrote:OMG es mutiert X)
Naja, der erste Versuch war unzureichend. Durch den neuen Rahmen hat sich das Gewicht halbiert.
Der Apostroph, auch Auslassungszeichen genannt, wird in der deutschen Sprache genau dann verwendet, wenn - kann man's ahnen! - ein Zeichen ausgelassen wird. Sonst nicht.

Aodat
Beach Boy
Posts: 731
Joined: 01.09.2004, 16:53
Location: Hannover

Re: Crapcopter

#6 Post by Aodat » 08.09.2010, 13:55

Sieht aber stabiler aus als die erste Konstruktion durch die Verstärkung in der Mitte.


Aber nicht ein bischen klein geraten ? sollte da nicht noch gyro und son gedöns drauf ?
Hakuna Matata Club Mitglied !!!

Die Weisheit baut ihr Haus , Torheit reist es nieder.

Aida-Fan http://www.aidafans.de
___________________________________________________________________________
2003 : Östliches Mittelmeer Nord-Route (7Tage) 2006 : Nordsee (5 Tage)
2007 : Westliches Mittelmeer (7Tage) 2008 : Östliches Mittelmeer Süd-Route (7Tage)
2009 : Karibik (14 Tage) 2010 : Östliches Mittelmeer Nord-Route (7Tage)
2011 : in Planung (14Tage Kombourlaub Aida u. Strand Kanaren

User avatar
fussel
Tiamat
Posts: 1595
Joined: 03.09.2004, 22:53

Re: Crapcopter

#7 Post by fussel » 08.09.2010, 21:42

Aodat wrote: Aber nicht ein bischen klein geraten ? sollte da nicht noch gyro und son gedöns drauf ?
Aeh.

Image

Die beiden Chips auf der gruenen Platine sind die Gyrosensoren. Das ganze ding mit den 2 gruenen Platinen uebereinander ist 'n 2.4 GHz Fernsteuerungsempfaenger von 'nem Hubschrauber (da sind die Gyros zur Stabilisierung sowieso drauf). Der grosse Chip ist 'n Atmega 168 Mikrocontroller (8 MHz CPU, 16kbyte Flash, 2kbyte RAM).

Die weissen Kabel greifen das analoge Gyro-Signal vom Empfaenger ab und fuehren es an die A/D-Wandlereingaenge.

Die 4 rosa und blauen Kabel sind die Signale von den Steuerknueppeln (Gas, drehen, vorwaerts/rueckwaerts, links/rechts). Das andere rosa Kabel greift 'ne Referenzspannung fuer den A/D-Wandler (ADC, A/D-Converter) vom Empfaenger ab.

Das schwarze Kabel, was mit einem Ende nicht verbunden ist, ist die Antenne.

Das rot-schwarze Kabel verbindet Spannungsversorgung vom Mikrocontroller mit dem Empfaenger, da liegen 5V Versorgungsspannung drauf.

Die Stiftleiste mit 3 Pins ganz rechts ist 'ne serielle Schnittstelle (TxD, RxD, GND), die Stiftleiste unten fuer das Programmierkabel zum flashen.

Die anderen Stiftleisten sind die Anschluesse fuer die Geschwindigkeitsregler der Motoren, das sind jeweils +5V, GND und Signal. Ueber die Signalleitung gibt der Controller halt die einzustellende Geschwindigkeit als PWM-Signal aus (1000 Mikrosekunden Impuls = Motor fast aus, 2000 Mikrosekunden = Motor Vollgas).

Von einem dieser Anschluesse kommt die 5V Versorgungsspannung - die Regler sind ja jeweils direkt zwischen Akku und Motor angeschlossen, und erzeugen auch gleich die Versorgungsspannung fuer Empfaenger/sonstige Elektronik.

Mit dem grossen Rahmen hat das ganze Ding ~1kg gewogen, jetzt nur noch 520g. Das Kameramodul mit Sendemodul fuer das Videosignal wiegen keine 100g. :)

Ausserdem hab ich noch staerkere Akkus mitbestellt. Das wird schon passen. :)

Der Abstand zwischen 2 Motoren ist uebrigens ca 40cm, vielleicht sieht das auf dem Foto kleiner aus als es ist.

/edit: mal die Bilder skaliert, sonst zerbrechen noch Tische.

/edit2: Mikrocontroller-Programm: :roll:

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <avr/io.h>
#include <avr/interrupt.h> 

#define true 1
#define false 0

//#undef DEBUG
#define DEBUG

void uart_print(char *s);

/* global variables for PWM sampling */

volatile int16_t throttle; 
volatile int16_t elevator; 
volatile int16_t aileron; 
volatile int16_t rudder;

uint16_t T_pwm_last = 0;
uint16_t T_pwm_last_rudder = 0;
uint8_t  PIND_last = 0;


char buffer[256];

void init() {
   // initialize UART
   UBRR0=51; // 9600 bps at 8 mhz
   UCSR0B=(1<<RXEN0)|(1<<TXEN0);
   UCSR0C = (3<<UCSZ00);

   uart_print("\f\r\ncrapcontrol init\r\n\n\nregister setup...");

   // PD1 out for tx
   // PD2, PD3, PB6, PB7 out for ESCs

   DDRD = (1<<1)|(1<<2)|(1<<3);
   DDRB = (1<<6)|(1<<7);

   // enable timer 1 for PWM duration measurements 
   // with prescale 1/8 -> counts microseconds at 8 mhz 
   TCCR1B = 2;

   // enable interrupts for PCINT21..23 and PCINT0
   PCICR = (1<<PCIE2)|(1<<PCIE0);
   PCMSK0 = (1<<PCINT0);
   PCMSK2 = (1<<PCINT21)|(1<<PCINT22)|(1<<PCINT23);


   // enable ADC and AD Interrupt for gyros, ADC clock prescaler 1/64 -> 125 kHz
   // @125 kHz, a conversion taking up 13 AD clocks takes 104 microseconds
   //ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
   ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);

   // enable timer 0 for gyro sampling interrupt routine @ 1kHz
   // prescaler 1/64 -> 125 kHz, count to 125 -> 1kHz
   TCCR0A=(1<<WGM01);
   TCCR0B=4;
   OCR0A=125;
//   TIMSK0=(1<<OCIE0A);

   uart_print("done.\r\nenabling interrupts.\r\n");
   // start interrupt handlers
   sei();

//   while(!throttle);


//   uart_print("measuring ADC zero point...");

//   adc_sample_zero=1;
//   while(adc_sample_zero);

//   sprintf(buffer,"done.\r\nzero values: %04d %04d %04d\r\n",adc_zero[0],adc_zero[1],adc_zero[2]);
//   uart_print(buffer);
   uart_print("init done.\r\n\r\n");
}

int main(void)
{
   int frame;
   unsigned int j;
   uint16_t i;

   int16_t motor_pulse[4]; // PWM duration for motor outputs

   uint16_t T_cycle_start, T_pwm_start;        // timer at start of PWM pulse
   int16_t E_zero, A_zero, R_zero;

   int16_t adc_current[3], adc_last[3];
   
   int16_t ang_a[3];
   int16_t ang_v[3];
   int16_t ang[3];      

   init();

   E_zero = elevator;
   A_zero = aileron;
   R_zero = rudder;

   while(throttle<900);
   while(throttle>1000);

   for(j=0;j<3;j++) adc_last[j]=read_adc(j);

   frame=0;
   while(1) {
      T_cycle_start=TCNT1;
      if(throttle<1000) {
         E_zero=elevator;
         A_zero=aileron;
         R_zero=rudder;
         ang_v[0]=0;
         ang_v[1]=0;
         ang_v[2]=0;
      }

      for(j=0;j<3;j++) {
         adc_current[j]=read_adc(j);
         
         ang_a[j]=adc_current[j]-adc_last[j];
         ang_v[j]+=ang_a[j];
         if(abs(ang_v[j])>1) ang[j]+=ang_v[j];
         
         adc_last[j]=adc_current[j];
      }
      

      motor_pulse[0]=throttle;
      motor_pulse[1]=throttle;
      motor_pulse[2]=throttle;
      motor_pulse[3]=throttle;

      if(throttle>1000) {
         motor_pulse[0]+= 4*ang_v[1];
         motor_pulse[0]+= 2*ang_v[0];
         motor_pulse[0]+=-(elevator-E_zero)/2;
//         motor_pulse[0]+= (rudder-R_zero);

         motor_pulse[1]+=-4*ang_v[1];
         motor_pulse[1]+= 2*ang_v[0];
         motor_pulse[1]+=(elevator-E_zero)/2;
//         motor_pulse[1]+= (rudder-R_zero);

         motor_pulse[2]+=-4*ang_v[2];
         motor_pulse[2]+=-2*ang_v[0];
         motor_pulse[2]+=-(aileron-A_zero)/2;
//         motor_pulse[2]+=-(rudder-R_zero);

         motor_pulse[3]+=  4*ang_v[2];
         motor_pulse[3]+= -2*ang_v[0];
         motor_pulse[3]+= (aileron-A_zero)/2;
//         motor_pulse[3]+=-(rudder-R_zero);
      }


      sprintf(buffer,"v: %d %d %d out: %4d %4d %4d %4d\r\n",ang_v[0],ang_v[1],ang_v[2],motor_pulse[0],motor_pulse[1],motor_pulse[2],motor_pulse[3]);
      uart_print(buffer);
      T_pwm_start=TCNT1;      
      PORTD=(1<<2);
      while((TCNT1-T_pwm_start)<motor_pulse[0]);
      PORTD=0;

      T_pwm_start=TCNT1;
      PORTD=(1<<3);
      while((TCNT1-T_pwm_start)<motor_pulse[1]);
      PORTD=0;

      T_pwm_start=TCNT1;
      PORTB=(1<<6);
      while((TCNT1-T_pwm_start)<motor_pulse[2]);
      PORTB=0;

      T_pwm_start=TCNT1;
      PORTB=(1<<7);
      while((TCNT1-T_pwm_start)<motor_pulse[3]);
      PORTB=0;

      while((TCNT1-T_cycle_start)<20000) ;

   }
   



}


// interrupt routine for rudder (PB0/PCINT0)
ISR ( PCINT0_vect ) {

   uint16_t t = TCNT1;

   if(!(PINB&(1<<0))) rudder = (t - T_pwm_last_rudder);
    T_pwm_last_rudder = t;
}

// interrupt routine for 
// elevator (PD5/PCINT21) 
// aileron  (PD6/PCINT22)
// throttle (PD7/PCINT23)

ISR ( PCINT2_vect ) {

   uint16_t t = TCNT1;
   uint8_t pinD = PIND;

   if(PIND_last&(1<<5)) elevator = (t - T_pwm_last);
   if(PIND_last&(1<<6)) aileron = (t - T_pwm_last);
   if(PIND_last&(1<<7)) throttle = (t - T_pwm_last);

   T_pwm_last = t;
   PIND_last = pinD;
}

/*
ISR ( TIMER0_COMPA_vect ) {
   adc_current=0;
   ADMUX=0;
   ADCSRA|=(1<<6);
}

ISR ( ADC_vect ) {
   if(adc_sample_zero) {
      adc_zero[adc_current]=ADC;
   } else {
      adc[adc_current]=ADC;
    }
   if(adc_current<2) {
      adc_current++;
      ADMUX=adc_current;
      ADCSRA|=(1<<6);
   } else {
      adc_sample_zero=0;
   }
}
*/

void
uart_print(char *s) {
#ifdef DEBUG
   while(*s) {
      while ( !( UCSR0A & (1<<UDRE0)) );
     UDR0=*s;
     s++; 
   }
#endif
}


int16_t read_adc(int n) {
   ADMUX=n;
   ADCSRA|=(1<<6);
   while(ADCSRA&(1<<6));
   return ADC;   
}
/edit3: Ich weiss, so genau wollte das jetzt keiner wissen. :D
Der Apostroph, auch Auslassungszeichen genannt, wird in der deutschen Sprache genau dann verwendet, wenn - kann man's ahnen! - ein Zeichen ausgelassen wird. Sonst nicht.

Aodat
Beach Boy
Posts: 731
Joined: 01.09.2004, 16:53
Location: Hannover

Re: Crapcopter

#8 Post by Aodat » 09.09.2010, 11:26

Hmm ok kenne noch von der Berufsschule Gyro Sensoren die waren recht gross.

Halt ein Rotor mit Sensoren der sich sehr schnell um sich selber dreht.

Wenn man den bewegt Registrieren die Sensoren die Fliegkraftänderung.

Aber das scheinen Annotuck Sensoren gewesen zu sein wenn ich die da jetzt sehe ^^
Hakuna Matata Club Mitglied !!!

Die Weisheit baut ihr Haus , Torheit reist es nieder.

Aida-Fan http://www.aidafans.de
___________________________________________________________________________
2003 : Östliches Mittelmeer Nord-Route (7Tage) 2006 : Nordsee (5 Tage)
2007 : Westliches Mittelmeer (7Tage) 2008 : Östliches Mittelmeer Süd-Route (7Tage)
2009 : Karibik (14 Tage) 2010 : Östliches Mittelmeer Nord-Route (7Tage)
2011 : in Planung (14Tage Kombourlaub Aida u. Strand Kanaren

Post Reply

Who is online

Users browsing this forum: No registered users and 3 guests