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

Kuro
Offline
Зарегистрирован: 22.03.2019
Здравствуйте.Помогите пожалуйста.Решил повторить проект Алекса Гайвера 'Перчатку времени'.Все спаял загрузил прошивку но при подключении к источнику питания светодиод вместо поргания высокочастотного еле светился.После замера напряжения там было только от 6 до 8 вольт.Полазил по интернету оказалось что проблема в коде.В этом деле я чайник.(Если что то все я выставлял правильно выходяшие с повышаюшего идет 33 Вольта а со второй ноги мосвета только то что было указано ранее.
int light = 200; //задержка, свет включен, микросекунд
int dark; //свет выключен, микросекунды
int min_dark = 1; //минимальная задержка темноты
int max_dark = 50; //максимальная задержка темноты
byte light_pin = 2; //сюда подключен свет
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;
}
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Kuro пишет:

Здравствуйте.

Здравствуйте.

Kuro пишет:

Помогите пожалуйста.

Если бы Вы, прежде чем постить, прочитали п.5 правил форума, то знали бы, что здесь помогают тем, кто делает сам.

А тем кто

Kuro пишет:

Решил повторить проект Алекса Гайвера

можно порекомендовать обратиться на специализированный для этого форум - https://community.alexgyver.ru/

Kuro
Offline
Зарегистрирован: 22.03.2019

Прошу прощения

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Kuro пишет:

Здравствуйте.Помогите пожалуйста.Решил повторить проект Алекса Гайвера 'Перчатку времени'.Все спаял загрузил прошивку но при подключении к источнику питания светодиод вместо поргания высокочастотного еле светился.После замера напряжения там было только от 6 до 8 вольт.Полазил по интернету оказалось что проблема в коде.В этом деле я чайник.(Если что то все я выставлял правильно выходяшие с повышаюшего идет 33 Вольта а со второй ноги мосвета только то что было указано ранее.

Уважаемый, я не настолько непримирим, как уважаемый Евгений, но из Ваших "спаял, но при подключении..." ничего не понял. Опубликуйте схему и функционал программы (чего должна делать). К Гайверу не полезу - западло...

Kuro
Offline
Зарегистрирован: 22.03.2019

По факту это Стробоскоп.Его функция заключается чтобы при в ключении можно было синхронизировать световые вспышки с движужимся врашятельно или поступательно предметом и создать иллюзию остановки времени или его замедления.В программе на сколько я понял прописан периуд включения светодиода и частота его вспышек в период времени(чесно я в этом чайник)или алгоритм но из за того что там какая-то неполадок  или ошибка напряжение не поступает на центральную ногу масфета.На сколько я понял сигнал не идет на D2.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Мда.. Понимаете, уважаемый, что для заявленных Вами функций ардуина не нужна. Проходит вал мотора через определенную точку, замыкает и размыкает контакт. Светодиод вспыхивает и гаснет  А ардуинка не нужна, ну совсем никак.

Извините, но я подтвердился в своем мнении о Гайвере - "абсолютно бесполезно и не работает". Не повторяйте его. Лучше почитайте правильные книжки о си.

Кстати, подумалось - при наличии переключателя на валу можно использовать конденсатор. Пока контакт замкннут - конденсатор заряжается, при прохождении точки - конденсатор разряжается через светодиод.

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

Cлона надо есть по частям.

Загрузи сначала вот такой скетч и проверь если светодиод нормально мигает. Или, по крайней мере есть ли меандр на D2 c частотой 1Гц

byte light_pin = 2; //сюда подключен свет
void setup() {
  pinMode(light_pin, OUTPUT);
}
void loop() {
  digitalWrite(light_pin, HIGH);   
  delay(500);                       
  digitalWrite(light_pin, LOW);    
  delay(500);                       
}

Как разберешься с "лампочкой" переходи к проверки потенциометра:

byte light_pin = 2; //сюда подключен свет
byte potent_pin = A6;  //аналоговый пин потенциометра
int potVal = 0;

void setup() {
  pinMode(light_pin, OUTPUT);
}
void loop() {
  potVal = analogRead(potent_pin);
  digitalWrite(light_pin, HIGH);   
  delay(potVal);                       
  digitalWrite(light_pin, LOW);    
  delay(potVal);                       
}

 

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

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

Данный скетч читает данные о темперетуре и выводит в компорт.

#include<Wire.h>
#define MPUaddr 0x69

void setup() 
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  Wire.beginTransmission(MPUaddr);      //Start communication with the MPU-6050.
  Wire.write(0x6B);                     //We want to write to the PWR_MGMT_1 register (6B hex).
  Wire.write(0x00);                     //enable temp sensor        
  Wire.endTransmission();      

  //----pointing temp sensor-----------------
  Wire.beginTransmission(MPUaddr);                 
  Wire.write(0x41);                     //pointing Temp_Out_High Reg
  Wire.endTransmission(); 
  
  Wire.requestFrom(MPUaddr, 2);         //two-byte temp data from Temp_H and Temp_L
  byte x1 = Wire.read();
  byte x2 = Wire.read();
  int x = (int)(x1<<8)|(int)x2;
  
  //------compute temp from x-----
  float mpuTemp = (float)(x/340.0 + 36.53);  //formula from datasheets
  Serial.print("Temp = ");
  Serial.print(mpuTemp, 2);                  //2-digit after decimal point
  Serial.println(" degC");
  delay(1000);
}

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

100500 мосфет не той системы )))