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   494 / 854
(#) misi93 válasza tbarath hozzászólására (») Nov 23, 2018 /
 
Köszönöm a biztatást igyekszem
(#) Kovidivi válasza Kovidivi hozzászólására (») Nov 23, 2018 / 1
 
Itt egy videó róla: Bővebben: Link
Már csak azt kellene kitalálni, hogyan töltsem ki az egész LCD-t, ha csak 8 speciális karakterem van.
A hozzászólás módosítva: Nov 23, 2018
(#) Rober_4 hozzászólása Nov 24, 2018 /
 
Sziasztok! A Korg Poly61-emhez szeretnék egy Midivezérlőt, ami a billentyűzetmátrixot helyettesítené.
A billentyűzetmátrix valójában 8x8-as, a tesztprogramban ezt 1x8-ra butítom. A soros bemenetről a checkMidi eljárással midi noteon, vagy noteoff utasítást fogad a program. Az alapján, hogy melyik billentyű leütését, vagy felengedését kapom az éppen lenyomott billentyűk térképét a boolean típusú hangok[] tömbben tárolom. A void loopban meghívom a checkMidit, majd gondolom amikor épp nincs dolga, akkor továbbmegy, és ha a matrixomon az első sor aktív, azaz a szintetizátor azt a sort időzíti a matrixból, akkor kiírja a 8digitalis kimenetre, hogy az adott 8 hangból melyik aktív.
Szerintetek működőképes lehet-e a dolog? Bocs a primitív programmegoldásokért!
  1. byte commandByte;
  2. byte noteByte;
  3. byte velocityByte;
  4. boolean hangok[127];
  5.  
  6. int matrixout1(8);
  7. int matrixout2(9);
  8. int matrixout3(10);
  9. int matrixout4(11);
  10. int matrixout5(12);
  11. int matrixout6(13);
  12. int matrixout7(14);
  13. int matrixout8(15);
  14. int matrixin1 = (5);
  15. int matrixin2 = (6);
  16. int matrixin3 = (7);
  17. int matrixin4 = (16);
  18.  
  19. void setup() {
  20.   Serial.begin(31250);
  21.   pinMode(matrixout1, OUTPUT);
  22.   pinMode(matrixout2, OUTPUT);
  23.   pinMode(matrixout3, OUTPUT);
  24.   pinMode(matrixout4, OUTPUT);
  25.   pinMode(matrixout5, OUTPUT);
  26.   pinMode(matrixout6, OUTPUT);
  27.   pinMode(matrixout7, OUTPUT);
  28.   pinMode(matrixout8, OUTPUT);
  29.   pinMode(matrixin1, INPUT);
  30.   pinMode(matrixin2, INPUT);
  31.   pinMode(matrixin3, INPUT);
  32.   pinMode(matrixin4, INPUT);
  33. }
  34.  
  35. void checkMIDI() {
  36.   do {
  37.     if (Serial.available()) {
  38.       commandByte = Serial.read();//read first byte
  39.       noteByte = Serial.read();//read next byte
  40.       velocityByte = Serial.read();//read final byte
  41.       if (commandByte == 0x90 && velocityByte != 0x00) {
  42.         switch (noteByte) {
  43.           case 0x0: ; hangok[0] = true; break;
  44.           case 0x1: ; hangok[1] = true; break;
  45.           case 0x2: ; hangok[2] = true; break;
  46.           case 0x3: ; hangok[3] = true; break;
  47.           case 0x4: ; hangok[4] = true; break;
  48.           case 0x5: ; hangok[5] = true; break;
  49.           case 0x6: ; hangok[6] = true; break;
  50.           case 0x7: ; hangok[7] = true; break;
  51.           case 0x8: ; hangok[8] = true; break;
  52.         }
  53.      }
  54.  if (commandByte == 0x90 && velocityByte == 0x00) {
  55.         switch (noteByte) {
  56.           case 0x0: ; hangok[0] = false; break;
  57.           case 0x1: ; hangok[1] = false; break;
  58.           case 0x2: ; hangok[2] = false; break;
  59.           case 0x3: ; hangok[3] = false; break;
  60.           case 0x4: ; hangok[4] = false; break;
  61.           case 0x5: ; hangok[5] = false; break;
  62.           case 0x6: ; hangok[6] = false; break;
  63.           case 0x7: ; hangok[7] = false; break;
  64.        }
  65.      }
  66.  
  67.     }
  68.   }
  69.   while (Serial.available() > 2);//when at least three bytes available
  70. }
  71.  
  72. void loop() {
  73.   checkMIDI();
  74.   boolean sor1 = digitalRead(matrixin1);
  75.  
  76.   if  (sor1) {
  77.     digitalWrite(matrixout1, hangok[0]);
  78.     digitalWrite(matrixout2, hangok[1]);
  79.     digitalWrite(matrixout3, hangok[2]);
  80.     digitalWrite(matrixout4, hangok[3]);
  81.     digitalWrite(matrixout5, hangok[4]);
  82.     digitalWrite(matrixout6, hangok[5]);
  83.     digitalWrite(matrixout7, hangok[6]);
  84.     digitalWrite(matrixout8, hangok[7]);
  85.   }
  86. }
A hozzászólás módosítva: Nov 24, 2018
(#) benjami válasza Rober_4 hozzászólására (») Nov 24, 2018 /
 
Jó eséllyel lassú lesz a programod a lekérdezés sebességéhez. Ha csak 8 billentyűt akarsz akkor 2db CD4066 analóg kapcsoló IC-t köss a mikrovezérlődre. Lehetőség van a teljes billentyűmátrix vezérlésére is (igaz a belső diódák hiánya miatt csak korlátozottan) ezzel.
(#) Rober_4 válasza benjami hozzászólására (») Nov 24, 2018 /
 
Köszi a választ!
61 billentyű lenne a végén, de szerintem multiplexerrel megoldható a 8 bemenet az 1-re, három címmel, de egyenlőre annak örülnék, ha működne, a midi bemenetérkezésekor egy ledet felvillantani a kimeneten dolog
Megpróbálom összerakni.
(#) benjami válasza Rober_4 hozzászólására (») Nov 24, 2018 /
 
Megoldható vele, de csak addig amíg egy billentyű van lenyomva az adott 8-ból.
(#) Rober_4 válasza benjami hozzászólására (») Nov 24, 2018 /
 
Miért? Amely billentyűk le vannak nyomva, ott változik a kimenet. Egy kimenet bemenet egy billentyű...
(#) benjami válasza Rober_4 hozzászólására (») Nov 24, 2018 /
 
Mondjuk én azzal kezdeném, hogy ráakasztanám a kis 8 csatornás logikai analizátoromat a 8db mátrix-in vezetékre és megnézném milyen sebességgel történik a lekérdezés. Mivel a 8049 nem egy erőmű, ez talán nem lesz MHz nagyságrendű. Az sajnos az nem deríthető ki, hogy a 8049 a mátrix megcímzése után mennyivel olvassa vissza az adott sort, de ha ez több 1-2 mikroszekundumnál, akkor talán csupán szoftveresen is megoldható. Persze ez nem a fenti programmal, hanem megszakítással (szükség esetén a lábállapot változás megszakítás kiszolgálását ASM-ben megírva).
Ez ugyan nem MIDI, de példának talán jó, amin elindulhatsz.
A hozzászólás módosítva: Nov 24, 2018
(#) rolandgw válasza Rober_4 hozzászólására (») Nov 24, 2018 /
 
Nem értem miért a bonyolultabb megoldást választottad, mármint a velocity-t használni, mikor a note on 0x90, a note off pedig 0x80.
(#) Rober_4 válasza rolandgw hozzászólására (») Nov 24, 2018 /
 
Igen ez jogos. Úgy tudom mindkettő elfogadott noteoff parancsnak. Természetesen mindkettőt le kell kezelnem a hangok kikapcsolásához. Egyenlőre nem ezen volt a hangsúly
(#) Rober_4 válasza benjami hozzászólására (») Nov 24, 2018 /
 
Elvileg a billentyűzet részben csak ellenállások és diódák vannak, tehát ha megcímzi őket, akkor illene is visszaolvasnia szerintem...
(#) Rober_4 válasza Rober_4 hozzászólására (») Nov 24, 2018 /
 
De meggyőztetek hagyom a fenébe.
(#) rolandgw válasza Rober_4 hozzászólására (») Nov 24, 2018 /
 
Van más megoldás is, igaz nem olcsó.
Bővebben: Link
(#) benjami válasza Rober_4 hozzászólására (») Nov 24, 2018 /
 
Gondolom vissza is olvassa. Csak az a kérdés, hogy mennyi idővel a megcímzés után. Ha fél mikroszekundummal, akkor nincs időd a programodban a megcímzett sorhoz tartozó kimeneteket beállítani, ha legalább 5-10 mikroszekundummal, akkor viszont le tud futni az az algoritmus, ami ezt megteszi.
(#) KoblogPerGyok válasza Rober_4 hozzászólására (») Nov 25, 2018 /
 
Szia!

Én nem adnám fel. Ki kell próbálni, majd szépen lassan gyorsabb megoldások felé venni az irányt. A kódod ha megy is akkor kicsit lassú lesz, de lehet rajta gyorsítani. Rögtön ott egy Port operáció, tök fölösleges és lassú a 8 Digital write.

Bővebben: Link

Az, hogy a soros portról kap egy/két bájtot, azzal semmi gond nincs szerintem. (azzal igen, hogy nem várod meg, míg minden átjön.)
(#) rolandgw válasza KoblogPerGyok hozzászólására (») Nov 25, 2018 /
 
Ennél sokkal összetettebb a feladat, szerintem. Kvázi emulálni kell egy 8x8-as matrix működést, ami ráadásul multiple, mivel a hangszer 6 hang polifónikus, bárhol megjelenhet egyszerre 6 lenyomás (vagy több). Vissza kellene keresni a teljes hangkiosztást a matrixban, aztán megfejteni a szkennelést. Közben midi adatokat fogadni, feldolgozni és megfelelő időzítéssel, kiadni.
(#) Rober_4 válasza rolandgw hozzászólására (») Nov 25, 2018 /
 
Szerintem bármennyi billentyűt lenyomhatok egyszerre, azt már intézi a szinti. Tehát a polifónia miatti "csuklásokat" nem nekem kell megoldani. Tulajdonképpen ha lenne 61 kapcsolóm és azokat be ki kapcsolgatnám, az is megoldaná a dolgot, és akár mind a 61-et bekapcsolhatom, a szinti eldönti, mi fog szólni a beérkező sorrendből...
Kb 25ezerből lehetne egy szlovák cégtől venne ehhez egy midi vezérlőt, de abba semmilyen kihívás nincs, ráadásul nem költséghatékony...
(#) Rober_4 válasza benjami hozzászólására (») Nov 25, 2018 /
 
Lehet ez az analóg kapcsolós cucc nem is olyan rossz megoldás kb 16 db kéne...
(#) rolandgw válasza Rober_4 hozzászólására (») Nov 25, 2018 /
 
Persze, hogy kapcsolhatod mind, nem ezért hoztam fel. Ha vezérlő ad egy oszlop jelet például, akkor neked tudnod kell mikor adja és nem biztos, hogy csak egy sorjellel kell reagálnod. Ezt addig meg kell tenned, amíg át nem vált a következőre.
(#) rolandgw válasza Rober_4 hozzászólására (») Nov 25, 2018 /
 
Idézet:
„Tulajdonképpen ha lenne 61 kapcsolóm és azokat be ki kapcsolgatnám, az is megoldaná a dolgot”

Értem, akkor te lennél a MIDI?
(#) proba válasza Rober_4 hozzászólására (») Nov 25, 2018 /
 
És ha a processzort házasítanál egy tárolókból álló hálózattal? Ha a márrix nem alkalmaz kimenetén irányfordítást, elég lehetne 8 D-tip. tároló OE kimenettel. A mátrix oszlopkijelölő vezetékei pont jók kimenet engedélyezőnek. Amit a tárolókba beírsz az meg pont jó lehet az adott oszlophoz tartozó gomb információnak. Igy a processzornak csak annyi dolga van, a megfelelő időben a megfelelő tárat átírja. A mátrix időzítésével nem kell foglalkoznia.
A hozzászólás módosítva: Nov 25, 2018
(#) benjami válasza proba hozzászólására (») Nov 25, 2018 /
 
Ez sem rossz verzió, 8db 8bites D tárolóval (pl. 74HC574) megoldható (ha nem kell invertálni az OE lábakat).
(#) Rober_4 válasza proba hozzászólására (») Nov 26, 2018 /
 
Ez jó ötletnek tűnik így ránézésre mivel mindaddig tárolja a lenyomást, amíg fel nem emelem a billentyűt, tehát nem változik az állapot.
(#) Rober_4 hozzászólása Nov 26, 2018 / 1
 
Közben, mivel az előző projektet szüneteltettem megvalósíthatatlansága miatt, és egy régi vágyam volt egy olyan MIDI GS controller, ami a Roland JV30-am realtime állítható hangszínparamétereit képes állítani, elkészítettem ezt. Három optikai ellenállást használtam hozzá, meg kaptam egy panelt még régebben, meg most rendeltem egy kínai Nanot és egy kék LCD-t. Sima normál Midi csatlakozó kimeneten kapja a szintetizátor a jelet..
Szóval ez egy midi kontroller, de nem CC üzeneteket ad, hanem Roland készülékek Gs üzenetét.
11bájton, 6-7-8 a paramétercím, 9-es az érték, 10-es a hibaellenőrző bit: a 3címbájt és az adat összegét kivonva 128-ból kapható meg. Működik szépen, ha valakit érdekel esetleg a forráskód ide feldobom. Az előző projektet átgondolom, illetve rámérek a hangszerre, de azt nem kapkodom el...
(#) rolandgw válasza proba hozzászólására (») Nov 27, 2018 /
 
Ez jó ötlet. Vennék egy start jelet megszakítás formájában valamelyik oszlopjelölőről, mikor kezdhető az átírás.
A konvertált midi adatokat pedig FIFO-ba tenni. Csak arra kellene ügyelni,hogy ne legyen túlcsordulás és ha üres a FIFO nullákat kapjon. Elmélet, nem biztos, hogy belefér az időbe.
(#) berkesandor hozzászólása Nov 27, 2018 /
 
7 szegmenses kijelzőt szeretnék használni, meg is csináltam vele amit szeretnék, csak az utolsó lépés hiányzik.
Ilyen a kijelző, és innen van a kódom kiindulási alapja: Bővebben: Link
A jobb szélen az akku kijelzést szeretném használni, de nem tudom értelmezni a csatolt képet. Bővebben: Link
Hogyan tudom bekapcsolni (és lekapcsolni) azok a karaktereket?
(#) tbarath válasza berkesandor hozzászólására (») Nov 27, 2018 /
 
Szerintem a BAT1, BAT2 és BAT3 bitek billentésével, a hogyant nem tudom.
(#) berkesandor válasza tbarath hozzászólására (») Nov 27, 2018 /
 
A tizedesvessző bitjeit így billegeti:
  1. void displaydata(int p)
  2. {
  3.  uchar i=0;
  4.  switch(p)
  5.  {
  6.  case 1:
  7.  sbi(dispnum[0],7);
  8.  break;
  9.  case 2:
  10.  sbi(dispnum[1],7);
  11.  break;
  12.  case 3:
  13.  sbi(dispnum[2],7);
  14.  break;
  15.  default:break;
  16.  }
  17.  for(i=0;i<=5;i++)
  18.  {
  19.  Write_1621(i*2,dispnum[i]);
  20.  }
  21. }
(#) tbarath válasza berkesandor hozzászólására (») Nov 27, 2018 / 1
 
Akkor tippem szerint:
  1. sbi(dispnum[3],7);
  2. sbi(dispnum[4],7);
  3. sbi(dispnum[5],7);

Ugyanis pont ugyanolyan pozícióban vannak a BAT[1-3] szegmensek, mint a DP[1-3] szegmensek, csak 3 byte-tal odébb.
(#) berkesandor válasza tbarath hozzászólására (») Nov 27, 2018 /
 
És mivel kapcsolod le?
Következő: »»   494 / 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