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   598 / 851
(#) Massawa válasza Kovidivi hozzászólására (») Márc 5, 2020 /
 
Bocs ott hiba van. ( ez már akkor történt amikor ide raktam a kodot). Azt már kijavitottam.
(#) Massawa válasza _BiG_ hozzászólására (») Márc 5, 2020 /
 
Ettöl félek én is, de majd holnap ujra nekifogok.
(#) Massawa válasza KoblogPerGyok hozzászólására (») Márc 5, 2020 /
 
Nem az YSTEP teljesen önállo, az Ymotornak csak forognia kell és majd egyszer megállnia, de az a rész még nincs a kodban. Az Y motor most csak két soros az egyikben a fix irány van a másikban meg csak léptet minden megszakitásra. Semmi más feltétel stb ott nincs.
Még az jutott most az eszembe, hogy a void loopban nekem több switch...case subrutinom van. Ez a motorkezelö a legrövidebb talán 6 soros - csak bekapcsolja a feltételeket a motorok forgásához. Nem tudom milyen gyorsan futnak a loop rutinok, a motormegszakitás nagyon lassu, jelenleg 1-20 ms- ként történik. Lehet, hogy ott lesz a konfliktus. Mint már korábban irtam a kod önálloan már ment ( a megszakitás) és a számlálás is.
A hozzászólás módosítva: Márc 5, 2020
(#) nemgyuri hozzászólása Márc 6, 2020 /
 
Sziasztok!
Az alábbi kis ultrahangos távolságmérő programom érthetetlenül működik.
Ha a számítógépre van kötve (USB-n), akár használom a soros portot akár nem látszólag hibátlanul működik. De külső tápról (2 cellás LiPo) esetén ha egyszer nem volt viszhang többet nem mér. Reset után sem, csak a táp ki- bekapcsolása segít.
Arduino UNO és HC SR04-es modul a hw.
(Eddig csak néhány gyakorló programot írtam Ardunióra)..
  1. #define LED300Pin 12
  2.  #define LED600Pin 13
  3.  #define LED900Pin 11
  4.  #define LEDHibaPin 10
  5.   //  #define EchoPin 2 // SRF04 Echo laba PIN2-re kotve
  6.   //  #define TriggerPin 3 // SRF04 Trigger laba PIN3-ra kotve
  7.     const int EchoPin=8; // Így is jó..
  8.     const int TriggerPin=9;
  9.    
  10.     byte Valt = 0;  
  11.     unsigned long EchoTime = 0; // az Echo labon megjeleno jel hosszat tartalmazo valtozo
  12.     unsigned long Tavolsag = 0; // a mert tavolsagot tartalmazo valtozo
  13.  
  14.   void Tavmeres() {
  15.      delayMicroseconds(2);
  16.      digitalWrite(TriggerPin, HIGH); // Pulse for 10 �s to trigger ultrasonic sensor
  17.      delayMicroseconds(10);
  18.      digitalWrite(TriggerPin, LOW);
  19.      EchoTime = pulseIn(EchoPin, HIGH,30000); // az Echo labon a magas allapot idejenek merese
  20.      Tavolsag = 10*EchoTime/58; // a celtargy tavolsaganak kiszamitasa (mm-ben)
  21.  //    Serial.print(Tavolsag, DEC);
  22.    }
  23.   void EchoTorles() {
  24.     pinMode(EchoPin, OUTPUT);
  25.     digitalWrite(EchoPin, LOW);
  26.     delayMicroseconds(20);               //eredeti10) shorter periods are not reliable
  27.     pinMode(EchoPin, INPUT);
  28.     delayMicroseconds(10);
  29.      digitalWrite(LED300Pin,HIGH);
  30.      digitalWrite(LED600Pin,HIGH);
  31.      digitalWrite(LED900Pin,HIGH);
  32.      digitalWrite(LEDHibaPin,LOW);
  33.      if (Valt==0) {
  34.       digitalWrite(LEDHibaPin,LOW);
  35.       delay(300);
  36.       Valt = 1;
  37.      } else {
  38.       digitalWrite(LEDHibaPin,HIGH);
  39.       delay(300);
  40.       Valt = 0;
  41.      }
  42.   }
  43.   void Kiiras() {
  44.      Serial.print(EchoTime,DEC);
  45.      //delay(100); //msec
  46.      Serial.print("    ");
  47.      Serial.print(Tavolsag, DEC); // az eredmeny elkuldese a soros porton keresztul a PC-re
  48.      Serial.println(" mm"); // mm kiirasa az eredmeny utan
  49.   }
  50.     void KijelezLED() {
  51.      digitalWrite(LED300Pin,HIGH);
  52.      digitalWrite(LED600Pin,HIGH);
  53.      digitalWrite(LED900Pin,HIGH);
  54.      digitalWrite(LEDHibaPin,LOW);
  55.      if (Tavolsag > 1 and Tavolsag < 400) {digitalWrite(LED300Pin,LOW);}
  56.      if (Tavolsag > 300 and Tavolsag < 1000 ) {digitalWrite(LED600Pin,LOW);}
  57.      if (Tavolsag > 800 and Tavolsag < 3000 ) {digitalWrite(LED900Pin,LOW);}
  58.      if (Tavolsag > 3000 or Tavolsag < 1) {digitalWrite(LEDHibaPin,HIGH);}
  59.       delay(200);
  60.   }
  61.  
  62.     void setup() {
  63.        pinMode(LED300Pin,OUTPUT);
  64.        pinMode(LED600Pin,OUTPUT);
  65.        pinMode(LED900Pin,OUTPUT);
  66.        pinMode(LEDHibaPin,OUTPUT);
  67.      pinMode(TriggerPin, OUTPUT); // Trigger lab kimenet
  68.      pinMode(EchoPin, INPUT); // Echo lab bemenet
  69.  //    Serial.begin(9600); // 9600 baud-sebessegu soros kommunikacios port beallitasa
  70.          digitalWrite(TriggerPin, LOW);
  71.          delay(10);
  72.          }
  73.     void loop() {
  74.       Tavmeres();
  75.       delayMicroseconds(2);
  76.        if (Tavolsag > 0 and Tavolsag <4000) {
  77.  //       Kiiras();
  78.         KijelezLED();
  79.      } else {
  80.         EchoTorles();
  81.      }
  82.     }
(#) Kovidivi válasza nemgyuri hozzászólására (») Márc 6, 2020 /
 
Hova kötöd a 8.4V-os feszültséget?
(#) asch válasza Massawa hozzászólására (») Márc 6, 2020 /
 
Tedd fel az egész programot github-ra, vagy legalább pastebin-re! Egyre gyanúsabb, hogy nem csak a bevágott részben vannak hibák. Általánosságban is jobban jársz, ha az egészet meg tudod mutatni, mert sokszor nem ott van a hiba, ahol várjuk.

A következő tippem például az, hogy a switch-case-ben nincs "break;" a case-ek között, és a soron következő logika is lefut, nem csak ez. Emiatt számlál többet egyszerre a számláló, mint várnád.
(#) Massawa válasza asch hozzászólására (») Márc 6, 2020 /
 
Kösz a segitséget.

Közben kisérletezgettem egy kicsit. Most fix adatokkal probáltam a megszakitást:

void setupban:

stepcounter=10,
xxsize=40

igy sem számolt jol. a stepcounter soha nem érte el a 0-t, de érdekes modon átugrott ujra 10-re, anélkül, hogy az xxsize--; érték csökkent volna, azaz az xDIR sem változott.

STEPCOUNTER = 7
xDIR =1
STEPCOUNTER = 6
xDIR =1
STEPCOUNTER = 1
xDIR =1
STEPCOUNTER = 10
xDIR =1
STEPCOUNTER = 8
xDIR =1
STEPCOUNTER = 6
xDIR =1
STEPCOUNTER = 4

A case-ben mindenütt ott a break; azt már ellenöriztem, csak azt nem tudom, hogy a loop milyen gyakran fut le, mert nagyon ugy néz ki, hogy az okozza a konfliktust. Most egy kicsit felgyorsitottam a megszakitast (10 ms), most egész más adatokat a printout, de a nullát most sem éri el. A printer 115200-bd-re van már állitva.
(#) Istvanpisti válasza Massawa hozzászólására (») Márc 6, 2020 /
 
Azok a változók, amik a megszakításban vannak volatile-ek?
Ha a megszakításból küldöd ki a változók értékét, akkor az megakaszthatja az egész program logikáját. Inkább állíts be egy logikai változót, amit a főprogramban figyelsz, és onnan menjen a print.
(#) Massawa válasza Istvanpisti hozzászólására (») Márc 6, 2020 /
 
Kösz!
Pillanatnyilag nem küldöm sehova. Most a két változo (stepcounter és az xxsize) értéke a void setupban van egyszer és mindenkorra meghatározva ( kiiktattam minden belsö számitgatást), a megszakitásban csak a motoroknak kell ugy menniük, ahogy tervezem.
Az adott esetben az Ymotor minden tizedik lépésére (stepcounter) az Xmotornak egyet kellene lépnie. Az Xmotor minden 40. lépésére (xxsize) irányt kell váltania. Külsö hatás csak az a 2 kapcsolo, ami a kodban van (ADJ ill a RUN). Ha ezeket megnyomom, akkor meg kell állnia a gépnek.
(#) sargarigo válasza Massawa hozzászólására (») Márc 6, 2020 /
 
Ha nem szupertitkos a program, miért nem osztod meg? Lehet egyből kiszúrná valaki a hibát, elég sokan vagyunk itt rá. Nem kellene látnokot játszania senkinek.
Persze ha mégis az, akkor nem szóltam!
(#) nemgyuri válasza Kovidivi hozzászólására (») Márc 6, 2020 /
 
Az UNO tápcsatijára. (nem az USB-re)
(#) Kovidivi válasza nemgyuri hozzászólására (») Márc 6, 2020 /
 
Uno tápcsatija? Oda, ahova max. 12V-ot lehet rakni? Akkor az okés.
(#) nemgyuri válasza Kovidivi hozzászólására (») Márc 6, 2020 /
 
Pontosan. Ennek a távmérőnek konstrukciós hibája van. (Ha nincs viszhang az Echo láb "H"-ban marad és a triggerre nem reagál többé!) Ezért az Echo lábat kényszeríteni kell "L"-be. (Valahol az interneten láttam ezt a megoldást)
Használom a pin13 ami egyben Tx is, ha jól tudom, ez bezavarhat? Mellesleg különböző időzítésekkel is próbálkoztam, de annak nem volt hatása.
(#) Massawa válasza sargarigo hozzászólására (») Márc 6, 2020 /
 
Mar egyszer beraktam, most leegyszerüsitettem, nincs benne külsö összefüggés, csak a stepcounter=10;
xxsize=40;
van a void setup ban definiálva.
az yDIR adott (nem változik)

kösz
  1. void STEPIRQ() {
  2.  
  3.   digitalWrite(XDIR, !xDIR);
  4.   digitalWrite(XSTEP, STEP & !ADJ & !digitalRead(GREEN));
  5.   digitalWrite(XDIR, xDIR);
  6.   digitalWrite(XSTEP, STEP & !ADJ & !digitalRead(BLUE));
  7. //most csak innen kell hogy menjen:
  8.   digitalWrite(YDIR, yDIR);
  9.   digitalWrite(YSTEP, STEP & !ADJ & !RUN);     // Move only when YELL and RED pushed
  10.  
  11.   if ((STEP && !ADJ && !RUN) == HIGH) {
  12.     stepcounter--;            // gear ratio 1 rev of Y motor == > stepcounter= xxSTEP
  13.     if (stepcounter == 0) {
  14.       xxSTEP = !xxSTEP;
  15.       // stepcounter = xmove;
  16.       stepcounter = 10;
  17.       digitalWrite(XDIR, xDIR);
  18.       digitalWrite(XSTEP, xxSTEP);
  19.       if (xxSTEP = false) {
  20.         xxsize--;
  21.         if (xxsize == 0) {
  22.           xDIR = !xDIR;
  23.           //  xxsize = xsize;
  24.           xxsize = 40;
  25.         }
  26.       }
  27.     }
  28.   }
  29.   STEP = !STEP;
  30.  
  31.   return;
  32. }
(#) atiotezer hozzászólása Márc 6, 2020 /
 
Sziasztok.

Harmadik feltételnek azt szeretném, hogy csak akkor teljesüljön, ha még pluszban a 6-os kimenet aktív.
(nyomógombot (bemenet) feltételeket betudok illeszteni, az működik, de nem tudok rájönni, hogyan függjön a kimenettől is.)

A 6-os kimenet egy relét kapcsol csak. (on-off)

Előre is köszönöm.
(#) KoblogPerGyok válasza atiotezer hozzászólására (») Márc 6, 2020 /
 
A kimentet állítod valahol máshol? Egyszerűen az adott if (pin ==High)

De azt is csinálhatod, hogy egy boolean változót veszel fel, ami mikor ezt a pint állítod high-ra akkor true, ha low akkor false. Ha interrupt függvények hozzányúlnak ehhez a változóhoz akkor Volatile valami bollean- kell a setupban.

Urána meg még egy && valami==True, (vagy ami neked kell && valami==False, neked kell eldönteni.

Vagy && Pin_neve==High

kell a linkelt feltételbe.
A hozzászólás módosítva: Márc 6, 2020
(#) sargarigo válasza Massawa hozzászólására (») Márc 6, 2020 /
 
Idézet:
„Mar egyszer beraktam, most leegyszerüsitettem,”

Nem akarok kötözködni, tényleg a segítő szándék vezérel. De ez még mindig nem a teljes kód. Fentebb már más is írta, hogy elképzelhető hogy nem ott van a hiba ahol keresed, hanem a program más részén van valami ami bezavar.
Hogy konstruktív is legyek, azt már próbáltad hogy kiveszed a megszakításból, és egyszerűen a loop-ban futtatod? Úgy is hibázik?
(Nekem speciel nehezen követhető hogy bitenként vizsgálgatod a digitalWrite részben, de biztosan okod van rá)
(#) KoblogPerGyok válasza sargarigo hozzászólására (») Márc 6, 2020 /
 
Illetve megint lemaradt egy = -jel.
(#) atiotezer válasza KoblogPerGyok hozzászólására (») Márc 6, 2020 / 1
 
Szia.

Sikerült megcsinálni, köszönöm a segítséget.
A hozzászólás módosítva: Márc 6, 2020
(#) Massawa válasza sargarigo hozzászólására (») Márc 6, 2020 /
 
Nekem ez müködött megszakitással, (igy ahogy itt van semmi más nem volt a sketchben a setupon meg a portok definicioján kivül), de a hülye fejemmel azt nem mentettem el, hanem tovább irtam (nem erre). Berakhatom az egészet is, de meglehetösen áttekinthetetlen ( nincs még annyi tapasztalatom az Arduino nyelvvel). A kod többi részében csak a nyomogombok lekérdezése van valamint a két nyomogom (ADJ meg a RUN) kapcsolová alakitása. Az elsö case-ben kiszámolja a paramétereket meg kiirja a displayre, a második case-ben a manuális mozgás van a 3-6 sorok az alábbi kodban ( az jol müködik).
A 3. Case meg csak beirja a két változot és kezelné az irányváltást az xDIR.
Semmi mást nem csinál (a case paramétere a ADJ meg a RUN bekapcsolt állapota). Még ide kell berakni a fordulatszámlálot, de az még nincs meg.
Nem értem, hol vizsgálgatok valamit bitenként? A digitalWrite-koban csak kiküldöm a portokra a jelet, legfeljebb csak az van benne, hogy ez csak akkor történjen meg ha a megfelelö kapcsolok (bitek) helyes állásban vannak.
Na mindegy egy kicsit kipucolom a kodot s majd felrakom. Mindenképpen köszönöm hogy foglalkozol a dologgal.
(#) sargarigo válasza Massawa hozzászólására (») Márc 6, 2020 /
 
Ha felteszed ide, akkor átbogarászom, esetleg megpróbálom valami áttekinthetőbb formára hozni, mert így nagyon kusza. Csak kommenteld fel, hogy lássam pontosan mit szeretnél! Ha belefér, lehet hogy újraírom neked! Mellesleg miért kell hogy megszakításból menjen?
A hozzászólás módosítva: Márc 6, 2020
(#) KoblogPerGyok válasza atiotezer hozzászólására (») Márc 6, 2020 / 1
 
Addig nézegettem a DigitalRead() függvényt amíg meg nem oldottad. Ez a legegyszerűbb megoldás. Sokan gondolkodnak rajta, hogyan lehet egy kimenetet olvasni, hát így. Ilyen könnyen.
(#) mateatek válasza KoblogPerGyok hozzászólására (») Márc 6, 2020 /
 
Csak hozzáfűzném a hozzászólásodhoz, hogy ha egy kimeneten timer van, és annak az aktuális állapotát szeretnéd leolvasni, akkor ott a digitalRead() függvény már nem működik. Az esetben már csak a regiszter kiolvasásával tudod megnézni, hogy abban a pillanatban milyen szinten van a kimenet.
(#) KoblogPerGyok válasza mateatek hozzászólására (») Márc 6, 2020 / 1
 
Igazad van. Ezt olvasgattam több helyen is nekem sem volt 100%. Nem tudtam pontosan elsőre, hogy ez működhet-e. Nem mertem ezt javasolni elsőként.
Szerencsére itt ez nem játszik. Más esetben maradt volna egy plusz logikai változó és annak a vizsgálata, vagy a regiszteres olvasás. A regiszter olvasás a legjobb, de a plusz logikai változós megoldás meg átláthatóbb szerintem. Csak azért írom, hogy a jövőben aki olvassa annak is legyen valami.

De most ebben a feladatban szerencsére jó és egyszerű megoldás.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Márc 6, 2020 /
 
Tovább gondolva timer-en a logikai változós nem játszik (játszhat). De majd kipróbálom, belezavarok egy kódot ebbe a hibába.
(#) Massawa válasza sargarigo hozzászólására (») Márc 6, 2020 /
 
Nem fogod elhinni, a nagy tisztogatatástol elindult és már pontosan azt teszi amit kell.
Valoszinüleg valahol egy jel maradt ki. Megmondani nem tudom pontosan hol. Tegnap átváltoztattam néhány változot booleanra, és lehet, hogy ott hiányzott valami.
Itt az ujra müködö kod.

Bocs, hogy ennyit zaklattalak titeket. Most még a fordulatszámlálást kell megoldani és kész.



  1. void STEPIRQ() {
  2.  
  3.   digitalWrite(XDIR, false);
  4.   digitalWrite(XSTEP, STEP && !ADJ && !digitalRead(GREEN));
  5.   digitalWrite(XDIR, true);
  6.   digitalWrite(XSTEP, STEP && !ADJ && !digitalRead(BLUE));
  7.   digitalWrite(YDIR, yDIR);
  8.   digitalWrite(YSTEP, STEP && !ADJ && !RUN);     // Move only when YELL and RED pushed
  9.  
  10.   if ((STEP && !ADJ && !RUN) == true) {
  11.     stepcounter--;            // gear ratio 1 rev of Y motor == > stepcounter= xxSTEP
  12.     if (stepcounter == 0) {
  13.       xxSTEP = !xxSTEP;
  14.       stepcounter = xmove;
  15.       digitalWrite(XDIR, xDIR);
  16.       digitalWrite(XSTEP, xxSTEP);
  17.       if (xxSTEP == false) {
  18.         xxsize--;
  19.         if (xxsize == 0) {
  20.           xDIR = !xDIR;
  21.           xxsize = xsize;
  22.         }
  23.       }
  24.     }
  25.   }
  26.   STEP = !STEP;
  27.  
  28.   return;
  29. }
(#) sargarigo válasza Massawa hozzászólására (») Márc 6, 2020 /
 
Javaslom, hogy mindig amikor már sikerült elérni valami működőt, akkor zippeld be, és tedd el későbbre! pl. stepper01.zip, stepper02.zip, stb. Így ha ilyen van, hogy egyszer már működött, de elrontottad, akkor van hova visszanyúlni.
(#) Massawa válasza sargarigo hozzászólására (») Márc 6, 2020 /
 
Már kezdem tanulni.
Most még nem zippelem, de ha valami müködik és beleakarok nyulni azonnal egy uj nevet adok neki (ez is most már az 5.). A kimondottan jokat meg elteszem egy más könyvtárba referenciának.
Most még a forudulatszámlálot kell megcsinálni. Két optoszenzor elött forog a kerék és fel illetve le kell számolni, ha elöbb az S1 vagy az S2 kimenet megy magasra.
Még azt nem tudom hova kellene tenni a loopba vagy a forgato case-be. Mennie mindig kellene akkor is ha kézzel forgatom a tengelyt.
(#) Kovidivi válasza atiotezer hozzászólására (») Márc 6, 2020 / 1
 
Én zárójelezném a feltételvizsgálatokat, biztos, ami biztos. Ha bekerül egy negálás (!), nem mindegy, hogy a kimenetet negálod, vagy esetleg a feltételvizsgálat eredményét.
(#) sargarigo válasza Kovidivi hozzászólására (») Márc 6, 2020 /
 
Igen, ez a negálás rendes C-ben is problémás volt! Én mindent körbepakoltam zárójellel, így szoktam meg. Biztos ami biztos. A fordító úgyis leoptimalizálja ha felesleges, de ha meg kellene és nincs ott, akkor megy az OP.
Következő: »»   598 / 851
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