29 Aralık 2014 Pazartesi

Kanguru (origami)

Robert J. Lang'ın "The Complete Book of Origami" adlı kitabına devam ettim ve üçüncü denememde kendi ayakları üerinde kısa süre de olsa durabilen bir kanguru yapmayı başardım. Bu modeli yapmak için ikizkenar diküçgen bir kağıtla başlamak gerektiğinden 15 cm x 15 cm bir kağıdı köşegen boyunca kestim. Tabii kesim ve sonraki katlamalarda yapılan en ufak hatalar her adımda katlanarak modelin sonlarında büyük sorunlara yol açıyor. Origaminin fıtratında var bu. Daha da kötüsü, kitaptaki kafan ve özellikle kulaklarla ilgili açıklamaları pek anlamadığımdan son kısmı tamamen doğaçlama yaptım, doğru olduğunu sanmıyorum ama o kadar özgürlüğüm de olsun artık. 

  

27 Aralık 2014 Cumartesi

Pastel

Resim yapmayı hiç beceremedim. Çocukken yaptığım resimler bile akademik çevrelerde teknik çizim kabul edilebilecek eserlerdi. Orta öğrenim boyunca resim derslerinden kaçtım, kaçamadığım durumlarda da ödevlerimi babam yaptı. Sonraki çeyrek yüzyıl boyunca elime resimle ilgili hiçbir şey almadım. Artık çocukluğa dönmenin zamanı geldi sanırım. Hedefsizce ve benim durumumda yeteneksizce renklerle oynamak ve eğlenmek.

Bunun için kendime pastel tebeşirler ve ucuz pastel kağıdı aldım ama boyamaya başladım. Bu sayfalardan resim yapmayı öğrenmeyi düşünmeyin sakın. Eğer resme başlamak istiyorsanız ama başarısız olacağınızdan korkuyorsanız bunları "beterin de beteri varmış" diyerek moral bulmak amacıyla kullanabilirsiniz ama. İşe yarayacağından eminim.








26 Aralık 2014 Cuma

Köpek balığı (origami)

Robert J. Lang'ın "The Complete Book of Origami" kitabında bulduğum nispeten kolay bir köpek balığını katlamayı denedim. 7.5 x 7.5 kağıt bu iş için çok küçük geldi bana, son adımlardaki sırt yüzgeci ve yan yüzgeçlerde oldukça zorlandım. Biraz daha büyük bir kağıtla daha kolay olacağını tahmin ediyorum. 




18 Ekim 2014 Cumartesi

Arduino Due ve L293D ile adım motoru kontrolü

Geçenlerde elime eski bir scanner geçti. Bu sefer içini fazla kırmadan açtım ve hareketli kısma ulaştım. Motorun kart bağlantısını çıkardım ve Arduino Due kartıma yetişebilsin diue uçları kablo ekleyerek uzattım. Sonra bu adım motorunu kontrol edecek devreyi yapmak için aramalara başladım. Internette bu tür bir sürü şema var ama genelde hepsi Arduino UNO türü kartlar için, yani giriş çıkışların 5V ile çalıştığı kartlar fakat DUE giriş çıkışları 3.3V ile çalışıyor. Bu şemaların DUE ile çalışıp çalışmayacağı konusunda araştırmalar yaptım ve adafruit sayfası forumlarında Limor Fried'ın buna benzer bir soruya verdiği ayrıntısız ama olumlu cevabı gördüm. Bunun üzerine önce L293D motor kontrol çipinin özelliklerine baktım. 

L293D


VCC1 girişi çip üzerindeki mantık devreleri için güç kaynağı olarak kullanılıyor. Bu bacağa 4.5V - 7V arası bir gerilim uygulamak gerekiyor ve maksimum 60 mA akım çekiyor. Arduino Due'nin 5V çıkışı 600 mA kadar akım verebiliyor. Motor için kullanılan VCC2 güç kaynağı ise VCC1'den 36V'a kadar bir gerilimle çalışıyor. Bunun için baba yadigarı ayarlanabilir bir güç kaynağı kullandım. 1A, 2A, 3A, 4A girişleri Arduino Due üzerindeki sayısal çıkışlarla kontrol ediliyor ve en fazla 100 μA akım çekiyorlar. Due kartındaki sayısal giriş çıkışlar ise 15 mA akıma kaynaklık yapabilecek ve 9 mA akım çekebilecek güçte. Bu karşılaştırmalardan sonra bu adresteki gibi bir bağlantı yapma çalışmasına başladım.

