【android】usb-serial-for-android その2

前回その1 

https://funasover.blogspot.com/2025/02/usb-serial-for-android.html

でやった事を再度、具体的に例示示しながら。



新規でEnpty View Activityを開く。ちなみに、古いStudioのEnpty ActivityとEnpty View Activityは一緒の内容。古いサイトなどを参考にする時には気にしておく。

言語をJavaにして、Groovyを選択して自動生成する。


settings.gradleを開いて、maven { url 'https://jitpack.io' }を追記する。


guild.gradle(Module)の方を開いて、
 implementation 'com.github.mik3y:usb-serial-for-android:3.8.1'
の一行をdependenciesの所に追加

からダウンロードしたファイルのxmlのフォルダーにあるdevice_filter.xmlをプロジェクトres/xmlにコピー&ペースト。ドラッグすると移動する。
usb-serial-for-android-master\usbSerialExamples\src\main\res\xml




AndroidManifest.xmlを開いて、以下<intent-filter>・・・をコピーする。device_filter.xmlの部分はコピーしたファイル名にあわせる。



<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />

ここまで来たら、一度buildしてみてエラーがないか確認。
問題なければエラーは起きない。

これで一通りは、usb-serial-for-androidを取り込む所までできているはず・・・
確認のために、
MainActivityを編集する。
テストのために、onCreateの部分に以下のように、UsbManager・・・以下の4行を追加してみる。
最初、UsbManagerの部分は、usb-serial-for-androidではないので、そのまま行けるはず

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
return;
}

最初は、UsbSerilaDriverの部分が着色される。これImportを記載していないからで、カーソルを寄せて、Import classでインポートすると文字の色が変わる。同じようにUsbSerialProberの部分もインポートをかける。

これでBuildが通るはずで、usb-serial-for-androidを取り込んで最低限の構成をつくったことになる。

もう少しコードを足す。 https://github.com/mik3y/usb-serial-for-androidのReadMEのまんまだが、driver.getPorts().get(0)で見つけたデバイスを接続するところまで。

// Open a connection to the first available driver.
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
// add UsbManager.requestPermission(driver.getDevice(), ..) handling here
return;
}

UsbSerialPort port = driver.getPorts().get(0); // Most devices have just one port (port 0)
try{
port.open(connection);
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
}
catch(IOException e){
e.printStackTrace();
}

ここまでもコンパイルしてもエラーはないはず。
これを実機で走らせる。アンドロイドとPCを繋いでいたUSBケーブルをいったん抜いてOTGのUSBケーブルを通じて、Arduino (中身は何も入っていなくてもOK)を接続する。と、”USBデバイス用アプリを選択”という画面が出て、1回、常時か選択するダイヤログが立ち上がってくれ、USB機器を認識する。


やっと目的のAndroidからシリアル通信で文字を送りだしてみる。
activity_main.xmlの編集(HelloのTextViewはすでにあるので、ボタンを追加して、それぞれidを投入)
Button button1  = (Button) findViewById(R.id.id_button);

button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
TextView tv =findViewById(R.id.id_serial_text);
tv.setText("Clicked");
try {
port.write("1".getBytes("UTF-8"),1);
} catch (IOException e) {
throw new RuntimeException(e);
}
tv.setText("send serial text");
}
});
それから上のコードをさらに下に追記。

Arduino側も準備する。
スケッチは適当。なんか受信したら2度点滅する。それ以外は消えているというもの。13番ピンでオンボードのLEDを点灯させる(Nanoの互換機を使っている)ボーレートは、上で設定した115200に合わせる。
void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  if (Serial.read() == -1) {
    digitalWrite(13, LOW);
  } else {
    digitalWrite(13, HIGH);
    delay(250);
    digitalWrite(13, LOW);
    delay(250);
    digitalWrite(13, HIGH);
    delay(250);
    digitalWrite(13, LOW);
    delay(250);
  }
  digitalWrite(13, LOW);
}


先ほどを同じく、OTGケーブルでArduinoを接続すると、
ダイヤログが立ち上がるので、作ったアプリを指定、1回だけ
これでボタンを押す度に2度点滅するようになっているはず。








コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

ILI9341 240X320 Arduino