イチゴパイとArduino Bluetooth通信の実践
最近、農業ロボットのプロジェクトをしています.上位機はベリーパイ3 B、下位機はArduino Megaを採用しています.最初はUDPプロトコルでデータ交換をしていましたが、UDP伝送データが安定していないことがわかり、シリアル通信を使うことにしました.ベリーパイ3 BにBluetoothモジュールが統合されているので、すべてが簡単になりました.
まず、ベリーパイで環境構築を行い、次のコマンドを順次実行します.
次に、Bluetoothの構成を行います.次の2つの方法があります.
1.LXDEを使用している場合は、画面右下隅で直接Bluetoothを選択し、スキャンと接続を行います.一般的にHC-05とHC-06モジュールの初期Bluetoothパスワードは1234で、接続が完了します.このとき、BluetoothモジュールのLEDが急速に点滅して低速点滅になります.次のベリーパーティーでデバイスを自動的に接続するには、/dev/で適切なファイルを作成する必要があります.まず、このBluetoothの識別コードを確認し、マウスポインタを先ほど接続したBluetoothに配置します.つまり、接続したBluetoothの識別コードが表示され、コマンドラインを開き、次のように入力します.
このうち、00:14:01:10:10:32は先ほどのBluetooth識別コードで、実行後、ツリーベリーパイの/devディレクトリに/dev/rfcomm 0ファイルが作成されますが、ArduinoのBluetoothインジケータが点滅し、「未接続」を示し、ツリーベリーパイがBluetoothデバイスにメッセージを送信したときに接続操作を行います.
デバイスがバインドされているBluetoothデバイスをバインド解除することを示します.
注意:ここでBluetoothの識別コードを誤って記入し、/dev/rfcomm 0ファイルを削除できない場合は、新しいrfcomm 1ファイルを作成してバインドすることができます.$sudo rfcomm bind 1 00:14:01:10:10:32で、プログラムに/dev/rfcomm 1を接続すればいいです.
2.コマンドラインを使用している場合は、コマンドラインに次のbluetoothctlコマンドを入力するとBluetoothの構成環境に入ります.
Bluetoothの構成環境では、次のコマンドが一般的です.
ペアリング可能なBluetoothのスキャン
ペア識別コードが00:14:01:10:10:32のBluetoothデバイス
デバイスがペアリングされているデバイスの表示
ペアリングされたデバイスの削除
バインドが必要な場合は、Ctrl+Zを押してBluetoothの構成環境を終了し、上記の手順に従ってコマンドラインでbindまたはrelease Bluetoothデバイスを実行します.
注意:ここでBluetoothデバイスを接続すると、Bluetoothデバイスが低速点滅し、デバイスと接続されていることを示します.しかし、この場合はデータがなく、以下のpythonとArduinoプログラムを実行する場合にのみ、シリアルポートを開き、シリアルポートデータの送受信を行うことができます.
ペアリングが完了したらプログラムの作成を行います.まずArduinoのプログラムです.
次に、ベリーパイのプログラムです(ここではpy 2.7を使用してテストしています):
注意:上でバインドするときに「bind 1」を使用すると、ここのport=「/dev/rfcomm 1」になります.
まず、ベリーパイで環境構築を行い、次のコマンドを順次実行します.
sudo apt-get update
sudo apt-get install Arduino python-serial
sudo apt-get install bluetooth bluez python-bluez
次に、Bluetoothの構成を行います.次の2つの方法があります.
1.LXDEを使用している場合は、画面右下隅で直接Bluetoothを選択し、スキャンと接続を行います.一般的にHC-05とHC-06モジュールの初期Bluetoothパスワードは1234で、接続が完了します.このとき、BluetoothモジュールのLEDが急速に点滅して低速点滅になります.次のベリーパーティーでデバイスを自動的に接続するには、/dev/で適切なファイルを作成する必要があります.まず、このBluetoothの識別コードを確認し、マウスポインタを先ほど接続したBluetoothに配置します.つまり、接続したBluetoothの識別コードが表示され、コマンドラインを開き、次のように入力します.
$ sudo rfcomm bind 0 00:14:01:10:10:32
このうち、00:14:01:10:10:32は先ほどのBluetooth識別コードで、実行後、ツリーベリーパイの/devディレクトリに/dev/rfcomm 0ファイルが作成されますが、ArduinoのBluetoothインジケータが点滅し、「未接続」を示し、ツリーベリーパイがBluetoothデバイスにメッセージを送信したときに接続操作を行います.
sudo rfcomm release 0 00:14:01:10:10:32
デバイスがバインドされているBluetoothデバイスをバインド解除することを示します.
注意:ここでBluetoothの識別コードを誤って記入し、/dev/rfcomm 0ファイルを削除できない場合は、新しいrfcomm 1ファイルを作成してバインドすることができます.$sudo rfcomm bind 1 00:14:01:10:10:32で、プログラムに/dev/rfcomm 1を接続すればいいです.
2.コマンドラインを使用している場合は、コマンドラインに次のbluetoothctlコマンドを入力するとBluetoothの構成環境に入ります.
bluetoothctl
Bluetoothの構成環境では、次のコマンドが一般的です.
scan on
ペアリング可能なBluetoothのスキャン
pair 00:14:01:10:10:32
ペア識別コードが00:14:01:10:10:32のBluetoothデバイス
paired-devices
デバイスがペアリングされているデバイスの表示
remove 00:14:01:10:10:32
ペアリングされたデバイスの削除
バインドが必要な場合は、Ctrl+Zを押してBluetoothの構成環境を終了し、上記の手順に従ってコマンドラインでbindまたはrelease Bluetoothデバイスを実行します.
注意:ここでBluetoothデバイスを接続すると、Bluetoothデバイスが低速点滅し、デバイスと接続されていることを示します.しかし、この場合はデータがなく、以下のpythonとArduinoプログラムを実行する場合にのみ、シリアルポートを開き、シリアルポートデータの送受信を行うことができます.
ペアリングが完了したらプログラムの作成を行います.まずArduinoのプログラムです.
void setup()
{
pinMode(11, OUTPUT);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW);
Serial.begin(9600);
}
void loop() {
while (Serial.available())
{
char c = Serial.read();
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW); // (LED)
if (c == 'A')
{
Serial.println("B"); // A B
} else {
Serial.println("Please input [A]"); //
}
}
}
次に、ベリーパイのプログラムです(ここではpy 2.7を使用してテストしています):
import serial
import sys
port = "/dev/rfcomm0"
serial = serial.Serial(port,9600)
if len(sys.argv) > 1:
sendStr = sys.argv[1]
else:
sendStr = "A"
serial.write(sendStr)
serial.flushInput()
if serial.isOpen() == False:
serial.open()
line = serial.readline()
print line
注意:上でバインドするときに「bind 1」を使用すると、ここのport=「/dev/rfcomm 1」になります.