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

butikwill
Offline
Зарегистрирован: 24.05.2020

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

}

 

b707
Offline
Зарегистрирован: 26.05.2017

судя по всему, вы хотите задать вопрос? - тогда что это делает в разделе "Проекты" ?

По коду - не вполне понятно, зачем у вас в коде таймер, он тут не нужен.

По схеме - что, драйвер мотора действительно питается от 3.3в? - а модель драйвера какая?

butikwill
Offline
Зарегистрирован: 24.05.2020

1.Через таймер я "ПЫТАЛСЯ" настроить частоту обновления данных с датчика.(Ключевое слово "пытался")

2.Модуль на базе полевого транзистора IRF520 управляет током с напряжением до 100В путем отпирания затвора сигналом от 2х до 4х вольт

PS* Если интересно почитать про указанный выше транзистор, вот вам ссылка https://shematok.ru/transistor/irf520

b707
Offline
Зарегистрирован: 26.05.2017

butikwill пишет:

2.Модуль на базе полевого транзистора IRF520 управляет током с напряжением до 100В путем отпирания затвора сигналом от 2х до 4х вольт

не надо ссылку на транзистор - ссылку конкретно на этот модуль можете дать?

butikwill
Offline
Зарегистрирован: 24.05.2020
b707
Offline
Зарегистрирован: 26.05.2017

Попробуйте добавить  встречно параллельно  включенный диод , как на схеме:

Контакт VCC на модуле к 3.3в подключать не нужно, хотя это особого значения не имеет, судя по схеме этот контакт вовсе никуда не подключен.

 

butikwill
Offline
Зарегистрирован: 24.05.2020

Сделал как посоветовали, ничего не изменилось

b707
Offline
Зарегистрирован: 26.05.2017

смотрю код - во-первых, разберитесь с таймером, либо уберите его вовсе.

Вовторых, читаете данные из I2C вы неаккуратно (строки 49-53). Добавьте, как минимум, вот это на строку 52:

if (index >= Nbytes) break;

butikwill
Offline
Зарегистрирован: 24.05.2020

Дополню свой рассказ: когда собирал схему собирался установить переменный резистор для регулировки интенсивности раскачивания. В наличии был потенсометр с номиналом 1МОм, при проверке его работы с обратной стороны Ардуино повалил дымок. Мое предположение что я испортил Ардуино... и от этого и все проблемы.

b707
Offline
Зарегистрирован: 26.05.2017

butikwill пишет:

Дополню свой рассказ: когда собирал схему собирался установить переменный резистор для регулировки интенсивности раскачивания. В наличии был потенсометр с номиналом 1МОм, при проверке его работы с обратной стороны Ардуино повалил дымок. Мое предположение что я испортил Ардуино... и от этого и все проблемы.

Тогда что вы от форума хотите? - задаете вопросы, а у самого плата подгоревшая? -начните с того, что возьмите исправную ардуину.

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

 

Админы, перенесите  в "Песочницу", в Проекты этому еще рано

butikwill
Offline
Зарегистрирован: 24.05.2020

Все ровно не понимаю! Я после этого проверил Ардуинку от и до. Все пины в норме, КЗ нигде нет, по показаниям мультиметра БП Выдает 11.7 Вольт 1.46 Ампер. Во время работы Ничего не греется. На самой плате нет даже намека на то что что-то сгорело!

На форум я обратился чтобы разобраться с проблемой! И я не говорил что сам точно знаю в чем проблема. Я дополнил Возможно Ардуино неисправно, однако чтобы исключить ненужные затраты и убедиться наверняка обратился в форуме! Я не профессионал в деле написания кода и поэтому сюда обратился. 

О назначении разделов форума я не знал и создал тему в том в котором сочел нужным. Если я неверно выбрал раздел то каюсь перед теми кто ожидал в данной теме обсуждения увидеть что-либо иное.

b707
Offline
Зарегистрирован: 26.05.2017

butikwill, не раздражайтесь.

Если есть возможность, возьмите другую Нано.

Потом выполните то, что я вам посветовал в сообщении #7 и отпишите о результатах.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

3.3 на NANO это совсем не силовой выход !!! На него вообще лучше ничего не вешать, что бы не спалить CH340.

butikwill
Offline
Зарегистрирован: 24.05.2020
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU9250.h"
 
#define relay_pin 8   // пин мосфета / реле

MPU9250 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;
int16_t mx, my, mz;

bool flagMosphet = 0;

void setup()
{
pinMode(relay_pin, OUTPUT);
      
Wire.begin();
Serial.begin(19200);
Serial.println("Initializing I2C devices...");
accelgyro.initialize();
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU9250 connection successful" : "MPU9250 connection failed");
}
void loop()
{
accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz);

if(gx>=0){
 flagMosphet = 1;
}
else if(gx<-30 || ay<-100){
 flagMosphet = 0;
}
        
digitalWrite(relay_pin, flagMosphet);
}

 

butikwill
Offline
Зарегистрирован: 24.05.2020

Заменил ардуино, переписал код и все хорошо. Всем спасибо

butikwill
Offline
Зарегистрирован: 24.05.2020

Следующая цель добавить регулировку интенсивности качения. С переменным резистором больше эксперементировать не хочу. Думаю сделать несколько режимов с переключением через тактовую кнопку как было на оригинальной схеме управления.