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   490 / 839
(#) sargarigo válasza berkesandor hozzászólására (») Nov 11, 2018 /
 
Azt nem értem, hogy 8 és 16MHz-es ardu panelekkel idézem "szinte tökéletesen megy". Mitől szinte? Ugyanez a baja?
(#) Kovidivi válasza berkesandor hozzászólására (») Nov 11, 2018 /
 
Az Arduino alatt be tudtad állítani rendesen a sebességet? Csak azért kérdezem, mert az F_CPU 16000000-t átírva a neked megfelelő kvarcra nem jelenti a sikert! Az egész Arduinonak belül át kell vennie a frekit. Le tudod tesztelni pl. a millis()-sel, hogy másodpercenként növekszik-e, lehetőleg legalább 10percet mérj, hogy elég pontos legyen a mérésed. A másik probléma, hogy attól, hogy a millis() jól jár, ez nem garantálja, hogy a lib-ek tudják, hogy nem 16Mhz-en járnak... Ezeket is le kell ellenőrizned, a megfelelő regiszterek kiolvasásával (baud rate megfelelőre van beállítva?).
A nyákon levő forrasztógyanta maradványok hibás adatátvitelt okozhatnak, le kell mosni a nyákor rendesen.
A hozzászólás módosítva: Nov 11, 2018
(#) berkesandor válasza Kovidivi hozzászólására (») Nov 11, 2018 /
 
A Minicore bootloadernek vannak verzói szinte minden kvarc frekire. A bootloader könyvtárába beilleszted ami neked kell, utána megjelenik a listában.
A SIM800-al nem könyvtárral kommunikálok, simán AT parancsokkal.
A I2C eszközök sajnos könyvtárkkal mennek. Minden könyvtárat külön át kell nézni, vagy elég a Wire.h ?

Csak azt nem értem, ha gyári ardut használok mindegy hogy 8-16 MHz, úgy fordítom és megy.
Ott honnan tudja lib, hogy milyen kvarz van a 328 mellett?
A hozzászólás módosítva: Nov 11, 2018
(#) sargarigo válasza berkesandor hozzászólására (») Nov 11, 2018 /
 
A gyári ardu mindegyikének van saját neve, amit ki kell választani fordítás előtt. Szerintem onnan tudja.
(#) berkesandor válasza sargarigo hozzászólására (») Nov 11, 2018 /
 
Minicore bootloadernél nincs.
Boards.txt tartalmaz infókat, de azt meg használja a fordításkor. Szóval tudni kéne neki a 7.x frekit is.
A hozzászólás módosítva: Nov 11, 2018
(#) vargham válasza berkesandor hozzászólására (») Nov 12, 2018 /
 
A bootloaderben beállított frekvenciáról az applikáció nem tud. Az két külön szoftver. A bootloader semmi mást nem csinál, csak frissíti az alkalmazásodat, ha küldesz neki egy újat soros porton.
Ha továbbra is Arduino-t akarsz használni, akkor a te kvarc frekvenciádhoz létre kell hozni egy új variánst. Jelenleg melyik Arduino variánsra fordítod le az applikációdat?
(#) KoblogPerGyok válasza berkesandor hozzászólására (») Nov 12, 2018 /
 
Szerintem megoldható úgy is ahogy szeretnéd, főleg akkor, ha saját NYÁK-ra teszel mindent, azaz csinálsz magadnak egy arduinót USB chip nélkül. Ekkor úgy is kell egy oszcillátor, akkor meg miért ne?

A gond a libeknél lehet ekkor is. Ha abban van milis(), delay, prescale, (vagy más) akkor máris át kell írni mindent benne.

A sim800L chip tudna i2c-t, de nincs kivezetése a modulokban. Na ez oldaná fel azt a elvi problémát amit te megtaláltál, ugyanis ott van SCL ami szinkronba hozza a kommunikációt. Ennek azonban más gondja lesz. Ezzel arra utalok, hogy bármit is választasz soha(!) nem lesz 100% üzembiztos. A mcu bekap a kozmikus háttérsugárzásból egy komolyabb részecskét és máris hibát generál. Kicsi a valószínűsége, de már ezzel sem lesz 100%.

Szerintem sokkal jobban jársz, ha a kommunikációban pl a cheksum-al ellenőrzöd a fogadott byte-okat és ha hibás lekéred megint. Ennél jobb megoldás nincs. Arra utalok, hogy a hibákra minden esetben fel kell készíteni a programokat. Ez a fejlesztés legnagyobb és egyben legunalmasabb része is sajnos.

Nem jártam utána a sim800l setén, hogy ezek a hibajavítások miként mennek, de pl a CD/DVD-n sem 8 bit egy adatcsomag, hanem 10 bit, vagy még több. Redundanciát visznek bele, hogy az eredeti adatot vissza lehessen állítani sérülés esetén. Szerintem a SIM800l is képes ilyesmire, mert a fejlesztők is tisztában vannak a korlátokkal.

A frekvencia állítássaal több gondot veszel a nyakadba szerintem. Amit küldtél frekvencia/baud táblázatot abban szerepel ugyan 0%, de az is csak annyit tesz, hogy az általuk vizsgált elképzelhető minimumnál kisebb. Az sem valódi 0.
(#) atus1981 hozzászólása Nov 12, 2018 /
 
Sziasztok!
Hogyan oldanátok meg egy olyan programot, aminek azt kellene tudnia, hogy kb 2 másodpercenként érkező 0VDC impulzusok idejére meghúz egy relét, amit az utolsó jeltől számított másfél másodperc múlva el is enged?
Köszi.
(#) tbarath válasza atus1981 hozzászólására (») Nov 12, 2018 /
 
A 0VDC impulzus az mi? Digitális vagy analóg jel?
(#) atus1981 válasza tbarath hozzászólására (») Nov 12, 2018 / 1
 
Analóg. Testre kapcsolgatás.
(#) tbarath válasza atus1981 hozzászólására (») Nov 12, 2018 / 1
 
Aham. Megírtam digitre, valahogy így csinálnám ha digit lenne:
  1. #define pinImp 1
  2. #define pinRelay 2
  3. #define relayTime 1500*1000
  4.  
  5. uint32_t t0 = 0;
  6.  
  7. void setup() {
  8.   // put your setup code here, to run once:
  9.   pinMode(pinImp, INPUT_PULLUP);
  10.   pinMode(pinRelay, OUTPUT);
  11.   digitalWrite(pinRelay, LOW);
  12. }
  13.  
  14. void loop() {
  15.   // put your main code here, to run repeatedly:
  16.   if (LOW == digitalRead(pinImp)){
  17.     t0 = millis();
  18.     digitalWrite(pinRelay, HIGH);
  19.   }
  20.   if ( (t0 > 0) && ( (t0 + relayTime) > millis() ) ){
  21.     digitalWrite(pinRelay, LOW);
  22.     t0 = 0;
  23.   }
  24. }


Nem tesztelt, és nem is biztos hogy hibátlan, de az elv kb. ez.
Analóggal az a szívás, hogy az ADC mintavétel időbe telik, és azt is célszerű átlagolgatni, aztán kell egy treshhold érték ami alatt 0-nak veszed, stb.
Én lehet tennék mellé egy 5V-ról hajtott komparátort, aminek a - lába lenne mondjuk a treshold érték (mondjuk 0,2 V vagy ilyesmi), a + lába a figyelt jel, aztán abból kijönne egy egészen használható digitális jel.
(#) atus1981 válasza tbarath hozzászólására (») Nov 12, 2018 /
 
A PulseIn nem lehet megoldás?
(#) tbarath válasza atus1981 hozzászólására (») Nov 12, 2018 /
 
Szerintem nem. Az egy low vagy high "impulzus" hosszát adja meg. Mire használnád ezt az értéket?

De amúgy amit írtam az is rossz
Meg a feladatleírás is kacifánt. Az alábbi kód digit jelre a következőt csinálja:

Az elejét nézve amikor jön a jel akkor behúzza a relét, ha elmegy akkor nem. (Szóval van egy minimális elvárt idő, amíg 0 a jel, nagyon rövid impulzusoknál a relé nem húz be!)
Aztán az utolsó ilyen 0 impulzus után (önkényesen megválasztva: ha 2,5 másodpercig nem jön ilyen impulzus) behúz 1x 1,5 másodpercre

  1. #define pinImp 1
  2. #define pinRelay 2
  3. #define endSignTime 1500*1000
  4. #define impulseTreshold 2500*1000
  5.  
  6. uint32_t t0 = 0;
  7.  
  8. void setup() {
  9.   // put your setup code here, to run once:
  10.   pinMode(pinImp, INPUT_PULLUP);
  11.   pinMode(pinRelay, OUTPUT);
  12.   digitalWrite(pinRelay, LOW);
  13. }
  14.  
  15. void loop() {
  16.   // put your main code here, to run repeatedly:
  17.   if (LOW == digitalRead(pinImp)){
  18.     digitalWrite(pinRelay, HIGH);
  19.   }
  20.   else{
  21.     t0 = millis();
  22.     digitalWrite(pinRelay, LOW);
  23.   }
  24.  
  25.   if ( (t0 > 0) && ( (t0 + impulseTreshold) > millis() ) ){
  26.     digitalWrite(pinRelay, HIGH);
  27.     delay(endSignTime);
  28.     digitalWrite(pinRelay, LOW);
  29.     t0 = 0;
  30.   }
  31. }
(#) atus1981 válasza tbarath hozzászólására (») Nov 12, 2018 /
 
A legfőbb "kacifánt" az, hogy még van 2 analogwrite is, amit meg kell szakítson egy külön-külön egy-egy 0VDC a bemeneten...

  1. int led_pin5 = 5;
  2. int led_pin6 = 6;
  3. int i;
  4. int u;
  5. int led_value5;
  6. int led_value6;
  7. int rele5 = 7;
  8. int rele6 = 8;
  9. int olvas0 = A0;
  10. int olvas1 = A1;
  11.  
  12. int state5 = 0;
  13. int state6 = 0;
  14.  
  15. unsigned long startMillis1;  
  16. unsigned long currentMillis1;
  17. unsigned long startMillis;  
  18. unsigned long currentMillis;
  19. const unsigned long period = 1500;
  20.  
  21. void setup() {
  22.  
  23. startMillis = millis();
  24. startMillis1 = millis();
  25.  
  26.   pinMode(olvas0, INPUT_PULLUP);
  27.   pinMode(olvas1, INPUT_PULLUP);
  28.   pinMode(rele5, OUTPUT);
  29.   pinMode(rele6, OUTPUT);
  30.   digitalWrite(rele5, LOW);
  31.   digitalWrite(rele6, LOW);
  32.   pinMode(led_pin5, OUTPUT);
  33.   pinMode(led_pin6, OUTPUT);
  34.   Serial.begin(9600);
  35. }
  36. void loop() {
  37.  
  38.   currentMillis = millis();
  39.   currentMillis1 = millis();
  40.  
  41.   if (analogRead(A0) < 100) {
  42.     analogWrite(led_pin5, 0);
  43.     i = 0;
  44.   digitalWrite(rele5, HIGH);
  45.   Serial.println("rele5: magas");
  46.   state5 = 1;
  47.   }
  48.  
  49.  
  50.  
  51.   if ((currentMillis - startMillis >= period) && (state5 == 1)) {
  52.     digitalWrite(rele5, LOW);
  53.     state5 = 0;
  54.     Serial.println("rele5: alacsony");  
  55.     startMillis = currentMillis;
  56.   }
  57.  
  58.  
  59.   if (analogRead(A1) < 100) {
  60.     analogWrite(led_pin6, 0);
  61.     u = 0;
  62.   digitalWrite(rele6, HIGH);
  63.   Serial.println("rele6: magas");
  64.   state6 = 1;
  65.   }
  66.   if ((currentMillis1 - startMillis1 >= period) && (state6 == 1)) {
  67.     digitalWrite(rele6, LOW);  
  68.     state6 = 0;
  69.     Serial.println("rele6: alacsony");
  70.     startMillis1 = currentMillis1;
  71.  
  72.   }
  73.   led_value6 = map(u, 0, 1023, 0, 140);
  74.   analogWrite(led_pin6, led_value6);
  75.  
  76.  
  77.   led_value5 = map(i, 0, 1023, 0, 140);
  78.   analogWrite(led_pin5, led_value5);
  79.   delay(1);
  80.   i++;
  81.   u++;
  82.  
  83.  
  84. }


ezzel az a gond, hogyha hosszabb a 0VDC, mint 1500ms, akkor egy pillanatra elenged a relé...
A hozzászólás módosítva: Nov 12, 2018
(#) tbarath válasza atus1981 hozzászólására (») Nov 12, 2018 /
 
Valószínűleg pontosan azt csinálja, amit kérsz tőle, valahol az 1500 millis lekapcsolásnál kellene még valami mást is vizsgálnod. De ezt a kódot max. te látod át, én tuti nem.
(#) KoblogPerGyok válasza atus1981 hozzászólására (») Nov 12, 2018 /
 
Szia!

Szerintem hasonló a gond mint a prell. Azt tenném, hogy az első if-ben ahol beolvasol analóg értéket, ott egy külső függvényt hívnék meg aminek a típusa boolean. A függvénybem egy loopban újra olvasgatok analóg értékeket pl. 10x. (delay10, vagy amit szeretnél a loopon belül) Ebben a loop-ban is (vagy for, még jobb) olvasnék adatot. Ha az érték kisebb mint 100mv akkor egy számláló++. A függvény végén egy feltétel, hogy ha ez a szám pl 6-nál nagyobb, akkor tutira behúzták földre. A függvény értéke meg true. (Profi szint: A függvény bemenő paraméterként megkaphatná, hogy a delay mennyi legyen, illetve megkaphatná, hogy mennyit mérjen és mennyitől fogadod el igaznak (10ből hat, vagy 10ből 8 stb. ), valamint mekkora a legnagyobb feszültség érték, amit még nullának veszel)

A fő programban, ahol elsőként olvastál be analóg értéket, abba beágyazva még egy feltétel. Ha ez a külső függvény true, akkor a megfelelő láb magas, majd hívjon meg egy másik függvényt ami vár addig amíg kell, a fő programban ezután a megfelelő láb alacsony. (várakozó függvény is saját, külső paraméterezhetően) Onnantól megy a program tovább, de ezt neked kell látnod.

Leírni több, mint leprogramozni, nem is értem miért nem csináltam meg...
A hozzászólás módosítva: Nov 12, 2018
(#) atus1981 válasza KoblogPerGyok hozzászólására (») Nov 12, 2018 /
 
És az analogwrite? Az miatt nem lehet várni.
(#) KoblogPerGyok válasza atus1981 hozzászólására (») Nov 12, 2018 /
 
Ok, benéztem! bocsánat!

Nem értem pontosan mit szeretnél, de szerintem az időmérés a hibás. A loop-ban ki kell szedni a current milis-eket, nem ott kell értéket adni nekik rögtön.


eltelt_ido+=millis()-eltelt_ido; //itt azt akarnám megoldani, hogy a valós eltelt idővel növelje, de a millis() túlcsordul!!!! Erre figyelni kell!

if (analogRead(A1) < 100)
{
analogWrite(led_pin6, 0);
digitalWrite(rele6, HIGH);
Serial.println("rele6: magas");
state6 = 1;
eltelt_ido=0; //Mert addig amíg nyomja nem kell, hogy elinduljon a számláló
}

//Elvileg ez ok, mert az eltelt idő ha nagyobb lesz mint 1500ms, akkor fog ez lefutni

if (( eltelt_ido >= period) && (state6 == 1)) {
digitalWrite(rele6, LOW);
state6 = 0;
Serial.println("rele6: alacsony");
}
A hozzászólás módosítva: Nov 12, 2018
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 12, 2018 /
 
A lényeg, hogy amikor megnyomja a gombot akkor kezd el számolni. Ha nem nyomja meg megint, akkor a számláló nő és mikor eléri a maximum értéket lefut ami alacsonyra húzza. Az eltelt idő számláló meg növekszik folyton, ezért az a második if ami lehúzza megint lefut.

Na ezzel az lesz a gond, hogy az eltelt_ido változó sem növekedhet örökké, túl fog csordulni. Ekkor a második if le fog futni, mert a változó 0 lesz, ha minden igaz. Szóval ez nem jó még.

A millis is túlcsordul, ezért az eltelt_ido+=millis-eltelt_ido sem jó teljesen. Ezt a hibát is le kell kezelni.
(#) atus1981 válasza KoblogPerGyok hozzászólására (») Nov 12, 2018 /
 
Igen, az időmérést piszkáltam meg, és úgy működik, ahogy szeretném.
  1. if ((currentMillis - startMillis >= period) && (state5 == 1)) {
  2.     digitalWrite(rele5, LOW);
  3.     analogWrite(led_pin5, 0);
  4.     state5 = 0;
  5.     i = 0;
  6.     //Serial.println("rele5: alacsony");  
  7.     startMillis = currentMillis; // módosítottam
  8.   }

Tehát a módosítással új értéket kap a startmillis, amíg 0VDC van a bemeneten.

(#) atus1981 válasza KoblogPerGyok hozzászólására (») Nov 12, 2018 /
 
A millis túlcsordulása miatt nem aggódok, mert pár óránként egy másik eszköz áramtalanítja a boardot
(#) KoblogPerGyok válasza atus1981 hozzászólására (») Nov 12, 2018 /
 
Ez lett volna a következő amit javasoltam volna, mert a kinullázás a lényeg, nem kell másik változó. Azt csak azért gondoltam bele, mert jobban átlátható a kód.

Király!
(#) berkesandor válasza KoblogPerGyok hozzászólására (») Nov 13, 2018 /
 
Ha így töltöm (fordítom) le - kép -, nem lehet elméltileg hiba. A kontollernek mindegy mekkora kvarc alapján jár, mindig ugyanaz a belső sebesség.
Érdekes amúgy az I2C hiba is, mivel ott a kontroller "adja" a SCL lábon a sebességet, a slave elemek ahhoz alkalmazodnak. Mindegy nekik, hogy az 100 kHz vagy 92.35 Khz-en mennek.
Szóval nem értem..

image.jpg
    
(#) vargham válasza berkesandor hozzászólására (») Nov 13, 2018 /
 
Idézet:
„A kontollernek mindegy mekkora kvarc alapján jár, mindig ugyanaz a belső sebesség.”

Ez nem teljesen igaz. Az ATMega328-ban csak néhány osztó van, szorozni nem tud. Tehát alapvetően a kvarc sebességével megy a CPU is, ha nincs osztás. Ha van osztás, akkor az lehet /2, /4, stb, tehát az osztás sem lehet tetszőlegesen részletes.
(#) kapu48 válasza berkesandor hozzászólására (») Nov 13, 2018 /
 
Egyébként az „arduino1.8.5”-ös ide híresen televan hibákkal!
Amikre itt is már sokan panaszkodtak.

Ezért nem is használjuk!
(#) gigazo hozzászólása Nov 13, 2018 /
 
Sziasztok.

A kis kertészetembe szeretnék összereakni egy autómata öntöző rendszert.
Arra gondoltam, hogy egy uno-hoz kötött mérleg szenzort használnék a közeg nedvesség megállapítására mivel a növényeim egy rekeszben vannak (talaj nélküli termesztés) És az uno kapcsolná az öntöző szivattyút egy relén keresztül.
Több kérdés is felmerült bennem,
1, Megoldható lenne-e a rendszer wifi modulokkal (találtam wifi-s relét de szerintem azt csak telefonnal lehet vezérelni)
2, Két arduino tudna egymással kommunikálni mert akkor egyiken csak egy relé lenne és az kapcsolná a szivattyút.

Köszönöm szépen ha valaki segít kicsit elmélyednem ebben az érdekes világban
(#) KoblogPerGyok válasza gigazo hozzászólására (») Nov 13, 2018 /
 
Szia!

Mindegyik megoldható, de miért gondolsz két Arduinót?
(#) tbarath válasza gigazo hozzászólására (») Nov 13, 2018 /
 
1. wifi: simán használhat esp8266/esp32 modulokat "wifi adapterként" az arduino-hoz, csak szintillesztő kell hozzá. De: ezek erősebb mikrokontrollerek, mint maga az arduino, szóval...
2. nyilván tud, nagyobb távolságokra soros porton (akár softserial) vagy rádión (433 mhz, rola, wifi, stb), rövidebb távon i2c/spi buszon keresztül is.
(#) gigazo válasza KoblogPerGyok hozzászólására (») Nov 13, 2018 /
 
Azért gondoltam kettőt mert az egyik mérte volna közeg súlyát a másik pedig kapcsolta volna a szivattyút és a kettő között lett volna wifi kapcsolat. De mint tbarath-tól megtudtam azért a két eszköz közötti wifi-s kommunikációt nem egyszerű dolog megoldani. Így inkább oda kábelezek 10-15m-ről van csak szó
(#) gigazo válasza tbarath hozzászólására (») Nov 13, 2018 /
 
Köszönöm a választ, érdekes lesz számomra az építés és jó az a tudat, hogy ha elakadok van hova fordulnom.
Következő: »»   490 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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