CatBotTray

art100
Offline
Зарегистрирован: 09.03.2014

кино

https://yadi.sk/i/tikT5q0NaFQuP

Обкатка началась.

1 Отвалилось колесо.

Решено: Персобирал редуктор другой стороной, перевернул двигатель.

2 Когда кошка лежит в коробке надо продолжать подбирать силу ШИМ-ов на заднем ходу.

Проворачиваю КошкаБотТележку практически на плоских широких полеуретановых колесах.

Солеса нехотят проскальзывать.

Решено: 12 вольт и 7 ампер часов на аккумуляторе решают задачу проворота с визгом пробуксовки 

//----------------------------------------
void left1   (int speed1, int speed2){ // right motor left motor
  digitalWrite(MOT11,HIGH);analogWrite (MOT12, speed2);analogWrite (MOT21, speed1);digitalWrite(MOT22, LOW); 
  delay(100); 
  digitalWrite(MOT11, LOW);digitalWrite(MOT12,    LOW);digitalWrite(MOT21,    LOW);digitalWrite(MOT22, LOW);   
}
//----------------------------------------
void right1  (int speed1, int speed2){ // right motor left motor
  digitalWrite(MOT11, LOW);analogWrite (MOT12, speed1);analogWrite (MOT21, speed2);digitalWrite(MOT22,HIGH);
  delay(100); 
  digitalWrite(MOT11, LOW);digitalWrite(MOT12,    LOW);digitalWrite(MOT21,    LOW);digitalWrite(MOT22, LOW);
}

 

art100
Offline
Зарегистрирован: 09.03.2014

Для драйвера L298 и моторов с редукторами константы сейчас такие.



int speedtmp0=  0;// for PWM  for stop reserv
int speedtmp1=  0;// for PWM  for right left
int speedtmp2= 80;// for PWM  for reverse1 forward1
int speedtmp3=100;// for PWM  for forward1
int speedtmp4=150;// for PWM  for forward1
int speedtmp5=255;// for PWM  for right left
...
 
1 Вариант подноса с рулевыми трапециями протифазным поворотами пришлось отложить из-за неожиданной слабости рулевой машинки.
На холостых оборотах рулил поднос. Но стоило нагрузить аккумулятором смазывай не смазывай силы у сервомотора с чудо редукторами уже не хватало провернуть. А впереди еще кошка весом 3 килограмма думаю.
Решено: Выкинуть такую механическую схему и изготовить механическую схему без руля.
Схема электрическая пока такая:
Пока решаю механические задачки. Зачем мне тупой робот обходящий препятствие. Мне надо чтоб рюмку наливочки нарубленного сальца огурков хлебца подвозил.
 
 
Пока так. Продолжение может будет.
 
 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

12В если обычные моторы которые на ебее или али продаются сожгет щетки нафиг

даже самое низкое передаточное число 1:48 (насколько помню ниже не было раньше) не дает нормальной скорости. я тоже повышал напряжение, а потом самодельные щетки из жести делал. кстати более живучие чем оригинальные

а вообще не понял зачем это устройство? кота к миске катать или просто ему нравится так развлекаться?

 

art100
Offline
Зарегистрирован: 09.03.2014

jeka_tm пишет:

12В если обычные моторы которые на ебее или али продаются сожгет щетки нафиг

ну и хрен на них новые куплю

Цитата:

даже самое низкое передаточное число 1:48 (насколько помню ниже не было раньше) не дает нормальной скорости. я тоже повышал напряжение, а потом самодельные щетки из жести делал. кстати более живучие чем оригинальные

а вообще не понял зачем это устройство? кота к миске катать или просто ему нравится так развлекаться?

Поднос по дому пусть катается.

Кошке весело не соскучишсяю Смотрю уже привыкла. Но спать решила пойти в другое место.

Смотрю механика хлипкая крутанешь на стыке линолиума полеруетанове колесо со свистом улетало. Посмотрел, что в редукторе можно переворотами поковыряться пересобрал вроде еще не отвались.

Дай кода для обхода препятствий

Я коллекционирую пока.

Там в arduino uno я зашил что-то дурацкое.

Типа башкой помохать УЗ померять поернуть на право опять бащкой помохать короче отлаживать еще 1 месяц буду. Радио тоже присобачил что-то тормозит неожиданно. Инфоркрасник обучил пультом безхозным летает этот поднос как сумашедший. Вот 2 дня с потсянным флудом в интернетах сподобился ШИМ-ы подобрать успокоить тележку. Смотрю задний ход под нагрузкой кошки тяжело.

Я заложил конечно 5 скоростей но смотрю 2-ух хватает. Просто поехать и форсаж.

Ну короче пошел кошку взвешивать, грузить поднос и подбирать ШИМы для заднего хода.

 

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

это понятно. а кот любит кататься или что? просто выглядит как будто по своей воле сидит в ящике

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

это понятно. а кот любит кататься или что? просто выглядит как будто по своей воле сидит в ящике

у меня коту если травы для котов насыпать куда нибуть, так ты его по своей воле отуда хрен сдвинешь :)