Elimdeki motor da adafruit adresindeki deneydeki gibi tek kutuplu (unipolar) ve 5 kabloya sahip bir adım motoruydu fakat önce hangi kablonun nereye bağlanması gerektiğini bulmam gerekiyordu. Aşağıda wikipedia sayfasından aldığım bir tek kutuplu adım motoru temsili şeması görülüyor.


Burada ortadaki uçlar ortak olacak şekilde bağlarsak tipik bir 5 kablolu tek kutuplu adım motoru elde etmiş oluruz. Elimdeki motorun ortak ucunu bulmak için basit bir test uyguladım. İkişer ikişer uçların arasındaki direnci ölçtüm. Ortak uç ile bobinin bir ucu arasındaki direnç bobinin iki ucu arasındaki direncin yarısı kadar olmalı. Aynı şekilde diğer dört uçla arasında aynı dirence sahip olan uç ortak uç olmalı. Yaptığım ölçümler sonucu bobin uçları arasında 150 ohm ve ortak uç ile bobin uçları arasında ise 75 ohm okumalar elde ettim. Ortak ucu bulduktan sonra diğer dört ucu hangi sırayla aktifleştirmem gerektiğini deneme yanılmayla buldum. Bunun için adafruit sayfasındaki adım motoru eğitim projesini denemeye başladım. Devreyi projedeki gibi oluşturdum.


Ben testte tabii ki Arduino UNO yerine DUE kullandım ama aynı bağlantıları yaptım, çünkü projede verilen programı birebir kullanmayı planlamıştım. Tabii ki elimdeki motorun kabloları bu şemadakinden farklıydı. Dolayısı ile bir sonraki sayfadaki programı yükleyip kablo bağlantılarını değiştirerek motorun ne kadar yumuşak çalıştığını gözlemledim. Birkaç deneme sonunda istediğim sonucu almayı başardım.

Programı Arduino'ya yükledikten sonra seri port monitörünü açıp oradan motorun hangi yöne (pozitif ya da negatif) ne kadar dönmesi gerektiği yazılıyor ve ENTER tuşuna basınca da program bu değeri okuyup motor kontrolüne başlıyor. Motor verilen değer kadar döndüğünde otomatik olarak durduruluyor.

Program aslında oldukça basit ama bazı satırları yine de açıklamak istiyorum.

int in1Pin = 12;
int in2Pin = 11;
int in3Pin = 10;
int in4Pin = 9;

Stepper motor(512, in1Pin, in2Pin, in3Pin, in4Pin);

Bu komut ile motorun temel konfigürasyonu yapılıyor. Birinci parametre (512) motorun bir turu kaç adımda yaptığını belirtiyor. Yukarıdaki örneğe göre motor bir turu 512 adımda tamamlıyormuş. Diğer parametreler de motorun girişlerini kontrol eden dijital giriş çıkışlar, motorun kabloları değil. Bu girişler L293D çipinin 1A, 2A, 3A ve 4A ayaklarına bağlı ve sıraları önemli. Ben bu sıralamayı deneme yanılmayla buldum. Eğer motor sadece iki kablo ile kontrol edilecekse yukarıdaki komutun başka bir versiyonu kullanılmalı:

Stepper motor(768, in1Pin, in2Pin);


motor.setSpeed(10);

Bu komut motorun bir dakikada kaç tur atacağını yani hangi hızla döneceğini belirliyor. Bunu yapmak için kullanılan kütüphane daha önce bir tur için gereken adım sayısını kullanarak iki adım arasında geçmesi gereken süreyi hesaplıyor ve her adımdan sonra o kadar milisaniye bekliyor. Bu değişkenlerin hepsi tamsayı tipler olduğundan kütüphanenin duyarlılığı da milisaniye ile sınırlı. Yani iki adım arasında ancak 1 milisaniyenin katları (0 dahil) kadar beklenebilir.

