Raspberry vakfının yakın zamanda duyurduğu sade ve boyut anlamında oldukça ufak(6.5cm X 3.0cm) zero kiti üzerinde java ile yazdığım bir kaç basit uygulamayı kolayca çalıştırabildim. Bu yazımda raspberry pi zero ile gömülü sistemler dünyasına benim gibi giriş yapan/yapacak olan arkadaşlar için ilk tecrübelerimi aktarmaya çalışacağım.
Öncelikle SD kartımıza linux tabanlı raspbian işletim sisteminin nasıl kurulacağını ardından java ile hazırladığım bir gauge uygulamasıyla raspberry zeronun performansını test edeceğiz. Yazılım kodları yazının sonuna eklenmiştir.
Programlama dili olarak java ile kısıtlı değiliz C++, Python,… gibi diğer nesne yönelimli dilleride tercih edebilirsiniz.
Raspberry PI Zero’yu Tanıyalım
Kartın üzerinde BCM2835 1GHz ARM11, 512MB Ramı olan, yapmayı planladığım GUI uygulamaları için yeterli bir işlemci, işletim sistemini kurup çalıştıracağımız(Hard-disk gibi düşünebilirsiniz) mini-sd kart yuvası bulunmakta.
Yanda sd-kart sınıflarının hızları görülmektedir. Ben saniyede 10mega-byte yazma hızı olan 8GB’lık class-10 bir sd-kartı tercih ettim.
Kartın üzerinde mikro-HDMI portu bulunuyor dolayısıyla HDMI girişi olan bir LCD yada televizyona kolayca bağlanabilir yada arzu ettiğiniz boyutlarda bir TFT ekran kullanarak taşınabilir mini bir cihaz yapabilirsiniz.
Üzerinde 1 adet USB-OTG portu bulunmakta. USB giriş sayısını arttırmak için HUB kullanılmaktadır.
Kitinizi static, kısa devre gibi durumlardan korumak için raspberry pi zero için üretilmiş kılıflar bulunmakta bunlardan edinmenizi tavsiye ederim. Kılıflar Türk distribütörlerinde e-bay fiyatlarıyla satılmaktadır.
Kartımızda 40 adet GPIO pin bulunmakta bunlara java uygulamalarınızdan erişebilmek için pi4j kütüphanesini kullanabilirsiniz. Bu kütüphane C ile hazırlanmış olan wiringPi kütüphanesini native olarak kullanmaktadır. Pinler Raspberry pi A+ ve B+ ile uyumludur ve tanımlaması aşağıdaki gibidir. Uart, SPI, I2C pin numaralarını bu diyagramdan görebilirsiniz.
Son olarak kitin üzerinde ACT ledi sd-kartınıza işletim sistemini doğru bir şekilde yükleyip kite takdığınız takdirde tepki vermektedir. SD-kartı takmadan bir enerji verelim dediğinizde led tepki vermiyor aklınızda bulunsun.
İşletim Sisteminin Kurulması
İşleti sistemini kurmak için başvuracağımız rehberin adresi burasıdır. Ubuntu kullanmakta olduğum için sadece linux işletim sistemleri için geçerli olan kısmı aktaracağım. Vermiş olduğum adreste windows ve mac kullanıcıları için yapılması gerekenler anlatılmaktadır.
Kullanacak olduğumuz 2 adet komut var. Bunlar:
- İşletim sistemi tarafından SD-kartımıza verilen ismi görmek için df -h
- İndirmiş olduğumuz image dosyasını sd-kartmıza yazmak için dcfldd bs=4M if/=<imaj dosyasini konumu> of/=<sd kartin konumu>
Benim durumum için df -h komutu verildikten sonra /dev/sdc1 dizininde sd-kartın olduğu görülmektedir.
SD-kart dizini için kullanılması gereken parametre ise of/=/dev/sdc dir. Sd-kart dizinimizi öğrendikten sonra aşağıdaki komut terminalden verilerek 3-5 dk sonra işletim sistemimiz kurulmuş olacaktır.
Java Uygulaması
IDE olarak eclipse ve java8 kullanarak yazmış olduğum uygulamanın çalışma videosu aşağıda verilmiştir. Uygulamada steelseries java-swing kütüphanesi kullanılmıştır. Sağda ki gösterge sayfasında değerler 500ms’de bir güncellenmektedir. CPU ve ram kullanımlarını sağda ki task-managerdan izleyebilirsiniz. Uygulamanın açılması yaklaşık 30sn sürüyor bu biraz rahatsız edici ancak açıldıktan sonra akıcı bir şekilde videodan da göreceğiniz üzere uygulama güzel bir şekilde çalışmakta.
Uygulama yazılımı:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import javax.swing.SwingUtilities; public class Monitor { private static GaugesPage gpage1; private static GaugesPage gpage2; private static GaugesPage gpage3; public static void main(String[] args) { //Gosterge ekran nesnelerini olusturalim... gpage1 = new GaugesPage(); gpage2 = new GaugesPage(); gpage3 = new GaugesPage(); //3 adet ayri gosterge ekranini acalim gpage1.showUI(); gpage2.showUI(); gpage3.showUI(); //3. Ekran verilerini surekli guncelleyecek thread... new Thread(){ int i = 0; public void run(){ while(true){ i = i+2; if(i > 100) i = 0; SwingUtilities.invokeLater(new Runnable(){ public void run(){ gpage3.setGauge1(i); gpage3.setGauge2(i); gpage3.setGauge3(i); } }); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); } } |
GaugePage sınıfı:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import eu.hansolo.steelseries.gauges.Radial; import eu.hansolo.steelseries.tools.BackgroundColor; import eu.hansolo.steelseries.tools.ColorDef; import eu.hansolo.steelseries.tools.GaugeType; import eu.hansolo.steelseries.tools.LcdColor; import eu.hansolo.steelseries.tools.NumberSystem; import eu.hansolo.steelseries.tools.PointerType; public class GaugesPage { private Radial gauge, gauge2, gauge3; public GaugesPage() { // TODO Auto-generated constructor stub } public void showUI() { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationByPlatform(true); JPanel panel = new JPanel() { @Override public Dimension getPreferredSize() { return new Dimension(300, 600); } }; panel.setLayout(new GridLayout(3,0));//BorderLayout()); gauge = new Radial(); gauge.setTitle("Voltaj"); gauge.setUnitString("V"); gauge.setGaugeType(GaugeType.TYPE2); gauge.setLcdBlinking(true); gauge.setLcdColor(LcdColor.BLUE_LCD); gauge.setLcdBackgroundVisible(true); gauge.setPointerType(PointerType.TYPE1); gauge.setBackgroundColor(BackgroundColor.LINEN); gauge.setLcdNumberSystem(NumberSystem.HEX); gauge.setLcdColor(LcdColor.REDDARKRED_LCD); panel.add(gauge); gauge2 = new Radial(); gauge2.setTitle("Akım"); gauge2.setUnitString("I"); gauge2.setPointerType(PointerType.TYPE2); gauge2.setBackgroundColor(BackgroundColor.STAINLESS); gauge2.setLcdInfoString("Current"); gauge2.setLcdColor(LcdColor.AMBER_LCD); panel.add(gauge2); gauge3 = new Radial(); gauge3.setTitle("Güç"); gauge3.setUnitString("kW"); gauge3.setMaxValue(120); gauge3.setMinValue(0); gauge3.setPointerType(PointerType.TYPE5); gauge3.setPointerColor(ColorDef.ORANGE); gauge3.setLcdThresholdVisible(true); gauge3.setLcdUnitStringVisible(true); gauge3.setLcdUnitString("kW"); gauge3.setLcdColor(LcdColor.BLUE2_LCD); panel.add(gauge3); frame.add(panel); JPanel buttonsPanel = new JPanel(); JLabel valueLabel = new JLabel("Value:"); final JTextField valueField = new JTextField(7); valueField.setText("0"); JButton button = new JButton("Set"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { try { double value = Double.valueOf(valueField.getText()); gauge.setValueAnimated(value); gauge2.setValueAnimated(value/2.0); gauge3.setValueAnimated(value/3.0); } catch(NumberFormatException ex) { //TODO - handle invalid input System.err.println("Geçersiz giriş!"); } } }); buttonsPanel.add(valueLabel); buttonsPanel.add(valueField); buttonsPanel.add(button); frame.add(buttonsPanel, BorderLayout.NORTH); frame.pack(); frame.setVisible(true); } public void setGauge1(double val){ gauge.setValue(val); } public void setGauge2(double val){ gauge2.setValue(val); } public void setGauge3(double val){ gauge3.setValue(val); } } |
Şimdilik bukadar. Raspberry PI ile ilgili net üzerinde çok fazla kaynak bulunmakta ayrıca Teknoseyir programında Levent Pekcan’ın Raspberry Pi 2 üzerinde Quake-3’ü çalıştırdığı bölümü izlemenizi tavsiye ederim, eğlenceli güzel bir bölümdü.
Çalışmalarınızda başarılar.