Hur synca en tid? (trådlöst mellan två arduinosar)
- FormerMazda
- Inlägg: 6442
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Hur synca en tid? (trådlöst mellan två arduinosar)
Håller ju på med startgrans-projektet, och har kommer en bra bit faktiskt.
Får ju granen att agera som tänkt, jag har koll på om det sker tjuvstart, och hur för tidigt man startade. Men såklart har jag mätning på reaktionstid iväg.
Sen ska ju tiden mellan start och mål mätas, och även slutfart med hjälp av dubbla fotoceller i slutet med känt avstånd.
Nu till nöten, målet är 201meter bort.
Kabel skulle underlätta i koden, men 201meter kabel är praktiskt knöligt på många vis.
Jag är inne på en trådlös lösning, och jag har köpt ett gäng NRF24L01+ ( Länk till ungefär typ )
Men då kommer direkt en fråga om timing? All tidräkning baserar jag på millis() i Arduinon, denna returnerar hur många millisekunder arduinion varit spänningssatt.
Att starta master-arduino och målslav-arduino exakt samtidigt lär inte gå. Att skicka vad masterns millis() är till slaven för att beräkna en diff lär ju också skita sig då kommandon ska utföras och data skickas mm. Det lär diffa en del helt enkelt.
Spontana tankar och idéer på hur jag ska lyckas synka detta?
En dålig idé jag har är att startgranen ställs upp och startas. Sen ansluter man en kabel mellan granen och målarduinon och utför nån typ av sync där man låter en digital I/O utföra sync.
Kruxet är om man hamnar i en tankevurpa i programmet och trycker på reset på nån enhet, då måste ju sync ske igen, och det suger ju när målarduinon är 201meter bort..
Får ju granen att agera som tänkt, jag har koll på om det sker tjuvstart, och hur för tidigt man startade. Men såklart har jag mätning på reaktionstid iväg.
Sen ska ju tiden mellan start och mål mätas, och även slutfart med hjälp av dubbla fotoceller i slutet med känt avstånd.
Nu till nöten, målet är 201meter bort.
Kabel skulle underlätta i koden, men 201meter kabel är praktiskt knöligt på många vis.
Jag är inne på en trådlös lösning, och jag har köpt ett gäng NRF24L01+ ( Länk till ungefär typ )
Men då kommer direkt en fråga om timing? All tidräkning baserar jag på millis() i Arduinon, denna returnerar hur många millisekunder arduinion varit spänningssatt.
Att starta master-arduino och målslav-arduino exakt samtidigt lär inte gå. Att skicka vad masterns millis() är till slaven för att beräkna en diff lär ju också skita sig då kommandon ska utföras och data skickas mm. Det lär diffa en del helt enkelt.
Spontana tankar och idéer på hur jag ska lyckas synka detta?
En dålig idé jag har är att startgranen ställs upp och startas. Sen ansluter man en kabel mellan granen och målarduinon och utför nån typ av sync där man låter en digital I/O utföra sync.
Kruxet är om man hamnar i en tankevurpa i programmet och trycker på reset på nån enhet, då måste ju sync ske igen, och det suger ju när målarduinon är 201meter bort..
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
kan du inte ha en RTC i båda och sen synkar man dom vid start genom en inbyggd funktion och kabel ?
Då kan ju målgångsenheten läsa tiden från sin RTC, och den lär ju inte ha ändrat sig speciellt mycket.
Då kan ju målgångsenheten läsa tiden från sin RTC, och den lär ju inte ha ändrat sig speciellt mycket.
- FormerMazda
- Inlägg: 6442
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Har haft lösa tankar kring RTC.
Men hur fungerar en sån? En pryttel som ger sin tid via nåt seriellt? Batteribackupat? Hur upplöst är tiden?
Men hur fungerar en sån? En pryttel som ger sin tid via nåt seriellt? Batteribackupat? Hur upplöst är tiden?
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Ansult en GPS till vardera enheten och använd klocka och PPS-puls ut från GPS:en så får du utmärkt synkning.
Lite overkill, men inte så dyrt numera.
MVH: Mikael
Lite overkill, men inte så dyrt numera.
MVH: Mikael
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Det är väldigt varierande, var länge sen jag labbade med en RTC men den jag körde (från maxim tror jag) pratade I2C och hade batteribackup.
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
En möjlighet jag har använd:
Ta en DS323x (finns olika modeller med olika interface).
Det är en serie väldigt exakta RTC (±2 minuter/år) och de har en möjlighet att ge ut pulser med t.ex. 1 sek.
Jag har denna puls in på en interruptpinne och kan då faslåsa en intern klocka till denna så att jag får ut 1,000ms tider.
Själva programdelen är enkel och det enda du egentligen behöver är själva pulsen, att läsa klockan är i grunden likgiltig, det viktiga är att pulserna kommer.
När du väl har denna exakta klocka kan du sedan synka via kommunikationen.
GPS med puls är bra också, pulsen kan "snabbas upp" på samma sätt.
Och hur styr man då denna faslås? Jag utgår ifrån att det är 1ms som gäller.
Ha en word-variabel (16 bit eller mer).
Start en 16-bit timer med ställbar tid.
Räkna ut ung. rätt tid som grundvärde, då går det snabbare att få lås på fasen.
* Vid varje puls ska variabeln nollas MEN SE NEDAN FÖRST!
* Vid varje timer-interrupt ska variabeln räknas upp med 1.
* Om variabeln är över 999 när pulsen kommer ska timerns delning ökas en aning (jag tar 1 steg).
* Om variabeln är under 999 när pulsen kommer ska timerns delning minska en aning (jag tar 1 steg).
Man använder då variabeln som ms-värde MEN filtrerar så att vid värden över 999 ställer man svaret till 999.
Hela sekunder räknas upp med pulserna.
Jag testade detta sätt i en skylt och resultatet blev kanonbra. µC'n kör enbart med intern klocka och jag testade att värma och kyla den och i båda fall avvek den en aning och låste igen utan problem.
Ta en DS323x (finns olika modeller med olika interface).
Det är en serie väldigt exakta RTC (±2 minuter/år) och de har en möjlighet att ge ut pulser med t.ex. 1 sek.
Jag har denna puls in på en interruptpinne och kan då faslåsa en intern klocka till denna så att jag får ut 1,000ms tider.
Själva programdelen är enkel och det enda du egentligen behöver är själva pulsen, att läsa klockan är i grunden likgiltig, det viktiga är att pulserna kommer.
När du väl har denna exakta klocka kan du sedan synka via kommunikationen.
GPS med puls är bra också, pulsen kan "snabbas upp" på samma sätt.
Och hur styr man då denna faslås? Jag utgår ifrån att det är 1ms som gäller.
Ha en word-variabel (16 bit eller mer).
Start en 16-bit timer med ställbar tid.
Räkna ut ung. rätt tid som grundvärde, då går det snabbare att få lås på fasen.
* Vid varje puls ska variabeln nollas MEN SE NEDAN FÖRST!
* Vid varje timer-interrupt ska variabeln räknas upp med 1.
* Om variabeln är över 999 när pulsen kommer ska timerns delning ökas en aning (jag tar 1 steg).
* Om variabeln är under 999 när pulsen kommer ska timerns delning minska en aning (jag tar 1 steg).
Man använder då variabeln som ms-värde MEN filtrerar så att vid värden över 999 ställer man svaret till 999.
Hela sekunder räknas upp med pulserna.
Jag testade detta sätt i en skylt och resultatet blev kanonbra. µC'n kör enbart med intern klocka och jag testade att värma och kyla den och i båda fall avvek den en aning och låste igen utan problem.
- FormerMazda
- Inlägg: 6442
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Googlar man på arduino och rtc så hittar man att DS3231 är att föredra och färdiga bibliotek finnes.
Med detta skulle man kunna ha denna rtc på alla enheter, sen vid uppsättning utföra en sync innan utplacering och sen kan man räknamed att alla enheter går lika under dagen.
Dock bara ner på sekunden, där är min tanke nu och jobbar. hur får jag millisekundsnogrannhet då?
Edit: Icecap har svarat en hel harrang!
Den ska studeras. Snart.
Med detta skulle man kunna ha denna rtc på alla enheter, sen vid uppsättning utföra en sync innan utplacering och sen kan man räknamed att alla enheter går lika under dagen.
Dock bara ner på sekunden, där är min tanke nu och jobbar. hur får jag millisekundsnogrannhet då?
Edit: Icecap har svarat en hel harrang!

Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Som adent skrev så har många (även mycket billiga) gps mottagare en 1PPS signal. Det är en digital puls som är väldigt noggrann och som är aktiv när vid varje hel sekund. Låter du den signalen gå in på en interrupt-pinne och läser av alternativt nollställer din millisekundräknare så har du global tid med millisekundupplösning vid både start och mål.
-
- Inlägg: 600
- Blev medlem: 26 juli 2011, 20:58:06
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Håller med GPS stämmorna, vore coolt, "äh, dom är GPS styrda bara"
Overkill ja, men det löser många problem och coolhetsfaktorn går som sagt inte att förneka!

