Beaglebone ile bir başka projede merhaba diyerek başlamak istiyorum. Beaglebone üzerinde ne yapılabilir gibisinden düşünürken bi anda GPIO ‘ları java üzerinden networkte kontrol edebilirmiyim ? diyerek kendime sordum ve bunu sizin için gerçekleştirdim.

Başlangıç olarak ortamımızı tanıtayım.

Gördüğünüz üzere Beaglebone’umuz Debug ve kontrol işlemleri için usb ile bilgisayara , network işlemleri için ethernet üzerinden modeme bağlıdır. Telefonumuzda wifi destekleyen android işletim sistemli bir telefon olup , modeme login modundadır.

Yapacağımız işlem Android destekleyen bir telefondan TCP/IP yoluyla beaglebone ‘umuza bir veri gonderip GPIO ları uyarmak.

İlk olarak beagle’ımızda

ifconfig eth0
diyoruz ve IP ‘mizi öğreniyoruz.

Gördüğünüz üzere 192.168.0.13 olduğunu gördük. Not ediyoruz bir yere.

Şimdi devreyi kuralım ;
Malzemeler : 1 adet 220 ohm direnç ve 1 adet led

Devre:

Devam edecek olursak Eclipse’yi açıyoruz ve kodlarımızı yazıyoruz.

beaglebone.java
_______________________________________________
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.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.sound.sampled.Port;

public class beaglebone {
public static final int PORT = 8000;//PORT NO
public static void main(String[] args) throws IOException {
//Sunucu soketi aciliyor.
ServerSocket sunucuSoketi = new ServerSocket(PORT);
System.out.println(“sunucu baslatildi”);

try {
//Baglantiyi gelene kadar bekle ve kabul et
Socket kullaniciSoketi = sunucuSoketi.accept();

try {

System.out.println(“Baglanti kabul edildi : “+ kullaniciSoketi);

BufferedReader bufci = new BufferedReader(//Yazilacak yazici guclendirir.
new InputStreamReader(//8 – ASCII donusumu yapar.
kullaniciSoketi.getInputStream()));//Gonderici ile baglanti.

//Gonderilen veriyi oku (38)
String PortNo = bufci.readLine();
Thread.sleep(100);//100ms bekle

// Dosya ile yazicisiyla baglati kurar.
FileWriter outFile1 = new FileWriter(“/sys/class/gpio/export”);
// Yazici tanimlanmasi
PrintWriter out1 = new PrintWriter(outFile1);
// Terminalde kod calistirir.
// Klasore yazma okuma yetkisi veriyoruz.
Process p=Runtime.getRuntime().exec(“chmod 777 /sys/class/gpio/export”);
p.waitFor(); //Islemin bitmesini bekliyoruz.
out1.println(PortNo);//PORT NO ‘yu Soket uzerinden gonderir.
out1.flush(); // Islemi tamamlama
out1.close(); // Out1 yazici soketini kapatir.

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”);
p.waitFor();
out2.println(“out”);
out2.flush();
out2.close();

FileWriter outFile3 = new FileWriter(“/sys/class/gpio/gpio”+PortNo+”/value”);
PrintWriter out3 = new PrintWriter(outFile3);
Process p3=Runtime.getRuntime().exec(“chmod 777 /sys/class/gpio/gpio”+PortNo+”/value”);
p.waitFor();

/*Burada sonsuz dongu elde etmeye calistim. Ancak while(true)
yada bilimumlari sorunu cozmez cunku soket close sorunu almaya
baslariz. Burada kucuk bir hile yaptik*/

int x =1 ;
while(x != 2){
out3.println(1);//1 verisini gonderiyoruz.
out3.flush();//tamamliyoruz.
Thread.sleep(200);//bekletiyoruz.
out3.println(0);//0 verisini gonderiyoruz.
out3.flush();//tamamliyoruz.
Thread.sleep(200);//bekletiyoruz.

}
out3.close();//Soketi kapatiyoruz.

} catch (Exception e) {
System.out.println(“Hata : “+e.toString());//Hatalari algiliyoruz.
}

} catch (Exception e) {
System.out.println(“Hata : “+e.toString());//Hatalari algiliyoruz.
}
}

}
________________________________________________

