Imaj yaratma

Merhaba,

Hadi gelin PC imajı yaratalım. Bunu yaparken de Microsoft kaynaklarını kullanalım. Öyle yapalım ki SID ler değişsin. Aynı zamanda donanıma bağlı kalınmasın. Kolay ve olabildiğince hızlı yüklensin. Kısacası hem sağdan hem cam kenarı hem de en ön sıradan olsun. :))

Third party yazılım kullanarak disk görüntüsü alma işlemi yıllardır var. Bilgisayarınızı evde kullanacaksanız, domaine bağlanmıyorsanız ve/veya networkten çalışan bir programınız falan yoksa ofiste de bu yöntemi kullanmaya devam etmenizde sakınca yok aslında. Ancak aksi durum söz konusu ise uygulamalarınız çalışmayabilir. Önce SID in ne olduğu ile başlayalım.

SID (Security IDentifier) bilgisayarlara, kullanıcılara ve security gruplara verilen bir nevi kimlik numarasıdır. NT 4.0 den beri var olan SID, oluşturulan user-computer ve group’ları benzersiz olarak tanımlayan bir numaradır. Objeleri unique (eşsiz) kılar. SID, İşletim sistemi kurulurken oluşturulur. Domain’e üye yapılan her bir computer hesabının ayrı bir SID kaydı/bilgisi mevcuttur. Active directory de yaratılmış bir objeye izin ve/veya hak verildiğinde o objenin ismiyle yada tanımlamasıyla değil SID numarası ile ilişkilendirilir. Bilgisayarı domaine eklediğinizde, çıkardığınızda veya ismini değiştirdiğinizde SID değişmez. Kaba bir benzetme yapmak gerekirse işletim sisteminin MAC adresi gibi bir şey kısacası.

 Peki bunların imaj ile ne alakası var? Bilgisayarın disk imajını klonladığınızda SID i de klonladığınız için unique olması gerektiği halde birden fazla makine aynı SID e sahip olduğundan domain e eklendiğinde sorun yaşarmanız kaçınılmazdır. Ama bu bizi durduramaz değil mi? 🙂

Yukarıda yazdığım sorunun önüne geçebilmek için Microsoft un toolları var. 2003 server zamanında bunları eklenti olarak alabiliyorduk ancak 2008 den itibaren entegre olarak geliyor. İstemci bilgisayarında da benzer durum mevcut. Evet sysprep ten bahsediyorum. 😉

İşletim sistemini kurdunuz, kullanmak istediğiniz programları yüklediniz, hatta Windows un özelliklerini de tek tek ayarladınız. Sadece imajın yedeğini almak istiyorsanız, işiniz kolay. Acronis poweriso vs vs bir sürü imaj programı var. Bunlardan birini kullanabilirsiniz. Ancak eğer domain e ekli bir bilgisayarsa o imajı sadece tek bilgisayarda kullanabilirsiniz. Amacınız o imajı birden fazla bilgisayara kurup yüklemeyi kısaltmaksa o zaman yapmanız gerek işler var demektir. İşte bu yazı bununla alakalı. İsterseniz öncelikle ihtiyaçlarımızı belirleyelim.

1- Bilgisayarlarımız domaine bağlı olacak. Dolayısı ile her bilgisayarın benzersiz SID i olması lazım.

2- Çeşitli marka ve modellerde bilgisayarlarımız var. Her birinin driverlarını tek tek yüklemek istemiyoruz. Tümü için tek imaj kullanılmalı.

3- Malum işletim sistemi release edildiği gibi durmuyor. Microsoft gerek patch gerekse servicepack ler ile sürekli bir şeyleri güncelliyor. Bizim kullandığımız bilgisayarlarda tümünün yüklenmesi gerekli olmayabilir ya da sorun yaşamamıza neden olabilir. Yüklenecek paketleri seçmemiz gerekebilir. Her yeni yüklenen bilgisayarda bunları tek tek yapmak ya da network üzerinden güncellemek de çözüm ama hem pratik değil hem de gereksiz iş yükü. Bunları imaja ekleyelim.

4- Kullandığımız bilgisayarlara yüklediğimiz belli programlar var. Hepsine tek tek yüklemek istemiyoruz. Bunlar yüklü gelirse zaman kazanırız.

5- Kullanıcıların kısayolları desktop görüntüleri vs herkeste aynı olsun istiyoruz. Bunu DC den de yapabiliriz ancak ilk yüklemede de hazır gelebilir.

vs vs vs. Daha uzar bu liste ama bu kadarı da yeterli şimdilik.

