Pi4Jライブラリを使用して加速度計をRaspberry Piに接続する

まえがき



こんにちは、Habr! つい最近、彼らは私をロボットクラブに連れて行った。 もちろん、私は喜んで同意しました、これは新しい経験であり、すべてです...さらに、私は新入生です。 私の先生は、私に一般的な概念を説明して、Raspberry Piで働くことを申し出ました。 それを操作する方法を見つけ、それにJDKをインストールし、3軸加速度計からの指示を表示するプログラムを作成する必要がありました。 必要なものをすべて取り出して、家に帰って整理しました。 終わったとき(約1週間かかりました)、私は1か所で掘るすべてを収集するために、私と同じアドレスのガイドを書くことにしました。 さて、あなたの読書をお楽しみください!



最初に



まず、デバイスにアクセスする必要があります。 SSHプロトコルを使用して接続します。 デフォルトでは、SSHサーバーは無効になっています。有効にするには、Raspberryをモニターまたはテレビに接続し、キーボードとマウスを接続します。 もちろん、ネットワーク環境をスキャンしてデバイスを特定し、見つかったIPを使用して接続できますが、バージョンに応じて実行することをお勧めします。 ターミナルをロードした後、起動し、コマンドsudo raspi-configを入力します。 開いたメニューで、詳細オプション-> SSHに移動し、有効化を選択します。 これらの操作の後、次のウィンドウが表示されます。



画像



いいね! これで、いつでも「ラズベリー」に接続できます。 ネットワーク設定をすぐに書きましょう。 必要なファイルは/ etc / network /ディレクトリにあり、 cd / etc / networkコマンドを使用してそこに移動します 。 次に、 sudo nano interfacesを入力して、目的のファイルを開きます 。 ここで、対応する行にデータを書き込み、静的IPアドレスを設定します。 次のようなものが得られるはずです。



画像



その後、CTRL + X、Y、Enterを押します。 接続するのはこのアドレスです。 次に、 SSHクライアント-PuTTYをダウンロードします。 プログラムを実行すると、次のウィンドウが表示されます。



画像



ここで、[ホスト名]フィールドに、インターフェイスで登録したものと同じIPを書き込みます。 [セッションの保存]フィールドに名前を入力して[保存]をクリックすると、設定を保存できます。 開くをクリックします。 PuTTYがSSHサーバーに接続するとすぐに、ウィンドウが開き、資格情報プロンプトが表示されます(デフォルトでは、ユーザー:pi、パスワード:raspberry):



画像



入力時にパスワードが表示されないことを心配しないでください; Linuxのようなシステムでは、パスワードは表示されませんが、入力は発生します。 Enterキーを押します。 すべてがうまくいった場合、次のウィンドウが表示されます。



画像



このコンソールでは、任意のコマンドを実行でき、デバイス自体で実行されます。 便利ですか?



JDKをインストールする



ここではすべてが非常に簡単です。 ターミナルでsudo apt-get updateと入力して、パッケージリストを更新します。



画像



sudo apt-getアップグレードシステム自体を更新します



画像

これにはかなり時間がかかることがあるので(この更新には約30分かかりました)、お茶を買いだめします。 JDKパッケージがパッケージのリストに追加され、タンバリンと踊る必要がなかったという大きな力に感謝します。 パッケージをインストールするには、単にsudo apt-get install openjdk-7-jdkと入力します。



パフォーマンスをテストするために、java -versionを導入します。 次のようなものが表示されるはずです。



画像



PS一部のマシンでは、システムがJDKパッケージを見つけられないために問題が発生する場合があります。 Debianの「wheezy」カーネルとjavaの非互換性が原因で発生します。 Javaで動作するように最適化されたDebian「wheezy」ソフトフロートにOSを再インストールしてみてください。 いずれにせよ、すべてが初めて「ラズベリー」に落ちました。 これが私のバージョンです:



画像



I2c対Raspberry PI



楽しみが始まりました! 始めるために、すべてが何であるかを理解しましょう。 偉大で強力なウィキペディアはこう言います:

I²C(ロシア語ai-tu-si / and-two-tse / and-two-si)は、2つの双方向通信回線(SDAおよびSCL)を使用した集積回路の通信用のシリアルデータバスです。 低速の周辺機器コンポーネントをマザーボード、組み込みシステム、および携帯電話に接続するために使用されます。 この名前は、Inter-Integrated Circuitの頭字語です。



私の仕事では、このLSM303DLMデバイスを使用します。将来的にはすべての例が表示されます。 以下に接続図を描きました。



画像



それは非常に単純であり、説明を必要としないと思います。 続けましょう。 そうです、すぐにモジュールの起動を担当するファイルに数行を追加しましょう。 コマンドラインでsudo nano / etc / modulesを書き、そこに追加します:



i2c-bcm2708

i2c-dev



画像



次に、i2c-toolsパッケージをインストールします。 ターミナルで次のように記述します: sudo apt-get install python-smbusおよびsudo apt-get install i2c-tools

ブラックリストの編集。 これを行うには、sudo nano /etc/modprobe.d/raspi-blacklist.confを記述します。 行を追加します。



ブラックリストspi-bcm2708

ブラックリストi2c-bcm2708



画像



それだけです I2Cを使用するためのすべての基本事項を完了しました。次に、デバイスが表示されるかどうかを確認しましょう。 i2cdetectコマンドには、必要なi2cdetectコマンドが含まれています。 ただし、最初に、ドライバーが正常にインストールされていることを確認してください。 ターミナルi2cdetect –lに書き込みます。 次が表示される場合:



画像



その後、すべてが順調です、あなたは先に進むことができます。 ここで、 i2cdetect –y 1i2cdetect –y 0 )と記述します。 アドレスラティスが表示されます。



画像



私の場合、加速度計のアドレスは0x18です(たとえば、ドキュメントで確認できます)。 次に、PI4Jについて説明しましょう。



すごいすごいすごい...



JAVAを使用してI2Cを操作するには、追加のPI4Jライブラリをダウンロードしてインストールする必要があります。 ここでそれについて読んでください 。 ターミナルwget pi4j.googlecode.com/files/pi4j-0.0.5.debに書き込んでダウンロードします。 sudo dpkg -i pi4j-0.0.5.debと書いてインストールします。 インストールされているファイルを確認します。



画像



プログラムをコンパイルするには、次のように記述します。



javac -classpath .:クラス:/ opt / pi4j / lib / '*'(名前)



実行するには:

sudo java -classpath .:クラス:/ opt / pi4j / lib / '*'(名前)



すべてのパッケージのうち、3つが便利です。



import com.pi4j.io.i2c.I2CBus; import com.pi4j.io.i2c.I2CDevice; import com.pi4j.io.i2c.I2CFactory;
      
      







クラスI2CDeviceおよびI2CBusのオブジェクトへの参照を作成します。



 import java.io.IOException; import com.pi4j.io.i2c.I2CBus; import com.pi4j.io.i2c.I2CDevice; import com.pi4j.io.i2c.I2CFactory; public class accelerometrOne { static I2CDevice device; static I2CBus bus; static byte[] accel; public static void main(String[] args) throws IOException { System.out.println("Starting sensors reading:"); try { bus = I2CFactory.getInstance(I2CBus.BUS_1); System.out.println("Connected to bus OK!"); device = bus.getDevice(0x18); System.out.println("Connected to device OK!"); } catch (IOException e) { System.out.println(e.getMessage()); } } }
      
      







コードを分析しましょう。 ラインバス= I2CFactory.getInstance(I2CBus.BUS_1); バスに接続し、 device = bus.getDevice(0x18)を使用します。 デバイスに接続しています。



次に、加速度計を較正する必要があります。 ドキュメントに登ります



画像



誰もが英語のすべてが良くない。 私の無料翻訳では、「LSM303DLHをオンにした後、2つのレジスタCTRL_REG1_A(20h)とCTRL_REG2_A(23h)を使用してデバイスを構成する必要があります。 これを行うには、50Hz ODRでの通常動作用に最初のレジスタに0x27を書き込みます。



データベースの継続的な更新で測定の全範囲+-2ガウスを保持し、バイトの順序を低から高に大きさの順序で高から低に変更するために、2番目のレジスタに0 * 40を書き込みます。



デバイスにデータを書き込むには、 I2CDeviceクラスのwriteメソッドを使用します 。 プログラムを追加しましょう:



 import java.io.IOException; import com.pi4j.io.i2c.I2CBus; import com.pi4j.io.i2c.I2CDevice; import com.pi4j.io.i2c.I2CFactory; public class accelerometrOne { static I2CDevice device; static I2CBus bus; static byte[] accel; public static void main(String[] args) throws IOException { System.out.println("Starting sensors reading:"); try { bus = I2CFactory.getInstance(I2CBus.BUS_1); System.out.println("Connected to bus OK!"); device = bus.getDevice(0x18); System.out.println("Connected to device OK!"); device.write(0x20, (byte) 0x27); device.write(0x23, (byte) 0x40); System.out.println("Configuring sensors OK!"); } catch (IOException e) { System.out.println(e.getMessage()); } }
      
      







素晴らしい!!! デバイスからデータを読み取るために残ります。 もう一度ドキュメントに目を向けると、データが軸ごとに2バイトずつ与えられていることがわかります。

画像



まあ、それだけです。 受信したバイトを配列に書き込み、画面にデータを表示します。



 import java.io.IOException; import com.pi4j.io.i2c.I2CBus; import com.pi4j.io.i2c.I2CDevice; import com.pi4j.io.i2c.I2CFactory; public class accelerometrOne { static I2CDevice device; static I2CBus bus; static byte[] accel; public static void main(String[] args) throws IOException { System.out.println("Starting sensors reading:"); try { bus = I2CFactory.getInstance(I2CBus.BUS_1); System.out.println("Connected to bus OK!"); device = bus.getDevice(0x18); System.out.println("Connected to device OK!"); device.write(0x20, (byte) 0x27); device.write(0x23, (byte) 0x40); System.out.println("Configuring sensors OK!"); readingsensors(); } catch (IOException e) { System.out.println(e.getMessage()); } } private static void readingsensors() throws IOException { while (true) { accel = new byte[6]; accel[0] = (byte) device.read(0x28); accel[1] = (byte) device.read(0x29); accel[2] = (byte) device.read(0x2a); accel[3] = (byte) device.read(0x2b); accel[4] = (byte) device.read(0x2c); accel[5] = (byte) device.read(0x2d); int accelx = asint(accel[0]) * 256 + asint(accel[1]); int accely = asint(accel[2]) * 256 + asint(accel[3]); int accelz = asint(accel[4]) * 256 + asint(accel[5]); System.out.println("accelx: " + accelx + ", accely: " + accely + ", accelz: " + accelz); } } private static int asint(byte b) { int i = b; if (i < 0) { i = i + 256; } return i; } }
      
      







その結果、起動後、次のようなものが表示されます。



画像







All Articles