JavaアプリケーションからArduino COMポートを操作する

樹液、Habr。 おそらく、arduinoを学び始めた人は、マイクロコントローラーとJavaアプリケーション間の情報の転送を簡単かつ迅速に編成する方法に興味を持つでしょう。 この束は、センサーからのデータの収集と処理、さまざまなホイッスルファートの管理、および最初のIoTプロジェクトの作成のための興味深い機会を開きます。

最近、インターネットで、非常に単純なJava-Arduino通信ライブラリに出会いました ここでこのトピックに関する出版物を見つけられなかったので、私はあなたと使用経験を共有することにしました。 作業には、インストールされたArduino IDEIntelliJ IDEAJava SE Development Kit 、そして実際にはマイクロコントローラー自体が必要です(私はAmperkaのLeonardoをベースにした中国のArduino NanoとStrelaでテストしましたが、両方とも完全に機能しました)。

タスクは簡単です-起動すると、マイクロコントローラーとのシリアル接続を確立し、無限ループでユーザーからの入力ラインを待機するコンソールアプリケーションを作成します。 入力した行に応じて、次のオプションが可能です。


マイクロコントローラーのスケッチ


スケッチを作成してArduino Nanoに読み込むことで、システムの構築を開始します。 あまり複雑ではありません。 「セットアップ」ブロックで、LEDとシリアルポートを使用してピンを設定し、「ループ」ブロックで、受信バイトのシリアルポートをリッスンします。 受信した値に応じて、この操作またはその操作を実行します。

スケッチのソースコード
/* №13       Uno, * Mega, Nano, Leonardo, Mini  . */ #define LED_PIN = 13 void setup() { // Serial-   9600 /c Serial.begin(9600); //       pinMode(LED_PIN, OUTPUT); } void loop() { //   Serial-   ()    if (Serial.available() != 0) { //     () byte b = Serial.read(); //   '1',    if (b == 49) digitalWrite(LED_PIN, HIGH); //   '0',    if (b == 48) digitalWrite(LED_PIN, LOW); } 


少し説明と注意を払うには、条件(b == 49)と(b == 48)をチェックするだけです。 理由がわからない場合は、ネタバレへようこそ:

生命、宇宙、その他すべての主要な質問に対する答え
シリアル接続を介してマイクロコントローラーに文字(Chr) '1'を送信する場合、 ASCIIエンコードが使用され 、文字 '1'は整数10進数値(Dec)49でエンコードされます。文字がマイクロコントローラーによって読み取られると、文字値は '1'にな​​りますb整数変数によって割り当てられたバイト。 つまり、実際には、変数bの値は49です。

この段階で確認するには、ポートの組み込みArduino IDEモニターから1と0を送信しますボードのLEDがオン/オフにならない場合は、スケッチでエラーを探します。

Javaアプリケーション


IntelliJ IDEAを実行して、新しいJavaプロジェクトを作成します。 動作させるには、2つの追加ライブラリjSerialComm-1.3.11.jarとarduino.jarを接続する必要があります。 ダウンロードしたjarアーカイブを追加する方法については、 こちらをご覧ください

アプリケーション全体は、単一のクラスで構成されます。

Javaソースコード
 import arduino.Arduino; import java.util.Scanner; public class AppMain { public static void main(String[] args) throws InterruptedException { Scanner scanner = new Scanner(System.in); Arduino arduino = new Arduino("COM52", 9600); boolean connected = arduino.openConnection(); System.out.println(" : " + connected); Thread.sleep(2000); label_1: while (scanner.hasNext()) { String s = scanner.nextLine(); switch (s) { case "on": arduino.serialWrite('1'); break; case "off": arduino.serialWrite('0'); break; case "exit": arduino.serialWrite('0'); arduino.closeConnection(); break label_1; default: System.out.println(s + " -   "); break; } } } } 

COMポートを操作するために、Arduinoクラスオブジェクトが作成されます。 コンストラクターは2つのパラメーターを取ります。

  1. 文字列portDescrition-COMポートの名前
  2. int baud_rate-ボーレート

これらのパラメーターはコンストラクターですぐに指定することをお勧めしますが、セッターを使用して個別に設定することもできます。 COMポートの名前は、Arduino IDEまたはデバイスマネージャーで表示できます。 ボーレートは、マイクロコントローラーのスケッチの「セットアップ」ブロックで指定されたものと一致する必要があります。この場合、9600 bps / sです。

 void setup() { // Serial-   9600 /c Serial.begin(9600); //       pinMode(LED_PIN, OUTPUT); } } 

次に、openConnection()メソッドを使用して接続を確立する必要があります。 接続が成功すると、メソッドはtrueを返します。 この値をコンソールに出力して、実行されたアクションが正しいことを確認します。

重要:接続を開いた後、Thread.sleep()メソッド(この場合は2000ミリ秒)を使用して一時停止する必要があります。 Arduino Nanoは、接続が確立された直後に送信される可能性のあるStrelaと比較して、本当に遅いことが判明しました。 コントローラーにさらに時間がかかる可能性があります。 したがって、接続が確立された場合、データは送信されますが受信されません。まず、一時停止値を増やします。

ここで、無限ループに入り、ユーザーからの入力を待ち始めます。

  label_1: while (scanner.hasNext()) { String s = scanner.nextLine(); switch (s) { case "on": arduino.serialWrite('1'); break; case "off": arduino.serialWrite('0'); break; case "exit": arduino.serialWrite('0'); arduino.closeConnection(); break label_1; default: System.out.println(s + " -   "); break; } } 

次の行を入力して「enter」を押すと、読み取られてString s変数に保存されます。 この行の値に応じて、switchステートメントはserialWrite(char c)メソッドを使用して文字「1」または「0」をマイクロコントローラーに送信します。 マイクロコントローラーがこれらの文字を受け取って整数変数に格納すると、49または48を取得することを忘れないでください。

一般に、次のArduinoクラスのオーバーロードメソッドを使用してデータを転送できます。

  1. public void serialWrite(String s);
  2. public void serialWrite(char c);
  3. public void serialWrite(String s、int noOfChars、int delay);
  4. public void serialWrite(char c、int delay);

ご覧のとおり、文字列全体、文字、および文字列の一部(noOfChars)を送信できます。 さらに、最後の2つの方法では、次の文字を送信した後に一時停止を指定できます。 ただし、文字列は文字ごとに送信されます(より正確には、ビットごとに送信されます)。 したがって、特定の値(接続されたサーボドライブを設置する必要がある角度など)を送信しない場合、1文字だけを送信する方が簡単です。

プログラムの最後で、close.connection()メソッドを使用してCOMポートを閉じることをお勧めします。これにより、プログラムを再起動したときに、COMポートがまだビジーであるという事実に関連するエラーを受信せず、ステートメントを使用して行入力を待っている無限ループを終了しますlabel_1ラベルで区切ります。これにより、対応するラベルが先行するループを終了できます。

 case "exit": arduino.serialWrite('0'); arduino.closeConnection(); break label_1; 

今日は以上です。 この記事がお役に立てば幸いです。 すぐに次の記述を試みます。これは、より応用的で機能的なアプリケーションの例を使用して、マイクロコントローラーからデータを送信するだけでなく、受信する可能性も考慮します。

Source: https://habr.com/ru/post/J340630/


All Articles