İşte bu gibi durumlarda işimizi kolaylaştırması için microsoft sysprep yardımcısını çıkarttı. Bu ne yapıyor? bilgisayar kurulduktan sonra kullanıcı hesapları ve SID gibi PC ye tanımlanan veri ve dosyaları silip başa sarıyor. Bir nevi reenkarnasyon ancak bun yaparken yaptığımız güncellemeler, Windows bileşenlerindeli özelleştirmeler ve yüklediğimiz programları vs silmiyor. Bunları olduğu gibi koruduğu için bilgisayar tekrar yüklendiğinde (bu yüklenme sıfırdan yüklenme değil anlaşılacağı üzere) bunlar hazır gelmiş oluyor. Peki nasıl yapıyoruz? Hadi süreci alt alta yazalım.

1- Örnek bilgisayarımızı sıfırdan kuruyoruz. Eğer birden fazla partition kullanacaksanız bu aşamada ayarlayabilirsiniz.

2- Windows bileşenlerindeki özelleştirmelerimizi yapıyoruz. Örneğin oyunları vb gibi uygulamaları kaldırabilirsiniz. Klavye ve dil ayarlarını yapabilir saat dilimini seçebilirsiniz.

3- Güncelleştirme paketlerimizi yüklüyoruz.

4– Gerekli ve herkeste kullanılacak olan programlarımızı yüklüyoruz. (Office vs vs gibi)

5- c:\windows\system32\sysprep klasöründeki sysprep uygulamasını çalıştırıyoruz. (cmd promptan ilgili klasöre gidip admin olarak açıp yapabilirsiniz ya da start>run>sysprep)

6- Açılan ekranda “Enter System Out-of-Box Experience (OOBE)” seçip “Generalize” kutucuğunu seçiyoruz. Alttaki seçenği de “shutdown” olarak seçin.

Sysprep gerekli ayarlamaları yapıp verileri sildikten sonra bilgisayarınızı kapatacaktır. elimizde güncellemelerimizin ve programlarımızın yüklü olduğu, özelleştirilmiş ve donanımdan bağımsızlaştırılmış bir Windows diskimiz var. Hadi bunun imajını alalım.

 

Bundan sonra iki ayrı yolumuz var.

Birincisi USB stick ya da DVD ye (halâ kaldı mı bunlardan?) yüklü PE ile bilgisayarı açıp herhangi bir third party programla diskin imajını almak.

Bu yöntemin avantajı hızlı olması ve disk ile ilgili herhangi bir değişiklik yapmamızın (partition vs gibi) gerekli olmaması. Ancak iki önemli dezavantajı var. Birincisi sonradan ekleme yapılamıyor olması ve değişikliğe izin vermemesi. Yani yeni bir makine geldiğinde driver gerekiyorsa imajı yazdıktan sonra elle yüklemelisiniz ya da yukarıdaki süreci tekrar etmelisiniz. İkincisi bence dezavantajı ise esnek olmaması. Disk tipinde değişiklik olursa (SSD kullanımına geçilmesi vs gibi) ya da boyutu örnek bilgisayarınızdakinden küçük olursa çalışmaz.

Diğeri ise gene USB den PE ile açıp wim dosyası oluşturmak. Bu Microsoft un çözümü ve oldukça kullanışlı. Ancak yavaş. Sonradan ekleme ve değişiklik yapılabildiği için kullanışlı. Donanımdan tümüyle bağımsız.

İlkini anlatmaya gerek yok sanırım PQDI ya da Acronisle imaj alıp klonlayarak yolunuza devam ediyorsunuz. Oysa ikincisi biraz daha eğlenceli [evet garip eğlence anlayışım var 🙂 ] bir süreç. Ancak WDS kullanıyorsanız bu daha çok işinize yarar. Dahası kurulumu otomatize edebilirsiniz. Domaine kendi join olabilir mesela. Özel bazı uygulamaları sonradan ekleyebilirsiniz ya da herkes tarafından kullanılmayan ancak bazı makinelerde ortak olan çevrebirimlerin sürücülerini ekleyerek kurulum esnasında opsiyon olarak tanımlayabilirsiniz vs vs gibi. Ya da 32 ve 64 bit iki ayrı işletim sistemi arasından seçim yapılmasını sağlayabilirsiniz. Sınırsız esneklik söz konusu kısacası. Ama bunları bir sonraki gönderide anlatalım. O başka bir iş.

Görüşmek üzere.

 

 

 

 

Reklamlar

İlk değişiklik

Dört boyutlu haritanın şimdilik gereksiz olduğuna karar verdim. Çok fazla veri vardı ve CPU utilizasyonunu arttırıyordu. Ben de daha basit bir yol seçmeyi düşündüm. (Şimdilik 🙂 )

Kafamdaki tam olarak şu;