loop içi de aslında oldukça kolay. Seri port monitöründen girilen bir tamsayı alınıyor ve motor o kadar adım hareket ettiriliyor. Hareket için kullanılan komut

motor.step(steps);

motoru steps değişkenindeki değer kadar hareket ettiriyor. Bu hareket sırasında yukarıda tanımlanan in1Pin, in2Pin, in3Pin ve in4Pin çıkışlarına belli bir sırayla HIGH ve LOW değerleri veriliyor. Dönüş sırasında her adımda çıkışlar aşağıdaki şemaya göre aktifleştiriliyor:

Adım no modulo 4 = 0Adım no modulo 4 = 1Adım no modulo 4 = 2Adım no modulo 4 = 3
1010011001011001
in1Pin = HIGHin1Pin = LOWin1Pin = LOWin1Pin = HIGH
in2Pin = LOWin2Pin = HIGHin2Pin = HIGHin2Pin = LOW
in3Pin = HIGHin3Pin = HIGHin3Pin = LOWin3Pin = LOW
in4Pin = LOWin4Pin = LOWin4Pin = HIGHin1Pin = HIGH

Bu tablo kullanılarak motorun kabloları yazılımla deneme yapılmadan da bulunabilir. Tablodaki çıkışlar L293D çipindeki 1A ... 4A girişlerine girerken bunlara tekabül eden 1Y ... 4Y çıkışları da motorun kablolarına bağlanıyor. Yani aynı tablo kullanılarak motorun kablolarına yeterli gerilim verildiğinde motorun beklenen adımı atması lazım. Tabii adımlar sırasındaki hareket çok küçük olduğundan motora dikkatlice bakmak gerekiyor.




31 Mayıs 2014 Cumartesi

gnuplot

Periyodik ölçümleri bir grafikte göstermek için gnuplot kullanılabilir. Örneğin toplanan sıcaklık verileri iki sütun halinde bir dosyada aşağıdaki şekilde tutulabilir:

09:36:57 -4.188
09:36:59 -4.188
09:37:00 -4.125
09:37:01 -4.125
09:37:02 -4.125
09:37:03 -4.063
09:37:04 -4.063

Birinci sütun saat:dakika:saniye formatında ölçümün yapıldığı anı gösteriyor ve ikinci sütun da o anda yapılan ölçümün değeri. Bu dosyada ölçümlerin birimleri tutulmuyor ama bu örnek sıcaklık ölçümünden alındığından birim santigrad.

Önce gnuplot uygulamasını kurmak gerekir:

$sudo apt-get install gnuplot, gnuplot-x11

Paketleri kurduktan sonra aşağıdaki komutlarla grafik ekranda gösterilebilir. 

$ gnuplot

gnuplot> set xdata time
gnuplot> set timefmt "%H:%M:%S"
gnuplot> set format x "%H:%M:%S"
gnuplot> set xlabel 'Zaman'
gnuplot> set ylabel 'Sıcaklık'
gnuplot> plot "/home/pi/data/temperature.dat" using 1:2 with lines

Eğer grafiği PNG formatında bir dosyaya aktarmak istersek plot komutundan önce çıktıyı aşağıdaki gibi yönendirmek gerekir.

gnuplot> set terminal png size 400,300 enhanced font "Helvetica,8"
gnuplot> set output 'output.png'

Bu şekilde kullanılınca gnuplot grafiği sadece dosyaya yazar, ekranda göstermez. Çıktıyı değişik formatlarda kaydetmek de mümkün. output.png dosyası daha sonra buradaki gibi bir web sayfasına ya da başka bir ortama yüklenebilir.






29 Mayıs 2014 Perşembe

Dijital termometre


