подскажите по настройке чувствительности

nik_ram
Offline
Зарегистрирован: 09.02.2018

Добрый день уважаемые участники 
подскажите пожалуйста как поменять настройки чувствительности сенсора  в полном коде скетча
хочу пробовать разные варианты настроек , поэтому снизойдите подробным объяснением где и чо менять

#include <Wire.h>

int IRsensorAddress = 0xB0;
//int IRsensorAddress = 0x58;
int slaveAddress;
int ledPin = 13;
boolean ledState = false;
byte data_buf[16];
int i;

int Ix[4];
int Iy[4];
int s;

void Write_2bytes(byte d1, byte d2)
{
    Wire.beginTransmission(slaveAddress);
    Wire.write(d1); Wire.write(d2);
    Wire.endTransmission();
}

void setup()
{
    slaveAddress = IRsensorAddress >> 1;   // This results in 0x21 as the address to pass to TWI
    Serial.begin(19200);
    pinMode(ledPin, OUTPUT);      // Set the LED pin as output
    Wire.begin();
    // IR sensor initialize
    Write_2bytes(0x30,0x01); delay(10);
    Write_2bytes(0x30,0x08); delay(10);
    Write_2bytes(0x06,0x90); delay(10);
    Write_2bytes(0x08,0xC0); delay(10);
    Write_2bytes(0x1A,0x40); delay(10);
    Write_2bytes(0x33,0x33); delay(10);
    delay(100);
}
void loop()
{
    ledState = !ledState;
    if (ledState) { digitalWrite(ledPin,HIGH); } else { digitalWrite(ledPin,LOW); }

    //IR sensor read
    Wire.beginTransmission(slaveAddress);
    Wire.write(0x36);
    Wire.endTransmission();

    Wire.requestFrom(slaveAddress, 16);        // Request the 2 byte heading (MSB comes first)
    for (i=0;i<16;i++) { data_buf[i]=0; }
    i=0;
    while(Wire.available() && i < 16) {
        data_buf[i] = Wire.read();
        i++;
    }

    Ix[0] = data_buf[1];
    Iy[0] = data_buf[2];
    s   = data_buf[3];
    Ix[0] += (s & 0x30) <<4;
    Iy[0] += (s & 0xC0) <<2;

    Ix[1] = data_buf[4];
    Iy[1] = data_buf[5];
    s   = data_buf[6];
    Ix[1] += (s & 0x30) <<4;
    Iy[1] += (s & 0xC0) <<2;

    Ix[2] = data_buf[7];
    Iy[2] = data_buf[8];
    s   = data_buf[9];
    Ix[2] += (s & 0x30) <<4;
    Iy[2] += (s & 0xC0) <<2;

    Ix[3] = data_buf[10];
    Iy[3] = data_buf[11];
    s   = data_buf[12];
    Ix[3] += (s & 0x30) <<4;
    Iy[3] += (s & 0xC0) <<2;

    for(i=0; i<4; i++)
    {
      if (Ix[i] < 1000)
        Serial.print("");
      if (Ix[i] < 100)
        Serial.print("");
      if (Ix[i] < 10)
        Serial.print("");
      Serial.print( int(Ix[i]) );
      Serial.print(",");
      if (Iy[i] < 1000)
        Serial.print("");
      if (Iy[i] < 100)
        Serial.print("");
      if (Iy[i] < 10)
        Serial.print("");
      Serial.print( int(Iy[i]) );
      if (i<3)
        Serial.print(",");
    }
    Serial.println("");
    delay(15);
}

исходя из рекомендаций производителя сенсора

Инициализация

Напоминание Не
забудьте установить бит 2 (0x04) в первом байте выходных отчетов для записи в регистры!

Чтобы включить ИК-камеру, необходимо выполнить следующую процедуру:

  1. Включить ИК-камеру (отправить 0x04 в выходной отчет 0x13)
  2. Включить ИК-камеру 2 (отправить 0x04 в выходной отчет 0x1a)
  3. Запишите 0x08 в регистр 0xb00030
  4. Запись блока чувствительности 1 в регистры по адресу 0xb00000
  5. Запись блока чувствительности 2 в регистры по адресу 0xb0001a
  6. Номер режима записи в регистр 0xb00033
  7. Напишите 0x08 в регистр 0xb00030 (снова)

