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   240 / 850
(#) csabeszq hozzászólása Jún 30, 2016 / 1
 
A TFT LCD-ről (240x320) és az Adafruit könyvtárról:

Egy görbe kirajzolása
- Adafruit library-vel 240 ms körül volt
- összeütöttem egy saját lib-et az Adafruit alapján, az 47 ms alatt fejezte be

Hihetetlen csapnivaló az egész kód. Egy LCD-nél azért nem mindegy, hogy mi mennyi ideig tart. Az Adafruit emellett még 20k-t le is foglal. Ha gyors grafikát akarunk, akkor lehet, hogy érdemes belemászni a speckóba és újraírni.

  1. PORTH = (PORTH&B10000111)|(((d)&B11000000)>>3)|(((d)&B00000011)<<5); \
  2.     PORTB = (PORTB&B01001111)|(((d)&B00101100)<<2);                      \
  3.     PORTG = (PORTG&B11011111)|(((d)&B00010000)<<1);                      \


Ez 16 bites aritmetikával fordult, borzalmasan nézett ki. Az uint8_t-s kasztolások berakása után a kód mérete fele lett, a sebessége duplája.

  1. void Adafruit_TFTLCD::writeRegister32(uint8_t r, uint32_t d) {
  2.   CS_ACTIVE;
  3.   CD_COMMAND;
  4.   write8(r);
  5.   CD_DATA;
  6.   delayMicroseconds(10);
  7.   write8(d >> 24);
  8.   delayMicroseconds(10);
  9.   write8(d >> 16);
  10.   delayMicroseconds(10);
  11.   write8(d >> 8);
  12.   delayMicroseconds(10);
  13.   write8(d);
  14.   CS_IDLE;
  15. }


Csodálatos a 40us delay. A legviccesebb, hogy mindenegyes képpont kirajzolásánál kétszer hívódik meg (1280 ciklus delayben). Miután kitöröltem helyből duplázott sebességben.

Sokmindent elárul az Adafruit TFT LCD könyvtárról, hogy fél nap alatt 6x-osára lehetett növelni a sebességét.

(#) Panhard válasza csabeszq hozzászólására (») Jún 30, 2016 /
 
Próbáltam én is ezt a könyvtárat, nekem nem jött be. Ami viszont igen, az a rinkydinkelectronics UTFT könyvtára. Csak infó. Ezt használja valaki?
(#) misi93 hozzászólása Jún 30, 2016 /
 
Sziasztok! Az ardinomra rákötöttem egy micro sd kártyát, irok is rá adatot, de ha pl kiveszem a kártyát akkor ugyan úgy írja rá?! ( mármint villog a kis led amit rákötöttem, hogy ha kész van az írással) ez hogy lehet? Valahogy meg lehet azt oldani, ha nem látja az sd kártyát akkor villogjon egy led és ne próbáljon rá írni?

  1. myFile = SD.open(filename, FILE_WRITE);
  2.   if (myFile)
  3.   {
  4.     myFile.print(flat, 4); // latitude
  5.     myFile.print(",");
  6.     myFile.print(flon, 4); // longitude
  7.     myFile.print(",");
  8.     myFile.print(fkmph, 2); // K/MS
  9.     myFile.print("km/h");
  10.     myFile.print(",");
  11.     myFile.print(falt);  // Altitude
  12.     myFile.print(",");  
  13.     myFile.print(static_cast<int>(day));
  14.     myFile.print("/");
  15.     myFile.print(static_cast<int>(month));
  16.     myFile.print("/");
  17.     myFile.print(year);
  18.     myFile.print(",");
  19.     myFile.print(static_cast<int>(hour+2));  //use GMT+2 in my region, adjust as your local/GMT time
  20.     myFile.print(":");
  21.     myFile.print(static_cast<int>(minute));
  22.     myFile.print(":");
  23.     myFile.println(static_cast<int>(second));
  24.     myFile.close();     // close the file:
  25.     blinkled();
  26.     } else {
  27.     // if the file didn't open, print an error:
  28.     digitalWrite(datawrite, HIGH);
  29.     delay(1000);
  30.     digitalWrite(datawrite, LOW);
  31.     //delay(100);
  32.    }
  33.   }
(#) Panhard válasza misi93 hozzászólására (») Júl 1, 2016 /
 
Ez nekem is probléma volt, hogy nem tudta az áramkör, hogy van-e benne kártya vagy nincs. De csak akkor, ha menetközben kivettem. SD.begin() után.
Csináld azt, hogy minden írás előtt meghívod az SD.begin()-t. Ha false értékkel tér vissza, csinálsz egy hibaüzenetet, vagy ledet villogtatsz, vagy bármit.
(#) Panhard válasza Panhard hozzászólására (») Júl 1, 2016 /
 
Egyébként építettem a kocsiba egy GPS loggert már másfél éve. Ha ráadom a gyújtást akkor indul be, és nyers NMEA adatokat ír a kártyára. (RMC és GGA) 2 sort másodpercenként. Még soha nem volt vele probléma. Nem fagyott le, és mindig tudott a kártyára írni. Nekem csak a setup()-ban van az SD.begin(), nem úgy ahogy fentebb javasoltam. Ez csak most jött ötletnek, ha annyira menet közben akarod ki/be rakosgatni a kártyát.
(#) troby hozzászólása Júl 1, 2016 /
 
Sziasztok, szeretnék egy arduino mini-re bootloadert írni egy UNO segítségével. Ezen az oldalon leírtak alapján össze is kötöttem a két panelt. Az UNO-ból kivettem az ic-t. Arduino programmal szeretném beégetni a bootloadert de nem történik meg. A port jók ki van választva ATmega328 5V illetve Pro-mini van kiválasztva és Arduino as ISP. Kérlek ha tudtok segíteni adjatok nekem tanácsot. Köszönöm.
(#) david10 hozzászólása Júl 1, 2016 /
 
Sziasztok,
Szeretnék írni egy olyan függvényt, amelyik a 8 számjegyből álló bemenetet felbontja számjegyekre, majd elküldi őket a serial porton.
Idáig jutottam:
  1. void felbontas(int input)
  2. {
  3. Serial.println("1.számjegy: "+ ?);
  4. Serial.println("2.számjegy: "+ ?);
  5. Serial.println("3.számjegy: "+ ?);
  6. Serial.println("4.számjegy: "+ ?);
  7. Serial.println("5.számjegy: "+ ?);
  8. Serial.println("6.számjegy: "+ ?);
  9. Serial.println("7.számjegy: "+ ?);
  10. Serial.println("8.számjegy: "+ ?);
  11.  
  12. }

A kérdőjel helyére mit kell írjak?
A választ előre is köszönöm!
A hozzászólás módosítva: Júl 1, 2016
(#) troby válasza david10 hozzászólására (») Júl 1, 2016 /
 
Szia, egyetlen változóban van a 8 számjegy vagy tömbben? Mert valahogy így csinálnám mint a papiron osztás és tömbben tárolnám az egyes számokat
  1. s=3200;
  2. if(s/1000!=0){
  3.     t[0]=(s/1000);
  4.     s=s-(t[0]*1000);
  5.     }
  6. if(s/100!=0){
  7.     t[1]=s/100;
  8.     s=s-(t[1]*100);
  9.     }
  10. if(s/10!=0){
  11.     t[2]=(s/10);
  12.     }
(#) Panhard válasza david10 hozzászólására (») Júl 1, 2016 /
 
Azért azzal nem árt tisztában lenni, hogy integerben nem fér el 8 számjegy. Csak 5
Neked ahhoz long int kell.
Én így csinálnám:
  1. void felbontas(long int input){
  2.  
  3. String temp = String(input);
  4.  
  5. Serial.println(String(temp[0]));
  6. Serial.println(String(temp[1]));
  7. Serial.println(String(temp[2]));
  8. Serial.println(String(temp[3]));
  9. Serial.println(String(temp[4]));
  10. Serial.println(String(temp[5]));
  11. Serial.println(String(temp[6]));
  12. Serial.println(String(temp[7]));
  13.  
  14. }
(#) david10 válasza troby hozzászólására (») Júl 1, 2016 /
 
Köszönöm a válaszod, de Panhard megoldása egyszerübb.
Mi a külömbség a változó és a tömb között?
Panhard: A te válaszodat is köszönöm.
A te megoldásodat holnap fogom megprobálni.
(#) Panhard válasza david10 hozzászólására (») Júl 1, 2016 /
 
Bocs, kicsit elrontottam. Így a helyes:
  1. void felbontas(long int input){
  2.  
  3. String temp = String(input);
  4.  
  5. Serial.println(temp[0]);
  6. Serial.println(temp[1]);
  7. Serial.println(temp[2]);
  8. Serial.println(temp[3]);
  9. Serial.println(temp[4]);
  10. Serial.println(temp[5]);
  11. Serial.println(temp[6]);
  12. Serial.println(temp[7]);
  13.  
  14. }


Mert a temp változó már eleve String.
(#) Panhard válasza Panhard hozzászólására (») Júl 1, 2016 /
 
Na még egy finomítás: Így már tudja hány számjegyből áll a szám, és csak annyi karaktert küld soros portra.
  1. void felbontas(long int input){
  2.  
  3. int hossz = String(input).length();
  4.  
  5.   for(int i=0;i<hossz;i++){
  6.     Serial.println(String(input)[i]);
  7.     }
  8. }
(#) david10 válasza Panhard hozzászólására (») Júl 2, 2016 /
 
Köszönöm a válaszaidat!
Kiprobáltam mindkét válaszodat. Mindkettő müködött.
További szép napot!
(#) haward válasza csabeszq hozzászólására (») Júl 2, 2016 /
 
Helló!

Köszönöm a segítséget, sikerült megoldani. Az volt a gond hogy ennek is hardwer hibája volt FTDI 26-os láb lebegett.
(#) david10 hozzászólása Júl 3, 2016 /
 
Sziasztok,
Az alábbi ''dolog''-nak mi a szakneve angolul?És hogyan lehetne beleírni az Arduino belső eepromjába?
Az eeprom törlés/olvasás megy, de nem tudom, hogy hogyan tudnám beleírni.
  1. int cathode_decimal[]={1, 239, 239, 239, 1, 255,  //Display 'H'
  2.                        1, 109, 109, 109, 125, 255,  //Display 'E'
  3.                        1,127,127,127,127,255, //Display 'L'
  4.                         1,127,127,127,127,255, //Display 'L'
  5.                        1,125,125,125,1,255,    //Display 'O'
  6.                      255,255,255,255,255}; //Display '...'

A választ előre is köszönöm!
A hozzászólás módosítva: Júl 3, 2016
(#) Panhard válasza david10 hozzászólására (») Júl 3, 2016 /
 
Ez egy tömb, ami 35 integer elemből áll. Eepromba az "EEPROM.write(addr, val);" függvénnyel lehet írni.

Pl:

  1. for(i=0;i<35;i++){
  2.  
  3. EEPROM.write(i, cathode_decimal[i]);
  4.  
  5. }


Persze lehet ezen a függvényen is még szépíteni. Pl: ne 0 legyen a kezdőcím vagy csak annyit írjon az eepromba, amilyen hosszú a tömböd, de a lényeg ez.
A hozzászólás módosítva: Júl 3, 2016
(#) david10 válasza Panhard hozzászólására (») Júl 3, 2016 /
 
Köszönöm a válaszod!
Elsőre müködött, de az olvasásnál voltak/vannak gondjam.
Felfedeztem, hogy így kell írjam, ha akarok bele tárolni adatokat.:
  1. int cathode_decimal[]={0, 0, 0, 0, 0, 0,  //Display 'H'
  2.                        0, 0, 0, 0, 0, 0,  //Display 'E'
  3.                        0,0,0,0,0,0, //Display 'L'
  4.                         0,0,0,0,0,0, //Display 'L'
  5.                        0,0,0,0,0,0,    //Display 'O'
  6.                      0,0,0,0,0}; //Display '...'

Ezzel az a gond, hogy hogyha hosszabb az eepromban tárolt adat, akkor csak az első 35-öt használja. Ha hozza adok egy sort, így:
  1. int cathode_decimal[]={0, 0, 0, 0, 0, 0,  
  2.                        0, 0, 0, 0, 0, 0,  
  3.                        0,0,0,0,0,0,
  4.                         0,0,0,0,0,0,
  5.                        0,0,0,0,0,0,    
  6.                        0,0,0,0,0,0, //HOZZA ADTAM EZT A SORT
  7.                      0,0,0,0,0};

így 42 integert fogad el.
Hogyan lehetne azt megodani, automatikusan észlelje, azt, hogy mikor van vége a szövegnek?
Az eepromból a 0-ás értéket semmire sem használja a programom, azaz az eeprom üres részein 0 van.
(#) misi93 válasza Panhard hozzászólására (») Júl 3, 2016 /
 
Köszi ezt meg is próbáltam, de nem jött össze mert vagy egyből hiba volt, vagy ha a setupbol kivettem akkor meg másodjára amikor írt volna a kártyára ( a poén az, hogy amikor elvileg nem volt SD.begin akkor is tudott szépen írni a kártyára csak hibát dobott. ( utólag megnéztem az időbéllyegeket.) Én is olyat tervezek csinálni( copyzni a netről mindenhonnan), csak nekem kb 2-3 -4 perc mire feláll a GPS-em .
(#) Master006 hozzászólása Júl 3, 2016 /
 
Üdv mindenkinek!
Van egy arduino Mega 2560 panelom, és szeretnék segítséget kérni ennek a panelnak egy bldc motor vezérlővé alakításában, ha lehetséges. Fet tranzisztorok is vannak, és a fizikai megépítést meg tudnom oldani egyedül is, de a programozásban nem kimondottan vagyok otthon. Korábban próbálkoztam más célokra használni, de nem sikerült rájönnöm a lényegére a dolgoknak. Sokszor nem is engedte beírni a programot a készülékbe a rendszer. Ha megoldható egy olyan eszköz kellene ami szenzoros bldc motor-t tud vezérelni szabályozhatóan.
(#) david10 válasza Master006 hozzászólására (») Júl 3, 2016 /
 
Ha tudol angolul, akkor itt mindent megtalálsz:
http://elabz.com/bldc-motor-with-arduino-circuit-and-software/
(#) Panhard válasza david10 hozzászólására (») Júl 3, 2016 /
 
Hello, meg lehet oldani, hogy automatikusan érzékelje a tömb hosszát a sizeof() függvénnyel.
De mivel integert akarsz menteni eepromba, az integer ugye 2 bájt, az EEPROMban pedig egy címen 1 bájt fér el. Ezért az integer 2 bájtját ketté kell venni, és úgy kell elmenteni. Kiolvasásnál pedig újra össze kell "rakni" a 2 bájtot. Neten sok példa van ilyenre is. A bitshift-et kell hozzá használni. Ha 255-nél kisebb értékekkel dolgozol az integerben, akkor nem kell szétválasztani 2 bájtra, mert csak az alsó bájtban van a hasznos adat. Azt fogja beleírni az eepromba. A felső bájt értéke elveszik.
A hozzászólás módosítva: Júl 3, 2016
(#) Panhard válasza misi93 hozzászólására (») Júl 3, 2016 /
 
Ha többször van SD.begin() attól nem mehet hibára. Csak annyi, hogy ott mindig inicializálja a kártyát.
Ha 3-4 percig tart mire beindul a GPG vevőd, akkor ott valami nem OK. Ha nincs benne elem, és szabadban vagy, akkor is csak kb: 40mp-ig kellene neki tartani míg beindul. Mert elem nélkül nem tudja elmenteni a műhold pályaadatokat, és minden bekapcsoláskor újra le kell neki tölteni. Vagy ha több mint 10 órája nem volt bekapcsolva akkor is, mert annyi idő alatt is sokat változnak a műhold pozíciók.
Amikor megtalálta a holdakat és működik rendesen, ha olyankor kikapcsolod, és pár mp múlva vissza, akkor meddig tart amíg beindul? Pár másodpercnek kellene lenni.
A hozzászólás módosítva: Júl 3, 2016
(#) Gránátalma hozzászólása Júl 4, 2016 /
 
Sziasztok!
Kezdő kérdés lesz ugyan, de hátha tudtok segíteni:

  1. int ch = 0;
  2.  
  3. void setup() {
  4.   Serial.begin(9600);
  5.   pinMode(8, OUTPUT);
  6.   pinMode(9, OUTPUT);
  7.   pinMode(10, OUTPUT);
  8.   pinMode(11, OUTPUT);
  9.   pinMode(12, OUTPUT);
  10.   pinMode(13, OUTPUT);
  11.   pinMode(7, INPUT);
  12. }
  13.  
  14. void loop() {
  15.   Serial.println("Menu");
  16.   Serial.println("-----------------------");
  17.   Serial.println("1. LED:8");
  18.   Serial.println("2. LED:9");
  19.   Serial.println("3. LED:10");
  20.   Serial.println("4. LED:11");
  21.   Serial.println("5. LED:12");
  22.   Serial.println("6. LED:13");
  23.   Serial.println("-----------------------");
  24.   Serial.println("Type the number and press enter");
  25.  
  26. do
  27. {
  28.   delay(50);          // wait for sensors to stabilize
  29.  ch = Serial.read();  // check the sensors
  30.  
  31. }
  32. while (ch = 0);
  33.  
  34.   delay(500);
  35.   Serial.println("ch erteke: ");
  36.   Serial.println(ch, DEC);
  37.   int ch;
  38.   switch (ch) {
  39.     case '1':
  40.       led1();
  41.     case '2':
  42.       led2();
  43.   }
  44. }
  45.  
  46. void led1() {
  47.   digitalWrite(8, LOW);
  48.   digitalWrite(13, HIGH);
  49.   return;
  50. }
  51.  
  52. void led2() {
  53.   digitalWrite(13, LOW);
  54.   digitalWrite(8, HIGH);
  55.   return;
  56. }


Az a bajom vele, hogy ott a do -While, de nem várja meg míg a ch értéke nagyobb lesz nullánál.
A ch értéke alatta látható, nulla, mégis loopol.
Több megoldást is próbáltam, a while-al, de mind sikertelen volt.
A hozzászólás módosítva: Júl 5, 2016
(#) holex válasza Gránátalma hozzászólására (») Júl 4, 2016 /
 
ch = 0 -> ch == 0
(#) icserny válasza Gránátalma hozzászólására (») Júl 4, 2016 /
 
A Serial.read() értéke az Arduino Referencia szerint sohasem lesz nulla, így az előttem szóló Holex fórumtárs javításával sem fogja azt tenni, amit szeretnél.

A referencia szerint -1-et ad vissza, ha nincs beérkező karakter. Emiatt a feltételt át kellene fogalmazni. Például:
  1. while(ch < 0);


Programlistához az "Idézet" gomb helyett máskor a "Kód" gombot használd, légy szíves!
A hozzászólás módosítva: Júl 4, 2016
(#) Gránátalma hozzászólása Júl 5, 2016 /
 
Köszönöm a válaszokat!
== -re gondoltam én is legelőször, azzal is produkálta.

Én is kifigyeltem, hogy -1 -et hoz értékre, akármibe teszem(byte int char...), de kiszedtem pár sort, ez az ide bemásolt verzió bálam most nullát ír ki, a DEC átváltás nélkül is, pl byte-ban.
Ezért nem értem miért loopol, ha egyszer a változó értékre a print 0-t ad.

itt látható is

Rendben, nem vettem észre, hogy van kód gomb.
A hozzászólás módosítva: Júl 5, 2016
(#) icserny válasza Gránátalma hozzászólására (») Júl 5, 2016 /
 
Idézet:
„de kiszedtem pár sort”
Mármint a Serial gyári könyvtárból? Nem kellene.

Mellesleg annak figyelésére, hogy érkezett-e be karakter, miért nem a Serial.available() függvényt használod? Bővebben: Link
(#) holex válasza Gránátalma hozzászólására (») Júl 5, 2016 /
 
Mert amit csinálsz, az nem egyenlőségvizsgálat, hanem értékadás, így a ch 0 lesz.
A hozzászólás módosítva: Júl 5, 2016
(#) Gránátalma válasza holex hozzászólására (») Júl 5, 2016 /
 
Értem. Valóban, ha kicserélem ==-re -1 lesz a ch.
Köszönöm a segítséget!
(#) brumbrus hozzászólása Júl 5, 2016 /
 
Üdv!
Van egy gomb amivel funkciót szeretnék váltani.
Az egyes funkcióról át bírok váltani a kettesre, de a kettesről sehogy sem lehet a hármasra azaz a led kikapcsolására.
  1. const int  buttonPin = 12;    // the pin that the pushbutton is attached to
  2. const int LED1 = 5;       // the pin that the LED is attached to
  3. const int soundpin = A8;
  4.  
  5. int sound;
  6. int buttonPushCounter = 0;   // counter for the number of button presses
  7. int buttonState = 0;         // current state of the button
  8. int lastButtonState = 0;     // previous state of the button
  9.  
  10. void setup() {
  11.   pinMode(buttonPin, INPUT);
  12.   pinMode(LED1, OUTPUT);
  13.   pinMode(soundpin, INPUT);
  14.   Serial.begin(9600);
  15. }
  16.  
  17.  
  18. void loop() {
  19.   // read the pushbutton input pin:
  20.   buttonState = digitalRead(buttonPin);
  21.  
  22.   // compare the buttonState to its previous state
  23.   if (buttonState != lastButtonState) {
  24.     // if the state has changed, increment the counter
  25.     if (buttonState == HIGH) {
  26.       // if the current state is HIGH then the button
  27.       // wend from off to on:
  28.       buttonPushCounter++;
  29.       Serial.println("on");
  30.       Serial.print("number of button pushes:  ");
  31.       Serial.println(buttonPushCounter);
  32.     } else {
  33.       // if the current state is LOW then the button
  34.       // wend from on to off:
  35.       Serial.println("off");
  36.     }
  37.     // Delay a little bit to avoid bouncing
  38.     delay(50);
  39.   }
  40.   // save the current state as the last state,
  41.   //for next time through the loop
  42.   lastButtonState = buttonState;
  43.  
  44.  
  45.   // turns on the LED every four button pushes by
  46.   // checking the modulo of the button push counter.
  47.   // the modulo function gives you the remainder of
  48.   // the division of two numbers:
  49.   if (buttonPushCounter == 1) {
  50.     digitalWrite(LED1, LOW);
  51.     sound=analogRead(soundpin)+60;
  52.       if((sound)>70)
  53.         {
  54.              digitalWrite(LED1,HIGH);
  55.         }
  56.       else
  57.         {
  58.              digitalWrite(LED1,LOW);
  59.         }
  60.  
  61.      delay(25);}
  62.      
  63.        while(buttonPushCounter == 2) {
  64.      digitalWrite(LED1, LOW);
  65.        for(int i = 0; i<360; i++){
  66.     //convert 0-360 angle to radian (needed for sin function)
  67.     float rad = DEG_TO_RAD * i;
  68.  
  69.     //calculate sin of angle as number between 0 and 255
  70.     int sinOut = constrain((sin(rad) * 128) + 128, 0, 255);
  71.     analogWrite(LED1, sinOut);
  72. }
  73.     delay(15);
  74.     }
  75.     if (buttonPushCounter == 3) {
  76.      digitalWrite(LED1, LOW);
  77.     }
  78.     if (buttonPushCounter == 4) {
  79.       buttonPushCounter = 0;
  80.       }
  81.     }
Következő: »»   240 / 850
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