Arduino autós projekt: fedélzeti comp. építése

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Arduino autós projekt: fedélzeti comp. építése

Hozzászólás Szerző: volkov »

Sziasztok!


Nos, hogy ez elején kezdjem, kezdő vagyok még Arduino-ban.
De amikor először találkoztam vele, egyből beötlött, hogy ezt lehetne ezt komoly dolgokra is használni :)

Amit kitaláltam, kiderült már más is kitalálta, sőt, meg is csinálta.

A terv: hengerenkénti injektoros kocsiba, amiben még nincs OBD2, jellemzően 1990-2000-ig kb fedélzeti comp. vagyis fogyasztás mérő :)

Az elv egyszerű: rácuppanunk az egyik injektor vezérlő jelére, s csak mérni kell a jel idejét, és az ismert átfolyási időből egyből adódik az elfogyasztott benzin.
Ezen kívül kell még a sebesség jeladó jele, ezzel számoljuk a megtett KM-t.
A benya és km hányadosából pedig adódik a fogyasztás.


http://ecomodder.com/wiki/index.php/MPGuino

Ez lenne a kész projekt.

Ez a kód:
http://opengauge.googlecode.com/svn/tru ... pguino.cpp

Van vele több bajom.
A fő, hogy nem értem 8)

De komolyra fordítva a szót gondom, hogy alapvetően mindent gallonban és mérföldben számol, s bár lehet váltani, de ezt át kellene írni, jó lenne látni még egyéb infókat is.
Valamint az LCD kezelése totálisan kínai...


Első konkrét kérdésem:
-van-e esetleg itthon valaki aki ezt megcsinálta már?
-ha valaki nagyon unatkozik, rövid magyarázatban leírná, hogy mi mit csinál? legfőképpen az LCD kezelés. (átirnám Liquidcrystal-ra az egészet)



Köszönöm!

András
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Nos, ha LCD:

- 60 nap alatt Arduino tanfolyamon merre jársz? Ott van LCD kezelés....



A javaslat:
- NE rakétavezérlővel kezdj. Ebben min 6-8 komplex témakör kerül megvalósításra....
- bontsd részekre és írdd meg onnan. A SW módosítással _nem_ tanulod meg a lényegi alapokat... :(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Ez a program már túlmutat az Arduino tudásán.
Regiszter szinten kezeli a megszakításokat és az LCD-t is.
Ez már komoly hardver ismeretet kívánó feladat.

Inkább szerez be olyan kijelzőt, amit használ.
A te jelenlegi tudásoddal nem fogod tudni átírni.

Esetleg a ki írt üzenetek honosítását csináld meg, ha már működik a rendszer.

Itt nézd meg a legalsó kijelző képet.
http://spiffie.org/kits/mpguino/assemble.shtml
Ahol nagy számokat használ.
Ezt pl. nem tudja az Ardunio. Ezért vannak saját rutinok írva az LCD-re.
:wink:
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Hozzászólás Szerző: volkov »

Robert írta:Nos, ha LCD:

- 60 nap alatt Arduino tanfolyamon merre jársz? Ott van LCD kezelés....
Az EEPROM-nál :)
De a Liquidcrystal-os dolgok mennek már.
Csak itt valami egész más van.
Robert írta: A javaslat:
- NE rakétavezérlővel kezdj. Ebben min 6-8 komplex témakör kerül megvalósításra....
- bontsd részekre és írdd meg onnan. A SW módosítással _nem_ tanulod meg a lényegi alapokat... :(
-Tudom. De jó látni a célt.
-"szétbontottam", ezért akarok pl az LCD-vel kezdeni
Liquidcrystal-al megírtam már a nagy számokat, csináltam vele órát 8)
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Hozzászólás Szerző: volkov »

kapu48 írta:Ez a program már túlmutat az Arduino tudásán.
Regiszter szinten kezeli a megszakításokat és az LCD-t is.
Ez már komoly hardver ismeretet kívánó feladat.

Inkább szerez be olyan kijelzőt, amit használ.
A te jelenlegi tudásoddal nem fogod tudni átírni.

