【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機器を認識する。
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度点滅するようになっているはず。
コメント
コメントを投稿