Öncelikle yakıt için 3 boyutlu bir haritadan verileri MAP ve RPM e dayalı olarak veriyi çekecek. Daha sonra kendi hesapladığı süre ile karşılaştırıp OEM ECU ‘larda olduğu gibi trimler kullanarak püskürtme süresini ayarlayacak.

Bunun için taslak scriptte şöyle bir değişikliğe gittim.

  • Öncelikle global değişkenler tanımlamam gerekti.

int XCount;
float LTFTrim;
float Total_Trim;

  • Bir sayıcı eklemek zorunda kaldım

Adından da anlaşılacağı üzere XCount değişkeni sayıcım. Beş kez STFT değeri yüksek çıkarsa LTFT değerini %5 arttırıyor/eksiltiyor.

  • Trim değerleri için karşılaştırma satırları eklendi.

if (STFTrim <= -20)
{
STFTrim = -20;
XCount = ++XCount;
if (XCount > 5)
{
XCount = 0;
LTFTrim = LTFTrim – 5;
if (LTFTrim <= – 20)
{
LTFTrim = -20;
}
}
}
if (STFTrim >= 20)
{
STFTrim = 20;
XCount = ++XCount;
if (XCount > 5)
{
XCount = 0;
LTFTrim = LTFTrim + 5;
if (LTFTrim >= 20)
{
LTFTrim = 20;
}
}
}

    Buna göre kısa vadeli düzeltme değerine göre %5 lik dilimler halinde kalıcı değişkenin değeri değişiyor. Her beş veri okumanın sonunda artış/eksilme yapılıyor. Her iki değer de %20 ile sınırlı. İleride buna hata kodu eklemeyi planlıyorum.

 

  • Son PWM değerini hesaplamak için eklentiler yaptım. Osilaskopta okuduğum duty-cycle değeri hesapladığımla birebir örtüşüyor. 🙂
  Total_Trim = LTFTrim + STFTrim;
Inj_Value = fuel_Value + Total_Trim;

  pwmvalue = map(Inj_Value, 0, 99, 0 ,255);

analogWrite(11, pwmvalue);

 

Başladık bakalım

İlk denemeler başarılı.
İki tane potansiyometre alıp adruino uno nun analog girişlerine bağladım. Bunlar temsili sensörlerim olacak. 🙂 Bunlardan gelen verilere göre 4 boyutlu haritalarımdan uygun değeri seçerek PC nin comport’una gönderiyorum. Evet daha yolun başında bile sayılmam belki ama yıllar önce öğrencilik yıllarımda öğrendiğim C’yi yeniden keşfetmem gerektiği hesaba katılınca aslında fena da yol almadım hani. 🙂

Neyse Sketch ime kısaca göz gezdirirsek; Öncelikle haritaları tanımlamakladım.

int fuel_Map[4][10][12] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 10, 10, 12, 12, 12, 12, 13, 12, 12, 10, 0,
2, 10, 11, 20, 13, 15, 15, 20, 25, 15, 10, 0,
3, 10, 12, 14, 18, 18, 18, 30, 25, 15, 10, 0,
4, 10, 15, 18, 20, 22, 35, 30, 25, 15, 10, 0,
5, 10, 22, 20, 22, 25, 35, 30, 25, 15, 10, 0,
6, 10, 20, 22, 25, 28, 35, 30, 25, 15, 10, 0,
7, 10, 22, 25, 30, 30, 35, 30, 25, 15, 10, 0,
8, 10, 15, 20, 33, 35, 35, 32, 25, 15, 10, 0,
9, 10, 15, 25, 35, 40, 40, 35, 25, 15, 10, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
3, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
4, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
7, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
8, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
9, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
3, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
4, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
7, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
8, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
9, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
2, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
3, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
4, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
5, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
6, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
7, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
8, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
9, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0};
Buna göre 4 ayrı yüzey, 10 satır ve 12 sütundan oluşan 4 boyutlu harita hazırlanmış oldu. Değerler tamamen afaki tabi.

Daha sonra analog portlardan gelen veriyi okumaya geldi sıra.

int fuel_Value = 0;
int MapSensorVal = analogRead(A0);
int RpmSensorVal = analogRead(A1);
// int TpsSensorVal = analogRead(A2); Üçüncü potansiyometreyi alana kadar buna sabit değer atamak durumunda kaldım. 🙂
int TpsSensorVal = 0 ;

Malum 8 bit ADC kullanılan portlarda 0-1023 arası değer çevrimi yapılabiliyor. Yani sizin porta gönderdiğiniz 5 ya da 3.3V u 8 bit data olarak çevirdiğimiz için öncelikle bunu scale etmek gerekiyordu. Bunun için map fonksiyonunu kullandım ki faydalı bir eser zira ara değerlerde kendi yuvarlama yaptığı için çok fazla gereksiz veri girişine gerek kalmıyor.

