Хочу передалать радио машинку на arduino, подбираю компоненты

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

берите лучше больше напряжение. в размере разницы почти нет

диоды на 1А самые распрастраненные шотки 1N5817-1N5819, или обычные 1N4001-1N4007

про 0,1мкф уже раз 10 писал. перечитайте

LYNX
Offline
Зарегистрирован: 21.03.2014

Нашел очередной раз))) между собой и каждую ногу с минусом :) Там тоже на 10V или меньше можно?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

там керамика. а она вольт на 50 идет

между собой и каждую ногу на корпус мотора а не минус

LYNX
Offline
Зарегистрирован: 21.03.2014

Спасибо :)  на выходных собиру, отпишусь

LYNX
Offline
Зарегистрирован: 21.03.2014

Пока такой код. С регулировской скорость потом упрощу по длине кода, некрасиво получилось

#include <SoftwareSerial.h> //Подключаем библиотеку для управлением блютусом
#include <Servo.h> //Подключаем библиотеку для управления сервой

//Объект блютус
SoftwareSerial BlueTooth(6,2);//50, 51); // RX, TX

//Создаем объект для серво
Servo Servo_Rotation;

//Цифровой пин для сервы
int dPin_Servo = 5;

//Предельные значения углов поворота
//Центральное положение
int Angle_Centr = 98;
//Углы при повороте
int Angle_Right = 118;
int Angle_Left = 78;

//Пины моторчика
int dPinMotor1 = 9;
int dPinMotor2 = 8;
int aPinMotor = 11;

// Создаем переменную для команд Bluetooth
char vcmd;

//Создаем переменную для скорости моторчиков
int vspd = 25;

//настройки при нажатии кнопки сброс
void setup() {

  //Инициализация экрана
  Serial.begin(9600);

  // Устанавливаем скорость передачи данных по Bluetooth
  BlueTooth.begin(9600);
  
  //Подключаем серво
  Servo_Rotation.attach(dPin_Servo);
  
  //Устнавливаем начальное положение
  RotateServoToAngle(Angle_Centr);
  
  //Включаем мотор
  pinMode(dPinMotor1, OUTPUT);
  pinMode(dPinMotor2, OUTPUT);
  
  //Устанавливаем максимальную скорость
  analogWrite(aPinMotor, vspd);

}

//Повторяющаяся функция
void loop() {

  // Если есть данные
  if (BlueTooth.available())
  {

    //Считывание данных, получаем символы
    vcmd = BlueTooth.read();

    //Показываем символ для отладки
    Serial.println(vcmd);

    //ПОВОРОТЫ КОЛЕСАМИ ПЕРЕДНИМИ
    // Поворот колес налево
    if (vcmd == 'L' || vcmd == 'H' || vcmd == 'G')
    {
      RotateServoToAngle(Angle_Left);
    }
    //Поворот колес направо
    else if (vcmd == 'R' || vcmd == 'J' || vcmd == 'I')
    {
      RotateServoToAngle(Angle_Left);
    }
    //Поворот колес в центр
    else if (vcmd == 'B' || vcmd == 'F' || vcmd == 'S')
    {
      RotateServoToAngle(Angle_Left);
    }
    
    //ДВИЖЕНИЯ МОТОРЧИКА   
    //Движение назад
    if (vcmd == 'H' || vcmd == 'J' || vcmd == 'B')
    {
      Engine_FBS(2);
    }
    //Движение вперед
    if (vcmd == 'G' || vcmd == 'I' || vcmd == 'F')
    {
      Engine_FBS(1);
    }
    //Остановка движения
    if (vcmd == 'S')
    {
      Engine_FBS(3);
    }
    
    //УПРАВЛЕНИЕ СКОРОСТБЬЮ    
    // Скорость 0%
    if (vcmd == '0')
    {
      SetupSpeed(0);
    }
    // Скорость 10%
    if (vcmd == '1')
    {
      SetupSpeed(25);
    }
    // Скорость 20%
    if (vcmd == '2')
    {
      SetupSpeed(50);
    }
    // Скорость 30%
    if (vcmd == '3')
    {
      SetupSpeed(75);
    }
    // Скорость 40%
    if (vcmd == '4')
    {
      SetupSpeed(100);
    }
    // Скорость 50%
    if (vcmd == '5')
    {
      SetupSpeed(125);
    }
    // Скорость 60%
    if (vcmd == '6')
    {
      SetupSpeed(150);
    }
    // Скорость 70%
    if (vcmd == '7')
    {
      SetupSpeed(175);
    }
    // Скорость 80%
    if (vcmd == '8')
    {
      SetupSpeed(200);
    }
    // Скорость 90%
    if (vcmd == '9')
    {
      SetupSpeed(225);
    }
    // Скорость 100%
    if (vcmd == 'q')
    {
      SetupSpeed(255);
    }

//Дополнительные команды
//W – передняя фара включена
//w – передняя фара выключена
//U – задняя фара включена
//u – задняя фара выключена
//V – звуковой сигнал включен
//v – звуковой сигнал выключен
//X – сигнал “аварийка” включен
//x - сигнал “аварийка” выключен 

  } 
}

