Всем здравствуйте! Недавно сломалась детская автоматическая качелька (сгорела плата) и я решил заменить ее на Ардуино нано. Прикупил платки: члюч на мосфете для управлением моторчиком, Акселерометр-гироскоп на базе mpu9250. Немного об устройстве: раскачивание люльки осуществляется моторчиком на 12в через редуктор (установлены в блоке управления где вентилятор). Раскачивает люльку моторчик только в одну сторону, в обратную сторону отклоняется по инерции. Я прикрепил mpu9250 к днищу люльки, а ардуино и все остальные потроха запихал в корпус блока управления. При написании скетча столкнулся с проблемой: при подаче на регулятор 12 вольт качалка раскачивается и ардуино зависает, а при подаче на регулятор 6 вольт качалка качается минуты 3-4 и тоже зависает. Ардуино просто подает на мосфет сигнал 1 и останавливается оставляя моторчик под нагрузкой.
Скетч
Скетч
#include <Wire.h> #include <TimerOne.h> #define MPU9250_ADDRESS 0x68 #define GYRO_FULL_SCALE_250_DPS 0x00 #define GYRO_FULL_SCALE_500_DPS 0x08 #define GYRO_FULL_SCALE_1000_DPS 0x10 #define GYRO_FULL_SCALE_2000_DPS 0x18 #define ACC_FULL_SCALE_2_G 0x00 #define ACC_FULL_SCALE_4_G 0x08 #define ACC_FULL_SCALE_8_G 0x10 #define ACC_FULL_SCALE_16_G 0x18 #define relay_pin 8 // пин мосфета / реле int flagMosphet = 0; // This function read Nbytes bytes from I2C device at address Address. // Put read bytes starting at register Register in the Data array. void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data) { // Set register address Wire.beginTransmission(Address); Wire.write(Register); Wire.endTransmission(); // Read Nbytes Wire.requestFrom(Address, Nbytes); uint8_t index=0; while (Wire.available()) Data[index++]=Wire.read(); } // Write a byte (Data) in device (Address) at register (Register) void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data) { // Set register address Wire.beginTransmission(Address); Wire.write(Register); Wire.write(Data); Wire.endTransmission(); } // Initial time long int ti; volatile bool intFlag=false; // Initializations void setup() { pinMode(relay_pin, OUTPUT); // Arduino initializations Wire.begin(); Serial.begin(115200); // Set accelerometers low pass filter at 5Hz I2CwriteByte(MPU9250_ADDRESS,29,0x06); // Set gyroscope low pass filter at 5Hz I2CwriteByte(MPU9250_ADDRESS,26,0x06); // Configure accelerometers range I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_4_G); // Configure gyroscope range I2CwriteByte(MPU9250_ADDRESS,27,GYRO_FULL_SCALE_1000_DPS); pinMode(13, OUTPUT); Timer1.initialize(20000); // initialize timer1, and set a 1/2 second period Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt // Store initial time ti=millis(); } // Counter long int cpt=0; void callback() { intFlag=true; digitalWrite(13, digitalRead(13) ^ 1); } // Main loop, read and display data void loop() { while (!intFlag); intFlag=false; // _______________ // ::: Counter ::: // Display data counter // Serial.print (cpt++,DEC); // Serial.print ("t"); // ____________________________________ // ::: accelerometer and gyroscope ::: // Read accelerometer and gyroscope uint8_t Buf[14]; I2Cread(MPU9250_ADDRESS,0x3B,14,Buf); // Create 16 bits values from 8 bits data // Accelerometer int16_t ay=-(Buf[2]<<8 | Buf[3]); // Gyroscope int16_t gx=-(Buf[8]<<8 | Buf[9]); // Display values // Gyroscope if(gx>=0){ flagMosphet = 1; } else if(gx<-30 || ay<-100){ flagMosphet = 0; } digitalWrite(relay_pin, flagMosphet); } |