art100
Offline
Зарегистрирован: 09.03.2014

jeka_tm пишет:

это понятно. а кот любит кататься или что? просто выглядит как будто по своей воле сидит в ящике

1-ое в коробках любит кошка валяться

2-ое я НЕ визжал моторами сразу на максимуме чтобы не пугать а подбирал ШИМ-ы и по чуть чуть вот и привикла.

3-е когда просто зделол поднос посадил ее верхом и она поняла что это всего-лишь фанерка

4-ое ШИМ-ами я даю отработать delay(100); на повороты delay(1000); для заднего хода.

5-ое когда катал поднос по дому дал кошке привыкнуть и просто усестся на поднос и сидеть пока не надоест. Ей 30 минут хватило чтобы надоело сидеть, а поднос не вжикает.

6-ое быть всегда рядом и поглаживать когда она на мою реакцию смотрела.

Вывод: Если мне не страшен этот поднос, чего ей пугаться?

Я этот ключевой код привел вверху.

Короче я пошел кошку взвешивать думаю 3 гилограмма.

3 килограмма груз не нашел. Попробовал с 2.5кг из кухни до компьютера доехал.

Сам поднос получился 4 кг

Итого расчитывать надо на вес подноса 7 килограмм.

Попробовал видео снять пока из кухни шел с общим весом 6.5 килограмм:

https://yadi.sk/i/_u9ONDAWaFcmW

Думаю могут быть проблемы с разливанием рюмки.

Пыльный пульт получил новую жизнь.

Дальше может еще что-нибудь будет.

Дайте кода для (обрезанная облегченная cyberlib.h мне не по душе)

Робот обьезжающий препятствия.

Я что один обладаю кодом которы написан с использованием стандартных библиотек?

//art100 to write catbot 20140820 IR Usonic DCmotors
#include <IRremote.h>
#include <Servo.h>
//pins--------------------------------
#define USTR1  A4//ultrasonic sensor
#define USEC1  A5//ultrasonic sensor
#define SERV1  3//
#define MOT11  4//motor     r
#define MOT12  5//motor PWM r
#define MOT21  6//motor PWM l
#define MOT22  7//motor     l
#define IRIN1  8// IR receiver to Arduino digital pin 12
//consts---------------------------------------
#define FORWARD 0xFFBA45
#define LEFT    0xFF1AE5
#define OK      0xFF9A65
#define RIGHT   0xFF5AA5
#define REVERSE 0xFFAA55
#define ARM1    0xFF3AC5 // virtual 
#define ARM2    0xFF7A85 // menu
#define ARM3    0xFF2AD5 // setup
#define ARM4    0xFF6A95 // skip
#define NUM0    0xFF9867 // 0
#define NUM1    0xFF30CF // 1
#define NUM2    0xFFB04F // 2
#define NUM3    0xFF708F // 3
#define NUM4    0xFF08F7 // 4
#define NUM5    0xFF8877 // 5
#define NUM6    0xFF48B7 // 6
#define NUM7    0xFF28D7 // 7
#define NUM8    0xFFA857 // 8
#define NUM9    0xFF6897 // 9
//#define SPEED1 0
//#define SPEED2 80
//#define SPEED3 100
//#define SPEED3 150
//#define SPEED4 255
int speedtmp0=  0;// for PWM  for stop reserv
int speedtmp1=  0;// for PWM  for right left
int speedtmp2= 80;// for PWM  for reverse1 forward1
int speedtmp3=100;// for PWM  for forward1
int speedtmp4=150;// for PWM  for forward1
int speedtmp5=255;// for PWM  for right left

Кина немножко не отлаженного кода https://yadi.sk/i/ql4JDdN8aFnFo

Я думал мне тут кода дадут :( 

Вопрос:

1.servo sg90  есть смысл поднимать напряжение выше 5 вольт или сгорит?

http://ru.aliexpress.com/item/Tower-Pro-Rc-Mini-Micro-9g-1-6KG-Servo-SG90-for-RC-250-450-Helicopter-Airplane/1104513783.html

2.Какое напряжение Nrf24L01 5в или 3.3вольта правильно?

2.2.Можно питать от 3.3вольта у ArduinoUnoR3?

http://ru.aliexpress.com/item/10Pcs-x-NRF24L01-Wireless-Module-2-4G-Wireless-Communication-Module-Upgrade-Module/1289649564.html

 

art100
Offline
Зарегистрирован: 09.03.2014

Продолжаем монолог.

3 день

Аккумулятор разрядился до 7 вольт при постояном включении получилось где-то поменьше 72 часов .  Подозреваю, что аккумулятор совсем старый. Даже не подозреваю, а уверен потому как потому как сам доставал из APS-smart. Он давно уже его забраковал. Может больше года назад.

Вывод: Все старые аккумуляторы из ИБП в работу. У меня их пожалуй наверно 4 штучки в мусорке лежит.

Решение: Заряжать 1 раз в 2-ое суток вполне достаточно.

Ну чтож пожалуй поковыряемся с наладкой Ультра Звукового сенсора .

Пока расстоянеи смотрю ловит. Ишь башкой сучит перед препятсвием и пробует обьехать. А кверху тормашками проблека однако :)

 https://yadi.sk/i/7dMC70ZqaKAt9

 

