最近、インターネットで、非常に単純なJava-Arduino通信ライブラリに出会いました。 ここでこのトピックに関する出版物を見つけられなかったので、私はあなたと使用経験を共有することにしました。 作業には、インストールされたArduino IDE 、 IntelliJ IDEA 、 Java SE Development Kit 、そして実際にはマイクロコントローラー自体が必要です(私はAmperkaのLeonardoをベースにした中国のArduino NanoとStrelaでテストしましたが、両方とも完全に機能しました)。
タスクは簡単です-起動すると、マイクロコントローラーとのシリアル接続を確立し、無限ループでユーザーからの入力ラインを待機するコンソールアプリケーションを作成します。 入力した行に応じて、次のオプションが可能です。
- 「オン」-マイクロコントローラーにはLEDが組み込まれています。
- 「オフ」-マイクロコントローラーは内蔵LEDをオフにします。
- 「終了」-マイクロコントローラーが内蔵LEDをオフにし、アプリケーションが終了します。
マイクロコントローラーのスケッチ
スケッチを作成して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つのパラメーターを取ります。
- 文字列portDescrition-COMポートの名前
- 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クラスのオーバーロードメソッドを使用してデータを転送できます。
- public void serialWrite(String s);
- public void serialWrite(char c);
- public void serialWrite(String s、int noOfChars、int delay);
- 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;
今日は以上です。 この記事がお役に立てば幸いです。 すぐに次の記述を試みます。これは、より応用的で機能的なアプリケーションの例を使用して、マイクロコントローラーからデータを送信するだけでなく、受信する可能性も考慮します。