Помогите, проблема в коде

4hdrey
Offline
Зарегистрирован: 04.01.2019

Здравствуйте, программисты. Я совсем чайник в этом деле. Решил собрать перчатку времени по видеогайду с калала на ютубе. Все прочно спаял. Гироскоп закреплен 1в1 как на видео. Поясню принцип работы. По идее, когда ты дергаешь рукой, должен включиться стробоскоп, настраевымый поворотом руки и потенциометром. Но при включении этой чудо машины, она не начинает беспрерывно мигать как стробоскоп, а мигает, затем на какое то время останавнивается. мигает. останавливается. На сигнал с потенциометра реагирует. Гирокскоп/аксель рабочий. Я много с этим возился и точно считаю, что проблема в коде. Код компилируется без проблем. Подскажите, знающие.

Спасибо!

код приложил

int light = 200; //задержка, свет включен, микросекунд
int dark; //свет выключен, микросекунды
int min_dark = 1; //миминмальная задержка темноты
int max_dark = 50; //максимальная задержка темноты
byte light_pin = 3; //сюда подключен свет
byte potent_pin = 6;  //аналоговый пин потенциометра
int angle;
boolean flag;
long lastchange;

#include <Wire.h>
#include "Kalman.h"
Kalman kalmanX;
Kalman kalmanZ;
uint8_t IMUAddress = 0x68;
/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
double accXangle; // Angle calculate using the accelerometer
double accZangle;
double temp;
double gyroXangle = 180; // Angle calculate using the gyro
double gyroZangle = 180;
double compAngleX = 180; // Calculate the angle using a Kalman filter
double compAngleZ = 180;
double kalAngleX; // Calculate the angle using a Kalman filter
double kalAngleZ;
uint32_t timer;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  pinMode(light_pin, OUTPUT);
  i2cWrite(0x6B, 0x00); // Disable sleep mode
  kalmanX.setAngle(180); // Set starting angle
  kalmanZ.setAngle(180);
  timer = micros();
}

void loop() {
  measure();

  if (accZ > 25000 && (millis() - lastchange > 300)) {  // если ускорение по оси Z больше порогового
    flag = !flag;                                       // переключить свет
    lastchange = millis();                              // запомнить время (чтобы сразу не выключился свет)
  }

  if (flag == 1) {
    angle = 250 - kalAngleZ;  //вычисляем угол, сделав поправку на 250 градусов
    dark = map(analogRead(potent_pin), 0, 1024, min_dark, max_dark); //расчет времени темноты как сумму угла с датчика угла и значения с потенциометра
    digitalWrite(light_pin, 1); // Включаем свет
    delayMicroseconds(light); // ждем
    digitalWrite(light_pin, 0); // выключаем
    delay(dark);
    delayMicroseconds(2000 + angle * 10); // ждем
  }
}

void measure() {
  uint8_t* data = i2cRead(0x3B, 14);
  accX = ((data[0] << 8) | data[1]);
  accY = ((data[2] << 8) | data[3]);
  accZ = ((data[4] << 8) | data[5]);
  tempRaw = ((data[6] << 8) | data[7]);
  gyroX = ((data[8] << 8) | data[9]);
  gyroY = ((data[10] << 8) | data[11]);
  gyroZ = ((data[12] << 8) | data[13]);
  /* Calculate the angls based on the different sensors and algorithm */
  accZangle = (atan2(accX, accY) + PI) * RAD_TO_DEG;
  accXangle = (atan2(accY, accX) + PI) * RAD_TO_DEG;
  double gyroXrate = (double)gyroX / 131.0;
  double gyroZrate = -((double)gyroZ / 131.0);
  gyroXangle += kalmanX.getRate() * ((double)(micros() - timer) / 1000000); // Calculate gyro angle using the unbiased rate
  gyroZangle += kalmanZ.getRate() * ((double)(micros() - timer) / 1000000);
  kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros() - timer) / 1000000); // Calculate the angle using a Kalman filter
  kalAngleZ = kalmanZ.getAngle(accZangle, gyroZrate, (double)(micros() - timer) / 1000000);
  timer = micros();
}

void i2cWrite(uint8_t registerAddress, uint8_t data) {
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission(); // Send stop
}
uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes];
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
  for (uint8_t i = 0; i < nbytes; i++)
    data [i] = Wire.read();
  return data;
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

4hdrey пишет:

Здравствуйте, программисты. Я совсем чайник в этом деле. Решил собрать перчатку времени по видеогайду с калала на ютубе. Все прочно спаял. Гироскоп закреплен 1в1 как на видео. Поясню принцип работы. По идее, когда ты дергаешь рукой, должен включиться стробоскоп, настраевымый поворотом руки и потенциометром. Но при включении этой чудо машины, она не начинает беспрерывно мигать как стробоскоп, а мигает, затем на какое то время останавнивается. мигает. останавливается. На сигнал с потенциометра реагирует. Гирокскоп/аксель рабочий. Я много с этим возился и точно считаю, что проблема в коде. Код компилируется без проблем. Подскажите, знающие.

Ну раз чайник, для начала, в соответствующий раздел. В нем можно почитать прикрепленную тему. Обратить внимание на пункт, про самописный код.

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

Внимательно сравните строки №№ 2 и 59. Ничего не смущает?

4hdrey
Offline
Зарегистрирован: 04.01.2019

ну, во второй строке дается тип данных переменной dark, в 55 она подсчитывается а в 59 задержка длиною в высчитаную dark. нет?

svm
Offline
Зарегистрирован: 06.11.2016

В микросекундах или миллисекундах?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Вы могли бы подробно описать как оно должно работать и что конкретно не так на деле?

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

4hdrey пишет:

ну, во второй строке дается тип данных переменной dark, в 55 она подсчитывается а в 59 задержка длиною в высчитаную dark. нет?

Значит, код не Ваш?

Во второй написано, что задержа в микросекндах, а в 59 уже в 1000 раз длинее.

4hdrey
Offline
Зарегистрирован: 04.01.2019

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

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

4hdrey пишет:

код не мой

Тогда не вижу смысла Вам помогать

4hdrey пишет:

проблема, кстати, была не в этом. 

Она и не могла быть в этом, просто это "ещё один косяк"

4hdrey пишет:

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

Звучит как бред.

svm
Offline
Зарегистрирован: 06.11.2016

Неплохо-бы выложить испраленный код и видео работы. А то может это всем надо. У меня вон три кошки прыгают как угорелые бесполезно, а если им такие перчатки нацепить, будет почти фейерверк.