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   650 / 854
(#) sargarigo válasza D R L hozzászólására (») Aug 29, 2020 /
 
Idézet:
„van 9-db relé abból 8-db szelepeket kapcsol és a maradék 1 pedig egy kis villanymotort. És a lényeg az, hogy egy kiválasztott italhoz tartozik egy szelep és egyszerre kell kapcsolnia a villanymotor reléjének és az adott ital reléjének . Egészen addig amíg el nem éri a megadott mennyiséget súlyban átszámítva”

Ezt azért nem lett volna rossz ha a nyitó hozzászólásban elárulod!
Még annyit árulj el légyszi, hogy a kezelőfelület miből áll, mert csak tippelem a kódból hogy van egy tekerőd amivel kiválasztod a piát, meg egy nyomógomb amivel indítod? Ez a része rendben működik amúgy?
(#) D R L hozzászólása Aug 30, 2020 /
 
A menü az jól működik, rotary encoder-t használok a menü léptetéséré.
(#) sargarigo válasza D R L hozzászólására (») Aug 30, 2020 /
 
Nakérem!

Kigyomláltam, újraírtam, remélem így gondoltad! Mivel nekem nincs ilyen gépem mint neked, ezért a visszajelzést a soros monitorra írtam, hogy lássam hogy működik. Ezt értelemszerűen majd írd át lcd-re! Kivettem a mérleg kezelését, ha gondolod majd visszaírod, szerintem az amúgy sem működött jól. Sok értelmét amúgy sem látom, mert úgysem lesz pontos. Ahhoz sokkal mélyebben bele kellene mászni a vezérlésbe, nem ezen a szinten ahol most mi állunk. Van egy modifier nevű változó, ezzel tudod korrigálni a kitöltött mennyiséget.
Ebben a kódban a soros monitoron tudod tesztelni a működést, u és d az enkóder tekergetése, és b a gomb megnyomását jelenti. A többit gondolom már hozzá tudod masszírozni az igényeidhez!

Használd egészséggel!
  1. #define pinNums 8
  2. int pins[pinNums] = {5, 6, 7, 8, 9, 10, 11, 12};
  3. int enablePin = 13;
  4.  
  5. volatile boolean TurnDetected;
  6. volatile boolean up;
  7. bool doonce = 0;
  8. char screen = 0;
  9. boolean changestate = false;  // nem nulla, hanem false! Megérti így is, de te viszont belekavarodhatsz!
  10. char serialReceived;
  11. float modifier = 1000; // korrekciós tényező az adagolás idejéhez
  12.  
  13.  
  14. #define VODKA 0
  15. #define JAGER 1
  16. #define VOROSBOR  2
  17. #define ROSEBOR 3
  18. #define NARANCS 4
  19. #define COLA  5
  20. #define BODZA 6
  21. #define WHISKEY 7
  22.  
  23. #define UPPERLIMIT  100
  24.  
  25. #define ITALOK  9
  26. int volumes[ITALOK]; // ebben tároljuk az italok mennyiségét
  27. String names[ITALOK] = {"Vodka", "Jager", "Vorosbor", "Rose bor", "Narancs", "Cola", "Bodza", "Whiskey", ""}; // ebben tároljuk a neveket
  28.  
  29. void isr0 ()  {
  30.   TurnDetected = true;
  31.   up = (digitalRead(clk) == digitalRead(dt));
  32. }
  33.  
  34. void setup() {
  35.   Serial.begin(115200);
  36.  
  37.  
  38.   pinMode(sw, INPUT_PULLUP);
  39.   pinMode(clk, INPUT);
  40.   pinMode(dt, INPUT);
  41.  
  42.   for (int i = 0; i < pinNums; i++)
  43.   {
  44.     pinMode(pins[i], OUTPUT);
  45.     digitalWrite(pins[i], HIGH);
  46.   }
  47.  
  48.   pinMode(enablePin, OUTPUT);
  49.   digitalWrite(enablePin, LOW);
  50.  
  51.   Serial.println("Start");
  52. }
  53.  
  54. void turned()
  55. {
  56.   if (TurnDetected)
  57.   {
  58.     doonce = 0;
  59.     if (!changestate)
  60.     {
  61.       if (up)
  62.       {
  63.         screen++;
  64.         if (screen >= ITALOK - 1) screen = ITALOK - 1 ;
  65.       }
  66.       else
  67.       {
  68.  
  69.         screen --;
  70.         if (screen < 0) screen = 0;
  71.       }
  72.     }
  73.     else
  74.     {
  75.       if (up)
  76.       {
  77.         switch (screen)
  78.         {
  79.           case 0: volumes[0] += 10; break;
  80.           case 1: volumes[1] += 10; break;
  81.           case 2: volumes[2] += 10; break;
  82.           case 3: volumes[3] += 10; break;
  83.           case 4: volumes[4] += 25; break;
  84.           case 5: volumes[5] += 25; break;
  85.           case 6: volumes[6] += 25; break;
  86.           case 7: volumes[7] += 10; break;
  87.           case 8: // start menüpont
  88.           default: break;
  89.         }
  90.         if (volumes[screen] > UPPERLIMIT)
  91.           volumes[screen] = UPPERLIMIT;
  92.       }
  93.       else
  94.       {
  95.         switch (screen)
  96.         {
  97.           case 0: volumes[0] -= 10; break;
  98.           case 1: volumes[1] -= 10; break;
  99.           case 2: volumes[2] -= 10; break;
  100.           case 3: volumes[3] -= 10; break;
  101.           case 4: volumes[4] -= 25; break;
  102.           case 5: volumes[5] -= 25; break;
  103.           case 6: volumes[6] -= 25; break;
  104.           case 7: volumes[7] -= 10; break;
  105.           case 8: // start menüpont
  106.           default: break;
  107.         }
  108.         if (volumes[screen] < 0)
  109.           volumes[screen] = 0;
  110.       }
  111.     }
  112.  
  113.   }
  114.   TurnDetected = false;
  115. }
  116.  
  117.  
  118. void drinkDisplay(char screen)
  119. {
  120.   Serial.print("CLR ");
  121.   Serial.print(names[screen]);
  122.   Serial.print(" ");
  123.  
  124.   if (screen < ITALOK - 1)
  125.   {
  126.     Serial.print(volumes[screen]);
  127.     Serial.println("ml");
  128.     doonce = 1;
  129.   }
  130.   else Serial.println();
  131.  
  132.   if (changestate == false)
  133.   {
  134.     Serial.println("Change?");
  135.   }
  136. }
  137.  
  138.  
  139. void loop()
  140. {
  141.   turned();
  142.   if (serialReceived == 'b')  // if (digitalRead(sw) == LOW)
  143.   {
  144.     serialReceived = 0;
  145.     changestate = !changestate;
  146.     //changestate = true;
  147.     doonce = 0;
  148.   }
  149.  
  150.   if (doonce == 0) drinkDisplay(screen);
  151.  
  152.  
  153.   if (doonce == 0 && screen == ITALOK - 1)
  154.   {
  155.     Serial.print("CLR ");
  156.     if (changestate == false)
  157.     {
  158.       Serial.println("Start?");
  159.       doonce = 1;
  160.     }
  161.     else {
  162.       Serial.println("Wait!");
  163.       delay(2000);
  164.       fill();
  165.     }
  166.   }
  167.  
  168.   // olvasunk a soros portról.
  169.   // ha 'u' vagy 'd' karaktert kap, akkor az a rotary encoder forgatasa
  170.   // ha 'b' karaktert kap, akkor megnyomta a user a gombot.
  171.   if (Serial.available() > 0) // ha van miért, akkor
  172.   {
  173.     serialReceived = Serial.read(); // olvasunk egy byte-ot
  174.     if (serialReceived == 'u')
  175.     {
  176.       TurnDetected = true;
  177.       up = true;
  178.       serialReceived = 0;
  179.     }
  180.     if (serialReceived == 'd')
  181.     {
  182.       TurnDetected = true;
  183.       up = false;
  184.       serialReceived = 0;
  185.     }
  186.   }
  187.  
  188.  
  189. }
  190.  
  191. void fill()
  192. {
  193.   Serial.print("CLR "); // lcd.clear();
  194.   for ( int i = 0; i < pinNums ; i++)
  195.   {
  196.     if (volumes[i] > 0)
  197.     {
  198.       Serial.print(names[i] + " ");
  199.       digitalWrite(pins[i], LOW);
  200.       digitalWrite(enablePin, HIGH);
  201.       Serial.print(volumes[i]);
  202.       Serial.println("ml");
  203.       delay(volumes[i] * modifier);
  204.       digitalWrite(pins[i], HIGH);
  205.       digitalWrite(enablePin, LOW);
  206.     }
  207.   }
  208.   doonce = 0;
  209.   screen = 0;
  210.   // mivel már kitöltöttük, töröljük a mennyiségeket
  211.   for (int i = 0; i < ITALOK; i++)
  212.     volumes[i] = 0;
  213.   changestate = false;
  214.   Serial.println("Done.");
  215.   delay(2000);
  216. }
(#) D R L válasza sargarigo hozzászólására (») Aug 30, 2020 /
 
Köszönöm az eddigi segítségedet! Abba tudnál még segíteni, hogy hogyan írjam át LCD be?
(#) Kera_Will válasza D R L hozzászólására (») Aug 30, 2020 / 1
 
Program elején:
Elejen az lcdnek megfelelo konyvtar betoltese az lcd buszának (paralel 4/8 bites /I^2C ... stb) megfelelo fizikai port labak definialasa. Ez kb 1 vagy 2 sor az adott lcd vezérlő könyvtárától függ miként kell ezt neki megmondani.
Lásd arduino.cc oldalon az LCD vezerlésről szóló minta kódok.

Bővebben: Link lcd vezerles

Aztán Ahol serialprint van oda kellene az lcd vezerlo konyvtarba levo karakter / valtozo megjelenitésére szolgáló utasitás sorokat beírni.

Kb ennyi a lenyeg ... ha belefer a forditasba(uC progratarolo teruletbe) akkor hagyhatod benne a "sorosporti monitor + billentyűkezelést is".
A hozzászólás módosítva: Aug 30, 2020
(#) Kera_Will válasza Kera_Will hozzászólására (») Aug 30, 2020 /
 
Folyt kov:
Igy aztan akar sorosmonitor programmal is kezelheted a gepet... nem csak rotaryrol
Avagy plusz debug/ futaskozbeni belso allapotok valtozok ertekeit is ki kuldheted a soros portra.
Ha meg ugyesebb a soros debug/ monitor resz akkor onnan atdefinialhanad a mennyiseget, tipusat a folyadeknak stb ... , nem kell az egesz forrast ujra forditani ...
Persze ekkor a belso eeprom teruletet kellene a futo progibol es a soros portrol elerni.
A hozzászólás módosítva: Aug 30, 2020
(#) Kera_Will válasza D R L hozzászólására (») Aug 30, 2020 /
 
A jelenleg meglevo LCDd tipusa hatarozza meg milyen softveres vezerlest kell melle beallitani a forraskodban.

Ha minden igaz akkor ez egy I2C buszos kijelzo lesz legalabbis azzal kezded 2 oldallal visszább a forraskododat.
Annak az i2c konyvtarnak megvannak a kijelzest megjelenito egyedi utasitasai.
Azokat kell hasznalni ( torles, pozicionalas , kiiras ...stb.)
A hozzászólás módosítva: Aug 30, 2020
(#) sargarigo válasza D R L hozzászólására (») Aug 30, 2020 /
 
Ahogy kolléga is mondja!
Elejébe belerakod ezt (lehet hogy nem kell mind, nem tudom melyik a mérlegé):
  1. #include<LCD.h>
  2. #include <Wire.h>
  3. #include <LiquidCrystal_I2C.h>
  4. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


A setup()-ba ezt:
  1. lcd.begin(16, 2);


Aztán ahol Serial.print("CLR") van oda lcd.clear(); kell, ahol Serial.print oda meg lcd.print. Még az lcd.setCursor() sorokat kell beraknod ahova gondolod, hogy megfelelő legyen a kijelzésed. Ennyi.
Én is benne hagynám a soros mutatványt, és mellé írnám az lcd-t. Elfér.
Pár sorban van csak kiírás, ellenőrízd hogy jól jelenik-e meg.
A hozzászólás módosítva: Aug 30, 2020
(#) D R L válasza sargarigo hozzászólására (») Aug 30, 2020 /
 
Na most sikerült megcsinálni, hogy normálisan írja ki. Mielőtt írtad azelőtt próbálkoztam ezekkel.
Meg az lcd.clear(); -el csak egy kicsit másképpen de az nem sikerült valami jól.
  1. #include<LCD.h>
  2. #include <Wire.h>
  3. #include <LiquidCrystal_I2C.h>
  4. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

De most már így jó, már csak az encodert kell valahogy "szóra bírni" mert hiába tekerem nem csinál semmit.
(#) sargarigo válasza D R L hozzászólására (») Aug 30, 2020 /
 
  1. attachInterrupt (0, isr0, RISING);

Ezt tedd be a setup()-ba, és elvileg működni fog az is!
(#) D R L válasza sargarigo hozzászólására (») Aug 30, 2020 /
 
A gombnyomásra még nem reagál de a tekerésre már igen.
(Az előző programhoz képest sokkal gyorsabb lett a menüben az italok közötti ugrálás.)
A hozzászólás módosítva: Aug 30, 2020
(#) sargarigo válasza D R L hozzászólására (») Aug 30, 2020 /
 
A 147. sorban van egy ilyen:
  1. if (serialReceived == 'b')  // if (digitalRead(sw) == LOW)

Cseréld le így:
  1. if (serialReceived == 'b' || digitalRead(sw) == LOW)
(#) D R L válasza sargarigo hozzászólására (») Aug 30, 2020 /
 
Így már működik, köszönöm a segítséget.
A súlyérzékelőt ehhez a programhoz hozzá lehet még adni úgy, hogy jól is működjön?
(#) sargarigo válasza D R L hozzászólására (») Aug 30, 2020 /
 
Az a gond a súlyérzékelővel, hogy amikor megindul a töltés, akkor túl fog lőni, és hintázni fog a mért érték. Amikor ilyesmivel foglalkoztam, akkor nekem sosem sikerült egyszerű módszerrel működőképessé tenni. Itt jönnek a Fuzzy, PID rendszerek, de ez neked szerintem már nagyon nem érné meg a befektetett munkát. Ettől még meg lehet oldani, de ebben már nem fogok tudni segíteni. Ebben az alkalmazásban bőven elég lesz ha az idővel arányosítod a kitöltött mennyiséget. Szerintem engedd el a mérleget!
(#) D R L válasza sargarigo hozzászólására (») Aug 30, 2020 /
 
A mostani programban lehet italonként arányosítani a folyadék súlyát és arányát?
Mert ugye más a fajsúlya a különböző italoknak.
(#) sargarigo válasza D R L hozzászólására (») Aug 31, 2020 /
 
Hm.. Jelenleg az összesre ugyanaz. De nem nagy kunszt.
Kell az elejére a float modifier helyett egy ilyen:
  1. int calibrations[pinNums] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000 };

Aztán a fill() -ben van egy ilyen sor:
  1. delay(volumes[i] * modifier);

Ehelyett pedig ezt:
  1. delay(volumes[i] * calibrations[i]);

Ezt nem próbáltam most ki, de elvileg ennyi kell hozzá. Így minden italhoz külön külön be tudod állítani a korrekciót.
(#) D R L válasza sargarigo hozzászólására (») Aug 31, 2020 /
 
Köszi!
(#) Bell hozzászólása Szept 6, 2020 /
 
Sziasztok!
Beszereztem néhány LGT8F328P SSOP20 MiniEVB panelt, de kicsit kevesebb infót találtam róla, mint amire szükségem lenne.
Három kérdésem lenne ezzel kapcsolatban:
- hogyan kell értelmezni azt, ha egy lábhoz két felirat is tartozik, az egyik lábnál pl. 8, alatta 9~, a másiknál 11~, alatta 9~, vagy csak egyszerűen 3~?
- a hátoldalon szereplő SWC, SWD, DTR lábak melyik portnak felelnek? meg?
- A MISO, MOSI, SCK lábakat szeretném használni, de nem tudom melyek azok.
Köszönet!
(#) morgo válasza Bell hozzászólására (») Szept 6, 2020 / 1
 
Ez talán segít: Bővebben: Link
(#) Kovidivi válasza Bell hozzászólására (») Szept 6, 2020 / 1
 
Ha ki tudod sípolni, akkor nézd meg, hogy pl. ahol a 8 alatt 9 hullámvonal van, az több lábhoz csatlakozik-e. Ha igen, akkor program írása közben választhatsz, hogy a nyák azon kimeneti pontján a uC melyik lábát használod (a másik láb high-Z állapotban marad!).
Az A4 SDA egyértelmű, két funkció van egy pöttyön.
A szám utáni hullámvonal pedig PWM kimenetet jelent.
(#) mateatek válasza Bell hozzászólására (») Szept 6, 2020 / 1
 
Szoftveresen választhatod ki, hogy melyik kimenetet kapcsoljad az adott lábra. Lehetséges az is, hogy mindkettőt. Ebben az esetben akár zárlatot is tudsz csinálni és főzöd a kontrollert.
Az SWC, SWD, DTR lábak a programozáshoz kellenek, ha nincsen bootloader a csippen, vagy ha nem akarod, hogy legyen. Larduino HSP néven keressél rá. A MISO, MOSI, SCK lábak ugyanúgy a 11, 12 és 13-as jelű kimeneten vannak, mint az arduinónál.
A teljes értékű használathoz telepítened kell a szükséges könyvtárakat. (32 MHZ, 12 bit ADC, 8 bit DAC, 4 timer, stb...)
A hozzászólás módosítva: Szept 6, 2020
(#) szili83 hozzászólása Szept 6, 2020 /
 
Arduino UNO-t megtáplálhatok úgy a tápegység csatlakozásán keresztűl, hogy közben a PC-re USB-n keresztűl van feldugva? Van egy nagy teljesítményt igénylő LCD, és debugolás közben az USB 500mA-e kevés neki.
(#) szili83 hozzászólása Szept 6, 2020 /
 
Encodert szeretnék használni, de olyan programban, ahol több serial print is van nem működik. Próbáltam megszakítással, de azt vagy rosszul csinálom, vagy nem tudom, de nem működik.
Az alapötlet ebből indult ki: Bővebben: Link
Erre lett átalakítva: Bővebben: Link
A hiba, hogy nem ír ki semmit sem.
(#) pipi válasza szili83 hozzászólására (») Szept 6, 2020 /
 
Hali!
Az isr szerintem soha nem fut, valamilyen irq-hoz hozzá kéne rendelni a setup()-ban...
Egy jótanács még, interrupt kiszolgáló rutinba nem illik Serial.print-et tenni, az interruptban billents pl egy flag-et, és a főprogramban figyeld a flag állapotát
(#) mateatek válasza szili83 hozzászólására (») Szept 6, 2020 /
 
Íme egy kód enkóderre. Sajnos egyszerűbbre az én sekélyes tudásommal nem tudtam megírni. PCinterruptot használ, bármely lábra konfigurálhatod. Ez most a PORTD 4-es és 5-ös lábán van. A nyomógomb nincsen a programban, azt bármely módon le tudod programozni.
Az enkóder lábaira tegyél egy-egy 47 nanós szűrőt.

  1. volatile byte A = 0;
  2. byte B = 0;
  3. volatile byte lepes = 0;
  4.  
  5. void setup() {
  6.   Serial.begin(9600);
  7.   DDRD &= ~_BV (4);
  8.   DDRD &= ~_BV (5);
  9.   PORTD |= _BV (4);
  10.   PORTD |= _BV (5);
  11.   PCICR = 0b00000100;
  12.   PCMSK2 = 0b00110000;
  13. }
  14.  
  15. ISR(PCINT2_vect) {
  16.    A = A + ((PIND & _BV (4)) == 0) << 1;
  17.    A = A + ((PIND & _BV (5)) == 0) << 1;
  18.    A = A << 2;
  19.    if(A == 136) lepes--;
  20.    if(A == 144) lepes++;
  21. }
  22.  
  23. void loop() {
  24.   if (lepes != B) {
  25.   Serial.println(lepes);
  26.   B = lepes;
  27.   }
A hozzászólás módosítva: Szept 6, 2020
(#) tbarath válasza szili83 hozzászólására (») Szept 6, 2020 /
 
Nem, ne csinálj ilyet. Vagy az LCD-det cseréld le valami másra debug alatt, vagy az LCD menjen külön tápról, és csak a táp legyen közös. Illetve meg lehet próbálni azt is, hogy az USB kábelen elvágod az 5V vezetéket.
(#) mateatek válasza tbarath hozzászólására (») Szept 6, 2020 /
 
Az UNO-nál egy komparátor figyeli a tápcsatlakozón lévő feszültséget. Ha ez magasabb, mint 6,6-7 volt, akkor lekapcsolja az USB-ről érkező 5 voltot. A tápcsatról érkező feszültséget egy áteresztő stabilizátor stabilizálja 5 voltra. Amíg a tápcsatin bejövő fesz 6,6-7 volt alatt van, addig mindkét táp rákerül a Vin-re. Az ilyenkor létrejövő esetleges túláramokat egy biztosíték védi ki. De mivel a stabilizátornak kell 1-1,5 volt többlet feszültség, hogy a kimenetén megjelenjen a terhelhető 5 volt, így ilyen átmeneti állapotban sem történik semmi gond.
(#) szili83 válasza mateatek hozzászólására (») Szept 6, 2020 /
 
Átraktam a 3 és 4-es lábra, mivel a megszakítás UNO esetén csak a 2 és 3-as lábon működik.
Egy irányba tekertem, de a képen látható eredmény született:
(#) mateatek válasza szili83 hozzászólására (») Szept 6, 2020 / 1
 
A PCMSK2 regisztert viszont hagytad ott, ahol volt. Ott is át kellene írni, hogy másik lábra kéred a megszakítást.
(#) szili83 válasza mateatek hozzászólására (») Szept 6, 2020 /
 
Köszi, félig értem.

De nem kellene a "PCICR"-t is átírni?
És hol látom, hogy mire kell átírni?

PCICR = 0b00000100;
PCMSK2 = 0b00110000;
Következő: »»   650 / 854
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