Подключите Bluetooth Raspberry Pi к H C -06 в эскизе обработки - PullRequest
2 голосов
/ 13 апреля 2020

У меня есть рабочая установка, в которой малиновый пи запускает эскиз загрузки без головы при загрузке. Этот эскиз соединяет встроенный Bluetooth Pi с H C -06. Pi также устанавливает последовательное соединение с Arduino Nano через USB-кабель. Эскиз обработки действует как реле. Он передает байты от Arduino к H c -06 и наоборот.

Устройство с H C -06 - это Arduino Nano. Это устройство отправляет сигнал квитирования, поэтому arduino на стороне Pi знает, что он подключен, и отправляет ответ.

Все это работает как брелок, но при одном условии. H c -06 должен быть включен перед загрузкой эскиза обработки. Если я включаю H C -06 слишком поздно или если я включаю / выключаю его, я не могу повторно подключиться, и эскиз обработки должен быть перезагружен.

Я хочу запрограммировать более продвинутый протокол дрожания рук с помощью функция тайм-аута. Таким образом, оба устройства будут знать, что соединение разорвано.

Я запускаю эскиз обработки с помощью сценария оболочки

sudo rfcomm bind hci0 20:14:04:15:23:75
sudo killall java
xvfb-run processing-java --sketch=/home/pi/Documents/bluetooth --run # runs headless

Команда rfcomm bind запускается только один раз при загрузке.

И скрипт Bluetooth:

import processing.serial.*;


Serial handController;
Serial central;

byte mode;

void setup()
{
    printArray(Serial.list());
    size(200,200);
    background(0); // black

    central = new Serial( this, Serial.list()[3], 115200);
    handController = new Serial( this , Serial.list()[0] , 115200 );
}

long prev;
byte tgl = 0;

void draw()
{

    if(handController.available() > 0) {
        int c = handController.read();
        println("            handcontroller:\t" + (char) c + "\t" + c); // as well char as dec value
        central.write(c);
    }
....

Возможно ли, что на этом эскизе я разрываю последовательное соединение с rfcomm0, а затем перезапускаю его?

Кажется, что это линия устанавливает соединение Bluetooth.

handController = new Serial( this , Serial.list()[0] , 115200 ); // rfcomm0

Я не очень знаком с java. Как я могу уничтожить серийный объект? И могу ли я сделать «новый» во второй раз из функции?

С уважением,

Bas

1 Ответ

2 голосов
/ 13 апреля 2020

Вы можете использовать метод Serial's stop() для закрытия последовательного соединения. Затем вы можете заново инициализировать порт по мере необходимости.

Вот грубый (непроверенный пример):

void restartSerialPort(Serial reference,String portName, int baudRate){
  // pause rendering (draw loop)
  noLoop();
  // stop previous connection
  if(reference != null){
    reference.stop();
    reference = null;
  }
  // start connection anew
  try{
    reference = new Serial( this, portName, baudRate);
  }catch(Exception e){
    println("error opening serial port: " + portName);
    e.printStackTrace();
  }
  // resume rendering
  loop();
}

Имейте в виду, что это нужно проверить / настроить: я не 100 % переданная ссылка будет легко обновляться (в противном случае новый объект Serial, вероятно, должен быть возвращен методом и переназначен исходной ссылке).

Кроме того, для обработки не требуется среда управления окнами, поэтому он не совсем безголовый.

В качестве быстрой альтернативы чисто командной строке вы можете посмотреть на Python и pyserial module

...