Overkill ja, men det löser många problem och coolhetsfaktorn går som sagt inte att förneka!
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Om du har möjlighet att synka enheterna (via direktkontakt) före eller efter, så räcker det med noggrannheten i kristallen till processorn (+/- 50ppm typ) för att ligga inom 0,4s drift/h. Använd en timer i CPUn som räknare (med lite interupt och så för att hantera overflow).
En RTC behövs inte och inte heller den är noggrannare än den kristall som driver den.
En RTC behövs inte och inte heller den är noggrannare än den kristall som driver den.
- FormerMazda
- Inlägg: 6442
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Har funderat en del nu, och en sak slog mig. Hela mitt befintliga program, som nu är mer eller mindre klart, baseras på den millisekundsräknaren ( millis() ) som räknar upp från poweron/reset.
Så även om GPS-idén skulle fungera så kan jag ju bara vara säker på att dom är syncade på en sekund. Inte vilken sekund. Vilket gör det svårt att räkna ut ET, alltså hur lång tid hela sträckan tog att köra. Skulle tro att den tiden är allt mellan .. inte en aning, men runt 10 sekunder kanske.
Möjligt att GPS-tid med sekund tick är en lösning.
Kabelsync vid uppstart är som sagt möjligt. Problemet blir om nån enhet resettas, för då resettas väl även millis()? Och då måste kabelsync ske igen vilket då är rätt knöligt.
Så även om GPS-idén skulle fungera så kan jag ju bara vara säker på att dom är syncade på en sekund. Inte vilken sekund. Vilket gör det svårt att räkna ut ET, alltså hur lång tid hela sträckan tog att köra. Skulle tro att den tiden är allt mellan .. inte en aning, men runt 10 sekunder kanske.
Möjligt att GPS-tid med sekund tick är en lösning.
Kabelsync vid uppstart är som sagt möjligt. Problemet blir om nån enhet resettas, för då resettas väl även millis()? Och då måste kabelsync ske igen vilket då är rätt knöligt.
- Swech
- EF Sponsor
- Inlägg: 4745
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Om slaven endast skickar stopkommando till mastern så behöver bara mastern sköta tidtagningen.
Du lär väl knappast behöva bättre upplösning än 0.05 sek- 0.1 sek?
Swech
Du lär väl knappast behöva bättre upplösning än 0.05 sek- 0.1 sek?
Swech
- FormerMazda
- Inlägg: 6442
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Slaven uppgift blir att skicka speedtrap och målgång för respektive bana.
Men slaven kan å andra sidan själv räkna ut slutfarten och när målgång registrerats så skickas bara vilken sida och slutfart i klartext.
Som du säger, allt som allt kanske det diffar som sämst 100ms? Och det må vara försumbart i dessa samanhang, det är ju ingen seriös racing i det avseendet och diffen är ju lika för båda banorna.
Kanske är så att jag snöat in på att få ET på millisekunden..
Vad är gisnningen på att det tar i tid för följande:
* Mastern detekterar varje banas start och sätter en respektive starttid för detta.
* Mastern ställer sig i nån typ av loop eller liknande och väntar på seriell data från slav om målgång.
* Så fort seriell data är mottagen så sätts sluttid för banan. (sluttid - starttid = ET)
Så fördröjningen blir vad master/slav tar för själva seriella pratet och sen om radiomodulerna i sig har nån naturlig fördröjning?
Kanske är dags att labba lite.
Men slaven kan å andra sidan själv räkna ut slutfarten och när målgång registrerats så skickas bara vilken sida och slutfart i klartext.
Som du säger, allt som allt kanske det diffar som sämst 100ms? Och det må vara försumbart i dessa samanhang, det är ju ingen seriös racing i det avseendet och diffen är ju lika för båda banorna.
Kanske är så att jag snöat in på att få ET på millisekunden..
Vad är gisnningen på att det tar i tid för följande:
* Mastern detekterar varje banas start och sätter en respektive starttid för detta.
* Mastern ställer sig i nån typ av loop eller liknande och väntar på seriell data från slav om målgång.
* Så fort seriell data är mottagen så sätts sluttid för banan. (sluttid - starttid = ET)
Så fördröjningen blir vad master/slav tar för själva seriella pratet och sen om radiomodulerna i sig har nån naturlig fördröjning?
Kanske är dags att labba lite.

- FormerMazda
- Inlägg: 6442
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Såg förresten att du Swech hade snajsiga radiomoduler. http://swechtrading.se/zencart/index.ph ... cts_id=614
Vet du om nån skillnad på dessa mot de jag har? https://www.sparkfun.com/products/691
Vet du om nån skillnad på dessa mot de jag har? https://www.sparkfun.com/products/691
- Swech
- EF Sponsor
- Inlägg: 4745
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: Hur synca en tid? (trådlöst mellan två arduinosar)
Mina går på annan frekvens. 433MHz
Jag gissar också att de går längre än dina, dina är specade till 100 meter
Swech
Jag gissar också att de går längre än dina, dina är specade till 100 meter
Swech