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   597 / 851
(#) pipi válasza usane hozzászólására (») Márc 4, 2020 /
 
Szerintem valami client.read függvénnyel kapod meg, kívánt méretű darabokban, és oda teszed/egymás után fűzöd, ahogy akarod. A kért méret célszerűen egy packet hosszának többszöröse ami ha jól emlékszem 1460? (FTP progikban láttam hogy nagyobb adattömegnél gyorsít) De talán lehet akár 10k is.
(#) asch válasza Csongig hozzászólására (») Márc 4, 2020 /
 
Tökéletes választás Arduino-t használni. Csak azért írtam a lehetőségeket, hogy lásd jó nagy a tervezési tér a befektetett energia, pénz és az eredmény elvárt tulajdonságai függvényében.
(#) djusee válasza asch hozzászólására (») Márc 5, 2020 /
 
Nekem is egyik kedvencem ez a modul, egyedül a stab. ic nem tetszik a "pont az épp bírja a 12V" végett(nagyon könnyen füstöl ha meghaladja a 12V -ot) , de ez megoldható és nincs rajta "fölösleges" ic ami energiát fogyaszt, talán a ledek de az is megoldható . Van is belőle jópár darab itthon
(#) djusee válasza asch hozzászólására (») Márc 5, 2020 /
 
Én ebből használtam eddig kettöt, még nem volt gondom velük(kopp-kopp). Most van szabadidöm ugyhogy elkezdtem tervezni egy sajátot itthonra ami persze nem kap ilyen olyan ipari minősítést de igaz nem is oda szánom és viszon árban jobb lessz. Amit lehet modulokból szeretném megvalósítani

ST.jpg
    
(#) asch válasza djusee hozzászólására (») Márc 5, 2020 /
 
Én is vettem ilyet, és azt kell hogy mondjam, nem vagyok elájulva tőle.

Ide írtam is róla egy blogbejegyzést: https://hup.hu/node/165133

Elég hosszú lett, a lényeg, hogy az egyik relé nagyfeszültségű lába és a TTL szintű jel közötti elválasztás összesen 2mm: https://pasteboard.co/IoK0a8a.jpg

Az alapötlet, hogy Arduino-kompatibilis PLC legyen, az jó. De az, hogy valóban beletegyünk egy hitelkártya méretű Arduino-t? Ráadásul Leonardot? Kéremszépen ez hülyeség. Ez egy hobbistáknak kitalált board. A funkcionalitást fele méretben is meg lehet oldani. Az Industrialshields-en pedig látszik, hogy amiatt szenvedtek a tervezésével, mert a csatlakozók mint rossz helyre esnek nekik. Az a tippem, hogy végül ezért nem lett meg a kellő elválasztás sem. Ha még egy Pro-minit tettek volna rá, ahogy a te terveden van. De nekik Leonardo kellett.

Controllino-ra cseréltem. Annak a belsejéről neten találtam fotót és leírást, elvileg rendben vannak a távolságok benne. Viszont magam még nem szedtem szét.
(#) Csongig válasza asch hozzászólására (») Márc 5, 2020 /
 
Köszönöm!
Ha jól látom van egy pár verziója ennek az Arduinonak.
Ezek közül melyiket ajánlod?
(#) asch válasza Csongig hozzászólására (») Márc 5, 2020 /
 
Amint már írtam: ízlés kérdése. A feladat annyira egyszerű, hogy bármi elbírja, és talán 5 láb elég hozzá. Tehát egy 8 lábú ATTiny is megoldaná.

Az Arduino boardokkal amit kapsz egy nyers csiphez képest:

* 3.3V-5V táp
* 8 vagy 16 MHz kvarc. Pontos órajelet ad, így például a serial kapcsolatok megbízhatóan működnek
* USB-serial átalakító, vagy egyéb USB-s PC elérés: programozás és debug trace üzenetek céljára kiváló. (De ez sincs mindegyiken, például a kedvenc Arduino Pro Mini-met egy USB-UART átalakítóval kell PC-re dugni. Ez is filléres tétel, és nincs benne semmi ördöngősség, de mégis plusz egy hibalehetőség, kezdőnek inkább olyat ajánlanék, amin van beépített USB.)

Amit mindenképpen meg kell valósítanod áramkörrel, az a kimeneti/bemeneti áramkörök illesztése. Ehhez boardot kell tervezni, vagy kész modult választani. Ha boardot tervezel, akkor már miért ne legyen az 5V táp és ISCP header is a boardon? Akkor máris felesleges az Arduino. Ha modult használsz, akkor a legjobb olyan boardot választani, amihez tervezték eredetileg. Tényleg végtelen a tervezési tér, és ezeket a kérdéseket senki nem tudja eldönteni helyetted.

Írtad, hogy kicsire akarod megépíteni. Nézd meg ezzel a szemmel, hogy mi fér el ott ahova szánod. Egy Arduino nano simán jó lehet minden szempontból: https://www.hestore.hu/prod_10035585.html
(#) djusee válasza asch hozzászólására (») Márc 5, 2020 /
 
Jujj, ez dúrva! Nem nyittam szét, lehet kellett volna. Én a relé nélküli változatokat vettem, DIN sínre ültethetö reléket hajt a doboz. Ez tényleg nem való hálózati feszültség-re. De csodálkozom hogyan kapott ez engedélyt a forgalombahozatalhoz? Én is relé nélkülire tervezem, TBD62783 -et és pin védelmet teszek a kimenetre és ezt az új kedvencem -el fogom elkészíteni, alias Blue Pill -el a nagyobb számú IO végett hogy ne kelljen portbővítőket használnom (de viszont ha találnák SPI vagy I2C -s portbővítő IC -t hasonló kimeneti paraméterekkel mint a TBD, akkor inkább a Pro Mini -t választanám mivel azt jobban ismerem) mert ugye bele kell hogy férjek a 100x100mm -es NYÁK hobbyhatárba.
(#) asch válasza djusee hozzászólására (») Márc 5, 2020 /
 
Ha előre tudod, hogy mi kimenet és mi bemenet, akkor a legegyszerűbb port bővítés a shift regiszter. SPI portra rákötöd őket és hardver vezérelten ki/be tudsz utaztatni annyi bitet amennyi jólesik. Pár vezérlő láb kell pluszba (output latch, input latch. Output enable-t érdemes úgy bekötni, hogy amig a proci nem indul el, addig ne legyen aktív a kimenet.), de a számuk független attól, hogy hány lábat kezelsz. A kimenetinél arra kell figyelni, hogy legyen benne latch, amivel a shiftelés után egyszerre teszed a kimenetre az értékeket. És kész is vagy.

Ez a változat például önmagában alkalmas relék kapcsolására: https://www.hestore.hu/prod_10036374.html Amennyit sorba kötsz, annyi relét tudsz vezérelni vele. Csak győzd táppal.
(#) Massawa hozzászólása Márc 5, 2020 /
 
Egy kis segitség kellene, már belegabalyodtam a kodomba:

A kod jelentös része müködik.
A feladat:
van két motor X és Y motor.
Az Ymotor simán forog a megszakitás alapján. Ennek a motornak 200 lépés kell fordulatonként.
Az X motor lassabban követi, azaz akkor lép xxSTEP, amikor a stepcounter leszámol bizonyos Ymotor lépést. (ezek az adatok elöre ki vannak számolva).
Ami nem akar menni az a következö fejezetben van:
Az Xmotornak xsize lépés után irányt kell váltania XDIR. Azaz xxsize amikor nullázodik irányt vált a motor, az xxsize ujra felveszi az xsize adatot és ismétlödik a folyamat ellenkezö irányba. Gyakorlatilag az Xmotor megtesz bizonyos lépést az egyik irányba, majd vissza. Azaz ide oda mozgat valamit.
Csak ezzel az irányváltással van gondom, illetve az xxsize--; nem ugy müködik ahogy kellene, annak az Xmotor lépéseit kellene számolnia.

Kösz!



  1. void STEPIRQ() {         // Interrupt
  2.  
  3.   digitalWrite(YDIR, YDIR);
  4.   digitalWrite(YSTEP, STEP & !ADJ & !RUN);     // Move only when YELL and RED pushed
  5.  
  6.  
  7.  
  8.   if (STEP & !ADJ & !RUN == HIGH) {
  9.     stepcounter--;                // gear ratio 1 rev of Y motor == > stepcounter= xxSTEP
  10.     if (stepcounter == 0) {
  11.       xxSTEP = !xxSTEP;
  12.       stepcounter = xmove;
  13.       digitalWrite(XDIR, XDIR);
  14.       digitalWrite(XSTEP, xxSTEP);    // Move only when YELL and RED pushed
  15.     }
  16.     if (xxSTEP&stepcounter == LOW) {
  17.       xxsize--;                       // temporary xsize=Size/Dia. When xxsize=0, the XDIR changes
  18.       if (xxsize == 0) {
  19.         XDIR = !XDIR;
  20.         xxsize = xsize;
  21.       }
  22.     }
  23.   }
  24.   STEP = !STEP;
  25.   return;
  26. }
A hozzászólás módosítva: Márc 5, 2020
(#) asch válasza Massawa hozzászólására (») Márc 5, 2020 / 1
 
Ami ránézésre rossznak tűnik, az az & operátor: ez bitenkénti ést valósít meg. Neked meg logikai és kell, ha jól gondolom. Ez a dupla és && operátor.

Az ==HIGH és ==LOW is dodgy: logikai értéket a true, false konstansokhoz illik hasonlítani. De felesleges is: == HIGH helyett elég a logikai kifejezés, ==LOW helyett pedig !(..)-ba kell tenni.

Ez úgy okozhat gondot, ha valamelyik változóban nem 1 a logikai igaz érték. Ugye régen az volt, hogy minden igaz, ami nem 0. Általában így is működik, de ha ilyen érték van benne, akkor nem lesz jó az aritmetika eredménye.

Ez az if a teljesen rossz: "if (xxSTEP&stepcounter == LOW)" a stepcounter és az xxSTEP közötti bitenkénti és-nek nincs értelme. Az egész if-et az előzőbe be lehet tenni: mindig az X lépés után ellenőrizzük, hogy kell-e irányt váltani. És a feltételben csak az xxSTEP-et kell ellenőrizni így már.

Helyesen:

  1. if (stepcounter == 0) {
  2.       xxSTEP = (xxSTEP==HIGH?LOW:HIGH); // Nem logikai tagadás, hanem számokat kezelünk: elvileg mindegy, de ha már a LOW/HIGH konstansokat használjuk, akkor használjuk rendesen!
  3.       stepcounter = xmove;
  4.       digitalWrite(XDIR, XDIR);
  5.       digitalWrite(XSTEP, xxSTEP);    // Move only when YELL and RED pushed <- ez kopipészt gyanús nem idevaló komment
  6.       if (xxSTEP==LOW) { // Minden második lépésnél számlálunk, amikor éppen 0 a stepper kimenet
  7.         xxsize--;                       // temporary xsize=Size/Dia. When xxsize=0, the XDIR changes
  8.         if (xxsize == 0) {
  9.           XDIR = !XDIR;
  10.           xxsize = xsize;
  11.         }
  12.       }
  13.     }
(#) asch válasza Massawa hozzászólására (») Márc 5, 2020 / 1
 
Ez a kifejezés is dodgy, csak éppenséggel pont működik:

STEP & !ADJ & !RUN

Helyesen el kell dönteni, hogy a változók boolean-ek-e, vagy számok-e? Ha számok, akkor lehet & műveletet csinálni rajtuk, ha boolean-ek, akkor lehet ! műveletet csinálni. A logikai és a bitenkénti műveleteket keverni nem illik. Egy jó megoldás pl, ha mindegyik logikai érték:

  1. digitalWrite(YSTEP, (STEP && !ADJ && !RUN)?HIGH:LOW);     // Move only when YELL and RED pushed
  2.   if (STEP && !ADJ && !RUN) {
  3.     ...
(#) Massawa válasza asch hozzászólására (») Márc 5, 2020 /
 
Köszönöm szépen.

A baj, az, hogy minden bemeneti adat aktiv állapotában 0 (alacsony a GND szinten). Ezért forditgattam öket a ! jellel. Elvben a nagybetüs változok booleanok, csak negativ logikával.

Az irányváltás sajnos továbbra sem müködik, minden más teszi a dolgát. A kodom olyan volt amit irtál:

Itt egy printout:

STEPCOUNTER = 0
xmove =0
xxsize =13
XDIR =5
STEPCOUNTER = 0
xmove =0
xxsize =3
XDIR =5
STEPCOUNTER = 0
xmove =0
xxsize =-7
XDIR =0
STEPCOUNTER = 0
xmove =0
xxsize =-16

láthato, hogy az xxsize átmegy negativ értékbe aminek nem kellene, mert 0 értéknél ismét fel kell tölteni az xsize értékre, az adott esetben ez 40:

xxsize =40
XDIR =5

szoval innen kellene leszámolnia 0-ra majd irányt váltani ami stimmel XDIR, (lehet hogy atdefiniálom booleanra).


  1. if (STEP & !ADJ && !RUN == HIGH) {
  2.     stepcounter--;                // gear ratio 1 rev of Y motor == > stepcounter= xxSTEP
  3.     if (stepcounter == 0) {
  4.       xxSTEP = !xxSTEP;
  5.       stepcounter = xmove;
  6.       digitalWrite(XDIR, XDIR);
  7.       digitalWrite(XSTEP, xxSTEP);    // Move only when YELL and RED pushed
  8.     }
  9.     if (xxSTEP == LOW) {
  10.       xxsize--;                       // temporary xsize=Size/Dia. When xxsize=0, the XDIR changes
  11.       if (xxsize == 0) {
  12.         XDIR = !XDIR;
  13.         xxsize = xsize;
  14.       }
  15.     }
  16.   }
  17.   STEP = !STEP;
  18.   return;
(#) asch válasza Massawa hozzászólására (») Márc 5, 2020 /
 
A 9. sorban lévő if a felette lévőn belül legyen! A stepcounter ugye osztóként működik, hogy hányadik ciklusokban kell ennek a motornak működni, nem? És itt az if (stepcounter==0) blokkon belül kellene lenni mindennek, ami az x motorra vonatkozik, hiszen ez csak itt mozdul. Még így is fura, hogy hogy tud negatívba menni... Kivéve, ha xsize arra inicializálja. Csak kellene látni a konstansokat is, meg a változók típusait.

Az XDIR értéke is nagyon fura: ez 0 és 1 lehetne csak elvben, nem? Hogy lehet 5?

Nincs valami memory vagy stack overflow, ami mindent felülír össze-vissza? Akkor aztán nézhetjük a kódrészletet évekig, akkor sem fejtjük meg. Az egész kód kellene hozzá.
(#) Massawa válasza asch hozzászólására (») Márc 5, 2020 /
 
Kösz most mennem kell.
A konstansok egyszerüek:
A stepcounter minden 10. YSTEP-léptet ( azaz ekkor nullázodik) és az müködik.
Az xsize=40 amit elöször beir az xxsize-be. Innen kell leszámolnia 0-ig majd irányt váltani és ujbol betölteni az xxsize-be az xsize értéket.

Majd kb 2-3 ora mulva folytatom, addig még elgondolkodok a gondon. A nagybetüs változoka mind átirtam booleanra.
Érdekes modon beraktam a 12. Sor utánba egy lcd.print (">") sort ( kijelezni az LCD-n az XDIR irányát ( természetesen If stb.vel) ilyenkor mindig leállt a motor egy kisebb moccanás után).
Az XDIR-t én sem tudom miért ir ki induláskor 5-t menet közben már csak 0 meg 1. Ugyanugy az xxsize-re is induláskor -1. ir holott definiáltam a bevezetöben higy int xxsize=0;. Amint átveszi a xsize értéket akkor már jo, de nem áll meg a 0 értéken.

Kösz.
A hozzászólás módosítva: Márc 5, 2020
(#) djusee válasza asch hozzászólására (») Márc 5, 2020 /
 
Igen, SPI - s Daisy Chain -ben gondolkodtam hogy készítek külön IO modulokat amelyekkel tetszés szerint bővíthetném. Ez a shift regiszter jó is lenne ha P csatornás kimenete lenne. Minden esetre köszi, feljegyzem magamnak.
(#) lelkes amatőr hozzászólása Márc 5, 2020 /
 
Sziasztok,
(Nem épp Arduino, de itt láttam AM2315-öt használókat)
Stamp BS2p-vel próbálom életre kelteni, de nem megy. Ha jól értelmezem a leírását, a 0xB8 címen a 03,00,04 parancs után kellene tudni olvasni az első 4 bájtot.
Ezzel a kis programmal próbálkozok:

' {$STAMP BS2px}
' {$PBASIC 2.5}

SDA PIN 8
addr CON $b8

t1 VAR Byte
t2 VAR Byte
p1 VAR Byte
p2 VAR Byte

Main:

I2COUT SDA, addr, [$03]
PAUSE 10
I2COUT SDA, addr, [$00]
PAUSE 10
I2COUT SDA, addr, [$04]
PAUSE 10

olvas:

I2CIN SDA, addr, 0, [t1, t2, p1, p2]
DEBUG CLS, DEC t1,"..", DEC t2,"..",DEC p1, "..",DEC p2
PAUSE 1000
GOTO olvas
END
(#) zsoltee0001 hozzászólása Márc 5, 2020 /
 
Sziasztok
Találtam ezt az oldalt:Bővebben: Link
DHT11 mérését loggolná egy webes felületre.
Fordításkor nem dob hibát, de nem működik.
Feltűnt, hogy a kód elején inklúdolt
  1. #include <stdlib.h>

nem aktív, sőt ha kiremelem, akkor se hiányolja.
Miért lehet ez?
(#) Kovidivi válasza Massawa hozzászólására (») Márc 5, 2020 /
 
1 karakter ' közé kell rakni, nem " közé.
(#) Massawa válasza Kovidivi hozzászólására (») Márc 5, 2020 /
 
Ezt nem értem.

A baj ott van, hogy valamiért nem számolja le a stepcountert 10-röl 0-ra. Elkezd számolgatni, de a 0-t nem éri el.
stepcounter--;
(#) tbarath válasza Massawa hozzászólására (») Márc 5, 2020 /
 
  1. if (STEP & !ADJ && !RUN == HIGH) {
  2.     stepcounter--;                // gear ratio 1 rev of Y motor == > stepcounter= xxSTEP

Itt van egy & bit operátor valami negált változóval
A hozzászólás módosítva: Márc 5, 2020
(#) Kovidivi válasza Massawa hozzászólására (») Márc 5, 2020 /
 
"Érdekes modon beraktam a 12. Sor utánba egy lcd.print (">") sort ( kijelezni az LCD-n az XDIR irányát ( természetesen If stb.vel) ilyenkor mindig leállt a motor egy kisebb moccanás után)." - erre értettem.
Egyébként a feltételeket isnle tudod ellenőrizni, hogy miért nem a megfelelően működik, ha a soros portra debuggolsz folyamatosan. Ott pedig fel fog tűnni, ha más lesz az eredménye egy &-t tartalmazó feltételnek, mint amit te szerettél volna.
A hozzászólás módosítva: Márc 5, 2020
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 5, 2020 /
 
Helló!

A teljes kódot nem látjuk, nem is értem pontosan a feltételeket, nem tudom miért nem logikai változókkal operálsz, vagy ha egészekkel akkor miért nem = vagy < >. De mindegy, lehet így is jó.

Azonban, ha ez egy interrupton lévő függvény, akkor minden ilyen globális változónak Volatile- előtaggal kellene szerepelnie.
(#) KoblogPerGyok válasza Massawa hozzászólására (») Márc 5, 2020 /
 
A másik, hogy az xxsize soha nem lesz nulla. Nem vágom, miért, de kiírattad. 3 után RÖGTÖN negatív értéket vesz fel, ezért az az if soha nem fut le ami újra felvetetné a helyes értéket, mert a nullát egyszerűen átugorja.
(#) KoblogPerGyok válasza tbarath hozzászólására (») Márc 5, 2020 /
 
Helló!

Ez lehet jó? Nekem nem tetszik, lehet jó ez, de más nyelveken belefutottam ilyen hibába.
if (STEP & !ADJ && !RUN == HIGH) {

A high pontosan mire vonatkozik? Az utolsó tagadott értékre, vagy az egész ÉS láncolatra? Inkább zárójelezni kellene, biztos ami biztos alapon.

A végén a !RUN==High az véletlenül nem egyenlő RUN==LOW-al?

Így jobban látszik szerintem: (A high az true-nak felel meg nem?) ÉS KÉT & jellel ahogy mondod.

if (STEP && !ADJ && !RUN)

Ha a változók nem logikai értékeket vesznek fel, akkor lehetnek érdekes eredmények itt. Ha nem 0 akkor igaz. Még -1-nél is. Ezeknek a változóknak unsigned-nek kellene lenniük, mert gond lehet.

ilyesmi jobb lenne szerintem, ha ezek numerikus változók:

if(STEP!=0 && ADJ!=0 && RUN!=0) már ha ezek egészek, bájtok, de nem logikai változók.
A hozzászólás módosítva: Márc 5, 2020
(#) KoblogPerGyok válasza asch hozzászólására (») Márc 5, 2020 /
 
Idézet:
„A stepcounter minden 10. YSTEP-léptet ( azaz ekkor nullázodik) és az müködik.
Az xsize=40 amit elöször beir az xxsize-be. Innen kell leszámolnia 0-ig majd irányt váltani és ujbol betölteni az xxsize-be az xsize értéket.”


Véletlenül a másik léptetésben (Másik kód, ami YSTEP(?) ) ben van nem maradt egy
xxsize--;

utasítás?

Gyanús, mert épp 10-el csökken úgy, hogy a fenti kódban nem szerepel ennyi. 3 utána -7 majd -16. Az utolsónál kimarad éppen egy. Máshol lesz a gond (meg itt is a volatile, &&, unsigned stb után.)

Így simán átlépi 0-t, ezért soha nem veszi fel a kezdeti helyes adatot.
A hozzászólás módosítva: Márc 5, 2020
(#) _BiG_ válasza Massawa hozzászólására (») Márc 5, 2020 /
 
Nem néztem át a kódodat, de arra figyelj, hogy a C-ben egy logikai feltétel kiértékelésénél csak addig megy el a program, amíg határozott igaz nem lesz a feltétel és hátulról előre fele dolgoz fel(!), ha az if-ben műveletvégzés is van, akkor lehet, hogy le se fut, mert előbb már igaz lesz az egész és így kimaradhat lépés.
A másik a műveletek prioritása. Lehet, hogy egy összehasonlítás és egy bitenkénti művelet nem megfelelő sorrendben értelmeződik, ha nincs zárójelezve. És a prioritás a fordításkor eldől, tehát a műveletvégzés sorrendje is.
Tehát értékadást, függvényhívást az if logikai részébe, ahol eldől a futás iránya, nem jó beletenni, mert a kiértékelésnél borulhat minden, ráadásul állapotfüggően, tehát egyszer-kétszer jó, de néha nem.
(#) Kovidivi válasza Massawa hozzászólására (») Márc 5, 2020 /
 
"digitalWrite(XDIR, XDIR);" - azért ebbe is érdemes lenne belegondolni, hogy mi lesz az eredménye...
A kódnak sokkal tisztábbnak, érthetőbbnek kell lennie, hogy a hibakeresést megkönnyítse!
(#) sargarigo válasza Massawa hozzászólására (») Márc 5, 2020 /
 
A másik meg, hogy érdemes az
  1. if (xxsize == 0) {
helyett
  1. if (xxsize <= 0) {
formát használni, és így ha véletlenül le is menne negatívba (márpedig látjuk hogy lemegy), akkor is megfogod vele.
(#) Massawa válasza sargarigo hozzászólására (») Márc 5, 2020 /
 
Ezt is már kiprobáltam, de addig amig a stepcounter nem éri el a nullát az xxsize sem igen változhat.
A legérdekesebb, hogy az egész program 10-12 alprogrambol áll mindegyiket külön kiprobáltam és egyen kivül mind ment ( az az egy még nincs beépitve).
Holnap ki kell deritenem miért nem számol a stepcounter nulláig.
Következő: »»   597 / 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