µQuad (Liten quadrokopter)
Re: µQuad (Liten quadrokopter)
NULL: Kv-värdet anger det värde där motorn rullar så snabbt att den genererade spänning motsvarar inkommande varför den inte driver något alls. Man kan säga att motorn aldrig kan komma att köra snabbare än detta varvtal.
Verkliga RPM-värde beror såklart på belastning osv.
Verkliga RPM-värde beror såklart på belastning osv.
Re: µQuad (Liten quadrokopter)
victor_passe:
Anledningen att göra så är att estimeringen inte kan hinna divergera under snabba rörelser och desto mindre quad desto snabbare kan den röra sig.
Sedan kör man bara regleringen så fort som det behövs för att styra systemet och 10-20 ggr snabbare än den högsta frekvensen i systemet brukar va bra riktmärke.
Anledningen att göra så är att estimeringen inte kan hinna divergera under snabba rörelser och desto mindre quad desto snabbare kan den röra sig.
Sedan kör man bara regleringen så fort som det behövs för att styra systemet och 10-20 ggr snabbare än den högsta frekvensen i systemet brukar va bra riktmärke.
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: µQuad (Liten quadrokopter)
Har jobbat lite mer nu på quaden, har gett upp med nrf modulen, den vill bara inte.
Monterade på en liten BT modul som funkar perfekt.
Har implementerat ett komplementär filter:
(bara plottar och skit)
(virtuell horisont)
Det funkar bra men jag måste höja min brytfrekvens för antiuppbygningsfiltret på den integrerade gyro datan.
Och kanske sänka brytfrekvensen för komplementär filtret.
Monterade på en liten BT modul som funkar perfekt.
Har implementerat ett komplementär filter:
(bara plottar och skit)
(virtuell horisont)
Det funkar bra men jag måste höja min brytfrekvens för antiuppbygningsfiltret på den integrerade gyro datan.
Och kanske sänka brytfrekvensen för komplementär filtret.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: µQuad (Liten quadrokopter)
Snyggt!
När det kommer till estimeringen så skulle jag rekommendera ett enkelt linjärt KF (typ som det LHelge designade för länge sedan) då du ändå har en ganska kraftig processor.
För sättet du kompenserar bias på skulle jag personligen kanske inte lita på till 100%, men en integrator på de viset introducerar man negativ fasförskjutning i estimeringsloopen vilken kan ställa till det.
Man kan skapa en komplementär estimering av bias genom att kolla på vinkelerrorn och integrera den väldigt sakta, men har sätt få filter som gör det.
Gradient Descent algoritmer är mer populära för komplementär estimering från vad jag har sätt, har du kollat något på detta?
Och keep up the good work!

När det kommer till estimeringen så skulle jag rekommendera ett enkelt linjärt KF (typ som det LHelge designade för länge sedan) då du ändå har en ganska kraftig processor.
För sättet du kompenserar bias på skulle jag personligen kanske inte lita på till 100%, men en integrator på de viset introducerar man negativ fasförskjutning i estimeringsloopen vilken kan ställa till det.
Man kan skapa en komplementär estimering av bias genom att kolla på vinkelerrorn och integrera den väldigt sakta, men har sätt få filter som gör det.
Gradient Descent algoritmer är mer populära för komplementär estimering från vad jag har sätt, har du kollat något på detta?
Och keep up the good work!

