Android IOIO で LEDチカチカ + シリアル通信してみた

どもー(´ω`)ノ Ramencozoです
現実逃避気味+食べてないボードの処理的な意味でAndroidIOIO動かしてみました(^p^)

前回IOIOを購入したのち放置だったので、とりあえず下記2点にチャレンジ

・IOIOボード上のLEDチカチカ
・UARTを使用してPCとシリアル通信

LEDチカチカについては橋本商会さんのIOIO for AndroidでLEDピコピコ光らせるな記事の内容をまるまるヤッてみたっていうソレです(´ω`)

下準備として、IOIO for Android Beginners Guide – SparkFun ElectronicsにあるIOIOを扱うライブラリIOIOLib.zipを拾ってきます。
このまま自分のプロジェクトからIOIOLibを参照するようにしてもいいのですが、自分はコレを

  1. zip解凍
  2. eclipseのworkspaceにimport
  3. プロジェクトをまるごとIOIOLib.jarとしてアーカイブ

ていう風にまとめまして、そののちプロジェクトフォルダ内に置いてReferenced Librariesとして設定するようにしてます。(別プロジェクトでIOIO使うときでもIOIOLib.jarコピって云々なソレで)

てなワケでソースコード+AndroidManifest.xml。ほぼ橋本商会さんのソース(LED_Blink)をベースにしています。とりあえずLED光らせたかったのでボード上のオレンジLED一個だけ制御するようにしてます。
AndroidManifestはPermissionにandroid.permission.INTERNETつけるとこに注意するくらいなものです。(IOIO-Android端末間で行うadbの通信にそのPermission必要とのことらしいです。)

2011/11/30 14:50 追記:
ナニゲにActivityではなくAbstractIOIOActivityをextendsしてるあたりでやや引っかかりました 見落としorz


HelloIOIO / HelloIOIOActvity.java

package jp.ramensroom.helloioio;

import ioio.lib.api.DigitalOutput;
import ioio.lib.api.IOIO;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.util.AbstractIOIOActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import android.widget.ToggleButton;

public class HelloIOIOActivity extends AbstractIOIOActivity {

private ToggleButton switchButton;

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

switchButton = (ToggleButton)findViewById(R.id.switchButton);
switchButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(switchButton.isChecked()){
Toast.makeText(getApplicationContext(), "LED ON", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "LED OFF", Toast.LENGTH_SHORT).show();
}
}
});
}

class IOIOThread extends AbstractIOIOActivity.IOIOThread{
private DigitalOutput led;

protected void setup() {
try {
led = this.ioio_.openDigitalOutput(IOIO.LED_PIN, false);
} catch (ConnectionLostException e) {
e.printStackTrace();
}
}

protected void loop(){
try {
led.write(!switchButton.isChecked());
sleep(10);
} catch (ConnectionLostException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

@Override
protected AbstractIOIOActivity.IOIOThread createIOIOThread() {
return new IOIOThread();
}
}

HelloIOIO / AndroidManifest.xml












HelloIOIO / R.layout.main.xml



[f:id:ramencozo:20111130135448p:image:w400]

以上のコードで実行した結果が下写真になります。

LEDがOFFの状態です。

Acivity内のToggleButtonをタップするとボード中央のオレンジのLEDが点灯します。
押すたびにON-OFF状態が変化します。

ひとまずLEDチカチカは成功しましたヾ(´ω`)ノシ

次にUARTでのシリアルポート通信のテストです。下記もろもろ示します。


HelloIOIOUART / HelloIOIOUARTActvity.java

package jp.ramensroom.helloioiouart;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import ioio.lib.api.DigitalOutput;
import ioio.lib.api.IOIO;
import ioio.lib.api.Uart;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.util.AbstractIOIOActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class HelloIOIOUARTActivity extends AbstractIOIOActivity {

private static final int UART_TX_PIN = 3;
private static final int UART_RX_PIN = 9;

//IOIOThreadからUIを書き換えるためのHandler用
private static final int MESSAGE_RECEIVE = 1;

private EditText txEditText;
private TextView rxTextView;

private Button sendButton;
private Uart uart;
private InputStream input;
private OutputStream output;

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

txEditText = (EditText)findViewById(R.id.txEditText);
rxTextView = (TextView)findViewById(R.id.rxTextView);

sendButton = (Button)findViewById(R.id.sendButton);
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String msg = txEditText.getText().toString();
txEditText.setText(""); //Data投げたあとにEditText内に文字残るのイヤなので
try {
output.write(msg.getBytes()); //データ+改行文字送信
output.write('\r');
output.write('\n');
} catch (IOException e) {
e.printStackTrace();
}
}
});
}

class IOIOThread extends AbstractIOIOActivity.IOIOThread{
private DigitalOutput statusLED;

protected void setup() {
try {
//とりあえず動いてるか確認用
statusLED = this.ioio_.openDigitalOutput(IOIO.LED_PIN, true);
statusLED.write(true);

uart = this.ioio_.openUart(UART_RX_PIN, UART_TX_PIN, 115200, Uart.Parity.NONE, Uart.StopBits.ONE);
input = uart.getInputStream();
output = uart.getOutputStream();
} catch (ConnectionLostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

protected void loop(){
try {
int availableBytes = input.available(); //データ受信してるかチェック
if(availableBytes > 0){
byte[] data = new byte[1024]; //ノリで1024くらい確保
input.read(data, 0, availableBytes);
char[] tmp01 = (new String(data, 0, availableBytes)).toCharArray();
String tmp02 = new String(tmp01);

//UIのTextViewに受信データ表示させるため、HandlerにStringデータ投げる
mHandler.obtainMessage(MESSAGE_RECEIVE, tmp02).sendToTarget();
}
sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

@Override
protected AbstractIOIOActivity.IOIOThread createIOIOThread() {
// TODO Auto-generated method stub
return new IOIOThread();
}

//IOIOThreadのloop()から受信データ飛んできた時にUI書き換えるためのソレ
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_RECEIVE:
String rxData = (String)msg.obj; //データ取得
rxTextView.setText(rxData); //TextView書き換え
break;
}
}
};
}

HelloIOIOUART / AndroidManifest.xml












HelloIOIOUART / R.layout.main.xml












実行してみたのが下写真です。Txポート(3番ピン)とRxポート(9番ピン)を直接つないでループバックするような構成にしてます。


先頭バイトは処理遅れのためか切れちゃうことが多いみたいですね…通常の使い方ではループバックほど送信処理と受信処理のタイミングはカブらないハズですが、データのエラーチェックはソフト的にやっといたほうが良さげですね。

とまぁひとまず今回のボードいじりはこんな感じで。次はSPI通信あたりを狙いにしてくつもりです(´ω`)ノそれではまたー

2011/11/30 14:37 追記:
IOIOのご本家サイトにて各種情報載ってるのでリンク置いてきますね。
IOIO Wiki
ほか自分が参考にさせて頂いたサイト様などどうぞー
IOIO for AndroidでLEDピコピコ光らせる
・GoogleグループのIOIO-UsersからSerial / UART Communication (2-way)UART and GPS Example