void RotateServoToAngle(int Angle)
{
  //Servo_Rotation.attach(dPin_Servo);
  Servo_Rotation.write(Angle);
  //Servo_Rotation.detach();
}

//Управление направлением движения мотрчика
void Engine_FBS(int Select)
{
  //Режим вперед
  if (Select == 1)
  {
    digitalWrite(dPinMotor1, LOW);
    digitalWrite(dPinMotor2, HIGH);
    analogWrite(aPinMotor, vspd);
  }
  //Режим назад
  if (Select == 2)
  {
    digitalWrite(dPinMotor1, HIGH);
    digitalWrite(dPinMotor2, LOW);
    analogWrite(aPinMotor, vspd);
  }  
  //Режим остановки
  if (Select == 3)
  {
    digitalWrite(dPinMotor1, LOW);
    digitalWrite(dPinMotor2, LOW);
    SetupSpeed(0);    
  }
}

void SetupSpeed(int Speed)
{
  if (vspd != Speed)
  {
    //Устанавливаем в переменную, если мы не меняем ее
    vspd = Speed;
  }
  //Изменяем скорость
  analogWrite(aPinMotor, Speed);  
}

 

LYNX
Offline
Зарегистрирован: 21.03.2014

Собрал плату. Спаял как мог)))

Проверочный код

void setup() {
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);  
}

void loop() {
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
  analogWrite(9, 255); 
}

Выходное напряжение на моторчик 4.25В - максимальное. Под нагрузкой около 2.5В. В в этот раз моторчик стабильно тянет, вытягиет машинку. Думаю может вместо 5В подавать на питание моторчиков 7.4В и там ШИМ отрегулировать до 5В стандартных... Как узнать номинальное напряение моторчика?

И второй вопрос, какие провода лучше использовать как удлинители платы, чтобы низ и верх соединить. Сейчас использую от витой пары, они жесткие. Хочется отдельно плату на верх приделать ввиде шины

LYNX
Offline
Зарегистрирован: 21.03.2014

Код дописал, пока ездиет хорошо, не так как ожидалось, но все же.

Все таки видно преимущество переднеприводных и 4WD по сравнению с заднеприводной. У меня примерно 20 градусов диапазон поворота руля, совсем резко не получится завернуть, начинает передние колеса клинить, в итоге они начитают служить тормозом.

Пока что еще есть проблема отключения bluetooth при столкновение с препятствием. Не понятно, или bluetooth так себя ведет или питание где-то отходит.

ШИМ мотора на пине 9, при изменение особо разницы не чувствуется. При более 220 либо едет, либо не едет если менее (analogWrite(aPinMotor, Speed); )

Далее на очереди датчик освещенности, датчик расстояния и пьезоспикер.

Код:

//////////////////////////////
//ДОПОЛНИТЕЛЬНЫЕ БИБЛИОТЕКИ

#include <SoftwareSerial.h> //Подключаем библиотеку для управлением блютусом
#include <Servo.h> //Подключаем библиотеку для управления сервой

//////////////////////////////
//СОЗДАЕМ КЛАССЫ

//Объект блютус
SoftwareSerial BlueTooth(0,1); // RX, TX

//Объект для рулевого серво
Servo Servo_Rotation;

//////////////////////////////
//СОЗДАЕМ ПЕРЕМЕННЫЕ И КОНСТАНТЫ

//Цифровой пин для сервы
const int dPin_Servo = 6;

//Предельные значения углов поворота
//Центральное положение
const int Angle_Centr = 98;
//Углы при повороте
const int Angle_Right = 107;
const int Angle_Left = 89;

//Пины моторчика
const int dPinMotor1 = 7;
const int dPinMotor2 = 8;
const int aPinMotor = 9;

//Пины лампочек
const int dPinLight1 = 2; //Передняя правая
const int dPinLight2 = 3; //Задняя правая
const int dPinLight3 = 4; //Передняя левая
const int dPinLight4 = 5; //Задняя левая

//Переменные для режима движения
boolean Emergency = false; //Аварийка
boolean Headlights = false; //Передние фары
boolean Backlights = false; //Передние фары
boolean TurnLeft = false; //Поворот на лево
boolean TurnRight = false; //Поворот на лево
boolean TurnBack = false; //Езда назад

//Состояние лампочек и последнее включение
int LedState1 = false; // 1 - этой переменной устанавливаем состояние светодиода
int LedState2 = false; // 2 - этой переменной устанавливаем состояние светодиода
int LedState3 = false; // 3 - этой переменной устанавливаем состояние светодиода
int LedState4 = false; // 4 - этой переменной устанавливаем состояние светодиода