Re: µQuad (Liten quadrokopter)
Hur mycket väger µQuad:en? vilken lyftkraft har den (newton) ?
Drifttid? effekt?
Drifttid? effekt?
- Greve Hamilton
- EF Sponsor
- Inlägg: 544
- Blev medlem: 4 september 2004, 15:03:35
- Ort: GBG
Re: µQuad (Liten quadrokopter)
Vad hade du för problem med nordic-kretsen? Fick du ingen kontakt med den alls eller fungerade inte radiodelen?
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: µQuad (Liten quadrokopter)
Jag fick in den i TX läge, den biasade utgångssteget i någon ms så jag antar att den även skickade.
Jag satte samma adress och samam frekvens på den andra kretsen, fick in den i RX läge men kunde inte få över någon data.
Så jag slog på carrier send på enhet 1 som ska sända bärvåg hela tiden.
Och tittade på carrier detect på enhet 2, den blev aldrig 1.
Jag provade med antenerna 1mm till 1m ifrån varandra, fick aldrig över någon data.
Hade jag haft en enhet som jag vet funkar skulle det vara lättare att felsöka, då skulle jag kunna se om det var RX eller TX som krånglade, men nu vet jag inte vilken det är eller om det är båda.
Kanske försöker igen med det senare.
Men nästa steg nu är PID.
Korken:
Jag är inte så bra på regler så jag testar med sådant som jag förstår.
Men om inte detta funkar så ska jag prova att implementera ett enkelt KF.
Jag satte samma adress och samam frekvens på den andra kretsen, fick in den i RX läge men kunde inte få över någon data.
Så jag slog på carrier send på enhet 1 som ska sända bärvåg hela tiden.
Och tittade på carrier detect på enhet 2, den blev aldrig 1.
Jag provade med antenerna 1mm till 1m ifrån varandra, fick aldrig över någon data.
Hade jag haft en enhet som jag vet funkar skulle det vara lättare att felsöka, då skulle jag kunna se om det var RX eller TX som krånglade, men nu vet jag inte vilken det är eller om det är båda.
Kanske försöker igen med det senare.
Men nästa steg nu är PID.
Korken:
Jag är inte så bra på regler så jag testar med sådant som jag förstår.
Men om inte detta funkar så ska jag prova att implementera ett enkelt KF.
Re: µQuad (Liten quadrokopter)
victor_passe: åå vart har du köpt ST blåtandsmodul, ser att det är den du använt.
Jag har inte hittat vart jag kan köpa den.
Gissar att det är SPBT2632C2A som du använt.
Så jag har fått sampla den för att få tag på den till ett av mina projekt.
Jag har inte hittat vart jag kan köpa den.
Gissar att det är SPBT2632C2A som du använt.
Så jag har fått sampla den för att få tag på den till ett av mina projekt.
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: µQuad (Liten quadrokopter)
samplade bara 1, visst är nog frakten dyrare än modulen men det känns inte korrekt att ta fler än jag behöver.
De finns på mouser för runt 13$.
Dock ska det vara en liknande µC i BT modulen som på quaden, jag har letat efter källkoden till BT modulen så man kan få in allt på BT module, det skulle vara ballt.
Men jag har inte hittat något, man får nog öppna plånboken skulle jag chansa på.
De finns på mouser för runt 13$.
Dock ska det vara en liknande µC i BT modulen som på quaden, jag har letat efter källkoden till BT modulen så man kan få in allt på BT module, det skulle vara ballt.
Men jag har inte hittat något, man får nog öppna plånboken skulle jag chansa på.
Re: µQuad (Liten quadrokopter)
yeep dom finns på mouser och på många andra ställen med.
Problemet är att Mouser och dom jag pratade med inte får sälja till Sverige då modulen innehåller krypterings funktioner.
Och det skapar problem då dom inte får exportera utrustning med krypterings teknik om dom inte har avtal för det, vilket inte mouser hade.
Så jag pratade med ST och fick 2st extra moduler, jag fick bara en från sampling och behöver en till för mitt bevattnings projekt.
Hehe de skulle vara ballt, dock så är det lite snålt med pinnar på BT modulen, dom har en till med flera IO, sen om den funkar de har jag ingen aning om.
Problemet är att Mouser och dom jag pratade med inte får sälja till Sverige då modulen innehåller krypterings funktioner.
Och det skapar problem då dom inte får exportera utrustning med krypterings teknik om dom inte har avtal för det, vilket inte mouser hade.
Så jag pratade med ST och fick 2st extra moduler, jag fick bara en från sampling och behöver en till för mitt bevattnings projekt.
Hehe de skulle vara ballt, dock så är det lite snålt med pinnar på BT modulen, dom har en till med flera IO, sen om den funkar de har jag ingen aning om.
- Greve Hamilton
- EF Sponsor
- Inlägg: 544
- Blev medlem: 4 september 2004, 15:03:35
- Ort: GBG
Re: µQuad (Liten quadrokopter)
Hmm, tråkigt att höra. Har just ritat och beställt ett kort där det ska sitta en Nordic radio på och jag nojar lite över att min layout inte är helt ok; halvkass skärmning kring radiodelen. Speciellt om det skulle vara så att det är just den som är problemet för dig (vilket vi iofs inte har en susning om) och med tanke på att din ser klart bättre ut än min. Jag har dock två moduler som det inte vara några större problem att få fart på, så felsökningen blir ju lättare för mig.victor_passe skrev:Jag fick in den i TX läge, den biasade utgångssteget i någon ms så jag antar att den även skickade.
Jag satte samma adress och samam frekvens på den andra kretsen, fick in den i RX läge men kunde inte få över någon data.
Så jag slog på carrier send på enhet 1 som ska sända bärvåg hela tiden.
Och tittade på carrier detect på enhet 2, den blev aldrig 1.
Jag provade med antenerna 1mm till 1m ifrån varandra, fick aldrig över någon data.
Hade jag haft en enhet som jag vet funkar skulle det vara lättare att felsöka, då skulle jag kunna se om det var RX eller TX som krånglade, men nu vet jag inte vilken det är eller om det är båda.