Çeşitli deneylerde kullanmak için sıvılara sokabileceğim ve geniş bir ölçüm aralığına sahip bir termometre yapmak istiyordum. Bu termometrei raspberry pi ile kullanıp periyodik olarak ölçümler yapıp bir dosyaya kaydetmeyi planlamıştım. Termometre için aşağıda özellikleri kısaca listelenmiş olan DS 18S20 sensörünü kullandım.

  • Ölçüm aralığı: -55 °C - 125 °C
  • -10 °C - 85 °C aralığında ±0.5 °C hata
  • 9 bit (sensördeki bazı registerlar ve bir formülle daha duyarlı okumalar yapılabiliyor) çözünürlük
  • Ölçüm için gereken süre maksimum 750 ms

Termometre için raspberry pi ve bağlantılar dışında sadece bir adet 4.7 kohm (dökümanlara göre 5 kohm civarında bir direnç yeterli) dirence ihtiyaç var. Devreyi önce bu linkteki gibi bir test kartında kurdum. Adafruit sayfasında 18S20 yerine 18B20 kullanılmış ama bu modellerin bağlantı özellikleri aynı olduğundan aynı devreyi kullanmak hiç sorun olmadı. Anladığım kadarıyla aradaki tek fark iki sensörün de ölçüm için kullandığı standard çözünürlük ( 18S20 9bit kullanırken, 18B20 9 bit ile 12 bit arasında ayarlanabiliyor). 18S20 ile 9 bitten daha duyarlı ölçümler için bazı registerler okunup üretici firma tarafından verilen formül kullanılabilir ama ben bütün bu işleri raspbian işletim sistemine bıraktım.

Devreyi deney kartında test ettikten sonra sensörün bacaklarını ileride sıvıyla temas etmesin diye ısıya dayanıklı silikon ile kapladıktan sonra üzerlerine bir de makaron geçirdim. Sonuçta aşağıdaki fotoğraftaki gibi bir termometre elde ettim.


Bu termometreyi raspberry pi kartına takmak için de delikli kart yardımıyla aşağıdaki devreyi hazırladım.



Sensörle iletişim için gereken protokolü aktifleştirmek için aşağıdaki komutları kullanmak gerek.

$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm


Bu aşamada /sys/bus/w1/devices/ dizini altında 10-000802c61744 şeklinde bir dizin belirecektir. Eğer DS 18B20 sensörü kullanılmışsa dizin adı 20- şeklinde olacaktır. Dizin adındaki geri kalan kısım ise kullanılan sensörün seri numarasıdır yani başka sensörlerde farklı bir isim çıkması normaldir. Eğer /sys/bus/ altında w1 dizini tanımlı değilse ya protokol etkinleştirilememiştir ya da raspberry pi üzerinde GPIO4 pini yerine başka bir pin kullanılmıştır.

1-wire protokolünün çalışıp çalışmadığını 

$ lsmod 

komutuyla test edebiliriz. Eğer çalışıyorsa komutun çıktısında aşağıdaki gibi satır bulunmalıdır.

$ wire 24629 2 w1_gpio,w1_therm 

Eğer bu modüller raspbian her başlatıldığında yüklensin istiyorsak bu komut işimizi görecektir:

$ sudo echo >> /etc/modules w1-gpio && sudo echo >> /etc/modules w1_therm

Bu komutla termometrenin o anki değeri okunabilir:

$ cat /sys/bus/w1/devices/10-000802c61744/w1_slave

Komutun çıktısı aşağıdaki gibi olacaktır.

27 00 4b 46 ff ff 06 10 8e : crc=8e YES
27 00 4b 46 ff ff 06 10 8e t=19375

t=19375 kısmı sıcaklığın bulunduğu kısımdır. Buradaki örneğe göre sıcaklık 19.375 derecedir. Sıfırın altındaki sıcaklıklar t=-1612 gibi gösterilmektedir ve -1.612 derece demektir.

Yukarıdaki çıktıdan sadece sıcaklık değerini alıp dereceye çevirmek için aşağıdaki skripti kullandım. Bu skripti /usr/bin/temperature dosyasına koydum.

#! /bin/bash
 