//Интервал
long interval = 400;           // интервал между включение/выключением светодиода (1 секунда)
long previousMillis = 0;         // храним время последнего переключения светодиода

// Создаем переменную для команд Bluetooth
char vcmd;

//Создаем переменную для скорости моторчиков
int vspd = 255;

//Переменная для включения функций работы
boolean BlueToothON = false;

//////////////////////////////

//настройки при нажатии кнопки сброс
void setup() {

  //Инициализация экрана
  Serial.begin(9600);

  // Устанавливаем скорость передачи данных по Bluetooth
  BlueTooth.begin(9600);

  //Включаем мотор
  pinMode(dPinMotor1, OUTPUT);
  pinMode(dPinMotor2, OUTPUT);

  //Устанавливаем максимальную скорость
  analogWrite(aPinMotor, vspd);

  //Инициализация пинов лампочек
  pinMode(dPinLight1, OUTPUT);
  pinMode(dPinLight2, OUTPUT);
  pinMode(dPinLight3, OUTPUT);
  pinMode(dPinLight4, OUTPUT);

}

//Повторяющаяся функция
void loop() {

  // Если есть данные
  if (BlueTooth.available())
  {
    //    if (BlueToothON == false)
    //    {
    //Включаем питание
    RUN_CAR();        
    //    }

    //Считывание данных, получаем символы
    vcmd = BlueTooth.read();

    //Показываем символ для отладки
    Serial.println(vcmd);

    //////////////////////////
    //////////////////////////

    //Поворот налево
    if (vcmd == 'L')
    {
      RotateServoToAngle(Angle_Left);
    }

    //Поворот направо
    if (vcmd == 'R')
    {
      RotateServoToAngle(Angle_Right);
    }

    //Ехать вперед
    if (vcmd == 'F')
    {
      RotateServoToAngle(Angle_Centr);
      Engine_FBS(1);
    }

    //Ехать назад
    if (vcmd == 'B')
    {
      RotateServoToAngle(Angle_Centr);
      Engine_FBS(2);
      digitalWrite(dPinLight2, HIGH);
      digitalWrite(dPinLight4, HIGH);
    }

    //Остановка
    if (vcmd == 'S')
    {
      RotateServoToAngle(Angle_Centr);
      Engine_FBS(3);
      digitalWrite(dPinLight2, LOW);
      digitalWrite(dPinLight4, LOW);
    }

    //ПОВОРОТЫ КОЛЕСАМИ ПЕРЕДНИМИ
    // Поворот колес налево
    if (vcmd == 'H' || vcmd == 'G')
    {
      RotateServoToAngle(Angle_Left);
    }
    //Поворот колес направо
    else if (vcmd == 'J' || vcmd == 'I')
    {
      RotateServoToAngle(Angle_Right);
    }

    //ДВИЖЕНИЯ МОТОРЧИКА   
    //Движение назад
    if (vcmd == 'H' || vcmd == 'J')
    {
      Engine_FBS(2);
    }
    //Движение вперед
    else if (vcmd == 'G' || vcmd == 'I')
    {
      Engine_FBS(1);
    }

    //УПРАВЛЕНИЕ СКОРОСТБЬЮ    
    // Скорость 0%
    if (vcmd == '0')
    {
      SetupSpeed(205);
    }
    // Скорость 10%
    else if (vcmd == '1')
    {
      SetupSpeed(210);
    }
    // Скорость 20%
    else if (vcmd == '2')
    {
      SetupSpeed(215);
    }
    // Скорость 30%
    else if (vcmd == '3')
    {
      SetupSpeed(220);
    }
    // Скорость 40%
    else if (vcmd == '4')
    {
      SetupSpeed(225);
    }
    // Скорость 50%
    else if (vcmd == '5')
    {
      SetupSpeed(230);
    }
    // Скорость 60%
    else if (vcmd == '6')
    {
      SetupSpeed(235);
    }
    // Скорость 70%
    else if (vcmd == '7')
    {
      SetupSpeed(240);
    }
    // Скорость 80%
    else if (vcmd == '8')
    {
      SetupSpeed(245);
    }
    // Скорость 90%
    else if (vcmd == '9')
    {
      SetupSpeed(250);
    }
    // Скорость 100%
    else if (vcmd == 'q')
    {
      SetupSpeed(255);
    }

    //////////////////////////
    // НАПРАВЛЕНИЕ ДВИЖЕНИЯ //
    //////////////////////////

    //Последнее направление: лево, право, назад
    //Движения влево
    if (vcmd == 'L')// || vcmd == 'H' || vcmd == 'G')
    {
      TurnLeft = true;
      TurnRight = false;  
    }
    //Движения вправо
    else if (vcmd == 'R')// || vcmd == 'J' || vcmd == 'I') 
    {
      TurnLeft = false;
      TurnRight = true;  
    }
    //остановка
    else if (vcmd == 'S') 
    {
      TurnLeft = false;
      TurnRight = false;
      TurnBack = false;
      //Проверка на сигналку
      if (Emergency == false)
      {
        LedState1 = false;
        LedState2 = LedState1;
        LedState3 = LedState1;
        LedState4 = LedState1;
      }  
    }
    //Аварийка вкл
    else if (vcmd == 'X')
    {
      Emergency = true;
    }
    //Аварийка выкл
    else if (vcmd == 'x')
    {
      Emergency = false;

      if (Headlights == false)
      {
        LedState1 = false;
        LedState3 = false;
      }
      if (Backlights == false && TurnBack == false)
      {
        LedState2 = false;
        LedState4 = false;
      }
    }
    //Фары вкл
    else if (vcmd == 'W')
    {
      Headlights = true;
    }
    //Фары выкл
    else if (vcmd == 'w')
    {
      Headlights = false;

      if (Emergency == false)
      {
        LedState1 = false;
        LedState3 = false;
      }
    }
    //Едем назад
    else if (vcmd == 'B')
    {
      TurnBack = true;
    }
    //Задние фары
    else if (vcmd == 'U')
    {
      Backlights = true;
    }
    //Аварийка вкл
    else if (vcmd == 'u')
    {
      Backlights = false;

      if (Emergency == false)
      {
        LedState2 = false;
        LedState4 = false;
      }      
    } 
  }

  //Текущие милисекунды
  unsigned long currentMillis = millis(); 
  
  if (currentMillis - previousMillis >= interval) 
  {   

    //Мигание аварийкой
    if (Emergency == true) 
    {
      LedState1 = !LedState1;
      LedState2 = LedState1;
      LedState3 = LedState1;
      LedState4 = LedState1;
    }
    else if (TurnRight == true)
    {
      LedState1 = !LedState1;
      LedState2 = LedState1;
    }
    else if (TurnLeft == true)
    {
      LedState3 = !LedState3;
      LedState4 = LedState3;
    }
    previousMillis = currentMillis;

  }

  //Проверка на передние фары
  if (Headlights == true && Emergency == false)
  {
    if (TurnLeft == false)
    {
      LedState3 = true;
    }
    if (TurnRight == false)
    {
      LedState1 = true;
    }
  }

  //Проверка на задние фары
  if ((Backlights == true || TurnBack == true) && Emergency == false)
  {
    if (TurnLeft == false)
    {
      LedState4 = true;
    }
    if (TurnRight == false)
    {
      LedState2 = true;
    }
  }

  //Проверка на лампочки отображение
  if (LedState1 == true)
  {
    digitalWrite(dPinLight1, HIGH);
  }
  else
  {
    digitalWrite(dPinLight1,LOW);
  }

  //Проверка на лампочки отображение
  if (LedState2 == true)
  {
    digitalWrite(dPinLight2, HIGH);
  }
  else
  {
    digitalWrite(dPinLight2,LOW);
  }

  //Проверка на лампочки отображение
  if (LedState3 == true)
  {
    digitalWrite(dPinLight3, HIGH);
  }
  else
  {
    digitalWrite(dPinLight3,LOW);
  }

  //Проверка на лампочки отображение
  if (LedState4 == true)
  {
    digitalWrite(dPinLight4, HIGH);
  }
  else
  {
    digitalWrite(dPinLight4,LOW);
  }


  //Дополнительные команды
  //V – звуковой сигнал включен
  //v – звуковой сигнал выключен

  //  else if (BlueToothON == true)
  //  {
  //    STOP_CAR();    
  //  }
}

