- Az NVIDIA szerint a partnereik prémium AI PC-ket kínálnak
- Két Zen 5-ös dizájnjának mintáit is szállítja már az AMD
- A Colorful "fagyosan kompakt" alkatrészekkel megy elébe a nyárnak
- A Keychron ismét egy űr betöltését vállalta magára az egerek szegmensében
- Az átlagnál vaskosabb ventilátorok kandikáltak ki a Corsair vitorlája mögül
- TCL LCD és LED TV-k
- NVIDIA GeForce RTX 3080 / 3090 / Ti (GA102)
- AMD Navi Radeon™ RX 6xxx sorozat
- Modern monitorokra köthető 3dfx Voodoo kártya a fészerből
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- HiFi műszaki szemmel - sztereó hangrendszerek
- Vezeték nélküli fülhallgatók
- Gaming notebook topik
- E-book olvasók
- Fujifilm X
Hirdetés
-
Egyre közelebb a Poco F6 startja
ma Újabb ár/érték csatát nyerhet a Xiaomi almárka.
-
Nyár végén jön az idei THQ Nordic Digital Showcase
gp Az új bejelentések mellett újabb részleteket kapunk a Gothic Remake-ről és a Titan Quest II-ről is.
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
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
-
Tankblock
aktív tag
Ha fontos, hogy pontos legyen akkor vagy végigméred referencia feszültségekkel és azokat haszálod fel, vagy veszel egy külső ADC-t ami sokkal pontosabb....
Kérdéses mire is kell optimalizálni: költségre, vagy nagy pontosságra, csak egyet választhatsz....Release the Beast....
-
rsanya87
tag
válasz gyapo11 #10145 üzenetére
Legjobb esetben a 2 fekete tekerővel lehet jobbra balra állítani, de úgy, hogy egymásnak ellen kell tekerni. Szóval egyiket ki másikat be, úgy fordul. A két ezüst tekerentyű pedig a fel-le irány, azt is egymásnak ellen kell tekerni, ugyanúgy működik mint a másik. Szóval 4 motor kellene aminek iszonyat nyomatéka van.
-
tvamos
nagyúr
Ebbol a megfontolasbol en ADS1220-at hasznalok, azt nem nagyon kell kalibabralgatni.
(#10152) rsanya87 válasza gyapo11 (#10145) üzenetére
Van az ebay-en atteteles nema motor is, azoknak jo nagy a nyomateka.
Ilyesmire gondolok: [link][ Szerkesztve ]
"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János
-
_q
addikt
válasz Tankblock #10151 üzenetére
Igen, emiatt vettem külső ADC-t. Költségbe így rosszul jöttem ki.
Az ESP 3v3 regulátorából jövő feszültséget használtam és egy potit, közben multiméterrel mértem. 0-3V között 10-15 pontot vettem fel. A multiméter ami elvileg pontos, ahhoz képest tized voltokat tért el az ESP ADC-jével mérve az érték. 3-3.3V között talán 1 értéket mért az ADC, 3.1 V körül már 3.3V-ot mért, miközben multiméterrel láttam, hogy nem annyi az érték. Közel 0 V-nál is hasonló volt, bár ott pontosabb. Tehát a 0 és 3 V körül levágta az értékeket és nem pontosan mérte, a kettő között pedig tized-század V eltérések is előfordultak. Ahol esetleg a tized V eltérés belefér ott még használható lehet talán.
Sajnálom, mert az uno-n lévő atmel ADC-je elég pontos és általános mérésekre szépen használható, ami nem mondható el az ESP32-ről.
(#10153) tvamos
Én mikor keresgéltem arduinos könyvtár support-ot, akkor az ADS1115-ot találtam, így nekem az lett.[ Szerkesztve ]
-
ecaddsell
aktív tag
válasz Tankblock #10148 üzenetére
Ha csak ez az egyetlen gondja lenne az ESP32 ADC-jének, akkor igen, de sajnos több sebből vérzik.
A nemlinearitás egyébként máshol jobban vesézve van:
https://github.com/espressif/esp-idf/issues/164Amit linkeltél meg van említve a zaj is, amibe már korábban is belefutottam és amit sokkal nehezebb kezelni.
Amit ajánlgatnak az vicc, 100nF-os kondit csak az tehet oda, aki valami lassú szenzort olvas. Eleve az ESP32 ADC-je nem valami gyors, szóva tipikusan a multisampling se opció.Visszatérve a zajra: A zaj forrása tipikusan a digitális kapcsolási zaj és erősen függ attól, mennyi kimenet változik szimultán módon. Na erről nem szól az ábra.
Ma (meg már 1 ideje) a komolyabb analóg és digitális részt is tartalmazó chipek több tápfeszt igényelnek. Azaz külön kellhet szűrni és stabilizálni a digitális mag tip. alacsonyabb tápfeszét (1V tól 1.8V környéke), a digit interface-t (tip. 1.8-3.3V) ill. az analóg részeket. Ez persze megdrágítja a dolgot és ott spórolnak ahol tudnak.
Kb. ennek az eredménye, hogy a spec szerint 12 bites ESP32 ADC kb. 7 vagy max. 8 bites valójában...Amivel ezzel kapcsolatban mostanában küzdök: Miután az ESP32-vel a 8 digit/s reciprok freki mérőt megcsináltam, elkezdtem áttérni a 10 digit/s-es interpoláló reciprok freki mérőre. Ennek az a lényege, hogy nemcsak azt mérjük, hogy a jel egy adott egész számú periódusára hány egész referencia jel periódus tartozik, hanem a referencia jel tört periódus idejét is mérjük.
Ez úgy történik, hogy a tört periódus ideje alatt 1 kondenzátort töltünk konstans árammal és a töltés végén megmérjuk a kondenzátor feszültségét (ennek a digitális részét CPLD adja nem az ESP32).
Mivel nálam a referencia periódusa 10ns (100MHz) max. ennyi ideig tölt a kondenzátor, ami túl nagy nem lehet, mert akkor nagyon nagy tötlő áram kellene. Szóva a kondenzátor kb. 1 nF, és 30mA körüli töltőárammal kb. 280mV feszültség emelkedést lehet elérni max (azaz normálisan 0-280mV emelkedés, ami nem nulláról indul, szóval lényegtelen, hogy kis értékeket nem tud az ESP32 mérni).
Azaz a két digithez kb. 3mV felbontással kellene mérni. Viszonylag gyorsan, mert a kis kondenzátor gyorsan veszti a töltést még nagy impedancián is.
Na itt az ahol az extra 100nF nem opció.
Oszcilloszkópon frankón látszik a jel. A filléres Aneng 8008 multiméter is konzisztensen tudja indikálni az feszültség emelkedést.
Csak az ESP32 küzd a jellel a saját maga által generálta zajban...Szóval messze nem csak a linearitás a gond. Zajos és a sebessége is megérne 1 külön github részt, hogy mi a teendő, ha normális sebességet szeretnénk (erre is elég sok fórumbejegyzés van már). Talán mégsem véletlen a sok panasz.
[ Szerkesztve ]
-
Tankblock
aktív tag
Lineáris 0.1V és 3,1V között... Ez is van a linken amit küldtem. Bele kell tervezni a projectbe. Anno az attiny13A projectemben inkább a 1V referenciát választottam mint a tápfeszültségig mérést.
Ha meg nagy pontosság kell arra vannak cél ICk. Valamit valamiért....
Boldog 2019 et Mindenkinek!Release the Beast....
-
Lego-hoz keresek arduinót, amit lehet távirányítani. Most melyik ajánlott? Még mindig a wemos, vagy van már azóta jobb? (arduinos motorvezérlő lenne, 2-3 motor, plusz ledekhez kellene)
Eladó Lego: 42139 All terrain vehicle
-
vampire17
addikt
Sziasztok!
Egy ideje kuzdok egy Ilyen kapucsengovel:
Ebbol az "F56" -os Kinetic van nekem.
Par info amit mar kideritettem rola es kep:
- A chipje az adonak: cmt2150A
(Ebbol elv van 433-as es 315-os is)
Kep az ado belsejerol:
Eddig semmivel sem sikerult megfognom a jelet... Amivel probalkoztam: Sonoff RF Bridge 433 mhz-es (modositott radio FW-vel) meg B1-ben sem lat semmit...
Arduino + QIACHIP 433mhz RF Relay Receiver Module
A szoftver az RFlink volt. szinten nem lat semmit...meg debug modban sem latja a csengo jelet (Ekkor kodolas nelkul fog mindent)
Itt van egy kep a gyari vevorol is (Ezzel termeszetesen tokeletesen mukodik az ado):
Megjegyzes: Mind a Sonoff, Mint az RFlinkel tokeletesen foghato mas csengo vagy egyeb 433-as eszkoz jele. csak a Kinetic csengo nem megy (van egy masik kinetic nyomogomom is, masik gyartotol, az sem latszik...)
Most probakepp rendeltem meg egy ilyet, ez az utolso otletem: [link]
ha esetleg tudnatok valami tippet, megis mivel lehetne fogni a csengo jelet az nagy segitseg lenne! Kezdem feladni... Nem akkora dolog amugy, csak mar nagyon bosszant, hogy nem akar osszejonni...
[ Szerkesztve ]
-
Janos250
őstag
válasz vampire17 #10162 üzenetére
Nem értek hozzá, csak a neten próbáltam utánanézni, de azért beledumálok
Ez a chip OOK modulációval dolgozik, ami azt jelenti, hogy van jel/nincs jel, azaz nulla esetén nincs jel, míg 1 esetén egy adott ideig van jel.
http://www.rfwireless-world.com/Terminology/OOK-vs-FSK-vs-ASK.html
https://www.edaboard.com/showthread.php?300713-help-about-modunlate-OOKÉn hogyan próbálkoznék:
Egyenirányítanám a jelet, szűrném, azaz kondi-ellenállással kiegyenlíteném, szkóppal megnézném, hogy mekkora a jel, szükség szerint erősíteném, vagy gyengíteném, hogy TTL szint legyen, azt rátenném egy digitális analizátorra, és látnám, mi a helyzet.
https://www.ebay.com/itm/USB-Logic-Analyzer-Device-Set-Compatible-to-Saleae-24MHz-8CH-for-ARM-FPGA-M100/253841718379?hash=item3b1a253c6b:gNoAAOSwjXVaoiyHAhogy elnézem, a beállításra elég sok variáció van, a fene tudja, hogyan állították be:
http://www.cmostek.com/download/AN113%20CMT2150A-2250(1)A%20One-Way%20RF%20Link%20Development%20Kits%20Users%20Guide.pdf
http://www.cmostek.com/download/AN115%20Pairing%20CMT2150A%20and%20CMT2250(1)A.pdfVagy a vevő oldalon nézném dig. anallal, hogy mi jön be.
Vagy vennék helyette egy könyebben kezelhetőt.
[ Szerkesztve ]
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
gyapo11
őstag
Csinálok egy mozgásérzékelős lámpát arduinoval, és nyilván sleepben kellene lennie az idő nagy részében, és a szenzortól jövő jelre kell fölébrednie. Van valakinek kéznél kód erre?
Van egy ilyen kódom, ezt is itt kaptam:#include <avr/sleep.h>
void sleepNow() // here we put the arduino to sleep
{
byte adcsra = ADCSRA;
wait(100);
ADCSRA = 0;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
attachInterrupt(0, wake_up_pin, LOW);
sleep_mode();
sleep_disable();
ADCSRA = adcsra;
detachInterrupt(0);
}
void loop()
{
Serial.println(" Megyek aludni..");
sleepNow() ; // elmegy aludni, majd felkelted
Serial.println(" Most keltem fel."); // majd innen folytatja
}Lehet, hogy ez jó is, a wake_up_pin-re kell kötni a szenzort, szintet majd meglátom, és elaltatás előtt ellenőrizni kell, hogy ne legyen aktív a szenzor. Vagy lehet, hogy ez se kell, mert akkor azonnal fölkel megint, indul az időzítés, ha az lejárt, jöhet az altatás.
Meg még az lenne a kérdés, hogy ha van egy másik ébresztés egy másik lábon, akkor kell egy másik sleepNow függvény arra a lábra és kész? Vagy még több esetén? Össze kell vagy kapcsolattal gyűjteni, egy lábon ébreszteni, és más lábakon beolvasni, hogy ki volt az?menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet
-
Imy
veterán
Olyan problémám lenne, hogy egy nyomógombbal akarom elindítani, majd esetleg egy hosszú nyomással leállítani a motort, ami a következő program szerint fut:
/*
*/
#include <Stepper.h>
#define STEPS 100
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
Stepper small_stepper(STEPS, 8, 10, 9, 11);
int Steps2Take = 0;
long temps = 0;
int Compteur;
int Rotate_n_temp;
int Rotate_n;
int PSW = 5;
int PSW_S = 0;
void setup()
{
pinMode(13, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(PSW, INPUT); // Push Switch
}
void loop()
{
if (digitalRead(PSW) == HIGH)
{
Push_b_on:
Rotate_n=2;
Rotate_n_temp = Rotate_n-1;
digitalWrite(13, HIGH);
delay(100);
small_stepper.setSpeed(300);
if (Compteur<=Rotate_n_temp){
Steps2Take = -4096;
temps = millis();
small_stepper.step(Steps2Take);
temps = millis()- temps ;
digitalWrite(IN1, LOW);
delay(2);
digitalWrite(IN2, LOW);
delay(2);
digitalWrite(IN3, LOW);
delay(2);
digitalWrite(IN4, LOW);
delay(2);
delay(2000); //pause
Steps2Take = 4096;
temps = millis();
small_stepper.step(Steps2Take);
temps = millis()- temps ;
Serial.println(temps);
digitalWrite(IN1, LOW);
delay(2);
digitalWrite(IN2, LOW);
delay(2);
digitalWrite(IN3, LOW);
delay(2);
digitalWrite(IN4, LOW);
delay(2);
delay(2000); //pause
// Glignotement de la LED
digitalWrite(13, LOW);
delay(100);
digitalWrite(13, HIGH);
delay(100);
Compteur++; //Ajoute 1 au Compteur
}
else{
digitalWrite(IN1, LOW);
delay(2);
digitalWrite(IN2, LOW);
delay(2);
digitalWrite(IN3, LOW);
delay(2);
digitalWrite(IN4, LOW);
delay(2);
Compteur=0;
goto Push_b_on;
}
}
else
{
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(100);
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(100);
}
}Mivel soros futású a program, így a goto paranccsal nem ugrik vissza az elejére, azaz ha akkor nincs benyomva a gomb, akkor nem megy a motor.
Hogyan lehetne megoldani, hogy a gomb egyszeri rövid nyomására elinduljon, és addig ne álljon le, amíg a gombot nem nyomom hosszan? (Leállítás kb 2sec nyomásra)
-
Teasüti
nagyúr
Szép estét!
Van itt aki több fülön ír programot? Előfordult már olyan, hogy nem találta a program a függőségeket és hiába rakom be akár a program mellé a referált könyvtárat, egyszerűen nem látja és hibát dobál a típus definiálásakor.
Próbáltam <> és "" jelekkel is behívni a könyvtárt, sikertelenül.
A program legelső fülén (a fő fájlban) konkrét példaként szerepel egyMPU6050 mpu;
sor. Ez az osztály az MPU6050.h fájlban van, amit betettem a program mellé. Meg is nyitja a többi füllel együtt, és rohadt idegesítő, hogy egy kattintásra van az osztály a definíciótól, mégis 'MPU6050' does not name a type hibát dob.Van vkinek bármi elképzelése miért?
-
Teasüti
nagyúr
Ahogy nézem a gomb kezelésed még nagyon-nagyon primitív. Volna egy erős gyanúm, hogy ez kb az első programod lehet és nem foglalkoztál még túl sokat a témával.
Jelenleg csak annyit csinálsz, hogy lefut az első feltétel ha nyomod a gombot és a második, ha nem.
Ez sajnos még elég messze van a kitűzött céltól, de ajánlanék egy tutorialt, ha megy az angol. Ez egész jó bevezetőnek tűnik az időzítő használatába.
A goto-ra meg nem lesz szükség. Mivel a loop() végtelen ciklusban fut, ezért felesleges vissza-vissza ugrálni a kódban, mivel úgyis kezdi elölről. -
Teasüti
nagyúr
Kérhetnék egy kis segítséget a PCNT-vel ESP32-n? Nem találok egyetlen egy példát sem.
-
Imy
veterán
válasz Teasüti #10167 üzenetére
Hát nem az első, de bonyolult dolgokat nem szoktam vele csinálni.
Amit linkeltél, abban nem találom, de inkább leírom szavakkal.
Adott egy gomb, és egy nyomógomb.
A LED addig nem villog, amíg nem nyomom meg a nyomógombot. Ha röviden megnyomom nekiáll villogni a végtelenségig vagy ha hosszan nyomom a gombot akkor megáll. Ha ismét röviden nyomom, akkor kezdi elöről, addig nem áll meg, amíg a nem nyomom hisszan a gombot. Ezt rá tudnám húzni a jelenlegi motormozgatásra is szerintem. De erre kellene nekem egy mintaprogram, mert annyira ezt így nem vágom.
-
vargalex
félisten
válasz Teasüti #10166 üzenetére
Szia!
Az include ugye a definíció előtt szerepel a kódban? <> és a "" include között csak a keresés sorrendjében van különbség. Előbbi esetében az IDE-ben definiált search directory-kban keresi, ezt használjuk a lib-ekben definiált header-ek include-olásához. A "" módon megadott pedig először a programod forrás könyvtárában keresi a header file-t, ezt a saját modulok include-olásához használjuk.
Alex
-
gyapo11
őstag
Nálam úgy volt, hogy a gomb benyomására egy változóba került a millis() értéke, indult egy while ciklus, ami figyelte a gomb felengedését, amikor ez bekövetkezett, akkor a jelenlegi és eltárolt millis összehasonlításából kiderült a nyomvatartási idő. Hátránya ennek a megoldásnak, hogy amíg a while fut, addig a loopban levő többi teendő nem fut, de nálam ez nem volt gond.
Ha fontos, hogy közben a loop pörögjön, akkor kicsit bonyolultabb.
Gomb benyomása után változóba millis, ezután olvasgatni a millist meg a gomb állapotát, 50 ms-en belül nem kell nézni a gomb felengedését, az még prell idő, utána már igen, és a felengedéskor kiszámolni a jelenlegi és a tárolt millis értékéből a nyomvatartási időt.
Hogy mikor mit csináljon a pörgő loopban, azt egy változóval lehet vezérelni, értékétől függően pl. egy switch egy-egy ága fut. Ha a változó 1, akkor mondjuk várja a gomb benyomását. Ha benyomódott a gomb, akkor a változóba 2, ekkor várja a felengedést. Ha felengedted, akkor változóba megint 1, és ismét várja a megnyomást.
Vagy vannak időzítő libek is, amikkel talán egyszerűbb, még nem próbáltam ilyeneket.menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet
-
Janos250
őstag
válasz gyapo11 #10172 üzenetére
Az ilyesmik miatt (is) kedvelem én az ESP32-t. Egyik szál nem csinál mást, csak figyeli a gombot, a másik szál meg..., a harmadik meg.. és így tovább, ahány kell. A szálon belül nyugodtan lehet "várakozás", mert az nem igazi várakozás, hanem a másik szálnak adódik át a vezérlés.
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
Imy
veterán
válasz gyapo11 #10172 üzenetére
Igen, a loopnak pörögnie kellene, de a gomb megnyomását valahol el kellene tárolni, és akár kiolvasgatni. De azt nem tudom, hogy hova, vagy hova.
Egyszerű dolgokra szoktam használni az arduinot, most is egy relé panellel ezt meg tudnám oldani, de hely nincs a panelnek, és könnyű, egyszerűnek kellene lennie.
Remélem valaki tud segíteni, aki már csinált ilyet.
-
Imy
veterán
Egy pédát tudsz?
Neme úgy kell, hogy a "void loop" többször lefut, de a gomb megnyomásának az értéke a "void loop"-ok alatt mindig "bekapcsolnak" kell lennie. Hosszú vagy 2. gombnyomásra pedig hamisnak, hogy álljon le a "void loop".
Azaz pl a "void loop"-ban egy LED fel, le kapcsolás van (csak egy példa), és ez úgymond vilog addig, amíg a gombot nem nyomom meg még egyszer, vagy pedig hosszan.
[ Szerkesztve ]
-
Ha van egy Wemos D1 r2-es lapom, meg egy SensorShield 5-öm, honnan tudom, hogy melyik kimenet mi?
Elvileg ez a Wemos lábkiosztása:[ Szerkesztve ]
Eladó Lego: 42139 All terrain vehicle
-
Teasüti
nagyúr
Nyomógomb épp most volt terítéken nálam, itt egy konkrét példa.
Az utolsó oldalon láthatod a teljes kódot, amiben benne hagytam egy már nem használatos részletet is, ami a nyomvatartást kezeli.
Ha további magyarázatra lesz szükséged, írj bátran!(#10176) Imy
Itt némi zavart érzek az erőben. Miért szeretnéd leállítani a loop()-ot? Ha azt megállítod, akkor csak reset után fog újraindulni a program. Amúgy ki tudsz lépni belőle egy simareturn;
paranccsal, de innentől megáll működni a processzor. Ha egy feltételes várakozás kell (feltételes program stop, ha ez ismerős), akkor azt csinálhatod egy while ciklussal, ami végtelenül fut amíg nem teljesül a feltétele. De ezekre igazán semmi szükség, hisz maga a loop() is végtelenül ismétlődik, viszont ha a gombnyomásodtól függően indítasz el feltételeket, akkor megcsinálhatod úgy, hogy egész egyszerűen átugorja a parancsokat az if-ben egészen addig, amíg nem teljesül vmeyiknek a belépési feltétele. Ilyen formában nem áll meg a program működése, mégis kvázi üresen fut a loop().(#10170) ecaddsell
Pulse counter kellene frekvencia méréshez. Hardveres lehetőleg. És Arduino IDE-ben.(#10171) vargalex
Igen, természetesen. A működő példaprogramból emeltem át a szükséges sorokat egy az egyben, természetesen a helyüknek megfelelő sorrendben elhelyezve.
A második fülön lévő header fájl hívja meg az MPU6050.h könyvtárat, amiben meg definiálva van az MPU6050 osztály. Ez így ebben a formában simán lefordul a párhuzamosan megnyitott példaprogramban. Ötletem sincs itt miért nem.[ Szerkesztve ]
-
Teasüti
nagyúr
válasz vargalex #10179 üzenetére
Azt a header fájlt egy az egyben másoltam át a példából. Az alap könyvtár meg nincs módosítva.
[ Szerkesztve ]
-
válasz Victoryus #10177 üzenetére
Végignéztem a led villogtató példával. Az lehet, hogy a 13 digitális pinből csak az 1, 4, 12 megy? Ez így akkor nem sok mindenre jó...
Kéne vezérelnie egy motorvezérlőt 2-3 motorral, meg 3 ledet. Vagy akkor próbáljam meg Shield nélkül?Eladó Lego: 42139 All terrain vehicle
-
Teasüti
nagyúr
válasz vargalex #10179 üzenetére
Vagy ha úgy érted, hogy a Motionapps20 header fájlból van-e több példány is, akkor igen. Van egy módosítatlan a könyvtárban és a módosított meg a program mellett. De nem gondolom, hogy ez probléma lenne. Ha nem a program mellettit töltené be, akkor nem az osztályra dobna hibát, hanem sok másra.
Meg a példában simán lefordul így. -
Teasüti
nagyúr
válasz ecaddsell #10183 üzenetére
Hát mondjuk megszakítást használni és programból számolni. Az szoftveres és sokat elvesz a cpu időből, ha nagy a frekvencia.
Értékelem a segítséget, de sajnos nem tűnik számomra használhatónak egyik sem.
Az első az ESP-IDF-hez íródott, miközben én Arduino IDE-ben vagyok.
A második meg egyáltalán micsoda? Nem fogom tudni visszafejteni azt a kódot, ahhoz túl nagy és bonyolult.
Főleg, hogy egy rakás hardver közeli függvényt hív be, amikről fingom sincsen.Vmi Instructables.com színvonalú példa nincs véletlen? Én nem találtam...
[ Szerkesztve ]
-
Imy
veterán
válasz Teasüti #10178 üzenetére
Ez a programom, és így kellene működnie, de most már nem tudom, hogy mit is, és hova kellene beleraknom...
Nekem így működik most:
- Motor megy x fordulatot
- LED villog x ideix x-szer, jelzi, hogy vár
- Motor megy x fordulatot
- LED villog x ideix x-szer, jelzi, hogy vár
- ... (végtelenségig megy, ha nincs gombnyomás)A gombnak ennyit kellene csinálnia:
- Gomb megnyom röviden, akkor indul el a motor
- Motor megy x fordulatot
- LED villog x ideix x-szer, jelzi, hogy vár
- Motor megy x fordulatot
- LED villog x ideix x-szer, jelzi, hogy vár
- ... (végtelenségig megy, ha nincs gombnyomás)
- Gomb megnyom hosszan, akkor megáll a motor
- LED, motor áll, nem csinál semmit
- Gomb megnyom röviden, akkor indul el a motor
- Motor megy x fordulatot
- LED villog x ideix x-szer, jelzi, hogy vár
- Motor megy x fordulatot
- LED villog x ideix x-szer, jelzi, hogy vár
- ... (végtelenségig megy, ha nincs gombnyomás)Programkód:
/*
===============
Stepper wiring:
===============
Arduino - Driver
D8 - IN1
D9 - IN2
D10 - IN3
D11 - IN4
===========
LED wiring:
===========
LED "-" : GND
LED "+" : D13
*/
#include <Stepper.h>
#define STEPS 100
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
Stepper small_stepper(STEPS, 8, 10, 9, 11);
int Steps2Take = 0;
long temps = 0;
int Cycle;
int Rotate_n_temp;
int Rotate_n;
int PSW = 5;
void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
pinMode(IN1,OUTPUT); //stepper motor coil-1
pinMode(IN2,OUTPUT); //stepper motor coil-2
pinMode(IN3,OUTPUT); //stepper motor coil-3
pinMode(IN4,OUTPUT); //stepper motor coil-4
pinMode(PSW, INPUT); // Push Switch
}
void loop()
{
Rotate_n=1;
Rotate_n_temp = Rotate_n-1;
digitalWrite(13, HIGH);
delay(100);
Serial.println("Stepper motor working, one cycle is OK ");
small_stepper.setSpeed(300);
if (Cycle<=Rotate_n_temp){
Steps2Take = -4096;
temps = millis();
small_stepper.step(Steps2Take);
temps = millis()- temps ;
Serial.println("Rotate cycle noumber:");
Serial.println(Rotate_n);
Serial.println("Motor step noumber:");
Serial.println(temps);
digitalWrite(IN1, LOW);
delay(2);
digitalWrite(IN2, LOW);
delay(2);
digitalWrite(IN3, LOW);
delay(2);
digitalWrite(IN4, LOW);
delay(2);
delay(2000); //pause
Steps2Take = 4096;
temps = millis();
small_stepper.step(Steps2Take);
temps = millis()- temps ;
Serial.println(temps);
digitalWrite(IN1, LOW);
delay(2);
digitalWrite(IN2, LOW);
delay(2);
digitalWrite(IN3, LOW);
delay(2);
digitalWrite(IN4, LOW);
delay(2);
delay(2000); //pause
digitalWrite(13, LOW);
delay(100);
digitalWrite(13, HIGH);
delay(100);
Cycle++;
}
else{
digitalWrite(IN1, LOW);
delay(2);
digitalWrite(IN2, LOW);
delay(2);
digitalWrite(IN3, LOW);
delay(2);
digitalWrite(IN4, LOW);
delay(2);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
/* digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
digitalWrite(13, HIGH);
delay(2000);*/
//1 min waiting, and restart motor
Cycle=0;
}
} -
Teasüti
nagyúr
válasz Teasüti #10184 üzenetére
Viszont ezt kipróbálom. Holnap. Mert a mai estém teljes egészében sz.pással és kutatással telt...
-
ecaddsell
aktív tag
válasz Teasüti #10184 üzenetére
Az első az ESP-IDF-hez íródott, miközben én Arduino IDE-ben vagyok.
Nekem még soha nem okozot gondot ESP-IDF-et használni az Arduino IDE-ből...
Többek között a második kód esetén sem.
De mindegy, te tudod mire kell és mit vállalsz be ehhez.Én elég sokat vállaltam ebben a témában (talán túl sokat is) pl. VHDL kód írása és tesztelése (működni látszik) Xilinx CPLD-re, nyáktervezés (kétfajta progit is bevetettem) stb. Nagyon sokat tanultam belőle, annak ellenére, hogy lehet ez is a befejezetlen projectek sorát fogja gyarapítani.
-
Tankblock
aktív tag
Hello
Mit kell csinálnia a motornak ha már megnyomtad elindult, de csak rövid ideig megnyomod még 1x?
Mekkora a rövid és a hosszú idő?Bármikor meg kell-e tudnod állítani?
Ha jól értem ha 1x elindítod akkor csak megállítani akarod valamikor.
Állapotgép tipikus esete.[ Szerkesztve ]
Release the Beast....
-
Teasüti
nagyúr
Ez így jelenleg halva született. Ennyi delay() mellett nem lehet időt számolni. Ezzel így max billenőkapcsolót tudnál használni, azt nem kell időzíteni. Ha gombnyomást akarsz mérni, ahhoz másodpercenként többször ellenőrizni kell a gombot, vagyis gyorsnak kell lennie a programnak. Ennyi delay()-el 4-5 másodperc legalább, mire egyszer lefut a loop(). A lineáris gondolkodás még hiányzik, de majd kialakul ha megérted, hogy nem muszáj minden egyes ciklusban végigmenni az összes parancson.
Ezért használunk feltételeket, hogy szabadon ki-be ugrálhassunk az elágazásokba. Így lehet, hogy egy If parancs csak minden századik ciklusban fut le. Vagy ezredik. Vagy százezredik... Ha millis()-el időzítesz, akkor eltelt időt számolsz milliszekundumokban. Ezt feltételben vizsgálod, hogy igaz-e a reláció:if (millis() > temp + 1000) { }
. Ideális esetben nincs megakasztva a program ennyi delay-el és mire teljesül pl. az 1000 ms várakozási idő, addigra akár sokezerszer ismétlődhet a loop(). Futhat akár üresen, ha egyik elágazásba (feltételbe) se ugrik bele, vagy csinálhat addig akármi mást is. -
Imy
veterán
válasz Teasüti #10189 üzenetére
Köszi, akkor érdemes kitenni külön "void"-ba azaz szubrutinba, ugye?
Amúgy a működés így fest, vagyis így kellene működnie, csak a kapcsolót kellene beleintegrálni. [link]
Az általad említett:
if (millis() > temp + 1000) { }
Ezt mire is tudom használni? Hogy csak akkor ugorjon be a ciklusba, ha eltellik az idő? A millis az 1ms? Temp? +1000?
[ Szerkesztve ]
-
Imy
veterán
-
Teasüti
nagyúr
Átírtam neked a programod.
Lefuttatni nem nyilván nem tudom, de ránézésre kb jónak tűnik.
Elvileg bekapcsolásra oda-vissza jár a léptetőmotor (feltéve ha ez a része jól működött az eredeti programnak) és felvillantja a led-et a mozgás végén. Majd két másodperc múlva újra.
Hosszú gombnyomásra megáll és két másodperces villogtatásba kezd, majd 1 perc elteltével újraindul a motor.Amúgy a Stepper.h könyvtár blokkolja a program futtatást, amíg mozgásban van a motor. Vagyis addig nem ugrik a következő sorra, amíg be nem fejezi a mozgást. Ez problémás lehet. Pl. nem tudom ez a könyvtár milyen hardvert használ (Timer, Int, stb.). Ha kikapcsolja a megszakításokat, akkor a millis() nem fog számlálni a motor léptetése közben.
[ Szerkesztve ]
-
Teasüti
nagyúr
válasz ecaddsell #10187 üzenetére
Na jó, de azért mentségemre szolgáljon, hogy ez amit most találtam kb 30 sor az egész.
Amit te linkeltél, ott az egyikről elképzelésem sincs mit csinál, a másik pedig... Ágyúval verébre.Először hallok erről a VHDL-ről.
Én naiv azt hittem vmi CAD félében terveznek processzorokat...
Soha nem hallottam még ilyen "program" nyelvről.
Akkor te saját microchip-eket tervezel? -
Imy
veterán
válasz Teasüti #10192 üzenetére
Köszönöm, ez részben már működik, de sajnos még nem jól.
Gombnyomásra elindul => OK
Hosszú gombnyomásra nem áll meg.
Nem tudom hol állítani, hogy X fordulatot menjen, majd Y ideig ne. (X fordulat a végleges programban 20 oda-vissza forgás lesz, és Y idő 55 perc) Azaz óránként megtesz 20 fordulatot, és 55 percig nem csinál semmit.
Ha nem csinál semmit, akkor a LED-et kell villogtatni, hogy lehesen látni, hogy stand-by állapotban van a cucc. -
_q
addikt
Miért fontos, hogy a gombot röviden vagy hosszan nyomod meg? A leírásod szerint semmi különbség nincs ha csak röviden egyszer lenyomod akkor indul, még egyszer meg nyomod akkor meg leáll. Így programozás szempontból is egyszerűbb lenne.
Itt egy egyszerű példa interruptra.
Loop-ba belerakod a led és a motor vezérlő részt. interrupt függvénybe csak 1 változó értékét változtatod. 1x lenyomod a gombot belép példa szerint void blink, változó állít "HIGH" mondjuk, loop-ban if turn on == 1 akkor motor forog, led bekapcsol.
Ha megint lenyomod akkor meg változó void blink-en bleül LOW-ra áll és leáll a motor, led kikapcsol.[ Szerkesztve ]
-
ecaddsell
aktív tag
válasz Teasüti #10193 üzenetére
Lehet, hogy egyszerű, de pont azt a módszert követi ("megszakítást használni és programból számolni") amire korábban azt írtad, hogy lehetőleg ne.
Amit korábban linkeltél PCNT-s rotary encoder dekódolás szintén nem működik, ha nincs prellmentesítve a dekóder (ami túlárazottá teszi az egészet), ezt a kört már korábban lefutottam és itt leírtam.
Nekem úgy tűnik szisztematikusan megtalálod (előnyben részesíted) a rossz módszereket, csak azért mert az egyszerű.
Nem saját saját microchipet tervezek, hanem a gyártó által tervezett, utólag meghatározható logika összeköttetéseket határozom meg (ami tudtommal tényleg hasonló a digitális microchip-ek tervezéséhez).
Lelkes hobbisták így szokta retro gépeket/procikat összedobni (nem érdekel a téma csak érdekesség).
-
Teasüti
nagyúr
válasz ecaddsell #10196 üzenetére
Most néztem át ezt, de ebben nincs megszakítás kezelés.
Itt csak kiolvassa a függvény a számlálót a loop()-ban.
Természetesen már szoftveresen számolom ki a frekvenciát, vagy ezt hogy érted? Ha jól értem ezt a programot a számlálás maga nem szoftveres. Nem változóban számolja a megszakításokat, hanem regiszterben. És függetlenül attól mit csinál a cpu, legalábbis remélem. Ennyiből áll a pulse counting, nem? Vagy van rá hardveres gyorsítás, ahol a pulzusok számából frekvenciát köp ki eredményül? Meglepne...Nem akarom túlbonyolítani a dolgot. Nekem elég annyi, hogy a program blokkolása nélkül tudjon számolni és igény szerint kiolvasni ezt az értéket.
Ezt hogy kell elképzelni? Vmi olyasmi, mint ESP32-nél a tetszőlegesen beállítható GPIO mátrix?
[ Szerkesztve ]
-
Janos250
őstag
válasz Teasüti #10197 üzenetére
Van, persze, de még én se használtam, csak azt láttam, hogy elvileg van:
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
482. oldal, 17. PULSE_CNTÍgy persze nagyon macerás, de valahol van hozzá valami hasonló, mint az RMT-hez, de amikor néztem, nem nagyon érdekelt, és nem is volt túl részletes a leírás.
Ami tetszett, hogy van benne hardware szűrés. Ez egy kapcsoló prell (pergés) mentesítéséhez jól jöhet.Szerkesztés:
Hopp, most nézem, hogy az általad linkelt pont ez.[ Szerkesztve ]
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
Teasüti
nagyúr
válasz Janos250 #10198 üzenetére
Igen.
Hardveres számlálás és szoftveres kiolvasás. Nekem ennyi bőven elég.
Közben átnyálaztam a PCNT driver-t is, hogy milyen függvényeket használ.
A rotary encoderes példa csont nélkül betalált (bár a srác eredeti szándéka szerint nem tudom a rotary encodernél mi az elképzelés a control pin használatára). Összeraktam a saját példámat ez alapján (copy & paste) és kipróbáltam egy PWM csatornára kötve. Szuperül működik.
Azt még nem tudom, a PCNT és az RMT az ugyanaz a hardver vajon, vagy csak a véletlen műve, hogy mindkettőben 8 csatorna van? Azért, mert legalább 6 csatornát használni kívánok az RMT-ből, de lehet mind a nyolcat idővel.Ha már szóba hoztad az RMT-t, akkor kérdeznék:
Szerinted azzal célszerűbb volna frekvencia modulált jelet létrehozni, mint a PWM vezérlővel?
Jelenleg a ledcpwm-et használom erre 50% kitöltéssel és a frekvenciát váltogatom (illetve szeretném váltogatni, de még nem jutottam el a próbáig). Viszont az előzetes tesztjeim szerint a ledcpwm nem igazán működik 0 Hz közelében. Úgy kb 10 Hz volt a minimum, ami jól működött. Nekem meg 0-2000 Hz között kellene PFM jelet csiholnom.szerk: olvastam az a technical reference manual-t. (Ez régen is megvolt már? Asszem most láttam először ezt a doksit.) De nem látom a kapcsolatot a driver-ben használt függvények és a regiszter nevek közt. Mondjuk a pcnt.h fájlnál nem mentem lejjebb, vmelyik include biztos hardver közelibb kódot rejt.
(#10187) ecaddsell
Amúgy köszi a biztatást! Végül csak IDF függvényekkel lett megoldva![ Szerkesztve ]
-
Janos250
őstag
válasz Teasüti #10199 üzenetére
"Ha már szóba hoztad az RMT-t, akkor kérdeznék: Szerinted azzal célszerűbb volna frekvencia modulált jelet létrehozni, mint a PWM vezérlővel?"
Én az RMT-vel csinálnám, azon egyszerű oknál fogva, hogy azt már használtam, nagyjából ismerem, de a PWM-et még nem
Persze lehet, hogy a PWM a jobb, ezt az tudná megmondani, aki mindkettőt használta.
"olvastam a technical reference manual-t. (Ez régen is megvolt már?"
Igen, néhány havonta frissítik, bővítik. Én ez alapján használtam az RMT-t 2017 ősszel, télen.
"a PCNT és az RMT az ugyanaz a hardver vajon, vagy csak a véletlen műve, hogy mindkettőben 8 csatorna van?"
Nem ugyanaz.
0x3FF5_6000 0x3FF5_6FFF 4 KB RMT
0x3FF5_7000 0x3FF5_7FFF 4 KB PCNT
Más memória címen vannak.
Table 6: Peripheral Address Mapping - Tech. Ref. 30. oldal
Egyébként a Tech. Ref sem teljes, még mindig. Vannak területek, amik még mindig hiányoznak, illetve egyes memóriacímek funkciója sincs leírva.
Például az RMT esetében bejelöltem sárgával, amik nincsenek dokumentálva: http://arduinouser.hu/esp32/ESP32_RMT_Register_Summary.pdf
Pl. azok a regiszterek sincsenek leírva, ami azt mutatja, hogy az egyes csatornák hol tartanak a kivitelben, azaz a RAM területük memória számlálója."Mondjuk a pcnt.h fájlnál nem mentem lejjebb, vmelyik include biztos hardver közelibb kódot rejt."
Igen:
https://github.com/espressif/esp-idf/blob/master/components/driver/pcnt.c
Aztán valamelyik fájlban a regiszterek címei is megvannak (általában struktúrában), de azt már nem keresem, megyek aludni
A PCNT-vel kapcsolatos tapasztalataidat - mindannyiunk okulására - majd oszd meg, lsz!Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
Új hozzászólás Aktív témák
- Újszerű - ASROCK B450 Fatal1ty Gaming K4 AMD AM4 alaplap + Windows 10/11 HOME digitális licensz
- Újszerű - ASROCK B450 Pro4 AMD AM4 dobozos alaplap
- HP Elitedesk 800 G4 DM I5-8500T 16GB 256GB SSD (1 USB sérült, de működik)
- Dell 7060 Micro I5-8500T 8GB 500 GB SSD WIFI
- DELL LATITUDE 7390 I5-8250U/8GB/256GB SSD/1920X1080