tempread=`cat /sys/bus/w1/devices/10-000802c61744/w1_slave`
temp=`echo $tempread | egrep -o '[-]*[0-9]*$'`
temp2=`echo "scale=3; $temp / 1000" | bc | awk '{printf "%f", $0}'` 
timestamp=`date +"%T"` 
echo $timestamp " " $temp2

Bu skripti kullanabilmek için bc paketini kurmak gerekti.

$ sudo aptitude update
$ sudo aptitude install bc
$ chmod +x /usr/bin/temperature


Son komutla yazdığımız skripti çalıştırılabilir hale getirdim. Bu skriptin çıktısını bir dosyaya atmak için başka bir skrip yazıp /usr/bin/acquire_temperature dosyasına koydum.

#! /bin/bash


echo `temperature` >> /home/pi/data/temperature.dat

Bu skripin çıktıyı yazacağı dosya (temperature.dat) benim sistemimde /home/pi/data dizininde yaratılıyor.

$ chmod +x /usr/bin/acquire_temperature

Bu skripti periyodik olarak çalıştırıp sonuçları bir dosyaya atmak için de aşağıdaki komutu kullandım. Bu komut (hemen hemen) her saniye, sıcaklık değerini alıp dosyaya yazan skripti çalıştırıyor.

$ watch -n 0.1 acquire_temperature

Bu komut çalıştıkça dosyaya her satırında önce o anki saat ve sonra da bir boşluktan sonra o ölçülmüş olan anlık sıcaklık değeri bulunan bir kayıt eklenir. Örneğin

09:12:39 21.750000
09.12.40 21.750000
09.12.42 21.812000

Yukarıda yapmış olduğum ölçümlerden birinin başlangıç kısmını koydum. Dikkat edilirse ölçümler bazen bir saniye atlayabiliyor ama bu benim kullanım amacım için ciddi bir sorun oluşturmuyor. Bir başka nokta da sıcaklık değerinin sonundaki sıfırlar. Bunlar temperature skriptindeki bc komutundan sonra kullandığım awk komutundan geliyor ve oradaki printf komutuyla istenirse bu sıfırlar kaldırılabilir.

Bu toplanan verileri gnuplot ile bir grafik haline getirmeyi daha sonraki bir yazıda anlatacağım.

Kaynaklar:

http://kopfkino.irosaurus.com/tutorial-ds18s20-temperatur-sensor-an-einem-raspberry-pi/

https://learn.adafruit.com/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing/hardware


21 Nisan 2014 Pazartesi

Origami (kelebek)


Zamanında aldığım origami kağıtları daha fazla tozlanmasın ve artık bir şekilde bu hobiye başlayayım diye basit bir model aradım ve bulduğum ilk sayfadaki kelebeği yapmaya koyuldum. Açıklamalar oldukça basit ama son adımı daha kolay anlayabilmek için youtube'da da bu modeli aradım. Sonuçlar aşağıda görülebilir.

 
  

Kaynaklar:
  1. http://www.origami-instructions.com/origami-yoshizawa-butterfly.html

4 Şubat 2014 Salı

Ebru

Sonunda çocuklara aldığım noel hediyesi ARTDECO Ebru başlangıç setini deneme fırsatı bulabildik. Kullanımı oldukça kolaydı. Kitreyi tekneye boşalttık ve boyalarla oynamaya başladık. Fırça ile arka plan rengini serpiştirdikten sonra herkes sırayla istediği renklerle denemeler yaptı. İşimiz bittiğinde boyanın üzerini kağıtla kapladık ve onbeş saniye kadar sonra kağıdı bir köşesinden tutup çektiğimizde bu desenle karşılaştık. Kitreli suyun üzerinde renkler bu kadar net gözükmüyordu ama bunu dert edecek kadar nankör de değildik. Sanırım sonunda evde herkesin hoşuna giden bir hobi bulabildik. Aşağıda ilk denemelerimizden bazıları görülmekte. Kağıtları doğru kurutmayı henüz beceremediğimizden sonuçlar oldukça dalgalı oldu. Neyse, zamanla bunu da öğreniriz. Bir de bütün tezgahı kedilerden korumanın yolunu bulmam gerekecek.