void RotateServoToAngle(int Angle)
{
  Servo_Rotation.write(Angle);
}

//Управление направлением движения мотрчика
void Engine_FBS(int Select)
{
  //Режим вперед
  if (Select == 1)
  {
    digitalWrite(dPinMotor1, LOW);
    digitalWrite(dPinMotor2, HIGH);
  }
  //Режим назад
  if (Select == 2)
  {
    digitalWrite(dPinMotor1, HIGH);
    digitalWrite(dPinMotor2, LOW);
  }  
  //Режим остановки
  if (Select == 3)
  {
    digitalWrite(dPinMotor1, LOW);
    digitalWrite(dPinMotor2, LOW);    
  }
}

void SetupSpeed(int Speed)
{
  if (vspd != Speed)
  {
    //Устанавливаем в переменную, если мы не меняем ее
    vspd = Speed;
  }
  //Изменяем скорость
  analogWrite(aPinMotor, Speed);  
}

void RUN_CAR()
{
  //Подключаем серво
  Servo_Rotation.attach(dPin_Servo);

  //Устнавливаем начальное положение
  RotateServoToAngle(Angle_Centr);

  BlueToothON = true;  
}

void STOP_CAR()
{
  //Отключаем серво
  Servo_Rotation.detach();

  BlueToothON = false; 
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

20 градусов маловато, но и с ними машинка может резко поворачивать если увеличить мощность двигателя

http://www.youtube.com/watch?v=jVkJ6CHVy9c

LYNX
Offline
Зарегистрирован: 21.03.2014

У вас вроде 2 мотора стоит в нем? А есть фото разположения внутри? У меня вроде идентичная конструкция сверху

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нет 1 мотор 1 сервопривод. мотор обычный. которой изначально стоял вроде такой

http://music.columbia.edu/~douglas/classes/Motor_Mania/DC_simple2.jpg

такая мощность потому что питание 2 литиевых аккумулятора, и драйвер на полевых транзисторах, на которых нет такого падения напряжения как у вас

фото если не забуду вечером сделаю. там ничего особенного не увидите. ардуина радиомодуль сервопривод стабилизаторы и батарея

конструкция почти у всех одинаковая. верх меняют и все

LYNX
Offline
Зарегистрирован: 21.03.2014

У вас какой диапазон поворота? Можете для примера схему на транзисторах дать?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я не на транзисторах собирал. использовал такую микруху SI9986. очень удобно

диапазон поворота градусов 45 наверно. может больше. допилите свою машинку чтобы побольше было

 

LYNX
Offline
Зарегистрирован: 21.03.2014

Дорогая SI9986? Или выпаяли откуда-то? У вас вроде 2 стабилизатора еще?

В принципе да, если добавить мощности, то и таких проблем с клином не будет

Жду фото))

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

