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 - движение вперед/назад
Подскажите ктонить, почему может не отрабатывать центрирование, если повороты работают без глюков и направление поворотов определяется и определяется верно?
Проблему решил... Дополнительно просто опрашиваю кнопки и норм...
Може кому пригодится.
Суть - что в цикле команды надо было проверять нажата ли кнопка (замкнут ли контакт), а не в цикле общей программы... Все просто оказалось...