Качалка для малыша на ардуино
- Войдите на сайт для отправки комментариев
Всем здравствуйте! Недавно сломалась детская автоматическая качелька (сгорела плата) и я решил заменить ее на Ардуино нано. Прикупил платки: члюч на мосфете для управлением моторчиком, Акселерометр-гироскоп на базе 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);
}
судя по всему, вы хотите задать вопрос? - тогда что это делает в разделе "Проекты" ?
По коду - не вполне понятно, зачем у вас в коде таймер, он тут не нужен.
По схеме - что, драйвер мотора действительно питается от 3.3в? - а модель драйвера какая?
1.Через таймер я "ПЫТАЛСЯ" настроить частоту обновления данных с датчика.(Ключевое слово "пытался")
2.Модуль на базе полевого транзистора IRF520 управляет током с напряжением до 100В путем отпирания затвора сигналом от 2х до 4х вольт
PS* Если интересно почитать про указанный выше транзистор, вот вам ссылка https://shematok.ru/transistor/irf520
2.Модуль на базе полевого транзистора IRF520 управляет током с напряжением до 100В путем отпирания затвора сигналом от 2х до 4х вольт
не надо ссылку на транзистор - ссылку конкретно на этот модуль можете дать?
https://aliexpress.ru/item/32284034866.html?spm=a2g0o.productlist.0.0.75263e9aw61uFi&algo_pvid=fc0f654e-1e3a-470e-a7d8-ca38b2545b1f&algo_expid=fc0f654e-1e3a-470e-a7d8-ca38b2545b1f-0&btsid=0b8b034c15903107343323998e29b6&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_
Попробуйте добавить встречно параллельно включенный диод , как на схеме:
Контакт VCC на модуле к 3.3в подключать не нужно, хотя это особого значения не имеет, судя по схеме этот контакт вовсе никуда не подключен.
Сделал как посоветовали, ничего не изменилось
смотрю код - во-первых, разберитесь с таймером, либо уберите его вовсе.
Вовторых, читаете данные из I2C вы неаккуратно (строки 49-53). Добавьте, как минимум, вот это на строку 52:
if (index >= Nbytes) break;
Дополню свой рассказ: когда собирал схему собирался установить переменный резистор для регулировки интенсивности раскачивания. В наличии был потенсометр с номиналом 1МОм, при проверке его работы с обратной стороны Ардуино повалил дымок. Мое предположение что я испортил Ардуино... и от этого и все проблемы.
Дополню свой рассказ: когда собирал схему собирался установить переменный резистор для регулировки интенсивности раскачивания. В наличии был потенсометр с номиналом 1МОм, при проверке его работы с обратной стороны Ардуино повалил дымок. Мое предположение что я испортил Ардуино... и от этого и все проблемы.
Тогда что вы от форума хотите? - задаете вопросы, а у самого плата подгоревшая? -начните с того, что возьмите исправную ардуину.
А то некрасиво получается - заставляете людей разбираться в ваших схеме и коде, зная что дело-то совсем в другом...
Админы, перенесите в "Песочницу", в Проекты этому еще рано
Все ровно не понимаю! Я после этого проверил Ардуинку от и до. Все пины в норме, КЗ нигде нет, по показаниям мультиметра БП Выдает 11.7 Вольт 1.46 Ампер. Во время работы Ничего не греется. На самой плате нет даже намека на то что что-то сгорело!
На форум я обратился чтобы разобраться с проблемой! И я не говорил что сам точно знаю в чем проблема. Я дополнил Возможно Ардуино неисправно, однако чтобы исключить ненужные затраты и убедиться наверняка обратился в форуме! Я не профессионал в деле написания кода и поэтому сюда обратился.
О назначении разделов форума я не знал и создал тему в том в котором сочел нужным. Если я неверно выбрал раздел то каюсь перед теми кто ожидал в данной теме обсуждения увидеть что-либо иное.
butikwill, не раздражайтесь.
Если есть возможность, возьмите другую Нано.
Потом выполните то, что я вам посветовал в сообщении #7 и отпишите о результатах.
3.3 на NANO это совсем не силовой выход !!! На него вообще лучше ничего не вешать, что бы не спалить CH340.
#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); }Заменил ардуино, переписал код и все хорошо. Всем спасибо
Следующая цель добавить регулировку интенсивности качения. С переменным резистором больше эксперементировать не хочу. Думаю сделать несколько режимов с переключением через тактовую кнопку как было на оригинальной схеме управления.