Yazım hatası olup olmadığını görüyoruz. yazdığımız kodu bir bos text dosyasına kopyalıyoruz ve beaglebone.java olarak kaydediyoruz.
Devamında dosyayı atabilmemiz için https://gokhantarim.wordpress.com/2012/10/22/beaglebone-java-kurulum-ve-sftp-ile-yonetim/ burada anlattığım yolla dosyamızı atıyoruz.

Şimdi Android kısmını yazmaya başlıyoruz. CTRL+N diyerek yeni bir proje açmaya başlıyoruz.

Devamında

Next dedikten sonra Next->Next->Finish diyoruz ve projemize devam ediyoruz.
İlk olarak layout->activity_main.xml i açıyoruz ve kompanentlerimizi ekrana sürüklüyoruz.

Daha sonra values->string.xml ‘imizi açıyoruz ve kompanentlerimize yazacağımız yazıları

aynı işlemi birkez daha yapıyoruz.
Name: ledyak
Value:Led’i
Daha sonra kaydet diyerek String.xml ‘i kapatıyoruz.

Şimdi gelelim kompanentlerimize bu yazdıklarımızı dahil etmeye;

bu işlemide yapıyoruz ve kaydediyoruz.

Şimdi MainActiviy.java ya yazacaklarımıza gelelim.

MainActivity.java
___________________________________
package com.androidtobeagle.tcp_ip;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.StrictMode;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//activity_main.xml ‘e eklediğimiz kompanentleri gerçekliyoruz.
Button buton = (Button)findViewById(R.id.button1);
TextView text =(TextView)findViewById(R.id.textView1);

//butona basılma interrupt’ımızı koyuyoruz.
buton.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
try {
//Soketimizi açıyoruz ve istek gönderiyoruz.
Socket soket = new Socket(“192.168.0.13”,8000);
//Soket üzerinden yazacak olan yazıcımızı oluşturuyoruz.
PrintWriter out = new PrintWriter(new OutputStreamWriter(soket.getOutputStream()),true);
//Ağ üzerinden GPIO bilgimizi gönderiyoruz.
out.println(“38”);

} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
/*Android version 9 ‘dan sonraki sürümlerde Thread hatası
almamız mümkün kılınıyor. Bunu bu metodla aşıyoruz.*/
if (android.os.Build.VERSION.SDK_INT > 9) {

StrictMode.ThreadPolicy policy =

new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}

_______________________________

Bunuda kaydettikten sonra AndroidManifest.xml ‘e ağa çıkma izinlerimizi ekliyoruz ve işlemimizi tamamlıyoruz.

AndroidManifest.xml
______________

<manifest xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
package=”com.androidtobeagle.tcp_ip”
android:versionCode=”1″
android:versionName=”1.0″ >

<uses-sdk
android:minSdkVersion=”8″
android:targetSdkVersion=”15″ />
<uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />
<uses-permission android:name=”android.permission.INTERNET” />

<application
android:icon=”@drawable/ic_launcher”
android:label=”@string/app_name”
android:theme=”@style/AppTheme” >
<activity
android:name=”.MainActivity”
android:label=”@string/title_activity_main” >
<intent-filter>
<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
</application>

</manifest>

———————————

Ve kaydet dedikten sonra artık işlemimiz bitmiş bulunmaktadır. Sıra geldi test etmeye.
ilk olarak beaglebone ‘umuzda dosyayı attığımız dosyaya giderek ;
javac beaglebone.java
java beaglebone
diyoruz ve böylece server ‘imizi başlatıyoruz ardından eclipseye girerek Run ‘liyoruz.
ve aygıtımızı göstererek işlemi tamamlıyoruz

Sonuç :