Esetleg a ki írt üzenetek honosítását csináld meg, ha már működik a rendszer.

Itt nézd meg a legalsó kijelző képet.
http://spiffie.org/kits/mpguino/assemble.shtml
Ahol nagy számokat használ.
Ezt pl. nem tudja az Ardunio. Ezért vannak saját rutinok írva az LCD-re.
:wink:
Hihi :) Dehogynem tudja!

Pl. ezt pont megírtam már én is (saját nagy számokkal) :D
(amik szerintem szebbek, lekerekítettem őket :)
Ez nem az a verzió, az az otthoni gépen van, ha kell csinálok róla képet működés közebn)

Kód: Egész kijelölése

#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

byte custchar[8][8] = {
  {
    B11111,
    B11111,
    B11111,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000
  }, {
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B11111,
    B11111,
    B11111
  }, {
    B11111,
    B11111,
    B11111,
    B00000,
    B00000,
    B11111,
    B11111,
    B11111
  }, {
    B00000,
    B00000,
    B00000,
    B00000,
    B01110,
    B01110,
    B00110,
    B00010
  }, {
    B00000,
    B00000,
    B00000,
    B01110,
    B01110,
    B01110,
    B00000,
    B00000
  }, {
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000
  }, {
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000
  }, {
    B11111,
    B11111,
    B11111,
    B11111,
    B11111,
    B11111,
    B11111,
    B11111
  }
};

byte bignums[10][2][3] = {
  {
    {7, 0, 7},
    {7, 1, 7}
  },{
    {0, 7, 6},
    {1, 7, 1}
  },{
    {2, 2, 7},
    {7, 1, 1}
  },{
    {0, 2, 7},
    {1, 1, 7}
  },{
    {7, 1, 7},
    {6, 6, 7}
  },{
    {7, 2, 2},
    {1, 1, 7}
  },{
    {7, 2, 2},
    {7, 1, 7}
  },{
    {0, 0, 7},
    {6, 7, 6}
  },{
    {7, 2, 7},
    {7, 1, 7}
  },{
    {7, 2, 7},
    {6, 6, 7}
  }
};

void loadchars() {
  lcd.command(64);
  for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
      lcd.write(custchar[i][j]);
  lcd.home();
}

void printbigchar(byte digit, byte col, byte row, byte symbol = 0) {
  if (digit > 9) return;
  for (int i = 0; i < 2; i++) {
    lcd.setCursor(col, row + i);
    for (int j = 0; j < 3; j++) {
      lcd.write(bignums[digit][i][j]);
    }
    lcd.write(6);
  }
  if (symbol == 1) {
    lcd.setCursor(col + 3, row + 1);
    lcd.write(3);
  } else if (symbol == 2) {
    lcd.setCursor(col + 3, row);
    lcd.write(4);
    lcd.setCursor(col + 3, row + 1);
    lcd.write(4);
  }

  lcd.setCursor(col + 4, row);
}




void setup() {
  pinMode(13, OUTPUT);
  lcd.begin(16,2);
  loadchars();
  digitalWrite(13, 1);
}
int i;

void loop() {

  for (i=0;i<100;i++){
    printbigchar(i/10, 0, 0);
    printbigchar(i%10, 4, 0);
    delay(1000);
  }
  if (i==100){
    i=0;
  }

}
A hozzászólást 1 alkalommal szerkesztették, utoljára volkov 2012. november 27. kedd, 13:12-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Ügyes!
Már csak az ehhez hasonló sorokat

Kód: Egész kijelölése

	LCD::gotoXY(0, 0);
	LCD::print(getStr(PSTR("OpenGauge       ")));
	LCD::gotoXY(0, 1);
	LCD::print(getStr(PSTR("  MPGuino  v0.86")));
Kel átírnod az általad használt formára:

Kód: Egész kijelölése

     lcd.setCursor(col + 3, row); 
     lcd.write(4); 
     lcd.setCursor(col + 3, row + 1); 
     lcd.write(4);
