Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > CyberWrt

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.10.2015, 22:10   #1
favi
Junior Member
 
Регистрация: 16.04.2014
Сообщений: 19
Вес репутации: 0
favi is an unknown quantity at this point
По умолчанию Re: Модуль "CyberBot-3"

Обновил код elik745i

Действительно стало лучше. Во всяком случае повысилась отзывчивость робота. Раньше робот при нажатии на кнопки A и D кратковременно включал моторы, а при нажатии на кнопки W и S примерно на 1.5 - 2 секунды.

С обновлением скетча, робот стал одинакого реагировать на все кнопки WSAD включая моторы кратковременно. Более того увеличился интервал зависания. Один раз у меня получилось 300 раз кратковременно нажать на кнопку A прежде чем робот завис.

А вот с подключением камеры все осталось по прежнему. Стоит дать одну команду и робот зависает. Видеопоток останавливается и моторы начинают вращаться бесконечно. При этом нажатие на кнопки заставляет моргать светодиод RX.

Вопрос Admin'у: Можно ли как-то считать то, что приходит в порт Arduino? Например отправлять обратно в TX и выводить на экран WEB-интерфейса? Или подключить к Aruino LCD дисплей, например HD44780 и дублировать туда приходящие через порт команды, и как это правильно реализовать в скетче?
favi вне форума   Ответить с цитированием
Старый 27.10.2015, 17:47   #2
elik745i
Senior Member
 
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0
elik745i is an unknown quantity at this point
По умолчанию Re: Модуль "CyberBot-3"

Цитата:
Сообщение от favi Посмотреть сообщение
Обновил код elik745i

Действительно стало лучше. Во всяком случае повысилась отзывчивость робота. Раньше робот при нажатии на кнопки A и D кратковременно включал моторы, а при нажатии на кнопки W и S примерно на 1.5 - 2 секунды.

С обновлением скетча, робот стал одинакого реагировать на все кнопки WSAD включая моторы кратковременно. Более того увеличился интервал зависания. Один раз у меня получилось 300 раз кратковременно нажать на кнопку A прежде чем робот завис.

А вот с подключением камеры все осталось по прежнему. Стоит дать одну команду и робот зависает. Видеопоток останавливается и моторы начинают вращаться бесконечно. При этом нажатие на кнопки заставляет моргать светодиод RX.

Вопрос Admin'у: Можно ли как-то считать то, что приходит в порт Arduino? Например отправлять обратно в TX и выводить на экран WEB-интерфейса? Или подключить к Aruino LCD дисплей, например HD44780 и дублировать туда приходящие через порт команды, и как это правильно реализовать в скетче?
я так и делал, когда дебаггил...
используй вот этот:

https://youtu.be/HcA-f-SeI6g


Код:
/* 
Sketch based on Cyberlib library from 
cyber-place.ru, however due to some hangups 
desition were taken to get rid of this library 
and use arduino standard libraries 
and Adafrruit libraries. LCD module used 
just for debuging and is optional, however 
many useful information can be hooked to it.

Wiring:
1.8''LCD is just insertewd to MEGA pins 8 -> AREF
2 servos (yaw and pitch) hooked to digital pins 2 
and 3 (configurable, just like LCD pins)
Servos powered by 5 volt regulator from external 
power supply (this is important not to fry arduino 
or your modem)
For video demonstration please visit my youtube:
http://youtu.be/HcA-f-SeI6g
Any references/updates please visit my blog: 
www.voltrans.az
*/

//#include <CyberLib.h>  // Подключаем библиотеку  
#include <Servo.h> // Подключаем библиотеку сервоприводов  
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Servo myservo1;  
Servo myservo2;  

//long previousMillis; // Нужно для таймера  
//uint8_t LedStep = 0; // Счетчик 
int val1 = 0;
int val2 = 0;
//int servoSpeed = 20;
int servoAngle = 20;
int minAngle = 0;
int maxAngle = 180;


//int i;
int q=2;
int w=114;

boolean light_stat; 
uint8_t inByte;  
uint8_t speed=255; //максимальная скорость по умолчанию 

//#define init {D4_Out; D5_Out; D6_Out; D7_Out; D8_Out; D11_Out; D12_Out;}   
#define TFT_CS     13
#define TFT_RST    12  // you can also connect this to the Arduino reset
                      // in which case, set this #define pin to 0!
