ARDUINO Качалка для малыша на ардуино

butikwiller

✩✩✩✩✩✩✩
24 Май 2020
4
0
Всем здравствуйте! Недавно сломалась детская автоматическая качелька (сгорела плата) и я решил заменить ее на Ардуино нано. Прикупил платки: члюч на мосфете для управлением моторчиком, Акселерометр-гироскоп на базе 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);

}


Подключение mpu.pngphoto_2020-05-24_16-45-51.jpg
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
а зачем тут ардуина и гироскоп?
как устроен механизм и какие там датчики положения есть?

тум походу просто движок в разные стороны крутится через редуктор
 

butikwiller

✩✩✩✩✩✩✩
24 Май 2020
4
0
Стандартная схема (которая сгорела) была устроенна таким образом что моторчик крутился в одну сторону, при этом положение люльки определялось обратным напряжением с моторчика. На плате присутствовал чип (предположительно микроконтроллер) непонятного происхождения, так как маркировка не читабельна из за образовавшегося нагара. Я пошел путем проще и решил получать положение люльки с датчика. И моторчик даже через редуктор не способен чисто своей тягой устанавливать колебания качения люльки при том что в ней будет лежать ребенок, для него это очень большая нагрузка. Поэтому чтобы раскачаться люльке нужна не только тяга моторчика, но и элементарная обратная инерция.
 

butikwiller

✩✩✩✩✩✩✩
24 Май 2020
4
0
Я установил диод как на схеме, и при напряжении от блока 6 вольт ардуино перестало зависать, однако при напряжении 12 вольт проблема не исчезла.
robojax-IRF520-MOSFET_schematic.jpg
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
тогда засунь код в тег для подсветки кода, иначе его никто читать не будет
(я например не читал)

чутья этого гироскопа хватает что ли для этой задачи? у меня валяется какой-то давно уже
думал сделать зажигание красного фонаря при тормозжении, но сомневаюсь, чтобы он мог чуять плавное торможение и просто еду по инерции с понижением скорости и не светить почем зря
 
  • Лойс +1
Реакции: Shalom

butikwiller

✩✩✩✩✩✩✩
24 Май 2020
4
0
C++:
#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);

}
чутья этого гироскопа хватает что ли для этой задачи?
Более чем