покупал в свое время. 500 рублей гдето отдал за 25 штук, расчитывал что приготятся. меньшим количеством совсем невыгодно. за 1 шт просили 200 рублей

куда я только ее не ставил: и в машинку, и в танк, даже в преобразователь поставил. хорошо работает))

хорошо постараюсь вечером сделать

 

LYNX
Offline
Зарегистрирован: 21.03.2014

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

Завтра выложу свое видео и проблему которую говорил: блокировка колес.

Смысл таков: ставишь поворот налево, едешь назад - машинку тянет вправо, хотя должно влево. ставишь поворот направо, едешь назад - машинку тянет вправо, как и должно быть. Пока ссылаюсь на редуктур, мож отошло что-то.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

на транзисторах можно собрать. никаких проблемм

вот например тут делали драйвер. единственное он на 5В. на большее напряжение так и не сделали. да и смысла нет. микруха логика для него стоит на уровне меги8.

уже можно на меге и полевиках драйвер делать))) и управление драйвером по i2c например организовать.

с одной стороны глупо ставить мегу для тупого управления моторами, но с другой стороны если так подешевели, уже проще ее поставить. но опять же для 5В

http://arduino.ru/forum/proekty/arduino-draiver-motora-dlya-robota

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну как то так. плата в данный момент не закреплена. аккумуляторы вытащил

LYNX
Offline
Зарегистрирован: 21.03.2014

У меня серва вверх ногами стоит :)

Для более большего поворота вытачивали платформу?

Сегодня свой вариант расположения скину.

LYNX
Offline
Зарегистрирован: 21.03.2014

Думаю попробовать подобрать аналог Si9986 на ебэе. На всех этих тоже вроде падение есть? Или есть идентичный.

А3967

HG7881 datasheet не нашел, может быть аналогом Si9986 но на 0.8А?

L9110S datasheet не нашел, может быть аналогом Si9986 но на 0.8А?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сначала определитесь вам нужна такая мощность или нет? машинка будет постоянно дрифтовать

если да то подходит:

1. только самодельный на полевиках

2. SI9986

3. http://arduino.ru/forum/proekty/arduino-draiver-motora-dlya-robota?page=3#comment-67489

там 2 драйвера

 

если такая мощность не нужна берете любой драйвер, L298 обычно и все

но это при условии питания от 2 литиевых аккумуляторов, соедененных последовательно

LYNX
Offline
Зарегистрирован: 21.03.2014

Пока этого достаточно, просто интересуюсь.

Т.е. вариант Motor Driver 1A Dual TB6612FNG будет приемлим? SI9986 все таки сложнее достать.

Думаете если повысить мощность на моторчик будет стабильнее поворачивать? Забыли про вопрос6 вытачивали под передние колеса дно машинки?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вытачивать не пришлось. и так все было хорошо

да любой драйвер можно поставить

просто если сделать мощнее машинку играть в разы интереснее. полицейские развороты, круги почти на месте, дрифт на поворотах, когда машинку несет боком. need for speed если играли то поймете о чем я

LYNX
Offline
Зарегистрирован: 21.03.2014

Заметил что на моей также почти. У меня добавлены крылья

Вид внутри

Вид снизу

http://youtu.be/N4pOzk5XDn4

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

фото одно и тоже

а вообще по моему один в один

LYNX
Offline
Зарегистрирован: 21.03.2014
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да наверно изза крыльев у вас поворачиваются колеса как у меня

