Как получить выходную мощность для дальномера LV-MaxSonar LV-EZ0 с Android Things? - PullRequest
0 голосов
/ 13 мая 2018

Я использую этот датчик с Raspberry Pi B 3 и Android Things 1.0

У меня это подключено согласно этим инструкциям

spec для его вывода предполагает, что я должен получить "ASCII заглавную" R ", за которой следуют три цифры ASCII-символа, представляющие диапазон в дюймах, максимум 255, за которым следует возврат каретки ( ASCII 13) "

Я подключился к устройству и настроил его следующим образом (я думаю, что параметры подключения соответствуют «Serial, 0 to Vcc, 9600 бод, 81N» в этой спецификации):

    PeripheralManager manager = PeripheralManager.getInstance();
    mDevice = manager.openUartDevice(name);
    mDevice.setBaudrate(9600);
    mDevice.setDataSize(8);
    mDevice.setParity(UartDevice.PARITY_NONE);
    mDevice.setStopBits(1);
    mDevice.registerUartDeviceCallback(mUartCallback); 

Я читаю из его буфера в этом обратном вызове следующим образом:

public void readUartBuffer(UartDevice uart) throws IOException {


    // "The output is an ASCII capital “R”, followed by three ASCII character digits
    // representing the range in inches up to a maximum of 255, followed by a carriage return
    // (ASCII 13)

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    final int maxCount = 1024;
    byte[] buffer = new byte[maxCount];
    int total = 0;
    int cycles = 0;

    int count;
    bout.write(23);
    while ((count = uart.read(buffer, buffer.length)) > 0) {
        bout.write(buffer, 0, count);
        total += count;
        cycles++;
    }
    bout.write(0);

    byte[] buf = bout.toByteArray();

    String bufStr = Arrays.toString(buf);
    Log.d(TAG, "Got " + total + " in " + cycles + ":" + buf.length +"=>" + bufStr);
}

private UartDeviceCallback mUartCallback = new UartDeviceCallback() {
    @Override
    public boolean onUartDeviceDataAvailable(UartDevice uart) {
        // Read available data from the UART device
        try {

            readUartBuffer(uart);
        } catch (IOException e) {
            Log.w(TAG, "Unable to access UART device", e);
        }

        // Continue listening for more interrupts
        return true;
    }

Когда я подключаю датчик и использую этот код, я получаю показания на обратной стороне формы:

05-10 03:59:59.198 1572-1572/org.tomhume.blah D/LVEZ0: Got 7 in 1:9=>[23, 43, 0, 6, -77, -84, 15, 0, 0]
05-10 03:59:59.248 1572-1572/org.tomhume.blah D/LVEZ0: Got 7 in 1:9=>[23, 43, 0, 6, 102, 101, 121, 0, 0]
05-10 03:59:59.298 1572-1572/org.tomhume.blah D/LVEZ0: Got 7 in 1:9=>[23, 43, 0, 6, 102, 99, 121, 0, 0]

Начальные 23 и последние 0 в каждой строке - это значения, которые я добавил. Вместо ожидаемого R \ d \ d \ d \ 13 между ними я получаю 7 подписанных байтов. Дисперсия в некоторых из этих байтовых значений появляется, когда я двигаю руку к датчику и от него - то есть значения, которые я получаю, меняются так, как я ожидал, даже если выходные данные совершенно неправильны по форме и размеру.

Есть идеи, что я здесь делаю не так? Я подозреваю, что это что-то чрезвычайно очевидное, но я в тупике. Изучая сами двоичные значения, не похоже, что биты сдвинуты, например, на ошибка в настройке протокола.

1 Ответ

0 голосов
/ 13 мая 2018

Сейчас я не могу проверить это на оборудовании, но кажется, что алгоритм для чтения последовательных данных из дальномера LV-MaxSonar LV-EZ0 должен немного отличаться: вы должны найти «ASCII заглавную« R »в буфере последовательности UART (поскольку LV-EZ0 начинает отправку данных после включения питания и не синхронизируется с платой Raspberry Pi, а первый полученный байт может быть не «R», а количество принятых байтов может быть меньше или больше 5 байтов ответа LV-MaxSonar ^ в одном буферебыть несколькими (или частью) ответов LV-MaxSonar) и затем попытаться проанализировать 3 цифры, представляющие диапазон в дюймах и заканчивающийся символом CR (если нет всех 3 байтов для цифр и символа CR - чем начинать искать заглавную букву «R»Опять же, потому что отклик LV-MaxSonar нарушен (это также может быть)). Например, посмотрите на драйвер GPS contrib , особенно на processBuffer() из NmeaGpsModule.java и processMessageFrame() из NmeaParser.java - разница в том, что у вас есть только одно «предложение», и его начало не "GPRMC", а только "R"символ.

И еще одна важная вещь: кажется, что в ваших буферах ответов нет заглавной буквы «R» (ASCII 82) - могут быть некоторые проблемы в соединении LV-MaxSonar LV-EZ0.Ваша схема должна быть точно такой же, как в верхнем правом изображении на странице 6 таблицы : Independent Sensor Operation: Serial Output Sensor Operation.Также попробуйте, например, подключить кабель LV-MaxSonar LV-EZ0 к USB <-> UART (с выходной мощностью) (например, как , что ) и проверить его в терминале с вашим ПК.

...