Quadcopter
From
Revision as of 19:50, 12 June 2013 by Michiel brink (Talk | contribs) (→de firmware voor de msp430g2553 (adc naar uart))
Project: {{{ProjectName}}} | |
---|---|
Name | {{{ProjectName}}} |
Initiator | {{{Owner}}} |
Status | {{{Status}}} |
Skills | {{{Skillz}}} |
Summary | {{{Summary}}} |
De quadcopter
om een beetje een indruk te krijgen in de quadcopter hebben we hier wat leuke futures staan:
- gyroscoop
- acceleratiemeter
- kompas
- in alle hoeken ultrasoon sensoren
- besturing via wifi
- live webcam stream
- volgens een reactie op de gekochte motortjes: bij 1,3Kg, 75km/h
- servo om webcam op en neer te bewegen.
- accu meting door middel van een adc naar uart programma, geprogrammeerd in een msp430g2553.
- een stm32f3 discovery board als brein.
- een raspberry pi voor de webcam stream en de aansturing en nog meer leuke dingen.
- gps (ooit in de verre toekomst)
- en nog veel meer!!
de firmware voor de msp430g2553 (adc naar uart)
(alle vakjes horen bij elkaar maar heb even geen zin om uit te zoeken hoe ik dat in 1 vak krijg)
#include <msp430.h> #include <stdbool.h> #include <stdio.h>
#define GND BIT4 #define DAT BIT5 #define RXD BIT1 #define TXD BIT2
char buffer[4]; int adc_new; int adc_old; char * adc_string;
void uart_putc(unsigned char c); void uart_puts(const char *str); int adc_read(); void Delay_ms(unsigned int ms);
int main(void) { //msp430 init WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz DCOCTL = CALDCO_1MHZ; //pin init P1SEL = RXD + TXD; P1SEL2 = RXD + TXD; P1DIR |= GND; P1OUT&=~GND; //uart init UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt //adc init ADC10CTL1 = INCH_5 + ADC10DIV_3 ; // Channel 5, ADC10CLK/4 ADC10CTL0 = SREF_0 + ADC10SHT_3 + ADC10ON + ADC10IE; //Vcc & Vss as reference ADC10AE0 |= BIT5; //P1.4 ADC option __enable_interrupt(); Delay_ms(1); // Wait for ADC Ref to settle while(1) { Delay_ms(500); adc_new = adc_read()*10/1023; if(adc_new != adc_old) { sprintf(adc_string, "%d",adc_new); uart_puts(adc_string); adc_old = adc_new; } } }
//uart
void uart_putc(unsigned char c) { while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = c; // TX }
void uart_puts(const char *str) { while(*str) uart_putc(*str++); }
//adc
int adc_read() { ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled return(ADC10MEM); }
__attribute__((interrupt(ADC10_VECTOR))) void ADC10_ISR(void) { __bic_SR_register_on_exit(CPUOFF); // Return to active mode }
//delay
void Delay_ms(unsigned int ms) { while(ms--) { __delay_cycles(1000); } }