Исправлены все баги и ошибки предыдущих версий. Для уменьшения времени отклика, переработана система управления
Теперь также корректно работает с Arduino Mini подключенным к порту UART роутера
В настройках можно выбирать нужный tty порт
Каждые 5 сек. слева и справа в верхней части экрана, обновляются индикаторы показаний, для примера я их получаю с портов А6 и А7 ардуины. Порты в скетче можно заменить на другие, или вместо показаний портов можно отправлять любые другие данные полученные с любых датчиков и с максимальным значением не более 9999
эти данные можно умножать на любой Ваш коэффициент, который прописывается в настройках в веб интерфейсе
Для работы модуля, в CyberWrt нужно установить модуль "Драйвер Видео" и модуль "Драйвер FTDI"
После установки модуля драйвер FTDI нужно подключить ардуину к USB порту и перезапустить роутер. Поле того как роутер загрузился, настройте драйвер на скорость 57600 и сохраните настройки. В модуле "CyberBot-3" в настройках нужно указать порт к которому подключена Arduino
В модуле драйвера видео выбрать максимальное разрешение и нажать кнопку старт. Если камеры нет то можно драйвер не устанавливать и управлять без камеры
Подключение
Сервва 1 подключается к D12(разъем на плате контроллера)
Сервва 2 подключается к D13(разъем на плате контроллера)
Фары подключаются к D9(к разъему BT на плате контроллера)
Бластер подключаются к D10(к разъему BT на плате контроллера)
Все остальные подключения по старой схеме
Продолжение следует...
PHP код:
#include <CyberLib.h> #include <Servo.h>
Servo myservo1; Servo myservo2; #define step_servo 10 //минимальный угол поворота ссервы за один клик uint8_t min_pos=10, max_pos=170; //минимальное и максимаьное положение сервы int i=130, i2=90; //начальное положение сервы
boolean light_stat; //состояние фар uint8_t inByte, packid; uint8_t speed=255; //максимальная скорость моторов по умолчанию
void setup() { myservo1.attach(12); // Подключение сервоприводов к порту myservo2.attach(13); // Подключение сервоприводов к порту myservo2.write(i2); // начальное положение сервы(горизот) при включении myservo1.write(i); // начальное положение сервы(вертикаль) при включении init; // Инициализация портов D11_Low; // Динамик OFF randomSeed(A5_Read); //Получить случайное значение horn(); //звуковое оповещение готовности робота UART_Init(57600); // Инициализация порта для связи с роутером //wdt_enable (WDTO_500MS); }
void loop() { if (UART_ReadByte(inByte)) { if ( packid == 16 ) // контрольная сумма команды cm= { packid=0; switch (inByte) // Смотрим какая команда пришла { case 'x': // Остановка робота robot_stop(); break;
case 'W': // Движение вперед robot_go(); break;
case 'D': // Поворот вправо robot_rotation_left(); break;
case 'A': // Поворот влево robot_rotation_right(); break;
Выкладываю еще один код для ардуино, без использования библиотеки CyberLib
За код спасибо elik745i
Подробности здесь
PHP код:
/* 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: 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 8 // D10 --> Motor A Input A --> MOTOR A + #define HG7881_A_IB 9 // D9 --> Motor A Input B --> MOTOR A - #define HG7881_B_IA 10 // D11 --> Motor B Input A --> MOTOR B + #define HG7881_B_IB 11 // 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 6 //tilt servo attached to pin 7 #define panServopin 7 //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 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 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;