Buggfix Plus
Aktuellt datum och tid: 14.03 2018-10-20

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 89 inlägg ]  Gå till sida Föregående  1, 2, 3, 4, 5, 6  Nästa
Författare Meddelande
InläggPostat: 04.38 2018-06-13 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4321
Ort: Jönköping
Du har ju ungefär att:
X = A*cos(vinkel)+B
Y = C*sin(vinkel)+D
Där A, B, C och D är konstanter.
B och D är ju medelvärdet, och A och C är amplituden.

Räkna om X och Y så att de går mellan -1 och +1. Då kan du räkna ut vinkel som arctan(Y/X).
Titta på funktionen atan2 så slipper du problem med division med noll om X är nära noll.


Upp
 Profil  
 
InläggPostat: 11.06 2018-06-13 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
Tack för svaret :)

Från sensorn så är både X och Y koncentrerade runt 0, jag la på lite på varje värde för att göra alla positiva när jag gjorde kurvan(lite onödigt iofs). Om jag ska skala om så att X och Y går från -1 till 1 så måste jag alltså dividera med deras respektive max-värde?
Går det att göra något liknande detta:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. Read_X();
  2. if(X > X_max)X_max = X;
  3. X /= X_max;
  4.  
  5. Read_Y();
  6. if(Y > Y_max)Y_max = Y;
  7. Y /= Y_max;
  8.  
  9. Angle = atan2(Y/X);
Detta borde kalibrera den om man kör runt ett varv och sedan kalibrera ytterligare under användning eller är det bättre att kalibrera en gång och sen låta det vara så för att undvika att den "över-kalibrerar"?
Jag är dock lite osäker eftersom det lästa värdet är i 2-komplementsform och jag måste ju även ta negativa max i beräkning. Är jag på rätt spår?


Upp
 Profil  
 
InläggPostat: 13.10 2018-06-13 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23137
Ort: Kristinehamn
2-komplement är ju just heltal med förtecken så det är inte mycket att spekulera på.

Att göra om det till flyttal är enkelt.
Att räkna ut verkliga vinkeln baserat på X och Y ska väl inte heller vara ett problem, det finns formler för det.

Att "kalibrera" den på det vis du visar känns helt fel, det finns fasta värden som är ±max, använd dom.
Lite bra att veta 1
Lite bra att veta 2


Upp
 Profil  
 
InläggPostat: 16.54 2018-06-13 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4321
Ort: Jönköping
Funktionen atan2 tar två argument, just för att hantera fallet då X eller Y är noll och också de 4 kvadranterna korrekt.
Vinkel = atan2(Y, X)


Upp
 Profil  
 
InläggPostat: 18.23 2018-06-13 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
OMG it works! Tack så mycket!
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. //Variabler
  2. int MagX;
  3. int MagZ;
  4. float DirectionX;
  5. float DirectionY;
  6.  
  7. signed int Direction;
  8. I2C1_Read(); //Läser in värdet från snesorn i MagX och MagY
  9.     DirectionX = MagX;
  10.     DirectionY = MagY;
  11.     Direction = atan2(DirectionY, DirectionX) * 180 / 3.1416;
Men är det rätt att värdet från sensorn (som är i 16-bitars tvåkomplementsform) läses in i MagX(som är en int) och att den sedan kopieras in i DirectionX(som är en float)?
Sen är det lite konstigt även om det kvittar, men Direction 0 och Direction 180 ligger inte 180 grader ifrån varann utan snarare 90 grader ifrån varann. Spannet 0-180 ligger dock fint fördelat både på plus- och minus-sidan. Gör jag nått fel eller ska det vara så?


Upp
 Profil  
 
InläggPostat: 12.17 2018-06-14 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4321
Ort: Jönköping
Vad får du för värden på MagX och MagY för de fyra väderstrecken? Och vad får du för värde på Direction för dessa fyra fall?


Upp
 Profil  
 
InläggPostat: 21.04 2018-06-15 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
Om jag utgår ifrån att max-värdet på X motsvarar norr, vilket det verkar göra så blir det ungefär såhär:

X109 Y-26
X0 Y18
X-65 Y-91
X54 Y-137

Ser ju ganska mystiskt ut men det ligger i den regionen och är väldigt repeterbart när man återkommer till samma vinkel.


Upp
 Profil  
 
InläggPostat: 22.14 2018-06-15 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4321
Ort: Jönköping
Värdena du får ser ju skumma ut. I grafen du visade tidigare var ju Y kring mittvärdet då X var min eller max, och X kring mittvärdet då Y var min eller max, vilket är precis som det ska!
Men värdena du visar följer inte detta mönster nu!
Kan du samla in mätvärden på samma sätt som du gjorde då du plottade grafen?


Upp
 Profil  
 
