Помогите.Проблема в коде
- Войдите на сайт для отправки комментариев
Пт, 22/03/2019 - 17:02
Здравствуйте.Помогите пожалуйста.Решил повторить проект Алекса Гайвера 'Перчатку времени'.Все спаял загрузил прошивку но при подключении к источнику питания светодиод вместо поргания высокочастотного еле светился.После замера напряжения там было только от 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;
}
Здравствуйте.
Здравствуйте.
Помогите пожалуйста.
Если бы Вы, прежде чем постить, прочитали п.5 правил форума, то знали бы, что здесь помогают тем, кто делает сам.
А тем кто
Решил повторить проект Алекса Гайвера
можно порекомендовать обратиться на специализированный для этого форум - https://community.alexgyver.ru/
Прошу прощения
Уважаемый, я не настолько непримирим, как уважаемый Евгений, но из Ваших "спаял, но при подключении..." ничего не понял. Опубликуйте схему и функционал программы (чего должна делать). К Гайверу не полезу - западло...
По факту это Стробоскоп.Его функция заключается чтобы при в ключении можно было синхронизировать световые вспышки с движужимся врашятельно или поступательно предметом и создать иллюзию остановки времени или его замедления.В программе на сколько я понял прописан периуд включения светодиода и частота его вспышек в период времени(чесно я в этом чайник)или алгоритм но из за того что там какая-то неполадок или ошибка напряжение не поступает на центральную ногу масфета.На сколько я понял сигнал не идет на D2.

Мда.. Понимаете, уважаемый, что для заявленных Вами функций ардуина не нужна. Проходит вал мотора через определенную точку, замыкает и размыкает контакт. Светодиод вспыхивает и гаснет А ардуинка не нужна, ну совсем никак.
Извините, но я подтвердился в своем мнении о Гайвере - "абсолютно бесполезно и не работает". Не повторяйте его. Лучше почитайте правильные книжки о си.
Кстати, подумалось - при наличии переключателя на валу можно использовать конденсатор. Пока контакт замкннут - конденсатор заряжается, при прохождении точки - конденсатор разряжается через светодиод.
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); }Ну а потом можно проверить правильно ли подключена плата с акселерометрами
Данный скетч читает данные о темперетуре и выводит в компорт.
#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); }И вот если все по отдельности работает нормально, то тогда уже начинать разбираться с гайверовским скетчем.
100500 мосфет не той системы )))