Home › Forums › Elektronika / programavimas › E-Dviracio matuoklis
- This topic has 43 replies, 6 voices, and was last updated 10 years, 5 months ago by agniusm.
-
AuthorPosts
-
2013/07/13 at 20:00 #2069agniusmParticipant
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.
2013/07/14 at 13:13 #5921E-MAXParticipantPrie 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.
2013/07/14 at 16:30 #5922ArturasLParticipantSveikas, 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?
2013/07/14 at 16:52 #5923agniusmParticipantIki 5v nieko nereikia man rodos
2013/07/14 at 17:17 #5924jonasParticipantSveiki, 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.
2013/07/14 at 19:14 #5925ArturasLParticipantPasipaisiau 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?
2013/07/15 at 05:33 #5926jonasParticipantMatuojant į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ą.
2013/07/15 at 08:07 #5927ŠarūnasKeymasterKad 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.
2013/07/15 at 09:11 #5928jonasParticipantŠarūnai su tavim nepasiginčysi, tai pats paprasčiausias būdas.
2013/07/16 at 12:44 #5929ArturasLParticipantSarunai, 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.
2013/07/16 at 19:34 #5930ŠarūnasKeymasterNeskaič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.
2013/07/19 at 10:50 #5931ArturasLParticipantAciu 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.
2013/07/20 at 10:24 #5932agniusmParticipantPas 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:
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
2013/07/20 at 12:14 #5933agniusmParticipantkol kas pasidariau fonta kuri reiketu pakoreguoti nes nepakankamai tvarkingai konvertavo:
likusius naudosiu esancius u8glib bibliotekoje. Tiesa, konvertavau tik skaitmenis.
EDIT:
Pataisiau fonta, islyginau, dapiesiau:
ir kitoks sriftas:
2013/07/20 at 15:18 #5934ArturasLParticipantPabandziau padaryti likusi grafika :) Galeciau pabandyti parasyti funkcijas, kurios keistu sonuose esancius stulpelius pagal davikliu duomenis. Reiktu, kad tik parasytum min ir max stulpeliu reiksmes.
2013/07/20 at 15:27 #5935agniusmParticipantEina 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
2013/07/20 at 17:45 #5936ArturasLParticipantAgniau, 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 :)
2013/07/20 at 18:43 #5937agniusmParticipantAs 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:)
2013/07/20 at 19:43 #5938ArturasLParticipantNa, 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… :)
2013/07/21 at 12:05 #5939agniusmParticipantViskas 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:
-
AuthorPosts
- You must be logged in to reply to this topic.