Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   375 / 847
(#) KoblogPerGyok válasza world-s hozzászólására (») Aug 12, 2017 /
 
Szia!

Mikor, és hol dől el, hogy mennyi lesz az animációk száma? Ez a loop-on belül is változhat? Azaz, valami memóriából, vagy SD kártyából is jöhet?
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Aug 12, 2017 /
 
Dinamikusan az alloc és a malloc utasításokkal lehet csak megoldani, illetve pointerekkel. Ha változik a tömb, akkor azt törölni kell, mielőtt újra felépíted.

De vitatkoznak rajta, hogy ez mennyire tesz jót a futás stabilitásának:

Bővebben: Link


Itt egy példa dinamikus tömbre:

Bővebben: Link
A hozzászólás módosítva: Aug 12, 2017
(#) world-s válasza KoblogPerGyok hozzászólására (») Aug 12, 2017 /
 
Az animációk száma, az animációkon belüli lépésszám, és hogy egy lépésen belül mennyi különböző színt kell beállítani a a fejlesztéskor dől el.
Ha lesz új, akkor max újra lesz fordítva.

Jelenleg a teszt alatt az arduino memóriában vannak a leírások, de tudom ez pazarló.
Van yl-90 (24LC256) modulom. Ezt tervezem ha lehet itt tárolni, vagy ha lassú lenne az olvasás, akkor mindig csak az aktuálisan futó animácó adatait tölteném fel az arduino memóriájába. (de ez még odébb van.)

A saját struktúrámat kipróbáltam.
Amint valamit belet teszek abban a pillanatban szól is, hogy elfogyott az Arduino nano memóriája, tehát nagyon pazarló a fix tömb mint gondoltam is.

kapu48 leírását alkalmazva megcsináltam az én struktúrámra a dolgot.
Sokkal jobb a helyzet vele.

  1. typedef struct {
  2.   uint32_t color; // Ezt nem közölted??
  3.   uint16_t leds; //Melyik ledekre kell alkalmazni az adott színt (bitenként)
  4. } StepNeoCoulours;
  5.  
  6. typedef struct {
  7.   uint8_t stepID;
  8.   StepNeoCoulours* neosets;
  9.   uint16_t Wait; //Mennyi millisecundum várakozás a következő lépésig
  10.   uint8_t ledB; //A hátsó két kék led fényereje 0-255
  11. } eyeAnimStep;
  12.  
  13. typedef struct {
  14.   eyeAnimStep* AnimSteps;
  15.   uint8_t nextAnim;  //van -e következő animáció amit kötelezően el kell indítani, és ha igen, akkor mi
  16.   uint16_t nextAnimWait;  //Mennyi millisecundum várakozás a következő beidőzített animácuóig
  17. } eyeAnim;
  18.  
  19. StepNeoCoulours anim1_step1[] = {    
  20.    {0x8A2BE0, 0b1010001000110011},
  21.    {0x8A2BE1, 0b1010001000110111}
  22. };
  23. StepNeoCoulours anim1_step2[] = {    
  24.    {0x8A2BE2, 0b1010001000111011},
  25.    {0x8A2BE3, 0b1010001000111111}
  26. };
  27.  
  28. eyeAnimStep anim1[] = {
  29.   {0, anim1_step1,2000,0},
  30.   {1, anim1_step2,4000,0}
  31.   };
  32.  
  33. eyeAnim leiras[] = {
  34.   {anim1, 1,20000}
  35.   };


A lekérdezés is megy:
  1. Serial.println(leiras[0].AnimSteps[0].neosets[0].color);
  2. Serial.println(leiras[0].AnimSteps[0].neosets[1].color);
  3. Serial.println(leiras[0].AnimSteps[0].Wait);


Ami nem tetszik, hogy az animáció adatok feltöltése nagyon sok lépésre szétdarabolt (anim1_step1, anim1_step2, anim1).
Ezért nehéz lesz idővel kezelni.

Sem az anim1[]-be sem a leiras[]-ba viszont nem engedi közvetlen feltölteni az adatokat.

Így próbáltam, de nem engedi:
  1. eyeAnimStep anim1[] = {
  2.   {0, {{0x8A2BE0, 0b1010001000110011},{0x8A2BE1, 0b1010001000110111}},2000,0},
  3.   {1, {{0x8A2BE2, 0b1010001000110011},{0x8A2BE3, 0b1010001000110111}},4000,0}
  4.   };
(#) kapu48 válasza world-s hozzászólására (») Aug 12, 2017 /
 
Én inkább szétszedném az elemeket.
Ha minden example-nek más az érték halmaza.
Valahogy, így:
  1. struct sc_u{
  2.          //CRGB color;
  3.          uint16_t leds; //Melyik ledekre kell alkalmazni (bitenként)
  4.       } ;
  5.  
  6.     struct in_u{
  7.       //uint8_t stepID;
  8.       uint8_t ledB;  //A hátsó két kék led fényereje 0-255
  9.       uint16_t Wait;  //Mennyi millisecundum várakozás a következő lépésig
  10.     } ;
  11.    
  12. struct example1 {
  13.     sc_u Sc_u1[16];
  14.     in_u Inu1[20];
  15.     uint8_t nextAnim;  //van -e következő animáció amit kötelezően el kell indítani, és ha igen, akkor mi
  16.     uint16_t nextAnimWait;  //Mennyi millisecundum várakozás a következő beidőzített animácuóig
  17. };
  18.  
  19.  
  20. struct example2{
  21.     sc_u Sc_u2[26];
  22.     in_u Inu2[40];
  23.     uint8_t nextAnim;  //van -e következő animáció amit kötelezően el kell indítani, és ha igen, akkor mi
  24.     uint16_t nextAnimWait;  //Mennyi millisecundum várakozás a következő beidőzített animácuóig
  25. };


A struct definíciók még nem részei a lefordított programnak.
Majd csak mikor létrehozol példányokat belőlük, és feltöltöd értékekkel a tömböket.
Esetleg csinálhatsz kisebb részlet animációkat, és ezeket aztán tetszőlegesen kevert sorrendben ismételheted.
A hozzászólás módosítva: Aug 12, 2017
(#) kapu48 válasza world-s hozzászólására (») Aug 12, 2017 /
 
Admeg definiáláskor a tömb méretét. Akkor nem const-ként hozza létre.
Igy:
  1. typedef struct {
  2. uint8_t stepID;
  3. uint16_t Wait; //Mennyi millisecundum várakozás a következő lépésig
  4. uint32_t color; // Ezt nem közölted??
  5. uint16_t leds; //Melyik ledekre kell alkalmazni az adott színt (bitenként)
  6. uint8_t ledB; //A hátsó két kék led fényereje 0-255
  7. } eyeAnimStep;
  8.  
  9.  
  10. eyeAnimStep leiras[2] = {
  11.   {0, 2000, 0x8A2BE0, 0b1010001000110011, 0},
  12.   {1, 2001, 0x8A2BE1, 0b1011111000110011, 0}
  13. };
  14. eyeAnimStep* pleiras = leiras;
  15. eyeAnimStep leiras2[4] = {
  16.   {0, 2002, 0x8A2BE2, 0b1010001000110011, 0},
  17.   {1, 2003, 0x8A2BE3, 0b1011111000110011, 0},
  18.   {0, 2004, 0x8A2BE4, 0b1010001000110011, 0},
  19.   {1, 2005, 0x8A2BE5, 0b1011111000110011, 0}  
  20.   };
  21. eyeAnimStep* pleiras2 = leiras2;
  22. //           ?
  23. eyeAnimStep* plista[2] = {pleiras, pleiras2};
  24.  
  25. uint8_t ListaHossza[3] = {2, 2, 4}; // 2 leirás, Hossza: 2, 4
  26.  
  27. uint16_t W;
  28. uint32_t C;
  29.  
  30. void setup() {
  31.   // put your setup code here, to run once:
  32.  
  33. }
  34.  
  35. void loop() {
  36.   // put your main code here, to run repeatedly:
  37.  
  38.   for(uint8_t i=0; i<ListaHossza[0]; i++){
  39.     for(uint8_t j=0; j<ListaHossza[i+1]; j++){
  40.       W = plista[i][j].Wait;
  41.       C = plista[i][j].color;
  42.  
  43. //      Most már lehet írni !!!!
  44.       plista[i][j].Wait = W;
  45.       plista[i][j].color = C;
  46.      
  47.     //...
  48.     }
  49.   }
  50. }
(#) KoblogPerGyok válasza world-s hozzászólására (») Aug 12, 2017 /
 
Idézet:
„kell beállítani a a fejlesztéskor dől el.
Ha lesz új, akkor max újra lesz fordítva.”


Akkor #define. Mármint ezekkel előre megmondhatod, hogy az adott tömb mekkora lesz.

Mikor újra kell fordítani, akkor elég lesz ezeket a változókat cserélni, majd fordítani.

Bővebben: Link

De agyalok rajta, mert lehet nem ez kell neked.
(#) kapu48 válasza world-s hozzászólására (») Aug 12, 2017 /
 
Tömböket létrehozhatsz a flashban const ként, de akkor felkel töltened közvetlenül létrehozáskor.
Vagy memóriában, ha menetközben akarod feltölteni.
(#) world-s válasza KoblogPerGyok hozzászólására (») Aug 12, 2017 /
 
Ok, hogy deffine, de ha az egyszerű feldolgozás miatt egységes sruktúrát szeretnék.
(Így is emellett sok mindet folyamatot figyel még az Arduino.)
Ha fix méretet adok, akkor a lehető legnagyobb méretet tudom csak megadni.
Tehát ha vagy egy animáció, ami 20 lépésből áll, és vagy egy olyan olyan animáció aminek az egyik lépésénél mind a 16 led más színen világít, akkor az általam írt nagy tömböket kell megadnom. Azt viszont tudom, hogy ebben az esetben az arduino teljese memóriája elfog az első adat beletöltésekor.

kapu48:
A te elgondolásod alapján nagyon jó memóriaértékek jöttek ki mikor a bővített struktúrámba beillesztettem. Csak sok lépés után sok önálló változót kell létrehozni, és egyesíteni őket. Ezt lenne jó csak egyszerűsíteni.

Amit most javasoltál külön szétszedni elemekre az maga az is járható út lenne.
De a FastLed.h-nál először az összes ledről rendelkeznem kell, hogy melyik milyen színű legyen, majd ha minden meg van, utána kiadni a show parancsot. Ez után jön két nem neopixeles led, aminek pwm-jét állítom be (ledB).

Tehát ezért kellett külön még egy belső dinamikus struktúra, amiből minden lépésnél annyi darab kell ahány darab szín van egy-egy lépésnél (van hogy 1 van, hogy 16).

Így viszont már nem nagyon tudom hogy lehetne szétszedni annyira, hogy ezt a feldolgozó részen egységesen lehessen még kezelni.
(#) kapu48 válasza world-s hozzászólására (») Aug 12, 2017 /
 
Csináltam 1 tesztet, const-ba raktam a tömbjeidet.
Így felszabadult a memória (36 Byte ezen a kis teszten!)

  1. typedef struct {
  2.   uint32_t color; // Ezt nem közölted??
  3.   uint16_t leds; //Melyik ledekre kell alkalmazni az adott színt (bitenként)
  4. } StepNeoCoulours;
  5.  
  6. typedef struct {
  7.   uint8_t stepID;
  8.   StepNeoCoulours* neosets;
  9.   uint16_t Wait; //Mennyi millisecundum várakozás a következő lépésig
  10.   uint8_t ledB; //A hátsó két kék led fényereje 0-255
  11. } eyeAnimStep;
  12.  
  13. typedef struct {
  14.   eyeAnimStep* AnimSteps;
  15.   uint8_t nextAnim;  //van -e következő animáció amit kötelezően el kell indítani, és ha igen, akkor mi
  16.   uint16_t nextAnimWait;  //Mennyi millisecundum várakozás a következő beidőzített animácuóig
  17. } eyeAnim;
  18.  
  19. const StepNeoCoulours anim1_step1[] = {    
  20.    {0x8A2BE0, 0b1010001000110011},
  21.    {0x8A2BE1, 0b1010001000110111}
  22. };
  23.  
  24. const StepNeoCoulours anim1_step2[] = {    
  25.    {0x8A2BE2, 0b1010001000111011},
  26.    {0x8A2BE3, 0b1010001000111111}
  27. };
  28.  
  29. const eyeAnimStep anim1[] = {
  30.   {0, anim1_step1,2000,0},
  31.   {1, anim1_step2,4000,0}
  32.   };
  33.  
  34. eyeAnim leiras[] = {
  35.   {anim1, 1,20000}
  36.   };
  37.  
  38.  
  39.  
  40.  
  41. void setup() {
  42.   // put your setup code here, to run once:
  43. Serial.println(leiras[0].AnimSteps[0].neosets[0].color);
  44. Serial.println(leiras[0].AnimSteps[0].neosets[1].color);
  45. Serial.println(leiras[0].AnimSteps[0].Wait);
  46.  
  47. }
  48.  
  49. void loop() {
  50.   // put your main code here, to run repeatedly:
  51.  
  52. }


Viszont nem értelek?
A különböző effekt tömböket, mindenféleképen egyedileg kel létrehoznod.
A lejátszáshoz pedig pointerezéssel hozhatsz létre különböző struktúrákat.
Lényeg, hogy nem másolgatod be minden tömbbe a rész tömböket, hanem csak a pointert adod meg rájuk.
(#) world-s válasza kapu48 hozzászólására (») Aug 12, 2017 /
 
Köszi.
Tényleg nagyon jó az eredménye.
Csak félek ha lesz 10 effekt, és mindben 5-10 lépés és lépésenként 4-5 szín, akkor sok egyéni változót kell létrehozni, és félek nehezen lehet idővel átlátni.

Tehát lesz sok ilyen, hogy
anim1_step1[]
anim1_step2[]
anim1_step3[]
anim1_step4[]
anim1_step5[]

anim2_step1[]
anim2_step2[]
anim2_step3[]
anim2_step4[]
anim2_step5[]

...
anim1[]
anim2[]
anim3[]

De ha nem lesz más, akkor ez marad.
Csak kár, hogy valahogy ide
  1. {0, anim1_step1,2000,0},

Az anim1_step1 helyére nem tudom rögtön beírni valahogy az anim1_step1 tartalmát.
(#) kapu48 válasza world-s hozzászólására (») Aug 12, 2017 /
 
Nem ismerem az alkalmazott HW-t?
És hogy mi a célja a feladatnak?
Mert ahhoz kel a program megoldásait kialakítani.
(#) world-s válasza kapu48 hozzászólására (») Aug 13, 2017 /
 
Video1
Video2

A 2x8 neopixel (ws2812) a két szem és és a két szem mögött ami nem világit van 2 db 10mm-es kék led, aminél meg PWM-el a fényerőt szabályozom.

1-1 effekt/animáció nem más mint pl. a pislogás, ahol időzítetten kell a ledeket kikapcsolni, majd visszakapcsolni.
De lehet egy animáció, egy vérben forgó szem, vagy bármi más ahol egy egy lépésben lehet minden lednek más a színe (a videókban most nincs olyan, hogy minden led színe más).

Most a vezérlő Arduino Nano, de mivel sok feladatot lát el, lehet Arduino Mega 2560 Pro Mini lesz.

És van egy időzítő sor, ami folyamatosan lekérdezi a nyomógombokat, a hőmérsékletet, a fényerőt, stb. Ebbe az időzítő sorba kerülne bele a szemek világítása is.
És erre lenne ez a struktúra, hogy meg van melyik animáció fut éppen és azon belül meg van milyen időközönként kell változtatni valamit, és azon belül le van írva, hogy mikor változatain kell egyszerre valamit, akkor mit. Mivel sok esetben nem mind a 16 led színe különböző így a színenként "color" írom le a változást, illetve mivel pont 16 led van, azét "leds" banálisan megadja az adott színt mely ledekre vonatkozik. Ezzel mind memóriát tudnék megspórolni ahhoz képest, hogy minden fázisban egyesével minden lednek meg kéne adnom a színét feleslegesen. De csak akkor ha nem kell lefoglalnom feleslegesen a memóriát.

Ez hála nektek már teljesül. Csak maga a leírás része (kód) most olyan, hogy a színeket és a lépéseket is külön-külön változóban kell leírni, és utána összeláncolni. Nem tudom egyben mintha kicsit ilyen JSON-os lenne. Persze ha nincs jobb módszer akkor így lesz, mert memória használatban viszont nagyon jó.
A hozzászólás módosítva: Aug 13, 2017
(#) kapu48 válasza world-s hozzászólására (») Aug 13, 2017 /
 
Én készítenék hasonló effekt tömböket:
  1. const uint16_t pislog[] = {
  2.   0b0000000000000000,
  3.   0b0000000111000000,
  4.   0b0000001111100000,
  5.   0b0000001111100000,
  6.   0b0000011111110000,
  7.   0b0000011111110000,
  8.   0b0000111111111000,
  9.   0b0000111111111000,
  10.   0b0001111111111100,
  11.   0b0001111111111100,
  12.   0b0011111111111110,
  13.   0b0011111111111110,
  14.   0b0111111111111111,
  15.   0b0111111111111111,
  16.   0b0000000000000000,
  17.   0b0000000000000000
  18. };


Ez 1 állandó színnel akár már le is játszhatnád.
Vagy a te módszereddel, tudod a színeket is megadni:
  1. const StepNeoCoulours anim1_pislogKek[] = {  
  2.    {0x8A2BE2, pislog[0]},
  3.    {0x8A2BE3, pislog[1]},
  4.    {0x8A2BE4, pislog[2]},
  5.    {0x8A2BE2, pislog[3]},
  6.    {0x8A2BE3, pislog[4]},
  7.    {0x8A2BE4, pislog[5]},
  8.    {0x8A2BE2, pislog[6]},
  9.    {0x8A2BE3, pislog[7]},
  10.    {0x8A2BE4, pislog[8]}  
  11.    //...
  12. };


Ezeket akár visszafele is lejátszhatod.
(#) trickentrack hozzászólása Aug 14, 2017 /
 
Üdv!
Szeretnék építeni egy motorvezérlést, de nem tudom hogy álljak neki. Túlzottan még nem is értek az arduinohoz ezért kérem a segítségeteket.
Egy ismerősöm kért meg, hogy segítsek neki. Épít egy felhőpásztát, aminek forgatnia kell a fejét.
Lényegében azt kéne csinálni, hogy van 2db végállás kapcsoló, mikor az egyiket megnyomja a fej forduláskor, akkor polaritást vált, és elindul vissza a fej, a másik oldalon lévő kapcsolót megnyomva szintén polaritást vált.

Van valami ötletetek?

Előre is köszönöm!
(#) Kera_Will válasza trickentrack hozzászólására (») Aug 14, 2017 /
 
Az ablaktörlő motor is ezt csinálja. Ezt minek kellene arduval elbonyolítani, pár dióda és 2 áramkörös váltó kapcsoló kérdése az egész.Sebességet pedig pwm-el szabályzó elektronika megoldja
A hozzászólás módosítva: Aug 14, 2017
(#) trickentrack válasza Kera_Will hozzászólására (») Aug 14, 2017 /
 
Mivel most úgy van megoldva, hogy van egy 3 állású kapcsoló középen. Viszont mivel a fejnek nagy súlya van, szállítás közben rengetegszer eltörött a kapcsoló. Ezért gondoltam az arduinos megoldásra.
(#) Kera_Will válasza trickentrack hozzászólására (») Aug 14, 2017 / 1
 
Akkor is kell valami ami mechanikai elmozdulást érzékeli mindegy mi a vezélése ardu vagy más . Akkor ajánlatos lenne pl.: mágnes és hall elem vagy optokapu
A hozzászólás módosítva: Aug 14, 2017
(#) trickentrack válasza Kera_Will hozzászólására (») Aug 14, 2017 /
 
Az a baj, túlzottan nem vagyok otthon az ilyen dolgokban, de majd próbálkozom!
(#) Kera_Will válasza trickentrack hozzászólására (») Aug 14, 2017 /
 
Bármilyen elmozdulás / pozíció érzékelő jó neked amivel 2 állapot az "ott lévőség vagy nem ott lévőség ", állapota eldönthető. Ennek a kimenetét kell illeszteni a meglévő további motor forgató rendszerhez.Jó helyen jársz csak nem a jó topicban tetted fel a kérdést
Keresőbe itt fent írbe a "végállás" szót sok sok motoros mozgolódós topickot fogsz találni
A hozzászólás módosítva: Aug 14, 2017
(#) KoblogPerGyok válasza world-s hozzászólására (») Aug 14, 2017 /
 
Dinamikus tömböket lehet használni, de nem egyszerű.

Amit nem értek, az az, hogy minden egyes led minden egyes tulajdonságát el lehet menteni egy byte típusú tömbbe. Ráadásul egy kétdimenziósba. De akár háromba is.

1 lednek mennyi bájt kell? RGB-hez 3. PWM hez 1. 16 Led-nél mindez 64 byte. Kell egy plusz az időzítéshez, plusz egy lesz-e még animáció. Ez eddig nem sok.

Led[10][Ledek száma x annyi bájt ami kell egy lednek +2]
Ezeket kell feltöltened mikor tudod, hogy egy anim mennyi frame-ből fog állni, akkor az első 10 helyett annyit írsz bele amennyit szeretnél.
A következő dimenzióban annyi adat megy, amennyi led van, illetve plusz az időzítés, illetve még ami kell. Vagy háromdimenziós tömböt használsz.

Tesztként, ha 16 led van:

1 frame összesen 16*(3+1)+2 azaz 66 byte. Szerintem ilyen kevés lednél ez semmi.

Mármost ezt ha feltöltöd, pl szövegfájlból, vagy serial monitoron, vagy akárhonnan, akkor ez mehet.

Az Arduino loop-ban megoldja, hogy az adott tömb i-ik indexű eleme mikor mehet, ha mehet egyáltalán.

Ügyes kódolással ebbe a tömbbe simán belerakhatsz sok animációt is, majd pl egy gomb vagy akármi, kiválaszthatja, hogy melyik anim engedélyezett. Így, mivel a második dimenzió adott, csak az elsőt kell megadni.

Az időzítéshez valóban nem elég a byte, de ki akar olyan animot, ami 1 milisec alatt változik? Azaz a kiértékeléskor a 255 nem milsec-et fog jelenteni, hanem pl tized másodpercet. Így egy bájton 25.5 sec lehet a max időzítés.
A loop-ban egy index ami a tömb első dimenziójában lépked, míg egy másik, ami a másodikban.

Egy ciklussal megadod a led lábának értékeit a második dimenzióból, majd egy if, hogy várjon ameddig kell, vagy ugorjon másik külső indexre, stb.

Mindezt ki lehetne egészíteni úgy, hogy pl egy sd kártyáról tölti fel az animációk tömböt, sokkal átláthatóbb lesz minden szerintem.

A gond inkább az lehet, hogy az Arduino-t fel kell készíteni az adatok fogadására, pl soros monitoron, de úgy, hogy egy frame-nyi infót kapjon pl szövegként, vesszővel tagolva. Természetesen miután meg lett mondva, hogy mennyi frame lesz. Itt kell majd az újra dimenzionálás, de csak egyszer. (De ezt el kellene kerülni) Ezt is kikerülheted, ha az arduino-ra azt a kódot töltöd fel, amiben az előre definiált tömb első indexe meg fog egyezni, a rátöltendő anim számával, így nem kell az arduino kódban látnod minden egyes frame bittérképét, de nyilván az elején meg kell adni neki, mekkora lesz az a tömb. (Megoldható, hogy a feltöltés előtt átdimenzionálja ezt, de szerintem kerülendő, jobb ha kódból van megadva, majd az adatok később)

Sőt!

Ha egy SD-kártyán byte térképen tárolod a frame-eket, akkor az arduino-n elég az épp aktuális frame-et tárolnod és a következőt. Így minden esetben két ilyen tömb kell! Fixen! Az arduino meg olvassa a következő frame-et, max időzít. közben csere! Ha minden frame azonos hosszúságú, akkor a bináris fájlban seek()-el, vagy hasonlóval gyorsan arra a recordra tudsz állni, ami a következő frame lesz a fájlban.

Vagy:

Abban ez esetben, ha tudnál egy olyan segéd programot írni, ami egy meglévő .ino fájlba egyszerűen beilleszti az összes adatot, akkor már feltöltés előtt tudni fogsz mindent, ezért azt már töltheted direktben az arduino-ra.

Pl Excelben egy kis makró, ami pl. a ledek számától és a frame-töl függő byte adatokat szépen kiírja egy ino-ba, de olyanba, amiben a definiált tömb már annyi amennyi kell, tartalmazza már a többi kódot stb. (úgy legyen megszerkesztve, hogy azt már ctrl+c, ctrl+v vel a megfeleő helyre beillesztve, magát a tömböt annak elemeinek felsorolásával.)Szerintem egy ilyen Excel nagyon hasznos lehet, mert a cella háttér színe már lehet az RGB érték, a frameeket külön kölön látod, egyszerűen csak export, a makró összerakja a kódot, azt feltöltöd direktben az arduino-ra és kész.

De ezek csak ötletek, lehet nem is értem pontosan a feladatot ha így van akkor bocsánat!
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Aug 14, 2017 /
 
Bocs a sok hibáért de hason fekve kell pötyögnöm telefonon mert szétment a derekam. Telóhoz meg nem szoktam hozzá!
(#) RoliNyh hozzászólása Aug 14, 2017 /
 
Kipróbáltam ezt a titkos tápfeszültségmérési módszert egy arduino unon 328P felületszerelt proc van rajta, de nekem csak nullákat küld vissza a roros monitoron. Nektek működik?

  1. long readVcc()
  2.   {
  3.   long result; // Read 1.1V reference against AVcc
  4.   ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  5.   delay(2); // Wait for Vref to settle
  6.   ADCSRA |= _BV(ADSC); // Convert
  7.   while (bit_is_set(ADCSRA,ADSC));
  8.   result = ADCL;
  9.   result |= ADCH<<8;
  10.   result = 1126400L / result; // Back-calculate AVcc in mV return result;
  11.   }
  12. void setup()
  13.  {
  14.  Serial.begin(9600);
  15.  }
  16. void loop()
  17.  {
  18.  Serial.println( readVcc(), DEC );
  19.  delay(1000);
  20.  }

Read arduino VCC doc...
Read arduino VCC video...
(#) KoblogPerGyok válasza RoliNyh hozzászólására (») Aug 14, 2017 / 1
 
Nincs return a függvényben. Azaz mindig 0 lesz az eredmény. Kellene egy retrurn result;
(#) RoliNyh válasza KoblogPerGyok hozzászólására (») Aug 14, 2017 /
 
Óóó picsbe, ott van az a 10 .-ik sorba, csak elmaradt egy sortörés...
Úgy már megy...
(#) RoliNyh válasza KoblogPerGyok hozzászólására (») Aug 14, 2017 /
 
Első két három mérés alatt még ugrál pár mV -ot, de utánna már egyet sem. Azt hittem, nagyobb hiszterézise lesz, de úgy látom, szerintem ez a módszer elég lesz a BMS rendszerembe cellafeszültség méréshez. Elvileg működik attiny85 -ön is (csak most épp még nincs ilyen tokom), így marad egy szabad láb, amire eddig az ellenállásosztós tápfeszültségmérést terveztem.
A hozzászólás módosítva: Aug 14, 2017

readVcc.png
    
(#) Kovidivi válasza RoliNyh hozzászólására (») Aug 14, 2017 /
 
Ez egész jó. Amit én ismertem, az botrányos, a belső hőmérőt használja. Megnéztem, az Attiny84-nél is tudsz Bandgap feszültséget mérni, szóval ott is lesz tápfeszültség eredményed.
(#) RoliNyh válasza Kovidivi hozzászólására (») Aug 14, 2017 /
 
Igen azt én is olvastam, hogy elvileg hőmérő is van benne, szóval akár tokhőmérsékletet is lehet vele mérni, de az annyira nem érdekel. Külső hőmérőszenzor lesz, amit beteszek minden egyes cellapakk közé...
(#) KoblogPerGyok válasza RoliNyh hozzászólására (») Aug 14, 2017 /
 
Mitől ennyire stabil? Nem látok átlagot sehol sem!
(#) RoliNyh válasza KoblogPerGyok hozzászólására (») Aug 14, 2017 /
 
Fogalmam sincs, nem értek hozzá.
De multival mérve a tápfeszt, az sem változik többet, legfeljebb +-0.002 V -ot...
Gyakorlatilag én ebből a readVcc() fügvényből semmit nem értek, csak arra sikerült rájönnöm,
hogy az utolsó előtti sorban a "result = 1107880L / result;" értékkel lehet kalibrálni...
A hozzászólás módosítva: Aug 14, 2017
(#) Kovidivi válasza KoblogPerGyok hozzászólására (») Aug 14, 2017 /
 
Ahogy nézem, 8biten kapta Roli az eredményt. Ez a maximum. 20mV/bit. Szerintem használható. Egy kis átlagolással tovább finomítható. Egy a lényeg itt is, a referencia feszültséget be kell írni a programba, akkor lesz még pontosabb.
Úgy is lehet kalibrálni, hogy a result változót az osztás előttről kiíratjuk soros monitorra mondjuk, eközben mérjük a tápfeszültséget, majd ebből a kettőből kiszámoljuk a szükséges osztót.
A hozzászólás módosítva: Aug 14, 2017
Következő: »»   375 / 847
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem