Home Forums Elektronika / programavimas E-Dviracio matuoklis

Viewing 20 posts - 1 through 20 (of 44 total)
  • Author
    Posts
  • #2069
    agniusm
    Participant

    Tai prisipirkau visokiu zaisliuku arduino ir pradejau po truputi zaisti. Paprasti dalykai nesunkus, bet matau, kad juodai strigsiu todel atidariau tema ir jei kas netinges ir bus susidures gales padet :)

    Turiu Saintsmart arduino UNO rinkinuka. Zaidziausi su Voltage divider, kazkas gavosi. Paklaida mazina ziuredamas i arduino itampa, kazkur radau koda.

    Siandien gavau LCD, valdiklis ST7565P, naudoju U8glib. Gal kas yra susidures? Gal yra GUI softas Isdestymui maketuoti?

    Kitas klausimukas kaip prideti sriftus i u8g_font_data.c? As paverciu pvz ttf su Graphene 1.0 i U8glib formata, bet kaip pridedu Arduino meta kazkokius error apie kuriuos nieko nenutuokiu :)EDIT: Nedaskaiciau, reikai ttf i bdf versti, veliau pakoreguota bdf i u8glib formata.

    Cia LCD dienos sviesoje, saules nebuvo taigi tik dienos sviesoje:

    http://www.youtube.com/watch?v=vBfRDwSbFQg

    Telefas nenorejo fokusuoti, nelabai kas matyt

    Manau man bus sudetingiusia suprogramuoti grafika ir po to ja suristi su gaunamais nuomenimis.

    #5921
    E-MAX
    Participant

    Prie to pacio , gal kas zinot programele paisyt 128×128 spalvotam 12 bit ekranui logotipus ?

    P.s agniau jei turi senu noskiu su spalvotu 128x128ekranu isilupk . softa arduinui rast labai nesunku . savo stalciui radau net 3 tokius.

    #5922
    ArturasL
    Participant

    Sveikas, Agniau, 

    As taip pat dabar zaidziu su arduino. Turiu panasu ekraneli ir naudoju ta pacia biblioteka. Sriftu itraukineti kolkas nebandziau. Jei nieko pries prisijungsiu prie sio skyrelio :)

    Noriu pasidaryti itampos monitoringa lifepo4 celei, nuo kurios butu maitinamas pac mikrovaldiklis. Tam turbut teks modifikuoti pati arduino. Jo maitinimas yra 5v voltai ir atramines itampos kojele AREF yra prikabinta prie tu 5v. Uzduotis butu prie AREF prijungti atramines itampos mikroschema mazdaug 1.2v . Galbut kas nors gali parekomenduoti tokia mikroschema, kuri mazai naudotu energijos?  

    Ar matuojant itampa iki 5v reikalingas mikrovaldikliui itampos daliklis. Ar galima butu tiesiai matuoti su mikrovaldyklio kojelem ar visgi reikalinga varza?

    #5923
    agniusm
    Participant

    Iki 5v nieko nereikia man rodos

    #5924
    jonas
    Participant

    Sveiki, su arduino nesisidūriau, bet yra atmega kuri turi vidinę atraminę įtampą tai ar yra ji arduino uno nežinau. U8glib naudojau savo matuoklyje su grafiniu lcd. Visai programai 32k atminties permažai. Tiek pakanka tik atvaizduoti informacijai. Ypač jei naudosit didelius šriftus 35 ir daugiau. Šriftų importuoti nebandžiau, ten jų pasirinkimas tikrai nemažas. Be to geriausia turėti adobe formato šriftus, o jie šiaip paprastai nesimėto. Agniau, jei nori gui ir u8g tai vargu kas susiriš. Gui buvau radęs, bet su u8g tai suderinti nebus paprasta.

    #5925
    ArturasL
    Participant

    Pasipaisiau shema paemes arduino micro leonardo: http://i.imgur.com/j2TQTVy.jpg 

     

    Jei noreciau pamatuoti mikrovaldiklio saltinio itampa, ar pakanka sios shemos? Ar reikia mikrovaldiklio analogine kojele kabinti prie maitinimo pliuso. Siuo atveju atramine itampa butu naudojama vidine 1.1v.  

     

    Dar keli klausimai:

    Kokie privalumai/trukumai kai atramine itampa yra vidine/isorine?

    Ar reikalingas kondencatorius c10 prie maitinimo? Ar jis neiskrovines be reikalo baterijos?

    AREF, kai naudojama vidine atramine itampa, turi buti prie nieko neprijungtas?

    Ka daro kojele Vbus, uvcc, ucap, pe2?

    Jei noreciau tiktai matuoti baterijos itampa, koks butu optimaliausias mikrovaldiklio veikimo daznis?

    #5926
    jonas
    Participant

    Matuojant įtampą analoginį kojelė visada reikia jungti ten ką matuoji, duotu atveju VCC ir išdalinti ją iki 1,1V prie VCC max. Vidinė gerai tuo,kad nereikalauja jokių papildomų elementų. Negerai tuo,kad turi tik 2 lygius 2,56V ir 1,1V. Ar iškrovinės bateriją kondensatorius C10 priklauso nuo kondensatoriaus, jei kondas prastos kokybės, tai tada taip, kitu atveju tai tik teoriškai. Kondensatorius reikalingas gesinti virpesiams, dėl stabilumo. AREF reikėtų prijungti per kondensatorių 100nF prie žemės. kokias funkcijas atlieka vienas ar kitas išvadas galima sužinoti paskaičius datasheet’ą(http://www.atmel.com/Images/7766S.pdf). Jei nori tik matuoti, tai užtenka ir 1Mhz. Jei naudosi grafinį displėjų tai min 4Mhz(priklausomai nuo grafinių bibliotekų), jei skaitmeninį-raidinį, irgi užtenka 1Mhz. Jei naudosi u8g tada minimum 8Mhz, o 16 tai jau iš viso neblogai. Ar pakanka tavo pavaizduotos schemos, tai taip su kaupu pakanka. Kaip supratau naudoji Arduino tai jam yra soft simuliatoriai. http://www.virtualbreadboard.com/. Labai patogu būtų saugiai pratestuoti savo

    mintis apie vieną ar kitą schemą.

    #5927
    Šarūnas
    Keymaster

    Kad matuoti mikrovaldiklio maitinimo įtampą, yra kitas variantas… vidinį ADC referencą perjungti prie maitinimo, o ADC įėjimą jungti prie vidinio VREF. Gausis kad ADC įėjimas yra stabilus, o VREF kinta. Gan lengvai išsiskaičiuoja įtampa.

    #5928
    jonas
    Participant

    Šarūnai su tavim nepasiginčysi, tai pats paprasčiausias būdas.

    #5929
    ArturasL
    Participant

    Sarunai, tavo pasiulytas matavimo budas kaip cia: http://www.rlocman.ru/shem/schematics.html?di=73220

     

    Kiek patikimas toks matavimo budas? Kazkur skaiciau, kad mikrovaldiklio vidine atramine itampa kazkiek plaukiojanti yra.

    O energijos suvartojimo atzvilgiu, turbut butu maziausia.

    #5930
    Šarūnas
    Keymaster

    Neskaičiau to straipsnio, bet panašu kad taip.

    Vidinis AVR referensas nėra labai tikslus, ypač iš pat pradžių būna kažkiek nuplaukęs. Susikalibravus, jau kinta gan nedaug (pilnai pakanka tokiam prietaisui). Neabejoju kad kažkur datašyte rašo apie tai.

    #5931
    ArturasL
    Participant

    Aciu Sarunui ir Jonui uz atsakymus. Jei kam reikes pamatuoti itampa arduino is kurios maitinasi pats mikrovaldiklis galit naudoti sita koda, patikrinta ir veikia:  

     

    long readVcc() {
    long result;
    // Read 1.1V reference against AVcc
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    delay(2); // Wait for Vref to settle
    ADCSRA |= _BV(ADSC); // Convert
    while (bit_is_set(ADCSRA,ADSC));
    result = ADCL;
    result |= ADCH<<8;
    result = 1126400L / result; // Back-calculate AVcc in mV
    return result;

    void setup() {
    Serial.begin(9600);

    void loop() {
    Serial.println( readVcc(), DEC );
    delay(1000);

     

    Ten kur 1126400L pasikoreguokite pagal jusu mikrovaldiklio atramine itampa.

    #5932
    agniusm
    Participant

    Pas mane draftas itampos daliklio toks:   

     

    #include <LiquidCrystal.h>
     LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
     int screen_backlight = 13; //pin D13 will control the backlight
    float voltage_battery1 = 0.0; //voltage from pin A0
    float voltage_reference1 = 0.0; //reference voltage on the arduino 5V-rail
    float voltage_battery2 = 0.0; //voltage from pin A0
    float voltage_reference2 = 0.0; //reference voltage on the arduino 5V-rail
    float voltage_divider = (1035.0+1000.0)/1000.0; //((R1+R2)/R2)*voltage for voltage divider before pin A0
     void setup() {
    pinMode(screen_backlight, OUTPUT); //LCD Setup
    digitalWrite(screen_backlight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
    lcd.begin(20,4); // columns, rows. use 16,2 for a 16x2 LCD, etc.
    lcd.clear(); // start with a blank screen
    }
     //method 2
    long readVcc() {
    // Read 1.1V reference against AVcc
    // set the reference to Vcc and the measurement to the internal 1.1V reference
    #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
    #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
    #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    #endif
    delay(2); // Wait for Vref to settle
    ADCSRA |= _BV(ADSC); // Start conversion
    while (bit_is_set(ADCSRA,ADSC)); // measuring
    uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
    uint8_t high = ADCH; // unlocks both
    long result = (high<<8) | low;
    result = 1.1 * (5/5.13) * 1023 * 1000 / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
    //result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
    return result; // Vcc in millivolts
    }
     void read_voltage() {
      //method 2
    voltage_reference2 = readVcc();
    voltage_battery2 = map(analogRead(0),0,1023.0,0.0,voltage_reference2) * voltage_divider;
     }
     void screen_print() {
      //printing method 2
    lcd.setCursor(0,0);
    lcd.print("Ref. V : ");
    lcd.setCursor(12,0);
    lcd.print(voltage_reference2 / 1000);
    lcd.setCursor(0,1);
    lcd.print("Battery V: ");
    lcd.setCursor(12,1);
    lcd.print(voltage_battery2 / 1000);
     }
     void loop() {
    read_voltage();
    screen_print();
    }
     //voltage smoothing: //volt_avg = alpha * read_volt() + (1-alpha) * volt_avg;

     

      

    Man uztektu, kad displejus rodytu toki atvaizda:

    meter.png

    Desineje rodo sroves arba galios naudojima arba regeneracijos lygi (gavau savo allegro sensorius ir kaip as neelektronikas suprantu bidirectional reiskia i abi puses matuos ir regeneracija bus neigiamas kintamasis?!).

    Gal kas turit linku kur galimet butu copy/paste koda su aprasu? :D

    #5933
    agniusm
    Participant

    kol kas pasidariau fonta kuri reiketu pakoreguoti nes nepakankamai tvarkingai konvertavo:

    20130720_151111.jpg

    20130720_151211.jpg

    likusius naudosiu esancius u8glib bibliotekoje. Tiesa, konvertavau tik skaitmenis. 

    EDIT:

    Pataisiau fonta, islyginau, dapiesiau:

    20130720_155517.jpg

    ir kitoks sriftas:

    #5934
    ArturasL
    Participant

    StAAOkQ.jpg 

    Pabandziau padaryti likusi grafika :) Galeciau pabandyti parasyti funkcijas, kurios keistu sonuose esancius stulpelius pagal davikliu duomenis. Reiktu, kad tik parasytum min ir max stulpeliu reiksmes.  

    #5935
    agniusm
    Participant

    Eina sau, as cia vos krutu o cia jau padaryta. nu ble, jega :)

    Akumuliatoriaus talpa arba likes kelias as taip suprantu turetu skaiciuotis pagal kazka :) Tikriausiai kraunant skaiciuoti idetas AH ir po to atatinkamai automatiskai derint tas reiksmes.

    Naudojamos galios rodiklis tikriausiai paprasciau.

    an rodos mano srifto dydis per didelis, pas tave normaliau atrodo, na, bet as judu vezlio greiciu mokindamasis:D

    EDIT:

    Padariau vaizdo LCD saules sviesoje del referenco:

    https://www.youtube.com/watch?v=ZLQiJjm7JbI  

    _ Taip pat besikeiciancius skaicius, bet man nelabai plavnai rodo, tikriausiai LCD kalte:

    https://www.youtube.com/watch?v=15tuK5SUqnM  

    _ EDIT 2: Reikes tikriausiai pasistengti susikrauti koki testavimo stenda ir pradet rimciau uzsiimt nes jau geda :D

    #5936
    ArturasL
    Participant

    Agniau, as irgi tik mokausi :) Butu puiku, jei kas gerai mokantis programuoti, paziurejes mano koda, pasakytu ka galima butu geriau padaryti :) Pas mane nera tokio stabdymo su lcd. Pajungtas jis per i2c. Stai kodas:  

     

    //lcd
    #include "U8glib.h"
    U8GLIB_64128N u8g(13, 11, 10, 9, 8); //SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
    //lcd 
    int count; 
    //lcdLeftColumn function start
    void lcdLeftColumn(void) {
    //
    u8g.drawBox(0,5,11,54);
    u8g.setColorIndex(0);
    u8g.drawBox(1,6,9,33);
    u8g.setColorIndex(1);
    // 
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(13, 12);
    u8g.print("F"); 
    u8g.setFont(u8g_font_5x8);
    u8g.setPrintPos(13, 35);
    u8g.print("25km"); 
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(13, 59);
    u8g.print("E");
    }
    //lcdLeftColumn function end
    //lcdCenterColumn function start
    void lcdCenterColumn(void) { 
    u8g.setFont(u8g_font_fub35n);
    u8g.setPrintPos(38, 50);
    u8g.print(count);
    }
    //lcdCenterColumn function end
    //lcdRightColumn function start
    void lcdRightColumn(void) {
    //
    u8g.drawFrame(117,5,11,54);
    u8g.drawBox(118,30,9,2);
    // 
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(110, 12);
    u8g.print("D"); 
    u8g.setFont(u8g_font_5x8);
    u8g.setPrintPos(101, 35);
    u8g.print("41A"); 
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(110, 59);
    u8g.print("R");
    }
    //lcdRightColumn function end 
    void setup(void) {
    count = 10;

    void loop(void) { 
    count = count + 1;
    if(count == 99){
    count = 10;

    //lcd
    u8g.firstPage();
    do { 
    //lcdLeftColumn start
    lcdLeftColumn();
    //lcdLeftColumn end
    //lcdCenterColumn start
    lcdCenterColumn();
    //lcdCenterColumn end
    //lcdRightColumn start
    lcdRightColumn();
    //lcdRightColumn end 
    } while( u8g.nextPage() );
    //lcd 
    //atvaizdavimo greitis ms
    delay(500); 

     

    O del likusio nuvaziuoti atstumo, jis, manau, priklausytu nuo akumuliatoriaus pako itampos, bendros talpos ir vaziavimo greicio. Ir kiek liko nuvaziuoti butu sokinejantis dytis, nes priklauso nuo vaziavimo greicio :)

    #5937
    agniusm
    Participant

    As dar neisivaizduoju, bet tikriausiai reiketu traukti duomenis is allegro daviklio ir itampos daliklio, kad paskaiciuotu bendra WH, bet reikia, kad kazkaip jis saugotu duomenis eeprom apie likuti energijos, sumuotu ir tada tik skaiciuotu likusi kelia pagal velnias zino ka :D, tikriausiai pagal signala gaunama is holo daviklio (apsisukimai, laikas, rato diametras) ir momentine vartojama galia? Reik man lyst visur kur nemoku pys….t, gyvenciau sau ramia:)

    #5938
    ArturasL
    Participant

    Na, nezinau ar gera mintis kiekviena karta duomenis saugoti eeprom. Ten ribotas irasymu skaicius. Likutine baterijos WH, manau, galima butu paskaiciuoti iskarto. Is bendros baterijos WH minus kas kiekviena sekunde suvartojamo WH (tai yra baterijos itampa * holo daviklis amperais / 3600). O likusi atstuma kaip skaiciuoti dar reik pagalvoti :) Nors gal cia kazkur nusigrybavau… :)

    #5939
    agniusm
    Participant

    Viskas daug aiskiau kai kazkas padaro uz tave :D Kai parasyta viskas aisku, o kai reik paciam tai labai ilgai uztrunka. Nzn, bet lygtais dabar geriau rodo ir su mano sriftu:

    https://www.youtube.com/watch?v=be2RpkfiiKw

Viewing 20 posts - 1 through 20 (of 44 total)
  • You must be logged in to reply to this topic.