LYNX
Offline
Зарегистрирован: 21.03.2014

Т.е. думаете изза крыльев блокировка?

Хотя вроде проверял: повернул в сторону, и рукамиее двигал, колеса клинили

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

они во что то упираются. посмотрите повнимательнее

LYNX
Offline
Зарегистрирован: 21.03.2014

У меня используется цифровой и аналоговый пины, например 3 пин.

Аналоговый инициализируется как А3, а цифровой как 3?

 

Недавно покатал машинку, понял что мощности мало. По асфальту едет примерно со скоростью человека. На ровной,уже чуть быстрее

LYNX
Offline
Зарегистрирован: 21.03.2014

Сегодня получу микросхемку SI9986

Правильно ли я понял как подключить ее вместо L293B

Sa и Sb - шим

Vdd - 5В

OUTa и OUTb - моторчик

INa - 5В или 0, вперед

INb - 5В или 0, назад

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Sa Sb GND на землю (минус питания)

OUTa и OUTb - моторчик

Vdd - плюс питания до 13В. но лучше не более 2 банок лития (8,4В). хватает проверено

INa шим

INb направление

 

LYNX
Offline
Зарегистрирован: 21.03.2014

INb - 0 и 5В? (назад, вперед)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да

можно наоборот

INa направление

INb шим

только ньюанс. помоему писал уже об этом. при одном направлении макс. скорость будет при шим 255, а при другом шим 0

инвертировано короче. учитывайте в коде

 

LYNX
Offline
Зарегистрирован: 21.03.2014

Спасибо большое

LYNX
Offline
Зарегистрирован: 21.03.2014

Подскажите пожалуйста где у si9986 где какие ноги. Припаял на плату и кажется стороны перепутал. Точки нет на чипе. Если чип держать так чтобы читалась маркировка (ноги сверху и снизу) то снизк земля и питание сейчас. Тестер показывет замыкание ног сверху первой и последней. Там у меня моторчик. Еще как вариант думаю конденсатор пробитый

LYNX
Offline
Зарегистрирован: 21.03.2014

Думаю из-за конденсатора, до их установки нормально было. Может из-за этого быть?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Motto
Offline
Зарегистрирован: 05.06.2014

Тоже собираю потихоньку самобеглую тележку.

LM7805 (аналог КРЕН5) это линейный стабилизатор.

А это значит, что всё, что выше 5В, он рассеивает в виде тепла, посему для экономичных схем непригоден и требует радиатора.

Достоинство у него только одно, на Ибее они по рублю за пучок.

Если нужен стабилизтор, лучше ставить импульсный.

На Ибее есть по 1,5 бакса, не помню на какой микрухе.

Импульсный стабилизатор с защитой от перенапряжения, перегрузки, перегрева, КЗ.

Есть на разный вольтаж, ток 3А.

Дропаут 2 вольта.

 

Китайские пластиковые держалки для АА батарей на Ибее лучше не брать.

Преотвратное качество, жестяные контакты, провода в три волосины.

При приличной нагрузке к использованию непригодны.

 

Литиевые аккумы всем хороши, но.

То, что продают на Ибее, типа UltraFire и иже с ним, это шлак.

Емкость раза в 2-3 ниже заявленной, умирают быстро, после нескольких десятков циклов.

Хорошие литиевые аккумы довольно дороги.

К литию обязательно нужно устройства контроля батареи, которое будет следить за напругой и визжать дурным голосом при критическом разряде, ибо литий критический разряд очень не любит и после первого же случая может впасть в коматоз.

А устройство следит за напругой на батарее и при 3,2В начинает пищвть. При 3,0В отрубает нагрузку.

По хорошему, лучше не баловаться с литиевыми аккумами размера АА, а взять нормальную Li-Po батарею 2S1P из 2-х банок, на 7,4В

Это идеальный вариант, т.к. дропаут на всех мотор-шилдах 1,5-2,5В. Т.е. до моторов как раз доходит около 6В.

Батарея будет с балансиром.

К ней сразу взять зарядник, поддерживающий зарядку с  балансировкой.

Лииевые аккумы хороши тем, что их можно заряжать большими токами до 10С

Но если глюканет зарядник, при перезаряде очень хорошо взрываются. Моделисты писали, что горели сараи и мастерские после взрыва литевыех аккумов.

 

С Ni-Mh аккумами проще.

Разряд до 0,9В на банку. Как моторы перестали бодро жужжать, можно заряжать, устройство контроля напряжения не обязательно.

Сборки из нескольких элементов можно заряжаются без балансира. Стоят дешевле лития.

В машинку оптимально 6 шт. Получится батарея на 7,4В минус 2В дропаут на мотор шилде, до моторов доберется 5,4-6В.

 

Мотор шилды.

Самые нормальные это на микрухах L293D и L298.

Ток до 2-х ампер, а главное, управление по плюсу и в связи с этим нормальный ШИМ.

