Bluetooth машинка.
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые форумчане.
Давно хотел собрать 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);
}
Всем привет!
На базе одной сломанной машинки захотелось сделать управление с телефона по bluetooth на arduino. С arduino знаком не так давно, но многие устроства успешно получались и работают, включая собственные предпочтения.
Но с машинкой уперся в проблему рулевого управления.
Схема состоит из L298N, arduino и HC-05.
Рулевое управление сделано за счет электродвигателя с редуктором, на выходном валу которого есть три контакта, один общий и два - с которыми общий замыкается, смотря в какую сторону повернуты колеса. Если колеса ровно, то контакты все разомкнуты.
И никак не могу победить, чтобы выровнять колеса.
Следал на LED 13 вывода диагностику факта повернутых колёс и все нормально показывает, что контакты замкнуты или разомкнуты, но при нажатии центрирования ('q'), просто отпускается нагрузка с двигателя руля и всё. Много разных вариантов пробовал для центрирования, но результат всегда один, колеса все также повернуты и не пытаются даже в центру двинуться... Не могу понять причину...
Может есть у кого какие соображения?
ENA, IN1, IN2 - руль, ENB, IN3, IN4 - движение вперед/назад
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; } } }Подскажите ктонить, почему может не отрабатывать центрирование, если повороты работают без глюков и направление поворотов определяется и определяется верно?
Проблему решил... Дополнительно просто опрашиваю кнопки и норм...
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); }Може кому пригодится.
Суть - что в цикле команды надо было проверять нажата ли кнопка (замкнут ли контакт), а не в цикле общей программы... Все просто оказалось...