Merhabalar arkadaşlar  , bir başka yazımızda merhaba demek istiyorum ve Dualshock ‘umuz USB bağlantı tipiyle beaglebone’umuza bağlı ve led devresi GPIO ‘lar üzerindedir. yakın zamanda  beagle üzerinde  birşeyler yapma üzerine düşünürken böyle birşey aklıma geldi tabi bu yazdığım yazı biraz başlangıç aşamasındadır. Büyük projeler elde etmek için önemli noktalara değinmeyi düşündüm.


Projemizdeki ortam nedir ? :

Standart malzeme listesi:


Gördüğünüz üzere;
Mavi       :  GPIO1_6
Beyaz     :  GPIO1_7
Sarı         :  GPIO1_2
Kırmızı  :  GPIO1_13
bağlantı noktalarına bağlı bulunmaktadir.
Projede yapmak istediğimiz basıp bıraktığımız tuşun yönündeki ledin yanıp tekrar bu tuşa bastığımız anda kapanmasıdır. Algoritmasına bakacak olursak ;

Sıra geldi yapacaklarımıza..

Şimdi arkadaşlar ben sizin yerinize uzun süren çalışmalarım sonucu bir joystick – dualshock test programı buldum linux üzerinde çalışabilen.
Bununla portumuz üzerinden gelen bütün bilgileri gayet kolay bir şekilde okuyabiliyoruz. Programımızı tanıtacak olursak ilk olarak

sudo apt-get install joystick
diyoruz ve kurulumumuzu tamamlıyoruz.

jstest /dev/input/jsX
Bu kısımda X yerine /dev/input klasörü altındaki dosyamıza bakabiliriz yada daha kısa düşünecek olursak
tab tuşuna basmamız yeterlidir.
Ardından herhangi tuşa bastığımızda “on off” tarzı buton bilgilendirmeleri anlık gelecektir. Ben ilk denememde 3’üncü X tuşuna bastım ve sonucum :

Bunu gördüğüm anda dedimki madem ki terminal’de ben bunu görebiliyorum acaba bunu java’ya yaptırarak düzenli bir hale getiremezmiyim?
Tabiki elbette mümkün bunu java’da bulunan Process ve ProcessBuilder sınıfımızlarımızla yapabiliyoruz.

Beaglebone için yazığım kod:

beaglebone.java
[codesyntax lang=”php”]

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

import javax.sound.sampled.Port;

public class beaglebone {

	public static final int PORT = 8000;//Soket port numaramiz
	public static final String JPORT0 = "38";//Beaglebone uzerinde
	public static final String JPORT1 = "34";//hangi porta denk 
	public static final String JPORT2 = "39";//geldigini belirtiyoruz
	public static final String JPORT3 = "45";//sabitleyerek burada

	public static final String gpioDeger0 = "6";//Izinler icin portlarimizin
	public static final String gpioDeger1 = "2";//bilgilerini giriyoruz
	public static final String gpioDeger2 = "7";// bu kisimda
	public static final String gpioDeger3 = "13";