#define TFT_DC     11
#define TFT_SCLK 9   // set these to be whatever pins you like!
#define TFT_MOSI 10   // set these to be whatever pins you like!
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
const int ledPin =  8; 
const int irlight = 46;
const int blastLed = 47;
int backlit = 100;     //backlit


void setup()    
{ 

  noTone(49);
  pinMode(ledPin, OUTPUT);
  pinMode(irlight, OUTPUT);
  pinMode(blastLed, OUTPUT);
  analogWrite(ledPin, backlit);  
  tft.initR(INITR_BLACKTAB);   // ST7735-Chip initialisieren  
  tft.fillScreen(ST7735_BLACK);
  tft.drawRoundRect(0,0,128,160,6,ST7735_WHITE);
  tft.drawRect(0,100,128,12,ST7735_WHITE);
  tft.drawTriangle(64, 5, 43, 35, 86, 35, ST7735_WHITE);
  tft.drawTriangle(64, 95, 43, 65, 86, 65, ST7735_WHITE);
  tft.drawTriangle(5, 50, 40, 35, 40, 65, ST7735_WHITE);
  tft.drawTriangle(123, 50, 89, 35, 89, 65, ST7735_WHITE);
  
  
  tft.setTextColor(ST7735_WHITE);
  tft.setCursor(46, 42);
  tft.print("WEBCAM");
  tft.setCursor(46, 52);
  tft.print("CONTROL");
  
  tft.setCursor(10, 102);
  tft.setTextColor(ST7735_WHITE);
  tft.setTextWrap(true);
  tft.print("Serial Monitor:");
  myservo1.attach(24); // Подключение сервоприводов к порту  
  myservo2.attach(26); // Подключение сервоприводов к порту  
  myservo1.write(val1);
  myservo2.write(val2);
  delay(500);
  myservo1.detach();
  myservo2.detach();
  init;  // Инициализация портов     
  horn(); //звуковое оповещение готовности робота   
  Serial.begin(57600);// Инициализация порта для связи с роутером    
  //wdt_enable (WDTO_500MS);
  tft.setCursor(72, 90);
  tft.setTextColor(ST7735_RED);
  tft.print("BLAST OFF");
  tft.setCursor(8, 90);
  tft.setTextColor(ST7735_RED);
  tft.print("IR OFF");
}    

