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   718 / 845
(#) mateatek válasza vargham hozzászólására (») Dec 26, 2021 / 1
 
Igen, ez kissé bonyolulttá teszi, de ha elfelejtjük a digitalread-eket és a portregiszterek állapotát bankonként tároljuk és vizsgáljuk, akkor gyors és rövid lehet a hozzávaló program.
(#) szitko válasza mateatek hozzászólására (») Dec 26, 2021 /
 
Valahogy így?

  1. setup()
  2. .
  3.  
  4. PCICR |= 0b00000001; //port B
  5. PCMSK0 |= 0b00000001; // PCINT0 pin
  6. .
  7. .
  8. loop()
  9. {
  10. .
  11. }
  12. ISR(PCINT0_vect)
  13. {
  14. változó++; //Értékadás
  15. }
A hozzászólás módosítva: Dec 26, 2021
(#) mateatek válasza szitko hozzászólására (») Dec 26, 2021 /
 
Igen, valahogy így. Ezzel a kóddal csak 1 lábon fogsz megszakítást kapni és minden változáskor. Azt neked kell kilogikázni programban, hogy föl, vagy lefutó volt-e.
(#) szitko válasza mateatek hozzászólására (») Dec 26, 2021 /
 
Igen, értem.
Nekem csak annyi kell, hogyha X bemeneten változás történik, akkor egy Y kimeneten vátozás legyen.
Tehát durván így :
  1. volatile byte állapot = LOW;
  2. .
  3. .
  4.  ISR(PCINT0_vect)
  5. {
  6. digitalWrite(kimenet, állapot);
  7. állapot = !állapot;
  8. }

Persze ez így nagyon durva...
(#) vargham válasza szitko hozzászólására (») Dec 27, 2021 /
 
Én az ISR-en belül nem használnék digitalWrite-ot. (Mondjuk máshol sem...) Direktben írnám a port regisztert.
(#) asch válasza szitko hozzászólására (») Dec 27, 2021 /
 
Felesleges tárolni az értéket, ésszerűbb "másolni". Ebben az a pláne, hogy így "idempotens" lesz a művelet, biztosan mindig jó kimenetet ad, nem tud eltévedni.
Példa, amiben az A port 3 indexű bitjét kell a B port 5 indexű bitjére másolni:

  1. ISR(PCINT0_vect)
  2. {
  3. uint8_t sample=PINA&_BV(3);
  4. if(sample!=0)
  5. {
  6. PORTB|=_BV(5);
  7. }else
  8. {
  9. PORTB&=~_BV(5);
  10. }


Egyébként feljebb lapozva láttam, hogy írtad, hogy bemenetként reléről van szó. Ennél várható hogy lesz oda-vissza urgáló tranziens, és ez az interruptos megoldás ezt elég gyorsan hűen követi, a kimeneten is lehet hogy lesz egy csomó felesleges oda-vissza átmenet. Ezért ésszerűbb lehet szoftveres "debouncing"-ot csinálni, és csak egy késleltetés után másolni a bemenetet.

Eleve fura, hogy a bemenet relé, de mégis ilyen szintű gyors reakcióra van szükség, amit az interrupt ad.
A hozzászólás módosítva: Dec 27, 2021
(#) szitko válasza asch hozzászólására (») Dec 27, 2021 /
 
Köszi a tippet.

Idézet:
„de mégis ilyen szintű gyors reakcióra van szükség”

Nem a gyorsaságon van a hangsúly. A procinak van elég "sok", más feladata.
A prellt megpróbálom hardveresen kiküszöbölni.
(#) asch válasza szitko hozzászólására (») Dec 27, 2021 /
 
Interrupttal is ki lehet küszöbölni a prellt könnyen:

Konfigurálsz egy timert, hogy mondjuk 50 milliszekundumonként fusson le (nagyjából, nem kell pontosnak lennie).

Ezt írod az interruptba:

  1. static uint8_t prevSample=0;
  2. ISR(TIMER1_ovf)
  3. {
  4. uint8_t sample=PINA&_BV(3);
  5. if(sample==prevSample) // prellmentesites
  6. {
  7.     if(sample!=0)
  8.     {
  9.     PORTB|=_BV(5);
  10.     }else
  11.     {
  12.     PORTB&=~_BV(5);
  13.     }
  14. }
  15. prevSample=sample;
  16. }


Azért is jó ez a megoldás, mert a CPU terhelése állandó lesz, a másik elvben "éheztetheti" a többi taszkot, ha a bemenet sokáig prellezik.
A hozzászólás módosítva: Dec 27, 2021
(#) szitko válasza asch hozzászólására (») Dec 27, 2021 /
 
Ez jó megoldás, de rendesen végig kell gondoljam.
Tudom, hogy az analóg prell sokkal lassabb, de jelen esetben az idő nem releváns és a relék "csak" 5V 0,2- max. 0,4mA kapcsolnak.
(#) Josi777 válasza asch hozzászólására (») Dec 27, 2021 /
 
A millis() függvénnyel mért prell idő semmiben sem befolyásolja a program futását, minden ugyanúgy zajlik, akárhányszor történik a prell.
(#) vargham válasza Josi777 hozzászólására (») Dec 27, 2021 /
 
Hogyan implementáltad?
(#) Josi777 válasza vargham hozzászólására (») Dec 28, 2021 /
 
Remélem jól értettem a kérdést.
  1. void buttonCheck1() {
  2.   readingButton1 = digitalRead(Button1);
  3.   if (readingButton1==LOW and reading1==true) {
  4.     if ((millis() - lastDebounceTime1) > debounceDelay) {
  5.       buttonShort1=true;
  6.     }
  7.     if ((millis() - lastDebounceTime1) > longPressDelay) {
  8.       buttonLong1=true;
  9.       buttonShort1=false;
  10.     }
  11.   }
  12.   if (readingButton1==HIGH) {
  13.     lastDebounceTime1=millis();
  14.     reading1=true;
  15.   }
  16. }

És ez tud hosszú megnyomást is, de kivehető belőle.
(#) asch válasza Josi777 hozzászólására (») Dec 28, 2021 / 1
 
Ja, én csak azért javasoltam timer interruptos megoldást, mert szitko arra utalt, hogy a fő szálon nem akar a gombokkal foglalkozni valami ismeretlen okból. Egyébként többnyire valóban felesleges a gombokat interruptban kezelni.
(#) szikorapéter hozzászólása Dec 28, 2021 /
 
Sziasztok. A problémám a következő. Elkészítettem ezt a kapcsolást, programmal együtt.
A problémám az hogy (jelenleg egy optikai érzékelő van rajta) viszont a ledek hol mennek, hol nem de biztos hogy nem fordulatszám függvényében.
A Ledsor WS2812B eddig működött mindennel ezzel a programmal furcsáskodik.
20 led van rajta és ugye fordulatszám függvényében kéne "emelje" a led oszlopot és változtatná annak színét még végül elérve a végfordulatot villogna.

  1. #include <Adafruit_NeoPixel.h>
  2.  
  3. #define PIN            6  //LED Data Pin
  4. #define NUMPIXELS      20  //number of leds connected
  5. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  6.  
  7. //Progressive lights from 3700 RPM to 7050 RPM, smooth color transition from green to red, then blue.
  8. //shift @7050 until 7500, all flashing blue.
  9. //overrev @>7500, all flashing red.
  10.  
  11. //to change rpm values change igfreq (frquency values are different depending on no. of cylinders).
  12. //4 cylinder engine, sequential ignition Hz=RPM/30.
  13. //4 Cylinder engine, wasted spark Hz=(RPM/30)x2.
  14.  
  15. //Set operating range (default=123hz to 235hz = 3700rpm to 7050rpm @ 4 cylinder sequential)
  16.  
  17. const unsigned int minFrequency = 10; // minimum frequency to begin turning on LEDs
  18. const unsigned int maxFrequency = 150; // maximum frequency in normal range
  19. const unsigned int shiftFrequency = 166; // frequency range from max to shift when shifting should happen
  20.  
  21. // colors for each pixel when on
  22. const uint32_t tachColor[NUMPIXELS] = {
  23.   Adafruit_NeoPixel::Color(0, 120, 0),
  24.   Adafruit_NeoPixel::Color(0, 120, 0),
  25.   Adafruit_NeoPixel::Color(0, 120, 0),
  26.   Adafruit_NeoPixel::Color(0, 120, 0),
  27.   Adafruit_NeoPixel::Color(0, 120, 0),
  28.   Adafruit_NeoPixel::Color(0, 120, 0),
  29.   Adafruit_NeoPixel::Color(15, 105, 0),
  30.   Adafruit_NeoPixel::Color(30, 90, 0),
  31.   Adafruit_NeoPixel::Color(45, 75, 0),
  32.   Adafruit_NeoPixel::Color(60, 60, 0),
  33.   Adafruit_NeoPixel::Color(60, 60, 0),
  34.   Adafruit_NeoPixel::Color(75, 45, 0),
  35.   Adafruit_NeoPixel::Color(90, 30, 0),
  36.   Adafruit_NeoPixel::Color(105, 15, 0),
  37.   Adafruit_NeoPixel::Color(120, 0, 0),
  38.   Adafruit_NeoPixel::Color(0, 0, 120),
  39.   Adafruit_NeoPixel::Color(0, 0, 120),
  40.   Adafruit_NeoPixel::Color(0, 0, 120),
  41.   Adafruit_NeoPixel::Color(0, 0, 120),
  42.   Adafruit_NeoPixel::Color(0, 0, 120),
  43. };
  44.  
  45. /*
  46.    list of frequencies to determine when LEDs get turned on.
  47.    for a given index if the frequency is above this value,
  48.    the LED will be on using the colors above
  49.    otherwise, it will be off.  These steps do not need to
  50.    be linear but must start with minFrequency and not exceed maxFrequency
  51. */
  52.  
  53. const unsigned int lightShiftFreq[NUMPIXELS] = {
  54.   minFrequency,
  55.   17,
  56.   25,
  57.   33,
  58.   40,
  59.   48,
  60.   55,
  61.   63,
  62.   70,
  63.   78,
  64.   85,
  65.   93,
  66.   100,
  67.   107,
  68.   114,
  69.   122,
  70.   129,
  71.   137,
  72.   144,
  73.   150,  
  74. };
  75.  
  76. int i;
  77. const byte tachPin = 2;
  78.  
  79. void setup() {
  80.   pixels.begin(); // This initializes the NeoPixel library.
  81. }
  82.  
  83. unsigned long igfreq;
  84.  
  85. void loop() {
  86.  
  87. //  int rpm;
  88.   float ighigh, iglow;
  89.   unsigned long igcal1, igcal2;
  90.  
  91.   //measure period of tach signal
  92.   ighigh = pulseIn(tachPin, HIGH);
  93.   iglow = pulseIn(tachPin, LOW);
  94.  
  95.   igcal1 = 1000 / ((ighigh / 1000) + (iglow / 1000));
  96.  
  97.   //do it again
  98.   ighigh = pulseIn(tachPin, HIGH);
  99.   iglow = pulseIn(tachPin, LOW);
  100.  
  101.   igcal2 = 1000 / ((ighigh / 1000) + (iglow / 1000));
  102.  
  103.   //to filter out some noise, we only consider our measurement valid if they are similar in value, we accept the average.
  104.   if ((igcal1 - igcal2) < 8) {
  105.     igfreq = (igcal1 + igcal2) / 2;
  106.   }
  107.  
  108.   if (igfreq >= minFrequency && igfreq < maxFrequency) {
  109.     // normal operating range
  110.     for ( int i = 0; i < NUMPIXELS; ++i) {
  111.       if (igfreq > lightShiftFreq[i]) {
  112.         pixels.setPixelColor(i, tachColor[i]);
  113.       }
  114.       else {
  115.         pixels.setPixelColor(i, pixels.Color(0, 0, 0));
  116.       }
  117.     }
  118.     pixels.show();
  119.   }
  120.   else if (igfreq >= maxFrequency && igfreq < shiftFrequency) {
  121.     //shift flash
  122.     //default color=blue
  123.     pixels.fill(pixels.Color(0, 0, 120));
  124.     pixels.show();
  125.     delay(20);
  126.     pixels.fill(pixels.Color(0, 0, 0));
  127.     pixels.show();
  128.     delay(20);
  129.   }
  130.  
  131.   else if (igfreq >= shiftFrequency) {
  132.     //overrev flash
  133.     //default color=red
  134.     pixels.fill(pixels.Color(120, 0, 0));
  135.     pixels.show();
  136.     delay(20);
  137.     pixels.fill(pixels.Color(0, 0, 0));
  138.     pixels.show();
  139.     delay(20);
  140.   }
  141. }
(#) sargarigo válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
Az az optikai szenzor biztosan jól van rákötve?
(#) szikorapéter válasza sargarigo hozzászólására (») Dec 29, 2021 /
 
Igen, ez a kapható infravörös szenzor, ezzel most sikerült összehoznom, viszont amit majd szeretnék elérni az az lenne hogy autó gyújtásjeléről vegyem le a jelet hozzá, ezt az egyik gyertya vezetékre tekert néhány menet huzallal szeretném megoldani és ezzel az áramkörrel. Ennyi elegendő lehet a "jelátalakításhoz"?

Mod: Esetleg R2 helyett gondoltam egy 5V1-es zénerre is így nem tudnám ellőni a tranzisztor bemenetét.
A hozzászólás módosítva: Dec 29, 2021
(#) sargarigo válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
A jelformálás nem erősségem, gondolom majd hozzáértőbbek nyilatkoznak róla. Szerintem egy schmitt-trigger még kellhet utána. Ez a megoldás amúgy engem is érdekel, követni fogom az eseményeket
Azért kérdeztem az optikai szenzor bekötését, nem-e az van hogy nem hajtja meg rendesen a vezérlő bemenetét. Érdemes lenne szerintem valami jelgenerátorral kihajtani próbából a programot, hogy az biztosan azt csinálja-e amit kell. Most leginkább a jelszintekre gondolok. Nyilván nyomógombbal nem fogsz 7000rpm-et szimulálni, de egy állítható négyszöggenerátort összedobni nem tart sokból.

Szerintem itt lesz a gubanc.

Másik ötlet, hogy a tápod rendben van? Nagy mennyiségű led meg tudja rángatni rendesen ha nem elég combos, ami meg viszi magával a programot is.
A hozzászólás módosítva: Dec 29, 2021
(#) szikorapéter válasza sargarigo hozzászólására (») Dec 29, 2021 /
 
Most reggel meghajtottam egy 555-ösről, ott szépen ment 8hz-enként felfelé a szallag.
Most megépítem ezt a "jelformázót" utána gondolkoztam én is egy TTL ic-n (mondjuk 74LS04) úgy szebb lenne a kimeneti jelalakom.
(#) Jonni hozzászólása Dec 29, 2021 /
 
Az utólag hozzáadott könyvtárat hogy lehet törölni? Nekem nincs telepitve az IDE csak portable fut. Examples mappába nincs benne csak az alap.
(#) szikorapéter válasza sargarigo hozzászólására (») Dec 29, 2021 /
 
Éles próba megvolt, csak nem megfelelően működik. Nagy gázadásnál világít 3 ledem ( ami ugye 25hz elvileg az 3000-es fordulatszám) de nagyon nem annyinak hallani.....
Valószínűleg szerintem szenzor hiba lehet vagy nemtudom, most átírtam a programot 1Hz-től de nem működik és kicsit "fel...." a dolog mert a lakásban meg működik a szenzor....
(#) szikorapéter válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
A program jó az arduino jó, a jellevétellel vannak bajok. Csináltam több menetes tekercset, alakítottam az áramkörön, bent működik az autón nem. Várom a segítséget hátha valaki tud valami egyszerűbb megoldás kábelről való jel levételre.
(#) sargarigo válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
Hát pedig ha a táp erős, a program úgy működik ahogy kell, akkor csak a bemenet marad..

Szűrő kondik vannak mindenütt ahol kell? A jármű elektronika picit másabb azért mint az asztali.
(#) sargarigo válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
Milyen autó ez? Nem lehet hogy elektronikus a gyújtótrafó? Lehet hogy csak az indító jelet méred, nem magát a szikrát.
(#) szikorapéter válasza sargarigo hozzászólására (») Dec 29, 2021 /
 
A táp stabil erős. Néztem nem-e ott a hiba de az rendben van kapott elég nagy puffert is, zavarszűréssel. Szenzorhiba lesz mert idebent működik a szenzor (most ugye arról beszélek ami a nagyfesz kábelről szedi a jelet) , odakint nem megy. Valószínűleg a szikra energia lesz a probléma hogy idebent én egy kínai sokkoló áramkörrel teszteltem ott igen nagy a szikraenergia, ellenben arról tű pontosan veszi a jelet. Autóról viszont csak nagyon magas fordulaton lép közben ott is csak picit jelez.

Mod.: Renault twingo, a trafóban nincs elektronika TCI gyújtású a kocsi és rotoros elosztású. Próbáltam a rotor után 1-es hengertől, meg próbáltam a trafó főkábelétől is de egyik se vált be.
A hozzászólás módosítva: Dec 29, 2021
(#) sargarigo válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
Akkor egy kis erősítőt tegyél az érzékelőbe, és mindjárt jó lesz!
(#) szikorapéter válasza sargarigo hozzászólására (») Dec 29, 2021 /
 
Kb. 5 féle szenzorral és 11 elb**** óra után feladom. Nem lehet értelmes jelet levenni a gyújtógyertya kábeléről. Se sima tranzisztoros "jelformázó" , se 555, se schmitt trigger, se komplett műveleti erősítős, sehogy. Egyszerűen a kijövő jel hasonlít a lóból kijövő jelre.....
(#) KBal76 válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
Az nem mûködik hogy a terecsre egy LED van kötve, tehát az indukált fesztôl felvillan a LED?
(#) szikorapéter válasza KBal76 hozzászólására (») Dec 29, 2021 /
 
Próbáltam leddel jelezni a kimenetet is de nem ment. Az arduino-s kütyü működik mert ott szépen fut minden (idebent frekigenerátorral tesztelve 5V TTL-el), autón semmi se akart menni. 1,7mm a szikraköz gyárilag tehát még csak nem is kicsi gyenge szikrát kellene "nézni", azért abból már elég erőnek kéne átjönni. Ötletem sincs hogy tudom leszedni úgy a jelet hogy tényleges értékelhető adat legyen belőle fordulatszám függvényében. Gondolkoztam hogy megfúrom a gyújtáselosztóm és teszek oda valami optikai vagy hall érzékelőt de ott a nagyfeszültség meg a rengeteg zavar miatt nem merem.
A hozzászólás módosítva: Dec 29, 2021
(#) KBal76 válasza szikorapéter hozzászólására (») Dec 29, 2021 /
 
Az a tranzisztoros jelformázó az hogyan nézett ki? Nekem egy kéttranzisztoros mikrofonerôsítôvel már sok csodát sikerült érzékelnem, aminek a hanghoz semmi köze.
(#) szikorapéter válasza KBal76 hozzászólására (») Dec 29, 2021 /
 
Majdnem ugyan az volt lényegében mint egy elektret kapszula erősítője. 2db BC547-es mindössze, de talán az volt a 2. amivel próbálkoztam. Gondolkoztam a trafó "primeréről" a jellevétellel, de kétséges mit kapok onnét vissza, pláne hogy a program úgy van megírva hogy 1 gyertya jelét figyelje ne a trafóról jövőt.
Következő: »»   718 / 845
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