	public static void main(String[] args) throws IOException {

		ServerSocket sunucuSoketi = new ServerSocket(PORT);//Server soketini aciyoruz
		System.out.println("sunucu baslatildi");

		try {
			Socket kullaniciSoketi = sunucuSoketi.accept();//kullanici gelene kadar bekle
			try {

					System.out.println("Baglanti kabul edildi : "+ kullaniciSoketi);
					//Soket okuyucumuz
					BufferedReader buf = new BufferedReader( new InputStreamReader( kullaniciSoketi.getInputStream() ) ) ;
					String line ;

					int PortAyar0 = 0;//Bir kerelik ayar 
					int PortAyar1 = 0;//yapmak istedigimiz
					int PortAyar2 = 0;//icin bu kisimda
					int PortAyar3 = 0;//boyle bir taktik gelistirdik.
					//Sonsuza dek oku
					while ( (line = buf.readLine() ) != null ) {

						if(line.equals("0")){
						   if( PortAyar0  == 0 ) {
						    ulasmaIzni(gpioDeger0);//Porta beagle uzerinde ulasma izni ver
							processor(JPORT0);//Port ilk acilis islemlerini yap ( gpio1_6 out 0 gibi )
							PortAyar0++;//sadece bir kerelik gir buraya dedik.
						}
						   ledyaksondur(JPORT0);//ledi yak sondur.

						}else if(line.equals("1")){
							   if( PortAyar1  == 0 ) {	
								   ulasmaIzni(gpioDeger1);
									processor(JPORT1);
									PortAyar1++;
								}
								   ledyaksondur(JPORT1);

						}else if(line.equals("2")){
							   if( PortAyar2  == 0 ) {
								   ulasmaIzni(gpioDeger2);
									processor(JPORT2);
									PortAyar2++;
								}
								   ledyaksondur(JPORT2);

						}else if(line.equals("3")){
							   if( PortAyar3  == 0 ) {
								   ulasmaIzni(gpioDeger3);
									processor(JPORT3);
									PortAyar3++;
								}
								   ledyaksondur(JPORT3);

						}else{
							System.out.println("ESLESMEDI");
						}

					}

			       System.out.println("cikti");

			} catch (Exception e) {
				System.out.println(e.toString());
			}

		} catch (Exception e) {
			// TODO: handle exception
		}
	}

public static void ledyaksondur(String PortNo) throws IOException{
	//dosya yazicimiz
	FileWriter outFile3 = new FileWriter("/sys/class/gpio/gpio"+PortNo+"/value");
	PrintWriter out3 = new PrintWriter(outFile3);

	//dosya okuyucumuz
	File dosya = new File("/sys/class/gpio/gpio"+PortNo+"/value");
	BufferedReader buf = new BufferedReader(new FileReader(dosya));

		String yazi = buf.readLine();//yaziyi okuyoruz
	 char[] stringArray;
	    stringArray = yazi.toCharArray();//karaktere ceviriyoruz
		//eslemi kontrol ediyoruz
	    if( stringArray[0] == '1' ){
			out3.println("0");//dosyaya 0 gonderiyoruz boylece lamba sonuyor
			out3.flush();
		}else if( stringArray[0] == '0' ){
			out3.println("1");
			out3.flush();
		}
		yazi = buf.readLine();//tekrar okuyoruz
			out3.close();//Soketi kapatiyoruz.

}

public static void ulasmaIzni (String gpioDeger) throws IOException, InterruptedException{
	//Linux terminalinde elimizle girmek yerine kendinin girmesini istedigimiz icin 
	//belirli portlarda echo 7 komutu istegi uzerine gelistirdigim bir kisim.
	Vector<String> commands=new Vector<String>();    
	commands.add("/bin/bash");    
	commands.add("-c");    
	commands.add("echo 7 > /sys/kernel/debug/omap_mux/gpmc_ad"+gpioDeger);//gpio bilgimizi atiyoruz. 
	ProcessBuilder p=new ProcessBuilder(commands);    
	Process process = p.start();  
	process.waitFor();
}

public static void processor(String PortNo) throws IOException, InterruptedException{

	FileWriter outFile1 = new FileWriter("/sys/class/gpio/export");	//dosya yazicimiz
	PrintWriter out1 = new PrintWriter(outFile1);
	Process p=Runtime.getRuntime().exec("chmod 777 /sys/class/gpio/export"); //dosyaya islem izni veriyoruz.
	p.waitFor();
		out1.println(PortNo);//pcden gonderilecek
		out1.flush();
		out1.close();

	FileWriter outFile2 = new FileWriter("/sys/class/gpio/gpio"+PortNo+"/direction");
	PrintWriter out2 = new PrintWriter(outFile2);
	Process p1 = Runtime.getRuntime().exec("chmod 777 /sys/class/gpio/gpio"+PortNo+"/direction"); 
	p1.waitFor(); 
		out2.println("out");
		out2.flush();
		out2.close();

	Process p3=Runtime.getRuntime().exec("chmod 777 /sys/class/gpio/gpio"+PortNo+"/value"); 
	p3.waitFor();

}

}

[/codesyntax]

Bilgisayarımız için geliştirdiğim kod:

joystickTest.java
[codesyntax lang=”php”]

package yazitahtasi_serial;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class MyJavaClass
{
	public static void main(String[] args) throws IOException, InterruptedException
	{// bizim yerimize terminal ekranından veri gondermesini ayarliyoruz.
		String cmd = "jstest /dev/input/js1";
		Process p3=Runtime.getRuntime().exec(cmd); 
		//sokete baglaniyoruz burada kendi beaglebone'unuzun IP'sini yazınız.
		Socket soket = new Socket("192.168.1.4", 8000);
		//soket yazicimiz
		PrintWriter out = new PrintWriter(new OutputStreamWriter(soket.getOutputStream()),true);

		BufferedReader buf = new BufferedReader( new InputStreamReader( p3.getInputStream() ) ) ;
		String line ;
		//sonsuza dek oku
		while ( (line = buf.readLine() ) != null ) 
		{	
			line = buf.readLine();
			 String [] strBuf = line.split(" ");//verimizdeki bosluklara göre parcalara boluyoruz ve
			 //boylece tam kısımları (0:on , 1:on gibi) elde etmiş oluyoruz.
			//tek tek okuyoruz boylece yakaladığımız an gonderiyoruz.
			 for(int m = 0 ; m < strBuf.length ; m++){
				String b= strBuf[m];

				if(b.equals("0:on") ){
					out.println("0");//veriyi gonder
					System.out.println("oldu");
				}else if(b.equals("1:on") ){
					out.println("1");
					System.out.println("oldu");
				}else if(b.equals("2:on") ){
					out.println("2");
					System.out.println("oldu");
				}else if(b.equals("3:on") ){
					out.println("3");
					System.out.println("oldu");
				}

			 }

		}
	}
}

[/codesyntax]

Ve sonucumuzu gözlemliyoruz.
SONUÇ:


Okuyan arkadaşlar bir sonraki yazıda nelere dikkat edip neler üzerinde yazılar yazmam hakkında bilgilendirirlerse
sizler için daha iyi olur. Herhangi yorum gelmediği için kendi düşüncelerim doğrulutusunda gidiyorum.  Teşekkür ederim arkadaşlar.

Bir başka makalede buluşmak dileğiyle kendinize iyi bakınız.

EDIT: Arkadaşlar yanlışlık ve dalgınlık ile LED ‘lerimizin bacaklarına 220 ohm’luk dirençlerimizi koymayı unutmuşum. Bu uyarıyı fazlasıyla dikkate alınız.
Teşekkürler 

______
Gökhan TARIM