És a Galon helyet, Liter rutinokat megírni.
:wink:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Azért én ezt a feladatot sk nézném át és _magasszinten_ piszkálnám csak.
Ha lemész regiszter ill alacsony szintre, az misztikus hibákat és megoldhatatlan feladatot jelent egy kezdőnek. Ez nem bántás, ez állapot.
Persze 1/2-2 év múlva már rutinból lekezeled őket, de úszni sem úgy tanultál meg, hogy a Balaton közepén kitettek.... Mondjuk a hatékonység jó, mert 100-ból 2 kievickél a partra, és elég őket továbbképezni :) A 98% vesztesség meg így járt.... :roll:

Én az időmérést nézném meg, és főprogramra koncentrálva a milis/microseconds() időmérőkkel... Két INT közt eltelt időmérés, és az átszámításkat + az LCD kezelést....
Utána lehet tovább menni. Így igaz, hogy nem készül el idén karácsonyra teljesen, viszont a megszerzett tudás az sokkal többet ér!
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Hozzászólás Szerző: volkov »

kapu48 írta:Ügyes!
Már csak az ehhez hasonló sorokat

Kód: Egész kijelölése

	LCD::gotoXY(0, 0);
	LCD::print(getStr(PSTR("OpenGauge       ")));
	LCD::gotoXY(0, 1);
	LCD::print(getStr(PSTR("  MPGuino  v0.86")));
Kel átírnod az általad használt formára:

Kód: Egész kijelölése

     lcd.setCursor(col + 3, row); 
     lcd.write(4); 
     lcd.setCursor(col + 3, row + 1); 
     lcd.write(4);
:wink:
Nem az a kiíró rész (ez lenne a kettős pont :) ), hanem:

Kód: Egész kijelölése

printbigchar(i/10, 0, 0); 
Ez a (mit, melyik oszlop, melyik sor)

Tudom, ezért kellenek a megjegyzések..

Hazaérek bemásolom a tisztázott verziót az óra mintával.
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Hozzászólás Szerző: volkov »

Robert írta:Azért én ezt a feladatot sk nézném át és _magasszinten_ piszkálnám csak.
Ha lemész regiszter ill alacsony szintre, az misztikus hibákat és megoldhatatlan feladatot jelent egy kezdőnek. Ez nem bántás, ez állapot.
Persze 1/2-2 év múlva már rutinból lekezeled őket, de úszni sem úgy tanultál meg, hogy a Balaton közepén kitettek.... Mondjuk a hatékonység jó, mert 100-ból 2 kievickél a partra, és elég őket továbbképezni :) A 98% vesztesség meg így járt.... :roll:

Én az időmérést nézném meg, és főprogramra koncentrálva a milis/microseconds() időmérőkkel... Két INT közt eltelt időmérés, és az átszámításkat + az LCD kezelést....
Utána lehet tovább menni. Így igaz, hogy nem készül el idén karácsonyra teljesen, viszont a megszerzett tudás az sokkal többet ér!
Hatalmas a feladat.
Tudtam, hogy nem 2 nap lesz ezt megcsinálni.

(tervben van egy másik Arduino-val jeleket generálni neki, hogy ne kelljen mindenhez a kocsi pl.)

Nem az idő a lényeg, ha jövő karácsonyra lesz kész, hát akkor lesz kész.

Első lépésnek a kiírás lecserélése lenne a célom, sok helyen nem tetszik a "gyári" megoldás.

Ez a függvény amit használ, hááát.. van ennek értelme? jobb mint a LiquidCrystal?
Vagy csak ki mit szeret és ismer?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Ha már rászántad magad, inkább karakteres LCD helyet Grafikus LCD-re oldanád meg a kijelzést.
Szerintem sokall, jobban nézne ki!
8)

Kezd itt:
Graphic LCD Library:
http://www.pjrc.com/teensy/td_libs_GLCD.html
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. november 27. kedd, 15:18-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Vagy csak ki mit szeret és ismer?
Ez a program nem Arduino alá van megírva, hanem Cpp.

És Robert is tapasztalatból tudja, hogy az Ardunió nem engedi az ilyen alacsony szintű Timer és megszakítás rutinok piszkálását.

Ezért a kétféle programozási stílus összekeverése kész csőd helyzet.