toc
Offline
Зарегистрирован: 09.02.2013

> 2.Какое напряжение Nrf24L01 5в или 3.3вольта правильно?

питание только 3.3 в (точнее см. даташит).
spi можно 5 в.

> 2.2.Можно питать от 3.3вольта у ArduinoUnoR3?

уно от юсб питаете?
можно. nrf чип мало потребляет. желательно кондёр на питание добавить.

art100
Offline
Зарегистрирован: 09.03.2014

toc пишет:
> 2.Какое напряжение Nrf24L01 5в или 3.3вольта правильно? питание только 3.3 в (точнее см. даташит). spi можно 5 в. > 2.2.Можно питать от 3.3вольта у ArduinoUnoR3? уно от юсб питаете? можно. nrf чип мало потребляет. желательно кондёр на питание добавить.

ну насчет 5в у меня работет один от чистого usb кончено это глючно но работает

а вся хрен питиается от монстра в 7...13вольт в режиме покая смотрю 11.71v

спасибо аткуально а то ИК конечно шустрый а за углом мне лень задницу поднимать

3 вольта так три вольта бум паяльник попозжей тыкать

так о чем я 

отдохну пусть здесь пока код автоматики поваляется

  //IR--------------------------------------------------------------------------------
   
  //robot обьезжающий препятствия----------------------------------------------------------------------------------------------------
  if(power==1){
    forward1(speedtmp4,speedtmp3,tforward1); // поехали 
    numcycles++;
    if(numcycles>130){ //Watch if something is around every 130 loops while moving forward2 Смотреть, если что-то есть примерно каждый 130 петель, двигаясь вперед,
      watchsurrounding(); //сделаем замеры вокруг ~130 градусов
      if( leftscanval < sidedistancelimit || ldiagonalscanval <distancelimit ){      turnright2(speedtmp5,speedtmp1,turntime);    }//
      if(rightscanval < sidedistancelimit || rdiagonalscanval <distancelimit ){      turnleft2 (speedtmp5,speedtmp1,turntime);    }//
      numcycles=0; //Restart count of cycles
    }//использовать часы() функцию, чтобы видеть, что происходит впереди (когда робот движется forward2 и не глядя вокруг, он будет тестировать расстояние спереди)
    distance = watch(); // use the watch() function to see if anything is ahead (when the robot is just moving forward2 and not looking around it will test the distance in front)
    //Робот будет просто остановить, если он полностью уверен, что есть препятствие впереди (тест должен 25 раз) (который нужен, чтобы игнорировать ультразвукового датчика ложных сигналов)
    if(distance<distancelimit){ popitka++; } // The robot will just stop if it is completely sure there's an obstacle ahead (must test 25 times) (needed to ignore ultrasonic sensor's false signals)
    if(distance>distancelimit){ popitka=0; } // если дистанция больше минимальной попытки обнулим
    if(popitka > 25){
      stopmove(); // Since something is ahead, stop moving.Так-то вперед, остановить движение.
      watchsurrounding(); //сделаем замеры вокруг ~130 градусов
      if     ( leftscanval  > rightscanval && leftscanval  > centerscanval ){ turnleft2 (speedtmp5,speedtmp1,turntime); }//
      else if( rightscanval > leftscanval  && rightscanval > centerscanval ){ turnright2(speedtmp5,speedtmp1,turntime); }//
      popitka=0;// попытки обнулим
    }
   }
   //robot обьезжающий препятствия----------------------------------------------------------------------------------------------------
   
}
//=============================================================================================================
//--------------------------------------------------------------------------------------------
int watch(){//UltraSonic типовой пример замера расстояния с конвертацией в сантиметры сразу
  long howfar;
  digitalWrite(USTR1, LOW);  delayMicroseconds( 5);//заведем излучатель
  digitalWrite(USTR1,HIGH);  delayMicroseconds(15);//заведем излучатель
  digitalWrite(USTR1, LOW);                        //заведем излучатель
  howfar=pulseIn(USEC1,HIGH);                      //получим расстояние
  howfar=howfar*0.01657;                           //convert in cm
  return round(howfar);                            //вернем результат
}
//----------------------------------------
void watchsurrounding(){ //сделаем замеры впереди ~130 градусов и позаписываем в 5 переменок если криточно мало сразу стоп
  centerscanval    = watch();                                     if(centerscanval   <distancelimit    ){ stopmove(); }
  ServoHead1.write(140); delay(300); leftscanval      = watch();  if(leftscanval     <sidedistancelimit){ stopmove(); }
  ServoHead1.write(120); delay(100); ldiagonalscanval = watch();  if(ldiagonalscanval<distancelimit    ){ stopmove(); }
  ServoHead1.write( 80); delay(100); centerscanval    = watch();  if(centerscanval   <distancelimit    ){ stopmove(); }
  ServoHead1.write( 40); delay(100); rdiagonalscanval = watch();  if(rdiagonalscanval<distancelimit    ){ stopmove(); }
  ServoHead1.write( 30); delay(100); rightscanval     = watch();  if(rightscanval    <sidedistancelimit){ stopmove(); }
  ServoHead1.write( 80); delay(300);//вернем положение прямо подбирать по железу
  Serial.print(leftscanval);     Serial.print("cm;");Serial.print(ldiagonalscanval);Serial.print("cm;");Serial.print(centerscanval);Serial.print("cm;");
  Serial.print(rdiagonalscanval);Serial.print("cm;");Serial.print(rightscanval);    Serial.println("cm;");//test 
}
//----------------------------------------
// поехали моторы крутить------------------------------------------------------------------------------------------------------------------------------------------------
void forward2 (int speed1,int speed2,int t1){ digitalWrite(MOT11,HIGH);analogWrite (MOT12, speed1);analogWrite (MOT21, speed1);digitalWrite(MOT22, LOW);  }// delay(t1); } 
                                          //  digitalWrite(MOT11,HIGH);digitalWrite(MOT11, LOW);  digitalWrite (MOT21,HIGH);  digitalWrite (MOT22, LOW);