Причем ШИМ реализуем двумя методами. Подачей плюса на управление, а ШИМ сигнала на пин Enable.

Или наоборот, подачей + на Enable, а ШИМ на пин управления.

Мотор шилды на микрухах HG7881, L9110S и иже с ними.

Ток до 600мА, но микрухи без радиаторов и при длительном пропускании всего 200мА начинается вонь перегретым текстолитом.

Управление движками в этих мотор шилдах только по минусу.

Это значит, что ШИМ 255 это стоп машина, а ШИМ 0 это полный газ.

И вообще, управление по минусу это жопа, когда у тебя ШИМ=f(Х), где Х это положение джойстика.

 

Во всех!!! мотор шилдах нет гальанической развязки между цепями питания и цепями управления.

А это значит, что Ардуино один фиг ловит помехи, даже при отдельном ее питании. В меньшей степени конечно, но ловит.

Пусковой ток движков постоянного тока до 2,5 от номинала, в зависимости от нагрузки.

При подключении Ардуино к моторшилду у меня при запуске движков Ардуино ловила глюки по цепям управления.

Во первых, при старте движков, хаотично дергались сервы, прицепленные непосредственно к Ардуино (питание ее было отдельно от  мотор шилда).

Во вторых Ардуино временами сама ребутилась, если моторы запускались в тяжелых условиях, например при переезде порогов.

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

И в идеале ставить не просто импульсный стабилизатор, а источник напряжения, чтобы ликвидировать просадки напряжения.

 

Потом еще всплывет проблема в том, что из за разной скорости движков машина едет не прямо, а описывает окружность большого радиуса.

Способов борьбы два.

Или считать пройденное растояние с помощью энкодеров, притормаживая более быстрый мотор.

Проблемы - работа с прерываниями, определение направления вращения, гемор с пробуксовкой колес.

Или корректировать положении машинки с помощью микрухи акселерометра и гироскопа в одном флаконе.

Проблем еще больше - математические преобразования, фильтр Калмана и т.п. Если в математике не силен, то проблемантично.

В форуме есть один чел. которому это удалось.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хороший обзор, но я бы внес пару корректировок

L298 не назвал бы нормальным драйвером. жутко греется, падение напряжения

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

зарядник с балансировкой дорог. дешевые гавно, писалось уже об этом.  если исполользовать 2 18650 аккумулятора дешевле купить зарядку с раздельным подсоеденением. тоже гавно, но стоит дешевле и косяков меньше с плохой балансировкой

насчет окружности можно проще. домножать шим на мотор который быстрее на 0,95 и так далее. короче перебором до равной скорости

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

аккумуляторы только li-ion. лично мое мнение

LYNX
Offline
Зарегистрирован: 21.03.2014

Пойдет ли этот способ замерить емкость батареи 18650? И например в дальнейшем раз в минуту определять оставшуюся ёмкость?

Motto
Offline
Зарегистрирован: 05.06.2014

А зачем?
TL431 плюс три резюка и нема проблема.
Зачем грузить ардуину лишними задачами.

LYNX
Offline
Зарегистрирован: 21.03.2014

только зарядник нашел по этой схеме

Motto
Offline
Зарегистрирован: 05.06.2014

Классический компаратор напряжения собирается на tl431 и трёх резисторах.

LYNX
Offline
Зарегистрирован: 21.03.2014

Motto пишет:
Классический компаратор напряжения собирается на tl431 и трёх резисторах.

К сожалению не нашел информации по такой схеме.

Motto
Offline
Зарегистрирован: 05.06.2014

TL431 это управляемый стабилитрон.

Схем на нем дофига и больше.

Например вот.

http://radio-hobby.org/modules/news/article.php?storyid=783

Если нужно не сигнализировать о падении напряжения до критического уровня, а вырубать нагрузку, то в схему нужно добавить N канальный МОП полевик (MOSFET) с необходимым напряжением открытия и током исток-сток.

Затвор полевика притянуть к плюсу через резистор в 10К, чтобы он был всегда открыт.

А закрывать подав минус на затвор через открывшийся TL431.

В протеусе можно отмоделировать, подобрав номиналы резисторов и полевика, в зависимости от требуемых условий.

А теоретически подковаться можно загуглив - "коммутирование мощной нагрузки с помощью mosfet"

Протеус еще хорош и тем, что можно ардуину эмулировать.

Т.е. смоделировать всё сразу, вместе с обвязкой.

 

Есть решения элегантнее но и подороже.

Это супервизоры питания (напряжения).

Бывают программируемые и нет.

С закрытым и открытым коллектором (выход высокоомный/низкоомный).

У них тоже встроенная термостабилизация, точность до 100мВ.

Встроенная защита от импульсных бросков тока имеется.

Встроенный источник опорного напряжения.

Моторолла такие выпускает, например  MC34063.

STMicroelectronics специализируется на них.

В самом простом случае схема контроля на супервизоре питания выглядит так.

Две ноги на контролируемый источник питания, выход на исполнительный механизм (на прерывание ардуины по изменению сигнала, например).

Или на мощный полевик, если нужно вырубить нагрузку.

Типовые схемы включения например вот

http://radio-hobby.org/modules/news/article.php?storyid=1354

 

Если возиться совсем лень, на Ибее есть сигнализаторы пониженного напряжения на любой вкус и цвет.

И со звуковой индикацией и со светодиодной или дисплеем, на разное напряжение или универсальные.

Есть даже для многобаночных липолек, цепляются к балансиру и контролируют напругу на каждой банке.

Цена в районе 100 руб.

 

Там же на Ибее можно купить и ваттметр для аккумулятора, который точно подсчитает сколько мАч отдала батарея.

Цена от 10 зеленых американских рублей.

LYNX
Offline
Зарегистрирован: 21.03.2014

Motto спасибо, понял смысл вашего текста - сигнализатор разряда.

Но сначала хотелось бы замерить приблизительную реальную ёмкость аккумулятора.

Результат тестирования:

Подключил на A0 - GRD резистор 6.9 Ом на 2 Вт

Включил монитор порта, отображались знаки какие-то

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

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

#define LED 13
#define resistor 6.9

float capacity=0, value,voltage,current, time=0;

void measure (void) {

  value= analogRead(0);

  voltage=value/1024*5.0;

  current = voltage/resistor;

  capacity=capacity+current/3600;

  time++;

  Serial.print('Voltage= ');
  Serial.print(voltage);

  Serial.print('V Current= ');
  Serial.print(current);

  Serial.print('A Capacity= ');
  Serial.print(capacity);
  Serial.print('Ah ');

  Serial.print('Discharging time= ');
  Serial.print(time);
  Serial.print('s ');

  Serial.println('\n');
}

boolean x=false;

ISR(TIMER1_OVF_vect) {
  TCNT1=0x0BDC;
  x=!x;

  measure();

}

void setup() {

  pinMode(LED, OUTPUT);

  TIMSK1=0x01; // enabled global and timer overflow interrupt;
  TCCR1A = 0x00; // normal operation page 148 (mode0);
  TCNT1=0x0BDC; // set initial value to remove time error (16bit counter register)
  TCCR1B = 0x04; // start timer/ set clock

  Serial.begin(256000);

};

void loop () {

  digitalWrite(LED, x);

};

Подскажите, не сголит ли ничего, и что не так в коде?

Вроде бы и с кодировкой все верно

Motto
Offline
Зарегистрирован: 05.06.2014

Потратил время и деньги, проводя эксперименты с источниками питания.

Так да, лучше литиевых аккумов типа 18650 нет ничего.

2 шт. последовательно, емкостью 2600мАн хватает за глаза.

Только брать нужно с PCB платой защиты от переразряда.

Тогда можно не морочится с контролем напряжения.

И чтобы в литиевых аккумах не разочароваться, не нужно брать у китайцев всякий отстой типа UltraFire, по 10 баксов за пучок, емкостью от 3000 мАч.

Китайцы завышают емкость своих аккумов в 5-10 раз.

Чтобы ввести покупателей в заблуждение, пишут соответсвующий вес.

Лучшие умы еще не догадались впихать в элемент 18560 емкость более 2500-2600 мАч.

И по циклам китайцы тоже врут.

Заявляют не менее 500 (нормальные производители до 1000), а на деле их аккумы дохнут через 30-40 полных циклов или 100-120 частичных.

 

6 Ni-Mh батареек вместо 2-х литиевых получается слишком громоздко и тяжело, да и заряжаются они дольше (я не рассматриваю аккумы fast charge, ибо они дохнут быстро).

Литий-ионные или полимерные батареи 2S1P на 7,2В громоздки, тяжелы и не имеют контроллера переразряда.

 

Кстати, да не введет вас в заблуждение фраза - защита от короткого замыкания, в описаниях аккумов.

В баночных батареях эта защита являет собой металлическую полоску, которой соединены банки и которая отгорает при коротком замыкании.

В элементах 18650 тоже отгорающая металлическая полоска между плюсом и платой защиты PCB.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ага. так и есть

LYNX
Offline
Зарегистрирован: 21.03.2014

Так то оно так, но хотел замерить реальную ёмкость. Делал по ссылке но крягозяблы выдает сериал порт

LYNX
Offline
Зарегистрирован: 21.03.2014

Всем добрый день. Возникла проблема...

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

При подключение блютус дергается "серво"

По коду всего одна строка Servo_Rotation.write(90);

При замере напряжения оно скачет, 3.99В - 4.02В

Питание сервы от 5В, после стабилизатора, серва на 5 пин

В итоге подключено: 12,13 - блютус (при 0, 1 тоже самое). Серво 5

 

Из-за чего может быть проблема?