![]() |
|
![]() |
#1 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Лечить нужно хардверно. Я думаю электролит должен устранить проблему
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0 ![]() |
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0 ![]() |
![]()
Вот обновленный код, замените в шапке если можно, реализовал плавный старт колес:
Код:
/* This sketch is for arduino nano/mini pro, to be used for building 2 motor wheeled robots, equipped with 2 servo actuators for camera control, buzzer and lights. For more details please visit this article: http://cyber-place.ru/showthread.php?t=1896&page=14 and for detailed instructions on how to build and circuit diagram: http://www.voltrans.az/?p=1340 Updated: 20July2016 - added soft start for H-bridge motors 15Sep2015 - added charging monitor/LEDs. 12Sep2015 - added voltage reading, start bug fixed (use library Arduino_Vcc-master) 3Sep2015 - added CyberBot3 support. Author: Elik745i Site: www.voltrans.az for cyber-place.ru */ #include <Servo.h> // Подключаем библиотеку сервоприводов #include <Vcc.h> // // Подключаем H-Bridge HG7881 #define HG7881_A_IA 9 // D9 --> Motor A Input A --> MOTOR A + #define HG7881_A_IB 10 // D10 --> Motor A Input B --> MOTOR A - #define HG7881_B_IA 11 // D11 --> Motor B Input A --> MOTOR B + #define HG7881_B_IB 12 // D12 --> Motor B Input B --> MOTOR B - // functional connections #define MOTOR_A_PWM HG7881_A_IB // Motor A PWM Speed #define MOTOR_A_DIR HG7881_A_IA // Motor A Direction #define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed #define MOTOR_B_DIR HG7881_B_IB // Motor B Direction #define DIR_DELAY 100 // brief delay for abrupt motor changes #define tiltServopin 7 //tilt servo attached to pin 7 #define panServopin 8 //pan servo attached to pin 8 #define serialReceive 13 //Serial Receive Message indicator LED #define moveLed 4 //LED indicating tank movement #define light 5 // #define full 2 //Fully charge LED #define charging 3 //Charging LED #define softStart 4 //motors soft start - otherwise drowback will affect wifi and canera!!! #define moveDelay 100 #define moveDelayturn 100 Servo tiltServo; Servo panServo; int val1 = 90; const int servoAngle = 20; const int minAngle = 0; const int maxAngle = 180; int lightState=0; int i; const float VccMin = 3.2; // Minimum expected Vcc level, in Volts. const float VccMax = 4.2; // Maximum expected Vcc level, in Volts. const float VccCorrection = 1.0/1.0; // Measured Vcc by multimeter divided by reported Vcc Vcc vcc(VccCorrection); uint8_t inByte, packid; const int SKR=12; //speaker pin unsigned long previousMillis = 0; // will store last time LED was updated // constants won't change : const long interval = 5000; // interval at which to alarm battery level (milliseconds) void setup() { Serial.begin( 57600 ); pinMode(serialReceive,OUTPUT); pinMode(moveLed,OUTPUT); pinMode(full,OUTPUT); pinMode(charging,OUTPUT); pinMode( MOTOR_A_DIR, OUTPUT ); pinMode( MOTOR_A_PWM, OUTPUT ); digitalWrite( MOTOR_A_DIR, LOW ); digitalWrite( MOTOR_A_PWM, LOW ); pinMode( MOTOR_B_DIR, OUTPUT ); pinMode( MOTOR_B_PWM, OUTPUT ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); } void loop() { float p = vcc.Read_Perc(VccMin, VccMax); unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; if(p<5){ for(i=1000;i>50;i--){ tone(SKR, i, 10); } } } if (Serial.available()) //Еесли что то пришло { digitalWrite(serialReceive,HIGH); //tone(SKR, 1440, 200); inByte = Serial.read(); if ( packid == 16 ) { //Serial.println(inByte); //for debug, feedback will not work! packid=0; switch (inByte) // Смотрим какая команда пришла { case 'x': // Остоновка робота robot_stop(); break; case 'W': // Движение вперед robot_go(); break; case 'D': // Поворот вправо robot_right(); break; case 'A': // Повопорт влево robot_left(); break; case 'S': // Движение назад robot_back(); break; case 'J': // Серво поднимается if(val1<maxAngle){ tiltServo.attach(tiltServopin); // attaches the servo on pin 2 for(int i=0;i<servoAngle;i++){ tiltServo.write(val1+i); // sets the servo position according to the scaled value delay(servoAngle); } val1=val1+servoAngle; tiltServo.detach(); // detaches the servo on pin 2 } break; case 'U': // Серво опускается if(val1>minAngle){ tiltServo.attach(tiltServopin); // attaches the servo on pin 2 for(int i=0;i<servoAngle;i++){ tiltServo.write(val1-i); // sets the servo position according to the scaled value delay(servoAngle); } val1=val1-servoAngle; tiltServo.detach(); // detaches the servo on pin 2 } break; case 'K': // Серво поворачивается влево panServo.attach(panServopin); // attaches the servo on pin 2 panServo.write(180); // sets the servo position according to the scaled value delay(200); panServo.detach(); // detaches the servo on pin 2 break; case 'H': // Серво поворачивается вправо panServo.attach(panServopin); // attaches the servo on pin 2 panServo.write(0); // sets the servo position according to the scaled value delay(200); panServo.detach(); // detaches the servo on pin 2 break; case 'B': // Бластер break; case 'C': // Клаксон for(i=100;i<5000;i++){ tone(SKR, i, 50); } for(int i=5000;i>100;i--){ tone(SKR, i, 10); } break; case ']': // запрос состояния аналоговых датчиков sendAnalog(); break; case 'V': // Включить/Выключить фары if (lightState==0){ digitalWrite(light,HIGH); lightState=1; }else{ digitalWrite(light,LOW); lightState=0; } break; } }else packet_id(inByte); digitalWrite(serialReceive,LOW); } } void robot_stop() { digitalWrite( MOTOR_A_DIR, LOW ); digitalWrite( MOTOR_A_PWM, LOW ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); delay( DIR_DELAY ); } void robot_go(){ digitalWrite( MOTOR_A_DIR, LOW ); // direction = forward digitalWrite( MOTOR_B_DIR, LOW ); // direction = forward for(byte i=0;i<=150;i++){ analogWrite( MOTOR_A_PWM, i ); analogWrite( MOTOR_B_PWM, i ); // PWM speed = slow delay(softStart); } delay(moveDelay); } void robot_back(){ digitalWrite( MOTOR_A_DIR, HIGH ); // direction = forward digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward for(byte i=150;i>=50;i--){ analogWrite( MOTOR_A_PWM, i ); analogWrite( MOTOR_B_PWM, i ); // PWM speed = slow delay(softStart); } delay(moveDelay); } void robot_left(){ digitalWrite( MOTOR_A_DIR, HIGH ); // direction = forward digitalWrite( MOTOR_B_DIR, LOW ); // direction = forward for(byte i=0;i<=150;i++){ analogWrite( MOTOR_A_PWM, 150-i ); analogWrite( MOTOR_B_PWM, i ); // PWM speed = fast delay(softStart-3); } delay(moveDelayturn); } void robot_right(){ digitalWrite( MOTOR_A_DIR, LOW ); // direction = forward digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward for(byte i=0;i<=150;i++){ analogWrite( MOTOR_A_PWM, i ); analogWrite( MOTOR_B_PWM, 150-i ); // PWM speed = slow delay(softStart-3); } delay(moveDelayturn); } void sendAnalog(){ float v = vcc.Read_Volts(); //float p = vcc.Read_Perc(VccMin, VccMax); float k = analogRead(A0)*0.0047; //measure battery voltage on A0 while charging if (k>4.15){ digitalWrite(full,HIGH); digitalWrite(charging,LOW); }else{ digitalWrite(full,LOW); digitalWrite(charging,HIGH); } Serial.write("{\"dat1\":\""); //Serial.print(v); Serial.print(k); //charge voltage shown on the left //Serial.print(" V"); Serial.write("\",\"dat2\":\""); Serial.print(v); //Actual system voltage on the right of the screen //Serial.print(f); Serial.write("\"}"); } void packet_id(uint8_t inbyte) //проверяем идентификатор пакета "cm=" { switch (inbyte) { case 'c': packid=2; break; case 'm': packid*=2; //packid=packid<<1; break; case '=': packid*=4; //packid=packid<<2; break; default: packid=0; } } |
![]() |
![]() |
![]() |
#4 |
Member
Регистрация: 01.03.2016
Сообщений: 38
Вес репутации: 0 ![]() |
![]()
Здравствуйте.
Пытаюсь собрать робота. Изменил скетч под L298 драйвер. Установил модуль "usb драйверы". Суть проблемы: когда на Arduino мониторе посылаю cm=W то моторы крутятся, если на веб странице нажимаю- ничего. Только диоды на Nano горят. Через терминал смотрел,транзитом: роутор- нано-usb ttl. модуль посылает тоже самое почти: cm=W или если отпустить кнопку cm=Wcm=x Нужно ли заблокировать программный сброс, вроде не перезагружается? Скорости менял и на 9600 и на 57600 и в скетче и в модуле(в модуле кстати не меняет). Последний раз редактировалось lsar; 19.09.2016 в 05:20. |
![]() |
![]() |
![]() |
#5 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
какая у Вас ардуина? Какой на ней USB мост?
|
![]() |
![]() |
![]() |
#6 |
Member
Регистрация: 01.03.2016
Сообщений: 38
Вес репутации: 0 ![]() |
![]()
nano китай СР341 мост.
через FTDI драйвер не пошел, установил "Драйвера USB Serial". если ttl подцепить к nano то в терминале видно что роутер отправляет. только вот скорость 57600 в скетче поставить или 9600, разницы нет все равно терминал понимает только на скорости 9600. Попробую CyberBot-2 и в скетче убрать идентификацию. |
![]() |
![]() |
![]() |
#7 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
с CH341 работать не будет
|
![]() |
![]() |
![]() |
#8 |
Member
Регистрация: 01.03.2016
Сообщений: 38
Вес репутации: 0 ![]() |
![]()
Работает!!! отлично работает. только надо было соединить вывод RESET и GND конденсатором 10 мкФ.
![]() |
![]() |
![]() |
![]() |
#9 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
И уменьшить скорость порта до 9600
|
![]() |
![]() |
![]() |
#10 |
Member
Регистрация: 01.03.2016
Сообщений: 38
Вес репутации: 0 ![]() |
![]()
Да. Правда, скорость через интерфейс все равно не регулировался у меня.
|
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|