После этих шагов пульт Wii Remote будет в одном из трех состояний:

ИК-камера включена, но не принимает данные,

ИК-камера включена и принимает данные с половинной чувствительностью,

ИК-камера включена и принимает данные с полной чувствительностью.

 В каком состоянии вы окажетесь, кажется, довольно случайным.

 Повторяйте шаги, пока не достигнете желаемого состояния.

 Чтобы избежать случайного состояния, установите задержку не менее 50 мс между каждой передачей байта.

Wii выполняет эти шаги несколько иначе, различия выделены жирным шрифтом:

  1. Включить IR Pixel Clock (отправить 0x06 в выходной отчет 0x13)
  2. Включить логику IR (отправить 0x06 в выходной отчет 0x1A)
  3. Запишите 0x01 в регистр 0xb00030
  4. Запись блока чувствительности 1 в регистры по адресу 0xb00000
  5. Запись блока чувствительности 2 в регистры по адресу 0xb0001a
  6. Номер режима записи в регистр 0xb00033
  7. Напишите 0x08 в регистр 0xb00030 (снова)

Добавление бита 0x02 к отчетам 0x13 и 0x1a является запросом подтверждения (если он установлен, wiimote ответит отчетом 0x22).

Настройки чувствительности

Чувствительность контролируется двумя блоками конфигурации, длиной 9 и 2 байта. Известно, что следующие настройки работают:

Блок 1 Блок 2 Заметки
00 00 00 00 00 00 90 00 C0 40 00 Предложил Marcan
00 00 00 00 00 00 FF 00 0C 00 00 Предлагает Kestrel (максимальная чувствительность)
00 00 00 00 00 00 90 00 41 40 00 Предложено inio (высокая чувствительность)
02 00 00 71 01 00 64 00 fe fd 05 Wii, уровень 1
02 00 00 71 01 00 96 00 b4 b3 04 Wii, уровень 2
02 00 00 71 01 00 аа 00 64 63 03 Wii уровня 3 (по рекомендации Клиффа)
02 00 00 71 01 00 c8 00 36 35 03 Wii, уровень 4
07 00 00 71 01 00 72 00 20 1f 03 Wii, уровень 5

Последний байт блока 1 определяет чувствительность по интенсивности, при увеличении значений

чувствительность снижается. Оба байта блока 2 должны быть нулевыми, чтобы был доступен полный

диапазон чувствительности. Для достижения наивысшего субпиксельного разрешения рекомендуется

установить максимально высокую чувствительность без отслеживания нежелательного света. По мере

уменьшения чувствительности уменьшается и субпиксельное разрешение, приближаясь к истинному

разрешению сенсора 128x96.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вставьте код как положено - с номерами строк.

nik_ram
Offline
Зарегистрирован: 09.02.2018

просто я не вижу в скетче  похожей настройки , одного из уровней 
должен быть по идее здесь 

// IR sensor initialize
    Write_2bytes(0x30,0x01); delay(10);
    Write_2bytes(0x30,0x08); delay(10);
    Write_2bytes(0x06,0x90); delay(10);
    Write_2bytes(0x08,0xC0); delay(10);
    Write_2bytes(0x1A,0x40); delay(10);
    Write_2bytes(0x33,0x33); delay(10);
    delay(100);

но я не пойму как его вставить . 
я не пишу для ардуино 
а просто пользователь 
может приведете пример одной настройки как нужно писать 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите, Вы не поняли, что я написал? Ну, вот скажите, как вам помогать? 

У Вас шибка в строке №ХЗ. А в строке №ХЗ поменяете точку на запятую. Так?

Вставьте код как положено на этом форуме. Если Вы не в состоянии увидеть иконку с надписью "Code" вверху окна вставки сообщения, то почитайте тему там всё написано.

Пока Вы не вставите код как положено в теме ничего полезного не будет.

nik_ram
Offline
Зарегистрирован: 09.02.2018
#include <Wire.h>

int IRsensorAddress = 0xB0;
//int IRsensorAddress = 0x58;
int slaveAddress;
int ledPin = 13;
boolean ledState = false;
byte data_buf[16];
int i;