InläggPostat: 23.43 2018-06-15 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
Det är värdena från grafen, det blir så om man drar ifrån dom 256 som jag la på där förut. Kurvorna blir likadana. Mycket skumt.
Men jag blir färdig med båten hårdvarumässigt imorgon så nästa vecka kommer det bli testning och försök att programmera den så jag kan ta nya mätvärden när båten faktiskt kör som det är tänkt med all övrig elektronik inkopplad.

Edit: Noterade nu att X pendlar kring ett värde högre än 0 och Y kring ett värde som är lägre än 0. Det är ju förmodligen det som gör skillnaden, är det måhända bara att "flytta" X neråt och Y uppåt för att det ska bli rätt? Frågan är ju varför det är så alls men det kanske inte är så bra sensor?
Det är en switch-regulator från 12V-batteriet --> 5 V och sen är det en linjär regulator från 5 --> 3.3V som driver sensorn.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 01.06 2018-06-16 
Användarvisningsbild

Blev medlem: 22.27 2005-07-04
Inlägg: 4321
Ort: Jönköping
Justerar du dem så att de pendlar hyffsat symmetriskt kring noll så kommer det nog bli mycket bättre beräknade värden...


Upp
 Profil  
 
InläggPostat: 13.44 2018-06-17 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
Jag ska prova det så får vi se :)

En fråga till, varför ger detta varningen att jag jämför en signed med en unsigned integer:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. #define SERVO_CENTER 3000
  2. #define STEERING_OFFSET 0
  3. #define SERVO_SPEED 2
  4.  
  5. #define STEERING OCR1A
  6.  
  7. int16_t Steering_Set = SERVO_CENTER + STEERING_OFFSET;
  8.  
  9. if(STEERING < (Steering_Set + STEERING_OFFSET)) STEERING += SERVO_SPEED;
Jag vill jämföra värdet i OCR1A med (Steering_Set + STEERING_OFFSET) och värdet i OCR1A kan ju inte vara signed, så vad jämför jag egentligen med i koden?

Edit: Hmmm...hjärnsläpp som vanligt. int16_t är ju signed


Upp
 Profil  
 
InläggPostat: 07.40 2018-06-18 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
Jag ämnar testa båten idag eller imorgon men har en liten fundering.
Är det möjligt att i ett interrupt sätta ett nytt ställe i programmet att fortsätta ifrån efter avbrottet?

Jag såg att det fanns en avbrotts-vector för watchdog-timern. Min tanke var om jag i det avbrottet skulle kunna tala om att den ska fortsätta på annat ställe efteråt samt eventuellt tända en LED som indikering att avbrott har inträffat. På så vis borde buggar som gör att programmet hänger sig inte göra att båten slutar fungera. Mitt manuella läge funkar, men det förutsätter att jag även kan växla till manuell från auto, och det går ju inte om programmet hängt sig i auto.
Det är mest för att minska risken för ”runaways” lite. Jag vill helst inte att den gör reset utan skulle bara vilja välja nytt ställe i min huvudloop att fortsätta ifrån.


Upp
 Profil  
 
InläggPostat: 14.11 2018-06-18 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23137
Ort: Kristinehamn
Det ska gå att göra det - men det är extrem dålig programmeringsskick.

Det finns dock ett stort problem som är att du vill göra det i en interrupt. Då måste du rulla av returadressen från stacken, rulla in den "rätta" och sedan lämna interrupten. Det kan finnas andra värden på stacken som kan ge problem.

Men om du gör så usla program att de hänger sig är det mycket bättre att göra bättre program. Det är ju DU som styr om uträkningar kan riskera hänga sig så DU kan också avgöra när det finns risk för detta och då göra en "räddning".


Upp
 Profil  
 
InläggPostat: 18.25 2018-06-18 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
Problemet är att det är svårt att testa båten utan att släppa iväg den och då känns det bättre att använda en watchdog-timer om det går. Det är inte programmeringsfel jag vet om som jag ska rädda, utan fel jag inte vet om.
Men om det inte finns något "inbyggt" sätt att ändra retur-adress från avbrottet så får det bli en vanlig reset hellre än inget alls, då kan jag hur som helst få tillbaka manuell kontroll oavsett om programmet hänger sig :)


Upp
 Profil  
 
InläggPostat: 21.39 2018-06-18 

Blev medlem: 20.01 2009-10-29
Inlägg: 1426
Jungfruturen gick galant :) Manuellt läge funkar utmärkt men auto-läge kunde jag dock bara dutta lite på eftersom jag inte har programmerat den mer än att köra rakt med hjälp av GPS:en och kompassen.
Den gick väldigt rakt och stabilt på plattvatten men det återstår att se hur den klarar vågor.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 89 inlägg ]  Gå till sida Föregående  1, 2, 3, 4, 5, 6  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010