void loop()    
{   
  /*
    unsigned long currentMillis = millis(); // Обновление таймера  
      if (LedStep == 0 && currentMillis - previousMillis > 500){ // Задержка 0,5 сек.   
      previousMillis = currentMillis; // обновление таймер  
      LedStep = 1; // Счетчик шагов  
    }  

    if (LedStep == 1 && currentMillis - previousMillis > 500){ // Задержка 0,5 сек.  
      previousMillis = currentMillis; // обновление таймер  
      LedStep = 2; // Счетчик шагов  
    }  

    if (LedStep == 2 && currentMillis - previousMillis > 500){ // Задержка 0,5 сек.  
      LedStep = 0; // Счетчик шагов  
    } 
*/
    
   if (Serial.available()) //Еесли что то пришло  
        { 
    
    byte inByte = Serial.read();
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(q, w);
    tft.print(inByte);
    tft.print(", ");
    q=q+24;
    if(q>=120){
      w=w+10;
      q=2;
    }
    if(w>=150){
     tft.fillRect(1,111,126,46,ST7735_BLACK);
    q=2;
   w=114;
    }
    
    switch (inByte)  // Смотрим какая команда пришла  
    {      
       case 'U': // Серво поднимается
                       if(val1<maxAngle){
                         up();
                         myservo1.attach(24);               // attaches the servo on pin 2
                         for(int i=0;i<servoAngle;i++){
                         myservo1.write(val1+i);           // sets the servo position according to the scaled value 
                         delay(servoAngle);
                         }
                         val1=val1+servoAngle;
                         myservo1.detach();                // detaches the servo on pin 2
                         }
         //up();
         // myservo1.write(i -= 10);      
        break;   
          
        case 'J': // Серво опускается
                        if(val1>minAngle){
                         dn();
                         myservo1.attach(24);               // attaches the servo on pin 2
                         for(int i=0;i<servoAngle;i++){
                         myservo1.write(val1-i);           // sets the servo position according to the scaled value 
                         delay(servoAngle);
                         }
                         val1=val1-servoAngle;
                         myservo1.detach();                // detaches the servo on pin 2
                         }
        //dn();
          //myservo1.write(i += 10);       
        break; 
               
        case 'H': // Серво поворачивается влево
                        if(val2<maxAngle){
                         lt();
                         myservo2.attach(26);               // attaches the servo on pin 2
                         for(int i=0;i<servoAngle;i++){
                         myservo2.write(val2+i);           // sets the servo position according to the scaled value 
                         delay(servoAngle);
                         }
                         val2=val2+servoAngle;
                         myservo2.detach();                // detaches the servo on pin 2
                         }
        //lt();
          //myservo2.write(i += 10);      
        break;   
          
        case 'K': // Серво поворачивается вправо 
                        if(val2>minAngle){
                         rt();
                         myservo2.attach(26);               // attaches the servo on pin 2
                         for(int i=0;i<servoAngle;i++){
                         myservo2.write(val2-i);           // sets the servo position according to the scaled value 
                         delay(servoAngle);
                         }
                         val2=val2-servoAngle;
                         myservo2.detach();                // detaches the servo on pin 2
                         }
        //rt();
          //myservo2.write(i -= 10);
        break;    
          
         case 'B': //  Бластер  
         if(light_stat) 
        { 
         digitalWrite(blastLed, LOW); 
         bIRoff();
         light_stat=false; 
        } else  
              { 
               digitalWrite(blastLed, HIGH);
              bIRon(); 
               light_stat=true; 
              } 
        break;  
         
        case 'C': // Клаксон  
         horn();  
        break;  
          
        case 'V': // Включить/Выключить фары  
        if(light_stat) 
        { 
         digitalWrite(irlight, LOW); 
         IRoff();
         light_stat=false; 
        } else  
              { 
               digitalWrite(irlight, HIGH);
              IRon(); 
               light_stat=true; 
              } 
        break;  
    }   
     if(inByte>47 && inByte<58) speed=(inByte-47)*25+5;//принимает команду и преобразуем в скорость          
  }   
// wdt_reset();  
} 
 void up(){
   tft.fillTriangle(64, 6, 44, 34, 85, 34, ST7735_GREEN);
   tft.fillTriangle(64, 6, 44, 34, 85, 34, ST7735_BLACK);
 }
 void dn(){
   tft.fillTriangle(64, 92, 46, 67, 83, 67, ST7735_GREEN);
   tft.fillTriangle(64, 92, 46, 67, 83, 67, ST7735_BLACK);  
 }
void lt(void){
      tft.fillTriangle(6, 50, 39, 36, 39, 64, ST7735_GREEN);
      tft.fillTriangle(6, 50, 39, 36, 39, 64, ST7735_BLACK);
      }
      
void rt(void){
      tft.fillTriangle(122, 50, 90, 36, 90, 64, ST7735_GREEN);
      tft.fillTriangle(122, 50, 90, 36, 90, 64, ST7735_BLACK);    
      }

void horn() 
{ 
  noTone(49);
  tone(49, 440, 150);	
  delay(250);
  tone(49, 440, 700);
} 

void bIRon(){
  tft.setCursor(72, 90);
  tft.setTextColor(ST7735_BLACK);
  tft.print("BLAST OFF");
  tft.setCursor(72, 90);
  tft.setTextColor(ST7735_GREEN);
  tft.print("BLAST ON");  
}

void bIRoff(){
  tft.setCursor(72, 90);
  tft.setTextColor(ST7735_BLACK);
  tft.print("BLAST ON");
  tft.setCursor(72, 90);
  tft.setTextColor(ST7735_RED);
  tft.print("BLAST OFF");
  
}

void IRon(){
  tft.setCursor(8, 90);
  tft.setTextColor(ST7735_BLACK);
  tft.print("IR OFF");
  tft.setCursor(8, 90);
  tft.setTextColor(ST7735_GREEN);
  tft.print("IR ON");  
}

void IRoff(){
  tft.setCursor(8, 90);
  tft.setTextColor(ST7735_BLACK);
  tft.print("IR ON");
  tft.setCursor(8, 90);
  tft.setTextColor(ST7735_RED);
  tft.print("IR OFF");
  
}
но это только первоначальный скетч, то есть если будете использовать совместите с моим последним скетчем, ну сами разберетесь....

Последний раз редактировалось elik745i; 27.10.2015 в 18:01.
elik745i вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 4 (пользователей: 0 , гостей: 4)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 06:21. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика