- Kormányok / autós szimulátorok topicja
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Computex 2024: léggel, vízzel – egy MSI VGA mindenek felett (videóval!)
- Szünetmentes tápegységek (UPS)
- Gaming notebook topik
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Samsung QN800D: Neo QLED 8K tévét teszteltünk
- HTPC (házimozi PC) topik
- TCL LCD és LED TV-k
Hirdetés
-
Az üzleti szférának szól a SmartThings Pro
ma A kütyüket összefogó megoldásból irodák, üzletek és hotelek is profitálhatnak.
-
Megjött a Philips 21:9 képarányú, 175 Hz-es QD-OLED monitora
ph Az Evnia termékcsalád új, 86,36 cm-es modellje a VESA DisplayHDR True Black 400 mellé ClearMR 9000 validációt is kapott.
-
Végre pontos megjelenési dátumot kapott a Visions of Mana
gp A készítők tisztázták azt is, hogy PlayStation 4-re megjelenik-e a végső kiadás.
-
PROHARDVER!
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
Teasüti
nagyúr
válasz
Teasüti #2914 üzenetére
Oké, user error.
Eleinte rögtön a byte-ként deklarált pufferbe raktam vissza a képlet eredményét, majd debuggoláskor a Serial.print-ben a puffer maradt benne, nem pedig az int temp.
Szóval jól számol a progi, csak a negatív számot mikor visszarakta a pufferbe, ott ment el az egész és én csak a legvégét láttam a monitorban.
A cast is működik, sőt megcsinálja cast nélkül is az int = byte - byte kivonást negatív eredménnyel hibátlanul.Hát ez jó lecke volt.
-
Teasüti
nagyúr
válasz
fpeter84 #2918 üzenetére
Ne is mondd, az időm 95%-a nettó szopórollerezés.
Ha már mikrokontroller...
Ti melyik irányba mennétek, ha a WS2812 többcsatornás vezérlése mellé meg kéne még oldani pár egyéb feladatot is, mint soros kommunikáció, input capture, alap I/O vezérlés?
Legyen két Uno I2C buszon összekötve master/slave módban? Ahol a slave egy amolyan koprocesszor szerepében kizárólag a ledekkel foglalkozik és a master-től kapja az utasításokat, miközben a master ráér foglalkozni minden mással.
Vagy legyen egy bika hardver, mint mondjuk a Due és az majd izomból megold mindent?Jelenleg az Uno a ledek renderelése közben épp elégséges sebességet produkál, a legizzasztóbb művelet (két függvény és a kettő közti átmenet /"képkocka") közben is megvan a 40 fps-em.
Persze ez csak szimuláció, 100 db virtuális leddel, egy csatornán... Azt még nem tudom mi lesz ebből, ha több független csatornát szeretnék renderelni.
Ha e mellé még extra feladatokat is szeretnék, akkor az azt jelenti, hogy 40 fps-nél 25 ms késleltetéssel számolhatok. Ezért filózok azon, hogy legyen koprocesszor.[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
Janos250 #2942 üzenetére
Koncepció szintjén szerintem még mindig a két processzoros felállás a legegyszerűbb.
Könnyebb delay-jel beállítani az fps-t az egyiken, míg a másikon mehetnek az alacsony késleltetésű feladatok.
Lehet egy erős proci izomból leviszi a 25 ms-et mondjuk 5 ms-re, de még nem tudom mennyire lenne bonyolult belőni az fps-t delay nélkül.
Az egész "grafikus futószalagot" egy ciklusba kéne rakni, belépési feltételnek meg a timer?
Vagy mennyire bonyolult egyenletes megjelenítési sebességet tartani változó fps-el. Az se zavar, ha 40 helyett 200 fps van, ha nem gyorsul be a grafika (változó offset két képkocka között).
Hmm, ezzel a kísérlettel elleszek egy darabig.[ Szerkesztve ]
-
Teasüti
nagyúr
Uhm lehetséges átadni egy függvénynek egy változó azonosítóját, hogy aztán azzal a változóval számoljon?
Vmi ilyesmire gondolok:byte buffer1[] = {};
byte buffer2[] = {};
#DEFINE RED(x,i) x[i]
void fgv(magic) {
RED(magic, i) = akármi;
}
setup() {
fgv(buffer1);
fgv(buffer2);
} -
Teasüti
nagyúr
Én értem, hogy ovis. De ha csak egyetlen feladat fut a procin...
Timer-nél lesz némi overhead, amivel nehéz számolni.
Nekem legalábbis.
Jelenleg azzal kísérletezek, hogy setup()-ban lemérem minden függvény idejét és ezekkel korrigálom a delay-t. Így faszán be lehet lőni az fps-t.Frame vezérlésű animációt egy ovis is leprogramoz, nekem meg nulla tapasztalatom van, a nyelvvel is csak ismerkedek.
A timer vezérlésű animációt még nem tudom, hogy lehetne összerakni. PC-s 3D grafikából merítettem ihletet, ott a motor teljes kapacitással fut és a megjelenítés van időzítve.
Nálam ez úgy nézne ki, hogy a led library meghívása lenne időzítve a program végén, míg a renderelés lefut minden ciklusban.De nekem ez a megközelítés nem tetszik.
Ha meg a teljes futószalagot időzítem, akkor meg tudni kéne belépés előtt, hogy mennyi idő alatt fog lefutni, mert azzal az értékkel kell korrigálni a timer-t.
De időt mérni csak a végén tudok...
Szóval jelenleg még a tervezőasztalon sem tisztult ki a kép.Vmi olyasmin filózok, hogy az animáció sebességét függetleníteni kéne az fps-től ÉS a megjelenítés frekvenciájától is. Vagyis ha a teljesítmény skálázná a következő képkocka offset-jét. Pl. egy colorwheel esetén a függvény felbontását növelném két képkocka között, ha gyorsul a sebesség. Vagyis ha egy másodperc alatt ki tud tolni magából 60 fps-t a vas, akkor 100% mintavételezés volna, 120 fps-nél 200% mintavételezés a függvényen.
De az egyenletes megjelenítéshez itt is ismernem kéne a futószalag idejét belépés előtt.[ Szerkesztve ]
-
Teasüti
nagyúr
Üdv ismét!
Piszkálja a csőröm a 32 bites proci, mint amilyen a Zero is, vagy akár az STM32.
Arra volnék kíváncsi, hogy van vmi előnye a 8 bitessel szemben az aritmetikai műveletekben is (változó típusától függetlenül), vagy mondjuk egy int8_t osztása és szorzása ugyanolyan gyors? Persze órajel ciklusonként értem. Vagy egy int16_t?Mi a helyzet a lebegőpontos számokkal? A 32 bitesek már tudják számolni hardverből, vagy itt is még trükkös és lassú a dolog?
A processzorok lelkivilágához nem értek.Pixel transzformációk kapcsán relatíve sokat használom a szorzást és osztást, főleg integer-rel.
Viszont megfontolnám a lebegőpontos számításokat is, ha már függvényeket használok.
Erre alkalmasabb lenne egy 32 bites proci?
Köszönöm!szerk: jah igen, 32 bitesből nem létezik 5V-os?
[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
fpeter84 #2974 üzenetére
Az igen, mea culpa!
Azért nem volt haszontalan éjszaka.
Uint32_t az nem double (integer)? Vagy 32 bites változó automatikusan float lesz?A táblázat viszont jól mutatja, hogy 32 biten ha van elég ram, akkor "double-t mindenkinek"!
A float szorzásban van vmi furcsaság. Ott lassúbb lenne órajel ciklusonként a Due, mint a Nano?
[ Szerkesztve ]
-
Teasüti
nagyúr
Mit takar az Arduino connectivity pontosan? Mire jó az?
Épp akartam kérdezni egy breadboard friendly vasat, ez a Teensy jónak tűnik.
Ez mennyire volna ajánlott nekem bevezetőnek? Nulla tapasztalat, nulla tudás mellé.
32 bites vonalon hol van a legnagyobb közösség? Úgy mint az Arduino esetében.[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
Janos250 #3002 üzenetére
Oké, csak a technikailag fejlettebb arm családban, mint amilyen az STM32 is.
Azt olvastam ez a terület túl fragmentált ahhoz, hogy olyan széleskörű rajongói tábora legyen mint az Arduinonak.Arduino-nak nincs Nano méretű 32 bites vasa, csak a Zero és a Due úgy tudom.
Ez a Maple ez nem discountinued? Tovább is lapoztam, mikor először kidobta a kereső.
[ Szerkesztve ]
-
Teasüti
nagyúr
Csak azt néztem, hogy a Teensy áráért Maple mini-ből is többet lehet kapni.
Ezt a felárat nem tudom hova tenni, nem azért mert nem tehetem meg.
De hisz ez 3.3 volton működik.Vagy az 5V toleranciát érted ez alatt?
Igazából nincs különösebb érvem a 3.3 ellen se, csak gondoltam könnyebb beilleszteni Uno mellé egy 5 voltosat.
Ami azt illeti képtelen vagyok dönteni a Nucleo, Maple, Teensy és egyéb STM32 deszkák között.
Melyiket lehet ajánlani egy laikusnak kezdésnek? FPU nem annyira létkérdés, csak úgy gondolom £22-ért már nem kéne kispórolni belőle azt sem. -
Teasüti
nagyúr
Az impulzus hosszúsága a kitöltési tényező lesz szerintem a PWM jelben (0-100%).
A frekvenciát nem tudod változtatni, az a PWM vezérlő hardveres jellemzője.A kondi szerintem nem fog segíteni, ha visszaemlékszek egy korábbi bejegyzésre, ahol a többiek a lehúzó ellenállást magyarázták nekem az Arduino bemenetének lebegése kapcsán, ahol a FET maga is rendelkezik egy kapacitással és ha jól értem, akkor nyit, ha az telítődik.
Nem az volt a megoldás erre, hogy másfajta FET-et kell alkalmazni? -
Teasüti
nagyúr
válasz
Janos250 #3016 üzenetére
Érdekes oldal ez a secrets of arduino.
A 3 timer ha mondjuk a PWM-mel van "elfoglalva" mind a 6 csatornán, akkor mellette befogható mondjuk input capture-re is?Amúgy elektronikailag van vmi különbség a fast pwm és phase correct pwm között?
Mert hogy most 0..255 között csak felfelé számol, vagy oda-vissza a számláló, abból nekem csak annyi jön le, hogy az egyiknek gyorsabb a frekvenciája.[ Szerkesztve ]
-
Teasüti
nagyúr
Mi ez a digitalRead() ^ 1 egy kimenetre állított porton?
Értem, hogy toggle, de... Ilyet is lehet?? Mi az a power 1? Ez vmi olyasmi, mint változó esetén pl a ledstate = !ledstate?/* Arduino 101: timer and interrupts
1: Timer1 compare match interrupt example
more infos: http://www.letmakerobots.com/node/28278
created by RobotFreak
*/
#define ledPin 13
void setup()
{
pinMode(ledPin, OUTPUT);
// initialize timer1
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 31250; // compare match register 16MHz/256/2Hz
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
interrupts(); // enable all interrupts
}
ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine
{
digitalWrite(ledPin, digitalRead(ledPin) ^ 1); // toggle LED pin
}
void loop()
{
// your program here...
} -
Teasüti
nagyúr
Üdv!
Kérhetnék egy kis segítséget a led strip vezérléshez?
Eljutottam odáig, hogy összeraktam egy offset vezérlésű grafikus motort, ami fps-től és timer-től függetlenül dolgozik (delay nélkül ugye), egy előre meghatározott animációs sebességet tartva két képkocka közötti eltolás számolásával a futási idővel korrigálva. Vagyis az fps-re fordítottan arányos az offset. (Hasonlóan, mint a pc játékok, vagyis kicsi fps-nél szaggat, nagy fps-nél megy mint állat, de ugye a játékidő tempója változatlan.)
Pl. két képkocka között ha +10-et küldök 60 fps-en a renderelő függvény bemenetére - ami a pixeleket számolja -, akkor 600 fps-en +1-et. Így viszonylag állandó animációs sebességet kapok (mondjuk +-10% az offset kerekítésétől függően kicsi értékeknél).A gond ott kezdődik, hogy csökkentve a kívánt animációs sebességet az offset nem mehet +1 alá, mert akkor az animáció egyszerűen leáll. Viszont magas fps-nél ez elkerülhetetlen, mivel egy adott aránynál elkezd nullára kerekíteni az offset.
Nos a kérdésem az, hogy miként lehetne megkerülni ezt a jelenséget úgy, hogy ilyen esetben csak minden második vagy harmadik (és így tovább...) loop() ciklusban legyen +1 az offset, amúgy meg nulla?
Vagyis a példánál maradva 600 fps felett minden második/harmadik képkockát ismétel.Esetleg vmi hasonló technikával jól jönne egy fps limit is. Ha a led szalag pwm frekvenciája 400 hz, akkor teljesen fölösleges 400 fps fölé szaladni.
(delay?)
(#3024) fpeter84
(#3025) tvamos
Igaz, mire való a prescale...[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
Teasüti #3026 üzenetére
Ha a led szalag pwm frekvenciája 400 hz, akkor teljesen fölösleges 400 fps fölé szaladni.
Vagy a 800 Khz-es átviteli sebesség fölé.
Amúgy WS2812-nél az adatbusz-on 1 hz alatt egy bit közlekedik? Vagyis 800khz úgy 33.333 db 24 bites pixel frissítésére elég? Vagy 400 fps-en 83 pixel. -
Teasüti
nagyúr
Hogy tudok összefűzni több Serial.print-et?
Most komolyan minden egyes változóhoz külön parancs kell? -
Teasüti
nagyúr
Uhm, az normális ha lefagy a proci, ha lebegő analóg bemenetről próbálok olvasni?
Pár másodpercig fut tovább anomáliákat okozva, aztán annyi. Soros kommunikáció is megszűnik.
Leesett a próbapanelről a poti... -
Teasüti
nagyúr
Én megvettem az eredeti Starter Kit-et.
Hát nem volt egy nagy élmény a könyv, néhányszor elővettem az első lépésekhez, meg első olvasásra érdekes volt. De azt hiszem nem venném meg újra. Tényleg gyerek szinten van, ami jó egy technikai analfabétának. De villámgyorsan túl lehet lépni rajta, hisz a benne lévő tudásanyag vajmi kevés és alaposan fel van hígítva bő magyarázatokkal.MÁS
Megjött a posta, szóval ma karácsonyi hangulatban bontogattam a kis I2C bizbaszokat, BT HC-06 vevőt, stb. Jupííí!
Viszont most először próbálok adatok küldeni a deszkára, és több mint egy órája azt kutatom, hogy miként lehet visszanyerni azt az egy szerencsétlen bájtot uint8_t formájában a kurva ASCII kódból.
Szóval ti mit használtok erre?
Hogy tudom konvertálni az uint8_t-t ASCII-be és vissza?(#3031) tvamos
Hát passz. Gondolom a port lebegése közben még a mérési határokon belül olvas értéket.
Na meg mi van akkor, ha nem? A változók max túlcsordulnak, nem kéne lefagynia.
Ennél érdekesebb volt, mikor megnéztem mit alkot az USB bekötött BT vevővel az UART-ra.
Na az úgy kiakasztotta, hogy még a PC se ismerte fel az eszközt utána, csak áramtalanítás után.[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
fpeter84 #3034 üzenetére
String message;
int integer;
while (Serial.available() > 0) {
message += char(Serial.read());
}
if (message.length() > 0) {
integer = message.toInt();
Serial.println(integer);
message = "";
}Lett a megoldás végül.
Fogalmam sincs ezek mennyi erőforrást vesznek el, de legalább nem akasztja meg a programot, mint a parseInt().Úgy olvastam BT-n programot feltölteni kifejezetten nem lehet. Mintha Arduino nyomatékosan nem ajánlaná emlékeim szerint. Talán nem túl biztonságos a 3.3 TTL feszültség az Uno RX lábán?
Természetesen nem ért váratlanul, mikor összeakadt az usb-vel, a hotplug viszont úgy tűnik működik.
Sima HC-06, soros kivezetéssel. -
Teasüti
nagyúr
Épp most olvastam utána. Elvileg nem nagy was ist das.
A 32-es lábát lehet használni a HC-05/06 vevőnek az Uno reset-elésére.
(Arra nem tért ki milyen varázslattal.)
Az új IDE-ben már dll fájlokkal se kell babrálni hozzá állítólag.
Aztán reset-en kívül csak az átviteli sebességet kell belőni 19200-ra a bootloader-nek és elvileg megy.Viszont ránézve erre a kis vacakra esélytelen számomra, hogy bármit is ráforrasztok arra a mütyür lábra.
Kézi reset-tel meg neki se állok, akkor már inkább kábelezek továbbra is.Egyébként meglepően ügyes ez a SoftwareSerial, azt hittem meg fogja akasztani a led frissítését.
Vajon hogy működik a puffere? Interupt-tal kapja el a bejövő adatot?[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
fpeter84 #3038 üzenetére
Polling, jó tudni... Köszi!
Csak néha egy-egy vezérlő bájthoz kell.
A 4D Systems LCD kijelzőivel szemezek még, az elvileg UART-on kommunikál, ahhoz lehet már több fog kelleni ennél. Bár funkciójában is ugyanaz, mint a BT. Egy kevés vezérlő bájt, és inkább Serial.print sorozatok állapotjelzéshez.BT vevőből ilyet vettem:
[link]FTDI-re nem tudom mi szükségem volna egyelőre. Az majd a barebone Uno-k építéséhez fog kelleni.
-
Teasüti
nagyúr
válasz
Teasüti #3039 üzenetére
Amúgy melyik a jobb választás embedded használatra? Barebone Uno, vagy egy Nano? Ebay-en kb egy árban vannak, sőt az Essential Kit egy hangyányit még drágább is a Nano-nál. Egyelőre még nem kacérkodok prototípus készítésével, de ha eljutok egy szintre, akkor már megfontolnám saját nyák készíttetését.
Mondjuk egy Nano-t se vészes beágyazni. Dilemma...Az STM32-esek közt se tudok dönteni.
-
Teasüti
nagyúr
válasz
fpeter84 #3043 üzenetére
Hogyne lehetne beállítani a kékfogat, a SoftwareSerial gyönyörűen teszi a dolgát, azután csak pár sor hidat képezni a gép és a BT között.
LCD-kkel az a bajom, hogy túl sok láb kell hozzájuk. Ha nem ilyen kész megoldást használok, akkor kell neki egy dedikált mikrokontroller, hacsak nem vmi bitang nagy számú porttal rendelkező deszkát veszek. De a Nano méretű cuccok meg nem erről híresek, h 50 I/O van rajta. És akkor még nem tudom hogy raknék össze egy grafikus interfészt érintőkijelzővel és az se lenne baj, ha animálva lenne. Ehhez meg van minden, beleértve a szoftvert is.
-
Teasüti
nagyúr
válasz
Gergosz2 #3051 üzenetére
A "HMI" képernyőkhöz van editor, az hatalmas előny szerintem. Meg nem 8 bites GUI-ra gondoltam, hanem 32 bitesre, grafikával, animációval akár. Mint egy Android alkalmazás, vagy HTML. Szóval eyecandy.
Nem foglalkoztam még a témával, egy-két videót néztem csak nagyjából mit tudnak ezek.
De gondolom ha kézzel készítem a képet editor helyett, akkor csak a photoshop tudásom szabhat gátat. Úgy olvastam semmi extrát nem csinálnak ezek, mint SD kártyáról megnyitják a megfelelő képeket oszt' ennyi.Esetleg az megoldható, hogy egy közönséges processzor nélküli lcd-hez magam rakom össze a kontrollert tárhellyel?
Mert valóban olcsóbb megvenni az alkatrészeket, mint egy HMI árát kifizetni.
Mondjuk itt csak azt kell szerintem eldöntenem megér-e nekem ennyit a szoftveres fejlesztés vagy nem.[ Szerkesztve ]
-
Teasüti
nagyúr
Nem értek a Linux-hoz, meg nem is szeretnék OS-el szarakodni.
De ezzel az erővel egy kiszuperált telefont is beágyazhatnék a projektbe, ami BT-n kommunikál.
Amúgy elsőre a BT-s megközelítés foglalkoztat inkább, de még vizsgálom egy Android GUI összerakásának lehetőségét különösebb IT tudás nélkül.
Tasker Widget készítőjével akár működhetne is, ha találnék egy jó beépülőt hozzá soros BT kommunikációhoz.Erről jut eszembe. Rendeltem egy HC-05 modult is, hogy megcsinálom a vezetéknélküli program feltöltést az Uno-ra, viszont kicsit ködösek az infóim.
Ugye a reset a modul LED kivezetésével történik, ami ha jól értem akkor aktív, ha van kommunikáció.
Ez idáig rendben is van, de ez nem fog nekem reset-elni programfutás közben minden egyes soros kommunikáció alkalmával? Mert ha újraindítja nekem az Uno-t egy Serial.read-nél vagy print-nél, akkor megette a fene az egészet.[ Szerkesztve ]
-
Teasüti
nagyúr
Uhm,
Timer interupt-tal játszadozok épp és első nekifutásra semmi nem történik, mármint fel se éled az Uno az addig jól működő programmal az alábbi kód beillesztése után.
1 kHz-es frissítése van az MPU6050-es gyorsulásérzékelőjének, ezt szeretném kiolvasni ugyanekkora frekvenciával és a loop()-ban a megfelelő pontban átlagot számolok és nullázom az értékeket.
Vagyis ez volna az elképzelés...
Vmi ötlet arra, hogy meg se nyikkan?
Az első és utolsó életjel egy félig kiküldött Serial.print pár sorral a timer beállítása után.
Próbáltam alá rakni a sei()-t ennek az egy Serial.print-nek, de meglepő módon még idáig se jut a program.Setup()-ban:
cli();//stop interrupts
//set timer2 interrupt at 1kHz
TCCR2A = 0;// set entire TCCR2A register to 0
TCCR2B = 0;// same for TCCR2B
TCNT2 = 0;//initialize counter value to 0
// set compare match register for 1khz increments
OCR2A = 249;// = (16*10^6) / (1000*64) - 1 (must be <256)
// turn on CTC mode
TCCR2A |= (1 << WGM21);
// Set CS22 bit for 64 prescaler
TCCR2B |= (1 << CS22);
// enable timer compare interrupt
TIMSK2 |= (1 << OCIE2A);
sei();//allow interruptsSetup()-on és Loop()-on kívül:
ISR(TIMER2_COMPA_vect){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3F); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,2,true);
AcZ += Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
measures++;
Serial.println("Yay");
}Egyébként ilyenkor az analogWrite() egyáltalán nem fog működni, vagy csak azon a két lábon nem, amit a Timer2 vezérel?
(#3061) fpeter84
BT-s vezérlés Android-on adja magát, de mennyire profi megoldás lenne már egy beépített képernyő![ Szerkesztve ]
-
Teasüti
nagyúr
válasz
Teasüti #3063 üzenetére
Hmmm úgy néz ki működik a dolog, ha az interrupt függvény tartalmát kikommentelem és bent hagyok egyetlen számlálót.
Ebből arra következtetek, hogy túl lassú az interrupt végrehajtása?
Talán a következő megszakítás újraindítja a kódot mielőtt az lefutna?
Lehetséges ez egyáltalán, hogy a következő megszakítja az előzőt?Hogy szokás fix frekvencián kiolvasni egy I2C buszon lévő eszköz regisztereit, ha nem timer interrupt-tal?
[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
Teasüti #3064 üzenetére
Sehogy se akar működni az I2C busz a megszakítással. A végrehajtási ideje 560 uS, szóval technikailag mennie kéne, de még 250 hz-re csökkentve se éled fel a program. Egyszerűen el se indul, még a setup() se fut le.
(#3065) fpeter84
GY-512-es modulom van, tud küldeni megszakítást.
Viszont jelenleg csak egyetlen tengely adatai kellenek nekem és csak a nyers adatok kiolvasása példáját használom. Az INT-hez meg már kéne a FIFO puffer, amivel meg társul a DMP is ha jól emlékszem (de nekem nem kell a DMP ehhez a projekthez, csak a nyers gyorsulás egy tengelyen).Illetve kicsi frekvencián nincs zajszűrés (átlagolva a mintákat), ami nekem nem jó.
[ Szerkesztve ]
-
Teasüti
nagyúr
Miért nem tudok küldeni AT parancsot az HC-05 vagy 06 moduloknak programból?
Ha serial monitorból gépelem be ezen a hídon keresztül, akkor príma:
// Keep reading from HC-05 and send to Arduino Serial Monitor
if (BTSerial.available())
Serial.write(BTSerial.read());
// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available())
BTSerial.write(Serial.read());De amint kódolni szeretném, sehogy se működik.
Pl.:
BTSerial.write("AT");
BTSerial.write("AT\r\n");
BTSerial.print("AT");
BTSerial.println("AT");
és stb...
String command = "AT";
char com[3];
BTSerial.print(command);
command.toCharArray(com, 3);
BTSerial.write(com);Ha csak egyetlen egy ilyen bekerül a programba, akkor már a híd se működik onnantól.
Egészen perverz módon azt is próbáltam, hogy a begépelt parancsot menti le karakter tömbbe és azt rakja ki write() módban.Szóval tudja esetleg vki most mi f@sz baja van?
Köszönöm! -
Teasüti
nagyúr
válasz
fpeter84 #3078 üzenetére
A serial monitor az "AT" üzenetre a loopback Serial.print(char, DEC) is csak két karakter ascii kódját adja vissza.
Ha van is itt még vmi trükk, akkor azt így nem látom.B@@@@!
Egész álló napja próbálom életre kelteni a HC-05-öt, semmire se akart válaszolni AT módban, semmilyen sebességen.
Kibogarásztam már a fórumok bugyraiból, hogy hisztis a soremelésre és a kocsi vissza karakterekre, de azt hittem az arduino serial monitor erről gondoskodik a háttérben, mivel a HC-06 simán kommunikál velem.
Erre nem most látom az ablak alján, hogy lehet kapcsolni a soremelést és a kocsivisszát??
(Na így már Serial.print(char, DEC) is 4 karaktert mutat az "AT" szóra.)
(#3081) Janos250
Example-ből másoltam ki ezt a parancsot, ami a tutorial-ban működik, nekem nem ad választ.
De mivel manuálisan sikerült most életet csikarni a HC-05-be, ezért ugyan érdekes jelenség, hogy kódból miért nem válaszol rá, de a továbbiakban érdektelen számomra. Ez egy baud rate teszthez kellett volna, ahol végigpörgeti az "AT" parancsot az összes sebességen.[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
norbert1998 #3084 üzenetére
Ránézésre ezt nem lehet megmondani.
Ez egy sokváltozós képlet, kezdve a motor nyomatékával, a jellemző áttétellel, ennek az orsónak a menetemelkedésével és így tovább minden egyes alkatrész jellemzőivel a hajtásláncban. És akkor a súrlódási tényezőket megállapítani még külön fejvakarás.
Hacsak nem vmi nevetségesen hosszú áttételt használsz, akkor az a 0,32 Nm elég viccesen hangzik szerintem.
De ne hallgass rám, csak hasraütöttem, ahogy a kérdés is csak hasraütésszerű.
Ez így már bőven gépészmérnöki feladat, általában ezt már tervezni szokás. -
Teasüti
nagyúr
Kérhetnék egy kis elektronikai segítséget?
Megcsináltam a vezetéknélküli program feltöltést, viszont a reset-elő áramkör nem működik vmiért.
Nálam R3 = 10 kOhm, R2 = 20 kOhm (2x10 sorba kötve). A kondi egy u1J63 izé, ami a kezdő csomagban volt, ha jól tévedek ez éppen akkora, amekkora ide kell.
Rámértem multival:
1. átvitel közben a PIN32 lehúz földre, ahogy kell; amúgy 3,3V.
2. a reset PIN-en stabil ~4V van minden helyzetben.
szerk: 3. a kondi egyik lábán a feszültség állandó ~4V, a másik lábán meg 3,3/0V mérhető üzemmódtól függően.
A bekötést n+1 alkalommal ellenőriztem.
A nulla felé konvergáló elektronikai ismereteimmel a feszültségosztót is épp csak kapisgálom, de a kondi nem tudom hogy viselkedik, vagy hogy kéne neki.
Vmi tipp?
Köszönöm!szerk: manuális reset-tel véletlenül elkaptam egy getsync kísérletet, a program szépen feltöltött szal ezen apró bug-on kívül elvileg jó.
Mellékhatása a mod-nak, hogy a monitor megnyitásakor is lesz egy reboot.[ Szerkesztve ]
-
Teasüti
nagyúr
Én pl. kalibrációs értékeket mentek el benne, amit onnan tölt be egy esetleges reboot esetén.
Flash élettartam.
A CPU meg évtizedeket szolgálhat. Igazából én még csak nem is hallottam hír szinten se öregségben elhunyt processzorról eddig életemben.
A 20-30 éves PC-k is vígan futnak még, persze ha az alaplap és rajta a kondik bírják még.[ Szerkesztve ]
-
Teasüti
nagyúr
MPU6050 lelkivilágához ért itt vki?
Átnyálaztam magam ezen, mellé felcsaptam még ezt is.
Viszont akad pár kérdésem, amit nem értek, infót neten nem találtam, a program és a kézikönyv nem tárgyalja.
Pl. a FIFO olvasása és írása hogy működik?
Van egy FIFO_R_W regiszterem, de ez csak egyetlen bájt az 1024-ből. Szóval ezt miként használja a modul? Az olvasás gondolom úgy megy, mint a 60 KB soros puffer esetén, hogy a kiolvasott adat helyére a sorban következő kerül míg ki nem ürül a FIFO. Így van?
Viszont az írás teljesen ködös, egyáltalán mit és miért kéne ebbe írni kívülről az adatbusz felől?Aztán ott van a low pass filter és a sample rate.
Ha jól értem a kézikönyvet, akkor a chip a mintavételi frekinél alacsonyabb szűrő frekivel írja ki a szűrt értéket a regiszterbe.
Viszont ennek látszólag ellenmond az alábbi kód:// Configure MPU6050 gyro and accelerometer for bias calculation
writeByte(MPU6050_ADDRESS, CONFIG, 0x01); // Set low-pass filter to 188 Hz
writeByte(MPU6050_ADDRESS, SMPLRT_DIV, 0x00); // Set sample rate to 1 kHz
writeByte(MPU6050_ADDRESS, GYRO_CONFIG, 0x00); // Set gyro full-scale to 250 degrees per second, maximum sensitivity
writeByte(MPU6050_ADDRESS, ACCEL_CONFIG, 0x00); // Set accelerometer full-scale to 2 g, maximum sensitivity
uint16_t gyrosensitivity = 131; // = 131 LSB/degrees/sec
uint16_t accelsensitivity = 16384; // = 16384 LSB/g
// Configure FIFO to capture accelerometer and gyro data for bias calculation
writeByte(MPU6050_ADDRESS, USER_CTRL, 0x40); // Enable FIFO
writeByte(MPU6050_ADDRESS, FIFO_EN, 0x78); // Enable gyro and accelerometer sensors for FIFO (max size 1024 bytes in MPU-6050)
delay(80); // accumulate 80 samples in 80 milliseconds = 960 bytesTehát 80 ms-et vár, ami e szerint 80 minta (1 kHz). Viszont feljebb meg 188 Hz-es lowpass van beállítva, szóval ezt nem értem.
A célom az volna, hogy egy tetszőleges lowpass frekvencián megtöltsem a FIFO-t a gyorsulásérzékelő adataival, majd ezt burst read módban kiolvasni relatíve ritkán, hogy a fő programomat ne lassítsa be a 200 hz-es I2C olvasás szerencsétlen Uno-n. E helyett mondjuk a megengedhető legnagyobb késleltetéssel végezni egyetlen I2C műveletet a teljes FIFO puffert kiemelve, majd matekozni.
Ehhez talán interrupt se fog kelleni, max flag-ként.
Illetve azon fílózom még, hogy ha overflow interrupt-ot választok, akkor a FIFO eleje már felülírodott, mire jön a jel? Mert tök jó lenne úgy időzíteni a burst read-et is, hogy teli puffernél olvasson.szerk: illetve továbbra se tudok interrupt-ban I2C műveletet végezni. Ez normális?
Köszi!
[ Szerkesztve ]
-
Teasüti
nagyúr
Miért van az, hogy az alábbi 3 soros kód részlet - hőmérséklet olvasása MPU6050-ről - nem fut le a setup()-ban (rawData[ ] nem tartalmaz semmit), míg a loop()-ban igen?
szerk: nem aktuális, delay megoldotta.
Gondolom a szenzor reset után még nem volt adat, mikor olvasott az Uno.//temperature from MPU6050
Serial.println(readTempData());
Serial.print(float(readTempData()/340.0 + 36.53), 2);
Serial.println(" °C");
int16_t readTempData()
{
uint8_t rawData[2]; // x/y/z gyro register data stored here
readBytes(MPU6050_ADDRESS, TEMP_OUT_H, 2, &rawData[0]); // Read the two raw data registers sequentially into data array
Serial.println(rawData[0], BIN);
Serial.println(rawData[1], BIN);
return ((int16_t)rawData[0]) << 8 | rawData[1] ; // Turn the MSB and LSB into a 16-bit value
}
void readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest)
{
Wire.beginTransmission(address); // Initialize the Tx buffer
Wire.write(subAddress); // Put slave register address in Tx buffer
Wire.endTransmission(false); // Send the Tx buffer, but send a restart to keep connection alive
uint8_t i = 0;
Wire.requestFrom(address, count); // Read bytes from slave register address
while (Wire.available()) {
dest[i++] = Wire.read();
} // Put read results in the Rx buffer
}[ Szerkesztve ]
-
Teasüti
nagyúr
válasz
Daszkalosz19 #3181 üzenetére
Nálam lefordítja így ahogy van.
Gondolom friss verziód van neked is.[ Szerkesztve ]
-
Teasüti
nagyúr
Ezt hol látod? Átsiklottam felette biztos.
Arról nincs infód véletlenül miért kell a PWR_MGMT_1 regiszterben a reset után még külön ébreszteni (kinullázni a regisztert)? A doksi szerint ha végez a reset-tel, akkor ez a kapcsoló automatikusan átfordul nullába. De nálam vmiért nem és nem is működik a modul, amíg külön nem írok nullákat ide.DEVICE_RESET: When set to 1, this bit resets all internal registers to their default values.
The bit automatically clears to 0 once the reset is doneFIFO-t nem használok jelenleg. felraktam maxra a lowpass filtert, aztán csak a regisztereket olvasom.
Egész jó eredményt ad, mintavételezéssel és átlagolással se kapnék szükségszerűen jobb eredményt, de legalább megspórolok némi cpu időt.MÁS
Watchdog interrupt-ra tud vki egy tutorial-t példával?
Csak olyan cikket találtam, ami egy erre épülő library-t mutat be, de nem akarok library-t használni, amikor pár sor az egész és legalább látnám mit is csinál regiszter szinten a kód.
(Lassan meg kéne néznem mi is az a library és hogy lehet létrehozni sajátot.)[ Szerkesztve ]
-
Teasüti
nagyúr
Watchdog témakörben van itt egy cikk, ami vhogy elmenti egy ISR_NAKED interrupt-tal, hogy hol lett megszakítva a program. Ez debug-ra volna jó, hogy aztán lehessen látni visszafejtés után pontosan milyen parancsnál fagyott le a futtatás.
Function called when the watchdog interrupt fires. The function is naked so that
we don't get program stated pushed onto the stack. Consequently the top two
values on the stack will be the program counter when the interrupt fired. We're
going to save that in the eeprom then let the second watchdog event reset the
micro.Nem fordul le a példa program, szóval szeretném újraalkotni alacsony szinten a kulcs részeit, viszont még elég hiányosak az ismereteim, meg a library-t se igazán értem még, hogy sketch-be át tudjam írni.
Nem tudom mi az a "stack" és hogy lehet kezelni. Illetve ez milyen területe az Arduino-nak? Még azt se igazán tudom mit kéne keresni a neten némi tájékozódás gyanánt.[ Szerkesztve ]
-
Teasüti
nagyúr
Illetve akartam kérdezni, hogy regiszter tologatásnál mit jelent egy ilyen művelet: 1<<WDRF?
Bitshift referencia szerint így kellene kinéznie:
Syntax:
variable << number_of_bits
variable >> number_of_bitsSzóval ez alapján nem tudom értelmezni a fenti műveletet.
Tolja el az 1-et balra a WDRF regiszterrel (ami 8 bites gondolom)??
Ha jól láttam az összes regiszter beállítása hasonlóképp működik*, de eddig csak értetlen copy&paste alapján végeztem tutorial-ból.
De szeretném megérteni mi is történik itt.
Érdekességképpen az I2C buszon lévő modulok regisztereit AND és OR művelettel lehet írni, ami adja magát és logikus is.Köszi!
*pl Timer1 config:
OCR1A = 31250; // compare match register 16MHz/256/2Hz
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt[ Szerkesztve ]
Új hozzászólás Aktív témák
- HGST 10TB 7.2K 12Gbps 256MB 3,5" SAS HDD Több darab is van
- Poco X6 Pro 12/512 garanciális
- INGYEN POSTA! AsRock B550M, Ryzen 5 5500, RX 6600XT, 16Gb DDR4 3200Mhz CL16, 250Gb M.2, 600W Gold
- CTO ÚJ Bontatlan MacBook Pro 16 M3 Pro 12CPU/18GPU 18GB/1TB SSD Magyar billentyűzet Azonnal átvehető
- ÚJ BONTATLAN Apple Watch Series 8 S8 41-45mm Azonnal Átvehető DEÁK TÉRNÉL 1 Év Apple Garanciával.