Men det vore verkligen roligt om du hade kunnat göra quaden ännu mindre som du nämner i videon. Tror inte att jag har sett någon som är mindre än denna storlek, samma storleksordning som Crazyflie.
Re: µQuad (Liten quadrokopter)
Greve Hamilton & victor_passe:
Jag har arbetat mycket med den kretsen, har gjort allt från trådlös CAN, SPI, I2C oc hUART med den (och en MCU till) och jag har aldrig haft problem med den.
Kan nu lägga upp designen så ska jag ta en titt och se om jag hittar något fel.
För det är sjukt underbara kretsar när man väl har fått dom att fungera.
Jag har arbetat mycket med den kretsen, har gjort allt från trådlös CAN, SPI, I2C oc hUART med den (och en MCU till) och jag har aldrig haft problem med den.
Kan nu lägga upp designen så ska jag ta en titt och se om jag hittar något fel.

-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: µQuad (Liten quadrokopter)
nrf_spi.c
nrfspi.h
Pic koden skickar samma saker fast annan kod givetvis.
Jag tror att felet ligger antigen i configurationen, alltså värderna jag sätter allt till i uppstart eller att jag missförstår state diagrammen och inte kommer in i lägena korrekt
Men som sagt så tror jag att den skickar då jag ser att den lägger på ca 1.8V på VDD_PA under 1ms.
Om felet skulle vara antenn desigen så kan jag köpa att räckvidden skulle vara kort, men den är <1mm i så fall.
Och jag har exakt samma komponent värden som i referens desigen i databladet och väldigt korta ledare.
Kod: Markera allt
#include "stm32f10x_rcc.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_gpio.h"
#include "misc.h"
#include "nrf_spi.h"
#include "cBuffer.h"
#include "led.h"
static CBUFFER nrfTxBuffer, nrfRxBuffer;
static unsigned char nrfRawTxBuffer[64], nrfRawTxBufferElementsLeft=0;
static unsigned char nrfRawRxBuffer[64], nrfRawRxBufferWritePointer=0,nrfRawRxBufferElementsToRead=0;
static unsigned char nrfBusy=0;
static unsigned char nrfIsInTxMode=0;
static unsigned char nrfStatusRegister=0;
void nrfInit()
{
//Init buffers
CBufferNew(&nrfRxBuffer, sizeof(RADIO_PKG_TYPE), NRF_BUFFER_LENGTH);
CBufferNew(&nrfTxBuffer, sizeof(RADIO_PKG_TYPE), NRF_BUFFER_LENGTH);
//Start clocks
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//Init I/O
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
nrfSetCSN();
nrfSetCE();
//Init SPI
SPI_InitTypeDef SPI_InitStruct;
SPI_StructInit(&SPI_InitStruct);
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
SPI_Init(SPI1,&SPI_InitStruct);
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE,ENABLE);
SPI_Cmd(SPI1,ENABLE);
//Init interrupts
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=SPI1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=7;//Semi low priority, this is not timing critical
NVIC_InitStruct.NVIC_IRQChannelSubPriority=7;
NVIC_Init(&NVIC_InitStruct);
nrfSendCommand(NRF_WRITE_MASK | 0, &((unsigned char){0b00111111}), 1);//Enable
while(nrfBusy);
nrfSendCommand(NRF_WRITE_MASK | 1, &((unsigned char){0}), 1);//No autoack
while(nrfBusy);
nrfSendCommand(NRF_WRITE_MASK | 2, &((unsigned char){1}), 1);//Datapipe 0
while(nrfBusy);
nrfSendCommand(NRF_WRITE_MASK | 3, &((unsigned char){3}), 1);//3Byte addr
while(nrfBusy);
nrfSendCommand(NRF_WRITE_MASK | 4, &((unsigned char){0}), 1);//No Retransmit
while(nrfBusy);
nrfSendCommand(NRF_WRITE_MASK | 5, &((unsigned char){0x7F}), 1);//Highest frequency
while(nrfBusy);
nrfSendCommand(NRF_WRITE_MASK | 6, &((unsigned char){0b00100110}), 1);//Max power minimum speed
while(nrfBusy);
nrfSendCommand(NRF_WRITE_MASK | 17, &((unsigned char){sizeof(RADIO_PKG_TYPE)}), 1);//5Bytes in each package
while(nrfBusy);
}
unsigned char nrfPendingRxPackage()
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))
return 0;
return 1;
}
void nrfSendCommand(unsigned char addr, unsigned char *data, unsigned char length)
{
if(nrfRawTxBufferElementsLeft)
return;
nrfRawTxBufferElementsLeft=length+1;
nrfRawRxBufferElementsToRead=length+1;
nrfRawRxBufferWritePointer=0;
nrfRawTxBuffer[length]=addr;
while(length--)
nrfRawTxBuffer[length]=*data++;
SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE,ENABLE);
}
void nrfSendPackage(unsigned char addr, unsigned char valueAddr, unsigned short value)
{
RADIO_PKG_TYPE package;
package.readRequest=0;
package.unitAddr=NRF_MY_ADDR;
package.value=value;
package.valueAddr=valueAddr;
CBufferPush(&nrfTxBuffer,&package);
}
RADIO_PKG_TYPE nrfReadPackage()
{
RADIO_PKG_TYPE package;
package.readRequest=0;
package.unitAddr=0;
package.value=0;
package.valueAddr=0;
if(!CBufferUsed(&nrfRxBuffer))
return package;
CBufferPull(&nrfRxBuffer,&package);
return package;
}
void nrfSetCE()
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
void nrfResetCE()
{
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}
void nrfSetCSN()
{
GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
void nrfResetCSN()
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}
void nrfParseRxBuffer()
{
nrfStatusRegister=nrfRawRxBuffer[0];
}
void SPI1_IRQHandler()
{
if(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE))
{
unsigned char data;
data=SPI_I2S_ReceiveData(SPI1);
if(nrfRawRxBufferElementsToRead)
{
nrfRawRxBuffer[nrfRawRxBufferWritePointer++]=data;
nrfRawRxBufferElementsToRead--;
}
if(!nrfRawRxBufferElementsToRead)//All done here
{
nrfParseRxBuffer();
nrfSetCSN();
nrfBusy=0;
}
//SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_IT_RXNE);
}
if(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE))
{
if(nrfRawTxBufferElementsLeft)
{
nrfBusy=1;
nrfResetCSN();
while(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE) && nrfRawTxBufferElementsLeft)
SPI_I2S_SendData(SPI1,nrfRawTxBuffer[--nrfRawTxBufferElementsLeft]);
if(!nrfRawTxBufferElementsLeft)
SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE,DISABLE);
}
//SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_IT_TXE);
}
}
//Here we want to move packages from tx buffer to raw tx buffer
void nrfProcess1000Hz()
{
static unsigned char state=0;
if(!nrfBusy && !nrfRawTxBufferElementsLeft && CBufferUsed(&nrfTxBuffer))//If we can send data and have data to send
{
if(state==2)
{
RADIO_PKG_TYPE package;
CBufferPull(&nrfTxBuffer,&package);
nrfSendCommand(0xA0, (unsigned char*)(&package), sizeof(RADIO_PKG_TYPE));//Send data
state=0;
nrfSetCE();
}
else if(state==1)
{
nrfSendCommand(0xE1, 0, 0);//Flush Buffer
nrfIsInTxMode=1;
state=2;
}
else if(state==0)
{
nrfResetCE();
nrfSendCommand(NRF_WRITE_MASK | 0, &((unsigned char){0b00111110}), 1);//Enter TX mode
nrfIsInTxMode=1;
state=1;
}
}
else if(nrfIsInTxMode)
{
nrfSendCommand(NRF_WRITE_MASK | 0, &((unsigned char){0b00111111}), 1);//Enter RX mode
nrfIsInTxMode=0;
state=0;
}
}
Kod: Markera allt
#ifndef __NRF_SPI_H_
#define __NRF_SPI_H_
/*The RADIO_CMD_TYPE works as following
* unitAddr is a unique addr for each unit
* readRequest is 1 when the package is a read request, otherwise it is 0
* valueAddr is the addr of the value that is to be read or is present in the package
* value is the value, this value is irrelevant for readRequest=1
*/
typedef struct {
unsigned char unitAddr;
unsigned char readRequest;
unsigned char valueAddr;
unsigned short value;
} RADIO_PKG_TYPE;
#define NRF_BUFFER_LENGTH 32
#define NRF_MY_ADDR 15
#define NRF_WRITE_MASK 0b00100000
void nrfSendCommand(unsigned char , unsigned char *, unsigned char );
void nrfInit();
void nrfSetCE();
void nrfResetCE();
void nrfSetCSN();
void nrfResetCSN();
void nrfProcess1000Hz();
unsigned char nrfPendingRxPackage();
void nrfSendPackage(unsigned char, unsigned char, unsigned short);
#endif
Jag tror att felet ligger antigen i configurationen, alltså värderna jag sätter allt till i uppstart eller att jag missförstår state diagrammen och inte kommer in i lägena korrekt
Men som sagt så tror jag att den skickar då jag ser att den lägger på ca 1.8V på VDD_PA under 1ms.
Om felet skulle vara antenn desigen så kan jag köpa att räckvidden skulle vara kort, men den är <1mm i så fall.
Och jag har exakt samma komponent värden som i referens desigen i databladet och väldigt korta ledare.