Bluetooth машинка.

zsm@nxt.ru
Offline
Зарегистрирован: 27.05.2013

Здравствуйте уважаемые форумчане.

Давно хотел собрать bluetooth машинку , но всё не доходили руки,

еще останавливало отсутствие нормального софта под android (весь бесплатный софт предлагает только дискретное управление-вперед , назад ,влево ,вправо.) что совсем не впечатляет..





Сегодня случайно нашел на маркете довольно интересный проект.

Установил , залил скетч , как ни странно всё сразу завелось.

Но есть одно но-двигатели не набирают полную мощность (такое ощущение что analogWrite при максимальных положениях ручек получает от силы 120 вместо 255) , скорее всего дело в скетче но не могу понять что менять в нем...

Гляньте пожалуйста скетч кому интересно.

Всем заранее спасибо)





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

#define charComand 5 // characters per comand
#define forward 11
#define backward 10
#define left 9
#define right 6
int pos = 0;    // variable to store the servo position
int spd = 0;    // Variable to store the motor speed
int midspd = 255;
int midpos = 255;
int special = 0;
unsigned long lastCommand;

char signal,car;

void setup()
{
  pinMode(forward, OUTPUT);
  pinMode(backward, OUTPUT);
  pinMode(left, OUTPUT);
  pinMode(right, OUTPUT);
  Serial.begin(9600);
  Serial.println("READY ");
}

void loop()
{
  if(Serial.available()>=charComand){
    lastCommand=millis();
    signal=Serial.read();
    switch(signal){
   
    case 'S':
      readInt(special);
      switch(special){
        case 0:    // Parar todo
          stop_all();
          break;
       
        case 1:    //continua conectado
          lastCommand=millis();         
          break;
      }
      special=0;
      break; 
     
    case 'V': // Vertical Bar
      readInt(spd);
      if (spd == midspd){
        Stop();
      }
      else if (spd >midspd){
        spd-=midspd;
        goForward(spd);
      }
      else{
        spd=midspd-spd;
        goBackward(spd);
      }         
      spd=0;
      break;

    case 'H': // Horizontal Bar
      readInt(pos);
      if (pos == midpos){
        stop_turn();
      }
      else if(pos > midpos){
        pos-=midpos;
        go_right(pos);
      }
      else{
        pos=midpos-pos;
        go_left(pos);
      }       
      pos=0;
      break;
     
    case 'L': // New Left bar value
      readInt(midspd);
      midspd/=2;
      Stop();
      break;
   
    case 'R': // New right bar value
      readInt(midpos);
      midpos/=2;
      stop_turn();
      break;
       
    }
    delay(1);
  }
 
  if( (millis() - lastCommand) > 1350){
    stop_all();
    lastCommand=millis();
    Serial.flush();
  }
 
}

void readInt(int &num){
  num = 0;
  for(int i=0;i<(charComand-1);i++){
    car=Serial.read();
    num+=(car-48)*(int)(0.5+pow(10,(charComand-2)-i));
  }
}

void goForward(int i){
  digitalWrite(backward, LOW);
  analogWrite(forward,i);
}

void goBackward(int i){
  digitalWrite(forward, LOW);
  analogWrite(backward,i);
}

void stop_all(){
Stop();
stop_turn();
}

void Stop(){
  digitalWrite(forward,LOW);
  digitalWrite(backward,LOW);
}

void go_left(int i) {
  digitalWrite(right, LOW);
  analogWrite(left, i);
}

void go_right(int i) {
  digitalWrite(left, LOW);
  analogWrite(right, i);
}

void stop_turn() {
  digitalWrite(right, LOW);
  digitalWrite(left, LOW);
}

 

zsm@nxt.ru
Offline
Зарегистрирован: 27.05.2013

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

Но всё же не нравится управление рулевой мотором ...
Думаю как серву прикрутить. 

Вообще хотелось бы раздобыть на android такую софтину , но пока безрезультатно...
есть ещё такой проект , там довольно классная программа но она рассчитана на управление 2 моторами , т.е. все расчеты происходят в android приложении , а дуня получает по BT готовые значения для двигателей..
короче я запутался) 
если кто баловался подобной тематикой , поделитесь пожалуйста софтом под андроид)

 

 

ExGen
Offline
Зарегистрирован: 11.09.2018

Всем привет!

На базе одной сломанной машинки захотелось сделать управление с телефона по bluetooth на arduino. С arduino знаком не так давно, но многие устроства успешно получались и работают, включая собственные предпочтения.

Но с машинкой уперся в проблему рулевого управления.

Схема состоит из L298N, arduino и HC-05. 

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

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

Следал на LED 13 вывода диагностику факта повернутых колёс и все нормально показывает, что контакты замкнуты или разомкнуты, но при нажатии центрирования ('q'), просто отпускается нагрузка с двигателя руля и всё. Много разных вариантов пробовал для центрирования, но результат всегда один, колеса все также повернуты и не пытаются даже в центру двинуться... Не могу понять причину...

Может есть у кого какие соображения?

ENA, IN1, IN2 - руль, ENB, IN3, IN4 - движение вперед/назад

int povl = 14; (контакт замыкается при повёрнутых колесах влево)
int povp = 15; (контакт замыкается при повёрнутых колесах вправо)
Принципиальная схема рулевого управления:
int ENA = 8;
int IN1 = 7; 
int IN2 = 6;
int IN3 = 5; // 
int IN4 = 4;
int ENB = 3;

int povl = 14;
int povp = 15;
int led = 13;

int val; 
int poslcmd;
int vals;
int pl;
int pp;

#include <SoftwareSerialWithHalfDuplex.h>
SoftwareSerialWithHalfDuplex dlcSerial(12, 11, false, false); //rx, tx

void setup()
{

 pinMode(led, OUTPUT);
 
 pinMode (povl, INPUT);
 digitalWrite(povl, HIGH);
 
 pinMode (povp, INPUT);
 digitalWrite(povp, HIGH);
 
 val = '0';
 pl = 0;
 pp = 0;
 vals = 70;
 poslcmd = 0;
 
 dlcSerial.begin(9600);
 pinMode (ENA, OUTPUT);
 pinMode (ENB, OUTPUT); 
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);
   
}

void procButtons() {
  int button_press_new = !digitalRead(povl);

    if (button_press_new == HIGH) { // on released
      pl=1;
      }  else { // on pressed
      pl=0;
    }

    int button_press_new2 = !digitalRead(povp);

    if (button_press_new2 == HIGH) { // on released
      pp=1;
      }  else { // on pressed
      pp=0;
    }
 }
   
    
 
void loop()
{
  
  procButtons();

  if (pl == 1) { //если колеса напр влево, горит постоянно
  digitalWrite(led, HIGH);  
  } else {
  digitalWrite(led, LOW);  
  }

  if (pp == 1) { //если колеса напр вправо, мигаем
  digitalWrite(led, HIGH); 
  delay(100);
  digitalWrite(led, LOW);
  delay(100);
  } else {
  digitalWrite(led, LOW);  //если в центре, то нет индикации
  }
  
  
  if ( dlcSerial.available()) // проверяем, поступают ли какие-то команды
  {
  val =  dlcSerial.read();

  if (val == 'q') { // центрируем колеса
  if (pl == 1) { //если колеса направлены влево
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
  do { 
  analogWrite(ENA,100);
  } while (pl != 1); 
  }
  
  if (pp == 1) { //если колеса направлены вправо
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  do {
  analogWrite(ENA,100);
  } while (pp != 1); 
  }
   analogWrite(ENA,0);
  }

  if (val > 69 && val < 255 && val != 't' && val != 'w' && val != 's') { // скорость
   vals = val;
   analogWrite(ENB,vals);
   }
 
  if (val == 'w') { // едем вперед
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  analogWrite(ENB,vals);
 }

  if (val == 's') { // едем назад
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, HIGH);
  analogWrite(ENB,vals);
  }

  if (val == 't') { // останавливаемся
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW);
  analogWrite(ENB,0);
  }


  if (val == 'a') { // поворачиваем налево
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  analogWrite(ENA,150);  
  poslcmd = 0;
  }
  

  if (val == 'd') { // поворачиваем направо
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
  analogWrite(ENA,150);  
  poslcmd = 0;
 }
 }
 }

 

ExGen
Offline
Зарегистрирован: 11.09.2018

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

ExGen
Offline
Зарегистрирован: 11.09.2018

Проблему решил... Дополнительно просто опрашиваю кнопки и норм...

 if (val == 'q') { // центрируем колеса
  if (pl == 1) { //если колеса направлены влево
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
  do { 
  analogWrite(ENA,100);
  procButtons(); //добавлено
  } while (pl == 1); 
  }
  
  if (pp == 1) { //если колеса направлены вправо
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  do {
  analogWrite(ENA,100);
  procButtons(); //добавлено
  } while (pp == 1); 
  }
   analogWrite(ENA,0);
  }

Може кому пригодится.

Суть - что в цикле команды надо было проверять нажата ли кнопка (замкнут ли контакт), а не в цикле общей программы... Все просто оказалось...