RpmSensorVal = map(RpmSensorVal, 0, 1023, 0, 11);
MapSensorVal = map(MapSensorVal, 0, 1023, 0, 9);
TpsSensorVal = map(TpsSensorVal, 0, 1023, 0, 4);

 

Hadi şimdi sensörlerden gelen verilere göre haritamızdan uygun değeri çekip com
portuna gönderelim. Veri sıralaması [yüzey][satır][sütun] olacak şekilde

fuel_Value = fuel_Map[TpsSensorVal][MapSensorVal][RpmSensorVal];
Serial.print(“MAP value : “);
Serial.println(MapSensorVal);Serial.print(“RPM value : “);
Serial.println(RpmSensorVal);

Serial.println(” “);
Serial.print(“PWM value : “);
Serial.println(fuel_Value);
Serial.println(” “);
Serial.println(“—————– “);

ComPort görüntüsü şöyle bir şey oldu.

 

map1

Genel strateji

Başlangıçta sadece yakıt kontrolünü yapabilmeyi planlıyorum. Bunun için çok kullanılan üç ayrı yöntem var.

Birincisi motorun hacimsel verimliliğinin haritasını çıkartıp kaydederek sensörlerden gelen veriye göre püskürtme süresini hesaplayarak enjektör sinyalini oluşturmak. Bunun kendine göre kolaylıkları ve kısıtlamaları var. Avantaj kısmında çok fazla bir şey bilmeye gerek kalmaksızın temel bir V E (Volumetric Efficiency = Hacimsel verimlilik) haritası ile bile marşa basabiliyor olmanız.  Tabi bu büyük kolaylık sağlıyor. En önemli sıkıntısı ise her döngüde tek tek tüm verileri kontrol edip hesaplama yapması nedeni ile işlemci ve RAM kaynaklarına ihtiyaç duyuyor olması. Gerçi işlemcilerin üç otuz paraya satılmaya başlandığı şu günlerde bu pek sıkıntı değil artık ama en büyük dezavantajı bu. Megasquirt ve benzeri ECU lar

İkinci yöntem ise basit haritalar hazırlayarak, kullanılan sensörlere göre bunların değerlerini el ile girerek statik püskürtme süreleri ile çalışmak. Genelde Piggy-back ve LPG ECU ları falan bu tip püskürtme yapıyor.

Üçüncü yöntem ise (ki bu OEM üreticilerin kullandığı yöntem) sabit haritalar kullanarak sabit değerler verip ek olarak sensörlerden gelen verilerle hesaplama yapıp tablodaki hazır değerler ile karşılaştırılarak püskürtmenin sağlanması ve trimler kullanarak sürekli sistem kontrolünün sağlanması.

Benim yapmak istediğim üçüncü yöntem elbette ancak daha henüz işin ABC sinde olduğum için ikinci yöntem ile başlayıp sonrasında birincisi ile hibritleyerek üçüncüye ulaşmak. Tabi bu noktada closed loop correction stratejisini oluşturabilmem feedback interfacelerini hazırlamam ve scripte onları da dahil etmem gerekiyor. Acelem yok elbet bitecek. Başladık…

Yolum uzun hadi tutmayın beni. :))

 

Enjektör kontrolü

Merhaba,

Epeydir aklımda olup bir türlü başlamadığım, elimin varmadığı, zaman bulamadığım kısacası yapmadığım enjektör kontrol devresi projeme başladım. Başlangıçta C ile firmware i hazırlayıp arduino ile test ettikten sonra gerekirse başka bir işlemci kullanıp onun için compile etmeyi planlıyorum. Ama temelde strateji belirlemem gerekiyor. Onun içinde ABC den başlayacağım.

Neden arduino? Çünkü açık kaynak kodlu olduğu için internette zilyon tane kaynak var. Neredeyse her ne isterseniz bulabiliyorsunuz. Bulamasanız bile yazabiliyorsunuz. Bellek adreslemeleri falan binlerce kez paylaşılmış. O nedenle temelde onunla başlayıp gerekirse ileride işlemciyi değiştiririm diye düşündüm. Halihazırda Arduino Uno üzerinde ilk denemelerimi yapıyorum. Elimde hazırda Mega ve Due de var. Nihai hedef olarak Due üzerinde çalıştırmayı düşünüyorum. Mega ile çevrebirimleri kontrol edeceğim. Interface lerin I/O devreleri zaten daha önce başkaları tarafından geliştirildiği için sıkıntı yok. Sadece onları daughter board olarak kullanılabilmesi için yeniden hazırlamam gerekecek.

Neyse velhasıl-ı kelam bindik bir alamete gidiyoruz kıyamete bakalım. Umarım maymun iştahımın kurbanı olmaz bitiririm. 🙂