void reverse2 (int speed1,int speed2,int t1){ digitalWrite(MOT11, LOW);analogWrite (MOT12, speed1);analogWrite (MOT21, speed1);digitalWrite(MOT22,HIGH);  }// delay(t1); }
                                          //  digitalWrite(MOT11, LOW);digitalWrite(MOT12,HIGH);  digitalWrite (MOT21, LOW);  digitalWrite (MOT22,HIGH);
void turnleft  (                     int t1){ digitalWrite(MOT11, LOW);digitalWrite(MOT12,HIGH);  digitalWrite (MOT21,HIGH);  digitalWrite (MOT22, LOW); delay(t1); }
void turnright (                     int t1){ digitalWrite(MOT11,HIGH);digitalWrite(MOT12, LOW);  digitalWrite (MOT21, LOW);  digitalWrite (MOT22,HIGH); delay(t1); }  
void stopmove (                            ){ digitalWrite(MOT11 ,LOW);digitalWrite(MOT12, LOW);  digitalWrite (MOT21, LOW);  digitalWrite (MOT22, LOW);            }
void turnleft2 (int speed1,int speed2,int t1){digitalWrite(MOT11,HIGH);analogWrite (MOT12, speed2);analogWrite (MOT21, speed1);digitalWrite(MOT22, LOW); delay(t1); }
void turnright2(int speed1,int speed2,int t1){digitalWrite(MOT11, LOW);analogWrite (MOT12, speed1);analogWrite (MOT21, speed2);digitalWrite(MOT22,HIGH); delay(t1); }
// IR пультовый вариант для форсажа с остановками чтобы не разбится------------------------------------------------------------------------------------------------------
void forward1(int speed1,int speed2,int t1){ digitalWrite(MOT11,HIGH);analogWrite (MOT12, speed1);analogWrite (MOT21, speed1);digitalWrite(MOT22,HIGH);  }//delay(t1); }
void reverse1(int speed1,int speed2,int t1){ digitalWrite(MOT11, LOW);analogWrite (MOT12, speed1);analogWrite (MOT21, speed1);digitalWrite(MOT22, LOW); delay(t1);  
                                             digitalWrite(MOT11, LOW);digitalWrite(MOT12,    LOW);digitalWrite(MOT21,    LOW);digitalWrite(MOT22, LOW);            }
void left1   (int speed1,int speed2,int t1){ digitalWrite(MOT11,HIGH);analogWrite (MOT12, speed2);analogWrite (MOT21, speed1);digitalWrite(MOT22, LOW); delay(t1);  
                                             digitalWrite(MOT11, LOW);digitalWrite(MOT12,    LOW);digitalWrite(MOT21,    LOW);digitalWrite(MOT22, LOW);            }
void right1  (int speed1,int speed2,int t1){ digitalWrite(MOT11, LOW);analogWrite (MOT12, speed1);analogWrite (MOT21, speed2);digitalWrite(MOT22,HIGH); delay(t1); 
                                             digitalWrite(MOT11, LOW);digitalWrite(MOT12,    LOW);digitalWrite(MOT21,    LOW);digitalWrite(MOT22, LOW);            }
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
//гавно код для идиотов
//void watchsurrounding(){ //сделаем замеры вокруг ~130 градусов
  //Meassures distances to the             right,       left,       front,        left diagonal,   right diagonal 
  //and asign them in cm to the variables  rightscanval,leftscanval,centerscanval,ldiagonalscanval rdiagonalscanval (there are 5 points for distance testing)
  //I used 80 degrees because its the central angle of my 160 degrees span (use 90 degrees if you are moving your servo through the whole 180 degrees)
  //Didn't use 180 degrees because my servo is not able to take this angle
//  centerscanval    = watch();                                     if(centerscanval   <distancelimit    ){ stopmove(); }
//  ServoHead1.write(120); delay(100); ldiagonalscanval = watch();  if(ldiagonalscanval<distancelimit    ){ stopmove(); }
//  ServoHead1.write(160); delay(300); leftscanval      = watch();  if(leftscanval     <sidedistancelimit){ stopmove(); }
//  ServoHead1.write(120); delay(100); ldiagonalscanval = watch();  if(ldiagonalscanval<distancelimit    ){ stopmove(); }
//  ServoHead1.write( 80); delay(100); centerscanval    = watch();  if(centerscanval   <distancelimit    ){ stopmove(); }
//  ServoHead1.write( 40); delay(100); rdiagonalscanval = watch();  if(rdiagonalscanval<distancelimit    ){ stopmove(); }
//  ServoHead1.write(  0); delay(100); rightscanval     = watch();  if(rightscanval    <sidedistancelimit){ stopmove(); }
//  ServoHead1.write(140); delay(300); leftscanval      = watch();  if(leftscanval     <sidedistancelimit){ stopmove(); }
//  ServoHead1.write(120); delay(100); ldiagonalscanval = watch();  if(ldiagonalscanval<distancelimit    ){ stopmove(); }
//  ServoHead1.write( 80); delay(100); centerscanval    = watch();  if(centerscanval   <distancelimit    ){ stopmove(); }
//  ServoHead1.write( 40); delay(100); rdiagonalscanval = watch();  if(rdiagonalscanval<distancelimit    ){ stopmove(); }
//  ServoHead1.write( 30); delay(100); rightscanval     = watch();  if(rightscanval    <sidedistancelimit){ stopmove(); }
//  ServoHead1.write(80); delay(300);//Finish looking around (look forward again)
//  Serial.print(leftscanval);     Serial.print("cm;");Serial.print(ldiagonalscanval);Serial.print("cm;");Serial.print(centerscanval);Serial.print("cm;");
//  Serial.print(rdiagonalscanval);Serial.print("cm;");Serial.print(rightscanval);    Serial.println("cm;");//test 
//}
//----------------------------------------
//----------------------------------------
//char decide(){
//  watchsurrounding();
//  if     ( leftscanval  > rightscanval && leftscanval  > centerscanval ){ choice='l'; }
//  else if( rightscanval > leftscanval  && rightscanval > centerscanval ){ choice='r'; }
//  else{                                                                   choice='f'; }
//  Serial.println(choice); //test
//  return choice; 
//}
//----------------------------------------
//void translateIR(){//no work //Used when robot is switched to operate in remote control mode
// switch(results.value){
//  case FORWARD: forward2  (speedtmp4,speedtmp3,tforward1);             break;//forward();                       break;//
//  case LEFT:    turnleft2 (speedtmp5,speedtmp1,turntime);  stopmove(); break;//  
//  case OK:      stopmove();                                            break;//
//  case RIGHT:   turnright2(speedtmp5,speedtmp1,turntime);  stopmove(); break;//
//  case REVERSE: reverse2  (speedtmp2,speedtmp3,treverse1);             break;//reverse2(int speed1, int speed2);                      break;// backwards();                     break;// !!!
//  default:     ;
// }//switch
// delay(500); // Do not get immediate repeat
//} 
//----------------------------------------

 

art100
Offline
Зарегистрирован: 09.03.2014

toc пишет:
> 2.Какое напряжение Nrf24L01 5в или 3.3вольта правильно? питание только 3.3 в (точнее см. даташит). spi можно 5 в. > 2.2.Можно питать от 3.3вольта у ArduinoUnoR3? уно от юсб питаете? можно. nrf чип мало потребляет. желательно кондёр на питание добавить.

поругай радио код

  //radio----------------------------------------------------------------------------------------
  if(radio.available()){// послухаем узкоглазое дуплексное радио
    char command1[32]=""; //вырвем из тела массив на 32 бита зачем на 32 не придумал еще может просто байт
    radio.read(&command1, 32); // шпионский символ прилетел вроде еще символ переноса строки летит не разбарался
 
    if (command1[0]=='S'){  digitalWrite(MOT11,   LOW);digitalWrite(MOT12, LOW);digitalWrite(MOT21,   LOW);digitalWrite(MOT22, LOW);   }  // стой стрелять буду
    if (command1[0]=='L'){ left1   (speedtmp5,speedtmp1,tlefrig1);  }// может я налево пойду 0.1 сек
    if (command1[0]=='R'){ right1  (speedtmp5,speedtmp1,tlefrig1);  }// может я правильной дорогой пойду 0.1 сек
    if (command1[0]=='F'){ forward1(speedtmp4,speedtmp3,tforward1); }// Fперед Фперед на танки 
    if (command1[0]=='B'){ reverse1(speedtmp2,speedtmp3,treverse1); }// оВВВратно оВВВратно  1 секунд 

    Serial.print(command1);//Serial.println(SpeedMot1);//фигня какаято отсалась от соседеного проекта потомс
    //    radio.stopListening();//test дуплекс понимаешь ли может попольозовать потом?
    //    radio.write(&command1, 32); // и отправляет обратно test
    //    radio.startListening();test
    //command1[0]='0'; а зачем в том проекте подтирал за собой может где протокол сдал принял понадобиться потом для такого
  }
  //radio----------------------------------------------------------------------------------------

кино сРадио https://yadi.sk/d/FjIs56o-aPtF3 88мегов чистый симплекс 2.4гегагерцовый

art100
Offline
Зарегистрирован: 09.03.2014

поругайте код робота обьезжающего препятствия

код работающий но что-то мне душа к нему не лежит

вроде выгребал вуграл авно чужое а все равно не красиво

  //robot обьезжающий препятствия----------------------------------------------------------------------------------------------------
  if(power==1){
    forward1(speedtmp4,speedtmp3,tforward1); // поехали 
    numcycles++;
    if(numcycles>130){ //Смотреть, если что-то есть примерно каждый 130 петель, двигаясь вперед,
      watchsurrounding(); //сделаем замеры вокруг ~130 градусов
      if( leftscanval < sidedistancelimit || ldiagonalscanval <distancelimit ){      turnright2(speedtmp5,speedtmp1,turntime);    }//повернем
      if(rightscanval < sidedistancelimit || rdiagonalscanval <distancelimit ){      turnleft2 (speedtmp5,speedtmp1,turntime);    }//повернем
      numcycles=0; //Restart count of cycles
    }
    distance = watch(); // при прямом движении просто меряем впереди
    //----------------------------------------------------------------------------------------------------------------------------------------
    //Робот будет просто остановить, если он полностью уверен, что есть препятствие впереди тест 25 раз
    if(distance<distancelimit){ popitka++; } // если дистанция меньше минимальной попытки
    if(distance>distancelimit){ popitka=0; } // если дистанция больше минимальной попытки обнулим
    if(popitka > 25){
      stopmove(); // Since something is ahead, stop moving.Так-то вперед, остановить движение.
      watchsurrounding(); //сделаем замеры вокруг ~130 градусов
      if     ( leftscanval  > rightscanval && leftscanval  > centerscanval ){        turnleft2 (speedtmp5,speedtmp1,turntime);    }//повернем
      else if( rightscanval > leftscanval  && rightscanval > centerscanval ){        turnright2(speedtmp5,speedtmp1,turntime);    }//повернем
      popitka=0;// попытки обнулим
    }
    //----------------------------------------------------------------------------------------------------------------------------------------
   }
   //robot обьезжающий препятствия----------------------------------------------------------------------------------------------------

 

другой вариант 

что-то мне подсказывает что этот код мертвый

но мне тоже что-то душа не лежит грести лапатой чужое

//===========================================================================================================
void loop(){
  // следующее условие будет проверять не наткнулся ли робот на препятствие	// если наткнулся - совершить маневр, и после его завершения опять ехать вперед
  if (get_distance() < 20){		// сюда попадем, если мы оказались впритык к препятствию (до него меньше 20 сантиметров)		// нам не хватает места для разворота
    Serial.println("backward"); robot_backward(); delay(1000);// сдаем немного назад
    Serial.println("forward");	robot_forward();	      // едем вперед с надеждой, что сдалека мы обнаружим помеху :)
    		// если ее обнаружим - то выполнится нижний участок кода		// если не обнаружим - либо опять сдадим назад, либо врежимся :)
  } 
  else if (get_distance() < 50){		robot_release();// если до препятствия остается 50 сантиметров, совершаем поворот		// останавливаем робота
    neck.write(70);		delay(500);// поворачиваем "голову" направо на 50 градусов
    d1 = get_distance();// считываем расстояние до препятствия справа от робота
    neck.write(170);		delay(500);// поворачиваем "голову" налево
    d2 = get_distance();// считываем расстояние до препятствия слева от робота
    if(d1 > d2){// // выбираем оптимальный маршрутсюда попадем, если справа от робота больше свободного места для езды
      Serial.println("turning to the right");			turning_to_the_right();// начинаем поворот направо
    } 
    else{// сюда попадем, если слева от робота больше свободного места для езды
      Serial.println("turning to the left");			turning_to_the_left();// начинаем поворот налево
    }
    neck.write(120);		delay(500);// вернем "голову" в исходную позицию
    while (get_distance() < 50){			delay(500);    }// поворачиваем до тех пор, пока препятствие не выйдет из поля зрения
    robot_forward();// поедем вперед, когда поворот завершится
  }
  delay(500);// небольшая задержка, чтобы дать время роботу поменять свое положение
}
//===========================================================================================================

 

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

Обьясняю:

Все пишут для игрушек то есть ни для чего практически применимого.

Рассматриваем реальный скажем так поднос ездящий по дому.

1. Как ни крути ширина подноса 30 см. Я как ни пытался 35 см что-то реально полезное

2 Ключевое слово УГЛЫ значит два дальномера. (весь инет завален сервой махающей всем чем попало в лучшем случае)

Я кручу верчу пока сервой но не лежит душа 

Я думаю пока так ТехЗадание

Вопрос:

Логика

1.Если правый сенсор и левый дают больше 1-ого метра поехали и разгоняемся.

2 Если на одном меньше 50 см снижаем обороты на обоих до мин (замедляем несущиеся 7 килограмм).

3 Если на одном меньше   10 см стоп (визг торможения 7 килограмм)

3.1.начинаем поворот в противоположную сторону.

4 Если оба сенсора дают больше 1 метра идем в пункт 1.

 

так?

Какая вы думаете логика интересней?

 

Поругайте код сенсоров

код 5мин назад набросал

//--------------------------------------------------------------------------------------------
int UltraSonicR(){//UltraSonic типовой пример замера расстояния с конвертацией в сантиметры сразу
  long DistanceR;
  digitalWrite(USTRR, LOW);  delayMicroseconds( 5);//заведем излучатель
  digitalWrite(USTRR,HIGH);  delayMicroseconds(15);//заведем излучатель
  digitalWrite(USTRR, LOW);                        //заведем излучатель
  DistanceR=pulseIn(USECR,HIGH);                      //получим расстояние
  DistanceR=DistanceR*0.01657;                           //convert in cm
  return round(DistanceR);                            //вернем результат
}
//--------------------------------------------------------------------------------------------
int UltraSonicL(){//UltraSonic типовой пример замера расстояния с конвертацией в сантиметры сразу
  long DistanceL;
  digitalWrite(USTRL, LOW);  delayMicroseconds( 5);//заведем излучатель
  digitalWrite(USTRL,HIGH);  delayMicroseconds(15);//заведем излучатель
  digitalWrite(USTRL, LOW);                        //заведем излучатель
  DistanceL=pulseIn(USECL,HIGH);                      //получим расстояние
  DistanceL=DistanceL*0.01657;                           //convert in cm
  return round(DistanceL);                            //вернем результат
}


код сервы махающей одним ультрозвуком к которой у меня не лежит душа
мерять на углах диагонялях когда 7килограм несется 1метр в секунду ве зеркала? веры как-то нет

//--------------------------------------------------------------------------------------------
int watch(){//UltraSonic типовой пример замера расстояния с конвертацией в сантиметры сразу
  long howfar;
  digitalWrite(USTR1, LOW);  delayMicroseconds( 5);//заведем излучатель
  digitalWrite(USTR1,HIGH);  delayMicroseconds(15);//заведем излучатель
  digitalWrite(USTR1, LOW);                        //заведем излучатель
  howfar=pulseIn(USEC1,HIGH);                      //получим расстояние
  howfar=howfar*0.01657;                           //convert in cm
  return round(howfar);                            //вернем результат
}
//----------------------------------------
void watchsurrounding(){ //сделаем замеры впереди ~130 градусов и позаписываем в 5 переменок если криточно мало сразу стоп
  centerscanval    = watch();                                     if(centerscanval   <distancelimit    ){ stopmove(); }
  ServoHead1.write(140); delay(300); leftscanval      = watch();  if(leftscanval     <sidedistancelimit){ stopmove(); }
  ServoHead1.write(120); delay(100); ldiagonalscanval = watch();  if(ldiagonalscanval<distancelimit    ){ stopmove(); }
  ServoHead1.write( 80); delay(100); centerscanval    = watch();  if(centerscanval   <distancelimit    ){ stopmove(); }
  ServoHead1.write( 40); delay(100); rdiagonalscanval = watch();  if(rdiagonalscanval<distancelimit    ){ stopmove(); }
  ServoHead1.write( 30); delay(100); rightscanval     = watch();  if(rightscanval    <sidedistancelimit){ stopmove(); }
  ServoHead1.write( 80); delay(300);//вернем положение прямо подбирать по железу
  Serial.print(leftscanval);     Serial.print("cm;");Serial.print(ldiagonalscanval);Serial.print("cm;");Serial.print(centerscanval);Serial.print("cm;");
  Serial.print(rdiagonalscanval);Serial.print("cm;");Serial.print(rightscanval);    Serial.println("cm;");//test 
}
//----------------------------------------

 

 

zhenious
Offline
Зарегистрирован: 03.07.2014

Почему бы не сделать в pulseIn(USECR,HIGH) ограничение по времени ожидания ?

Зачем впустую выжидать расстояние в несколько метров, если в данном случае критичен 1 м

3.1.начинаем поворот в противоположную сторону. - а может вправо или влево, т.е. поворот 90 град попробовать, вместо разворота

art100
Offline
Зарегистрирован: 09.03.2014

zhenious пишет:

Почему бы не сделать в pulseIn(USECR,HIGH) ограничение по времени ожидания ?

Зачем впустую выжидать расстояние в несколько метров, если в данном случае критичен 1 м

3.1.начинаем поворот в противоположную сторону. - а может вправо или влево, т.е. поворот 90 град попробовать, вместо разворота

Полезное замечание про сенсор

Тоже чувстувую что этот код взятый от другой игрушки авнецом попахивает но не считал там ничего еще. Вроде 103см максимум увидел и успокоился.

А как вы считаете как  аккуратней написать?

Тех Задание такое

Длинна комнаты 500 см максимум.

Узкое место 5 см минимум.

На счет поворотов посмотрите видео, где  7 килограм так просто быстро не развернешь. Поднос максимум на 15% проворачивается даже если даешь 12 воль по пол ампера на все 4 мотора поэтому я подаю форсажа 0.1 секунды вполне достаточно. Варинат с плавностями это ожидание мощной рулевой машинки и 1-ый вариант тележки. Пока не лежит в 1-ому варианту. Если рюмку разливать не буду, остановлюсь на 4-ех моторной как самой крепкой схеме. 

 

art100
Offline
Зарегистрирован: 09.03.2014


Кайф. Надо спинку почесать. ;)

1

2

/ ------------- PROCESS AND INTERPRET SENSOR DATA ------------- void AvoidWalls() { // GET/SET URGE VALUES basicVelocity = 150; // Set above 0 to make it continuously move forward urgMotor_L = 0; urgMotor_R = 0; urgFatigue = 0; // AVOID WALLS AT SIDE urgTurn_L += maxPing*maxPing - ((maxPing-sonarRightVAL) * (maxPing-sonarRightVAL)); //inverse proportional to square of rightval urgTurn_R += maxPing*maxPing - ((maxPing-sonarLeftVAL ) * (maxPing-sonarLeftVAL )); urgMotor_L -= 0.1*(maxPing*maxPing - ((maxPing-sonarRightVAL) * (maxPing-sonarRightVAL))); urgMotor_R -= 0.1*(maxPing*maxPing - ((maxPing-sonarLeftVAL ) * (maxPing-sonarLeftVAL ))); // AVOID OBJECTS IN FRONT urgMotor_L += maxPing*maxPing - 0.5*((maxPing-sonarFrontLeftVAL ) * (maxPing-sonarFrontLeftVAL )) - ((maxPing-sonarFrontRightVAL) * (maxPing-sonarFrontRightVAL)); urgMotor_R += maxPing*maxPing - 0.5*((maxPing-sonarFrontRightVAL) * (maxPing-sonarFrontRightVAL)) - ((maxPing-sonarFrontLeftVAL ) * (maxPing-sonarFrontLeftVAL )); // SCALE URGES TO PWM output values (255) urgTurn_L = 255 - map(urgTurn_L , 0, 1.8*maxPing*maxPing, -255, 255); // Scale to within PWM output limits urgTurn_R = 255 - map(urgTurn_R , 0, 1.8*maxPing*maxPing, -255, 255); urgMotor_L = map(urgMotor_L, 0, 1.8*maxPing*maxPing, -255, 255); // Scale to within PWM output limits urgMotor_R = map(urgMotor_R, 0, 1.8*maxPing*maxPing, -255, 255); // SET MOTOR SPEED newMotorSPD_L = basicVelocity + urgMotor_L + (urgTurn_R/4) - (urgTurn_L/2) + 60; newMotorSPD_R = basicVelocity + urgMotor_R + (urgTurn_L/4) - (urgTurn_R/2) + 60; // Clip to 255/-255 (negative value means reverse direction) if (newMotorSPD_L > 255) newMotorSPD_L = 255; if (newMotorSPD_L < -255) newMotorSPD_L = -255; if (newMotorSPD_R > 255) newMotorSPD_R = 255; if (newMotorSPD_R < -255) newMotorSPD_R = -255; }

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хорош бухать. уже диагноз заядлого ардуинщика. от кода оргазмирует

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

хорош бухать. уже диагноз заядлого ардуинщика. от кода оргазмирует


Судя по картинке он таки собрал фалоимитатор на ардуино гыы

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хуже. он его испытывает. надеюсь только для того чтобы код допилить

art100
Offline
Зарегистрирован: 09.03.2014

Каждый думает в меру своей распущенности.

Вот почему мужик в трусах, а все про секс думают?

Этой картинке сто лет в обед. Тоже обсуждения картинки скатывалось к сексуальным фантазиям.

В красные труселя что-ли попробовать закрасить?

Сегодня тестировал код вжикает класно :) надо отлаживать. Неожиданно обнаружил странное потребление неработающего радио на NRF24L01+. Весь день ушел на врезание амперметров. Или воткнул шунт 5 Ом 10 Ватт в 12.86в и понизил всего-то до 12.06в. Все успокоилось. Но желание уже нет высматривать имена/переменные. Поднос катается на старой программе и ладно.

Схема сейчас такая.

 

без радио и моторов все красиво 80мА

с радио AMS1117 я начал чувсвовать нагрев значит 40-60градусов

а так нет значит не более 40 градусов


 

шас попробую цифровиком померять

 

врубаем 1 ампер моторов и анализируем слаботочку

без радио после одно минуты

с просто воткнутым никаe толком не инициализированным радио меньше минуты

на AMS1117 уже критичные 65 градусов

Как могла Arduino Uno R3  с кучей железа прекрасно работающего

путем добавления только 12мА радио NRF24L01+ откушать лишние 200мА ?

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

может быть она миллиаперычасы в энергонезависимую память распихивала ?

мой кот, перед тем как мине на сутки дежурить, тоже отжирается..... автопоилкакормилка есть.... но он не доверяет ардуине после получения дюлей за погрызенный 328 камень