:?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Amik el vannak előled rejtve:

LiquidCrystal.h
http://code.google.com/p/arduino/source ... l.h?r=1037

LiquidCrystal.cpp
http://code.google.com/p/arduino/source ... cpp?r=1037

Hát szerintem ez sem túl 1*Ű!
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Hozzászólás Szerző: volkov »

kapu48 írta:Ha már rászántad magad, inkább karakteres LCD helyet Grafikus LCD-re oldanád meg a kijelzést.
Szerintem sokall, jobban nézne ki!
8)

Kezd itt:
Graphic LCD Library:
http://www.pjrc.com/teensy/td_libs_GLCD.html
Hű, ez tetszik :)
A hely, ahová ez menni fog, adott, méricskélek majd.
kapu48 írta: Ez a program nem Arduino alá van megírva, hanem Cpp.

És Robert is tapasztalatból tudja, hogy az Ardunió nem engedi az ilyen alacsony szintű Timer és megszakítás rutinok piszkálását.

Ezért a kétféle programozási stílus összekeverése kész csőd helyzet.
:?
Ezt vettem észre :D
kapu48 írta:Amik el vannak előled rejtve:
LiquidCrystal.h
http://code.google.com/p/arduino/source ... l.h?r=1037

LiquidCrystal.cpp
http://code.google.com/p/arduino/source ... cpp?r=1037

Hát szerintem ez sem túl 1*Ű!
A lényeget leírtad: el van rejtve :)
Egyelőre örülök, hogy az előre megírt erre épülő LiquidCrystal függvényeket értem.
S azok alapján összejött a nagy betűs izé. Valahol el kell kezdeni
:wink:



Konkrét kérdés (elméleti):
Jelenleg a kocsiban van gyári fedkomp, de nem bele való, 1.84x többet mér mint amit kéne neki.
Első lépésnek meg akarom oldani Arduino-val, hogy figyelje a bejövő jelet, megmérem mennyi ideig tartott, majd mikor vége, akkor ennek az 1.84-ed részét kimenő jelként kiküldöm.

"micros()"-al érdemes ezt csinálni?

elv:
- jel érkezésekor megnézem a micros()-t.
- jel végén megint megnézem, a két értéket kivonom, lesz X
- ciklusban indítok egy jelet, megnézem az időt, és addig fut a ciklus míg el nem telt X/1.84
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Arduino nyelven kb esélytelen. Az időzítő/timer funkció használata nincs kidolgozva...

Valami feszínkapargatás:
http://arduino.cc/playground/Code/Timer1
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Hozzászólás Szerző: volkov »

Robert írta:Arduino nyelven kb esélytelen. Az időzítő/timer funkció használata nincs kidolgozva...

Valami feszínkapargatás:
http://arduino.cc/playground/Code/Timer1
Elkeserítesz :(

Akkor ez halottnak a csók?
(ez gombbal műkszik, kiírja hogy mennyi ideig nyomtam a gombot)

Kód: Egész kijelölése

#include <LiquidCrystal.h>
//TAV-IR EXT1 panelra
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
int LED = 13;
int GOMB = 3;
int nyomas = 0; //volt e gombnyomás
long ido_1; //idomereshez
long ido_2; //szinten

void setup(){
  pinMode(GOMB, INPUT); //be-ki menetek beallitasok
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
}
 
void loop() {
  ido_1=0;
  while (digitalRead(GOMB) == LOW){
    if (ido_1==0){ 
      nyomas=1;
      ido_1 = micros();
    } //Ha az ido 0 volt, akkor mintat veszek. ha mar van minta,
//csak varok amig nyomva a gomb
  }
  ido_2 = micros(); //minta a vegen is
  ido_2 = ido_2 - ido_1; //kulonbseg az eltel ido
  if (nyomas ==1){
    lcd.clear();
    lcd.print(ido_2/1000000, DEC);
    lcd.print(",");
    lcd.print(ido_2/100000%100000, DEC);
    lcd.print(ido_2/10000%10000, DEC);
    nyomas=0;
  }  
}
Válasz küldése