int Ix[4];
int Iy[4];
int s;

void Write_2bytes(byte d1, byte d2)
{
    Wire.beginTransmission(slaveAddress);
    Wire.write(d1); Wire.write(d2);
    Wire.endTransmission();
}

void setup()
{
    slaveAddress = IRsensorAddress >> 1;   // This results in 0x21 as the address to pass to TWI
    Serial.begin(19200);
    pinMode(ledPin, OUTPUT);      // Set the LED pin as output
    Wire.begin();
    // IR sensor initialize
    Write_2bytes(0x30,0x01); delay(10);
    Write_2bytes(0x30,0x08); delay(10);
    Write_2bytes(0x06,0x90); delay(10);
    Write_2bytes(0x08,0xC0); delay(10);
    Write_2bytes(0x1A,0x40); delay(10);
    Write_2bytes(0x33,0x33); delay(10);
    delay(100);
}
void loop()
{
    ledState = !ledState;
    if (ledState) { digitalWrite(ledPin,HIGH); } else { digitalWrite(ledPin,LOW); }

    //IR sensor read
    Wire.beginTransmission(slaveAddress);
    Wire.write(0x36);
    Wire.endTransmission();

    Wire.requestFrom(slaveAddress, 16);        // Request the 2 byte heading (MSB comes first)
    for (i=0;i<16;i++) { data_buf[i]=0; }
    i=0;
    while(Wire.available() && i < 16) {
        data_buf[i] = Wire.read();
        i++;
    }

    Ix[0] = data_buf[1];
    Iy[0] = data_buf[2];
    s   = data_buf[3];
    Ix[0] += (s & 0x30) <<4;
    Iy[0] += (s & 0xC0) <<2;

    Ix[1] = data_buf[4];
    Iy[1] = data_buf[5];
    s   = data_buf[6];
    Ix[1] += (s & 0x30) <<4;
    Iy[1] += (s & 0xC0) <<2;

    Ix[2] = data_buf[7];
    Iy[2] = data_buf[8];
    s   = data_buf[9];
    Ix[2] += (s & 0x30) <<4;
    Iy[2] += (s & 0xC0) <<2;

    Ix[3] = data_buf[10];
    Iy[3] = data_buf[11];
    s   = data_buf[12];
    Ix[3] += (s & 0x30) <<4;
    Iy[3] += (s & 0xC0) <<2;

    for(i=0; i<4; i++)
    {
      if (Ix[i] < 1000)
        Serial.print("");
      if (Ix[i] < 100)
        Serial.print("");
      if (Ix[i] < 10)
        Serial.print("");
      Serial.print( int(Ix[i]) );
      Serial.print(",");
      if (Iy[i] < 1000)
        Serial.print("");
      if (Iy[i] < 100)
        Serial.print("");
      if (Iy[i] < 10)
        Serial.print("");
      Serial.print( int(Iy[i]) );
      if (i<3)
        Serial.print(",");
    }
    Serial.println("");
    delay(15);
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

А сенсор то какой. PDF на него есть?

nik_ram
Offline
Зарегистрирован: 09.02.2018
nik_ram
Offline
Зарегистрирован: 09.02.2018

неужели никто не может разобраться в настройках?

nik182
Offline
Зарегистрирован: 04.05.2015

А зачем? Такого сенсора нет. Зачем тратить время? Если очень нужно, есть платный раздел. Там сделают.

b707
Offline
Зарегистрирован: 26.05.2017

nik_ram пишет:

неужели никто не может разобраться в настройках?

Вы код этот откуда взяли? В коде автор шлет байты пакетами по 2 штуки. Что он имел в виду. если только адреса регистров уже двух байтные?

нужно больше информации и желательно даташит на камеру, а не просто куцое описание на чей-то вебстраничке

И да, если вы сами скетчи не пишете - писать за вас на этом форуме вряд ли кто станет.

nik_ram
Offline
Зарегистрирован: 09.02.2018
b707
Offline
Зарегистрирован: 26.05.2017

не знаю, я не смог понять по этим файлам, как записывается конфиг через I2C

nik_ram
Offline
Зарегистрирован: 09.02.2018

спасибо, хотя бы за ответ :)