робот на Уз дальномере

zugni
Offline
Зарегистрирован: 14.06.2015

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

#define trigPin 5
#define echoPin 6

int motorPin = 8; //right side to IB - forwward

int motorPin2 = 9; //left side to IA - forwward

int motorPin3 = 10; //right side to IA - backward

int motorPin4 = 11; //left side to IB - backward



void setup()

{

Serial.begin (9600);

pinMode(motorPin, OUTPUT);

pinMode(motorPin2, OUTPUT);

pinMode(motorPin3, OUTPUT);

pinMode(motorPin4, OUTPUT);

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

}

void forward(){

digitalWrite(motorPin, HIGH);

digitalWrite(motorPin2, HIGH);

digitalWrite(motorPin3, LOW);

digitalWrite(motorPin4, LOW);

}

void backward() {

digitalWrite(motorPin, LOW);

digitalWrite(motorPin2, LOW);

digitalWrite(motorPin3, HIGH);

digitalWrite(motorPin4, HIGH);

}

void turnLeft() {

digitalWrite(motorPin, HIGH);

digitalWrite(motorPin2, LOW);

digitalWrite(motorPin3, LOW);

digitalWrite(motorPin4, HIGH);

}

void turnRight() {

digitalWrite(motorPin, LOW);

digitalWrite(motorPin2, HIGH);

digitalWrite(motorPin3, HIGH);

digitalWrite(motorPin4, LOW);

}

int CheckDistance() // Проверяем расстояние

{

long duration, distance;  //Длительность расстояния

digitalWrite(trigPin, LOW); // Добавить эту строку
delayMicroseconds(2);       // 2 Добавить эту строку
digitalWrite(trigPin, HIGH);

delayMicroseconds(10);      // Добавить эту строку
digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

  distance = (duration/2) / 29.1;  //29.1

  return distance;

 }

  void loop()

 {

  int testDistance = CheckDistance(); /// получить расстояние до объекта с помощью команды ping

  if (testDistance >= 30 || testDistance <= 0) /// если объект находится более чем в 30 см от него идет вперед
  
 {

  forward();

 }

  else /// объект находится ближе, чем 30 см, поворачивает направо

 {

  turnRight();

 }

delay(500); ///ждать пол сек до следующего пинга

 }

 

crazy-coder
Offline
Зарегистрирован: 20.07.2015

из вашего поста не понятно, что за железка, сколько моторов и каким образом она уравляется.

с дальномером понятно, допустим по какой-то причине он глючит, но что именно происходит в момент когда робот врезается и стоит на месте, каковы показания дальномера?

какие моторы? шаговые или роторные? если роторные то задержка здесь не нужна, т.к. за это время робот может проделать недопустимо большой путь...

zugni
Offline
Зарегистрирован: 14.06.2015

Обычный тех калесный робот 2wd  3й от мебельного столика .

показания с дальномера нормальные 

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

crazy-coder
Offline
Зарегистрирован: 20.07.2015

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

все еще недостаточно информации. судя по всему у вас обычные роторные моторчике в этом случае delay(500) не нужен, да и вообще по любому он не нужет, тем более что на момент измерений робот продолжает свое движение в заданном направлении.

так же интересно как себя ведет робот после того как врезался и застрял, если его руками поднять и переместить на другое место - он поедет дальше или так же будет тупить? да и вообще если его поднять колеса крутятся?

опять же застряет когда упирается в стену или исключительно какой-нибудь тонкий/узкий объект типа ножки стула?

где брали пример скетча?

по хорошему нужно выводить лог с показаниями дальномера вполне возможно всплывут какие-нибудь аномалии

zugni
Offline
Зарегистрирован: 14.06.2015

где брал не помню я эти примеры давно собирал по инету. а что в место delay(500) писать? да я думаю тут еще один намечается скетч но тут уже другое подключил двигатели как там на картинке и даже в скетче видно как их подключать .робот ездиет как ему вздумается и попрежнему ультрозвукоговой дальномер не совсем точно реагирует.

 

http://www.khnu.km.ua/root/kaf/ksm/sayt2/robot.htm

crazy-coder
Offline
Зарегистрирован: 20.07.2015

delay(500) - это задержка, если ее убрать (т.е. удалить строчку или закомментировать), то опрос датчика и управление двигателями будет осуществляться без задержки, что вообще-то логично особенно если под ногами у робота может болтаться кошка

еще такое "странное" поведение может быть из-за разряженных батарей, плохого контакта в цепях и так же из-за неверной установки дальномера (например наклонен вниз,  либо неровный и/или "волосатый" (ковер) пол

zugni
Offline
Зарегистрирован: 14.06.2015

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

kayot
kayot аватар
Offline
Зарегистрирован: 11.04.2014
[code]

//
//  board pinout:
//
//                         ATmega368      Arduino 
//                       +-----\/----+
//          Reset       1| PC6   PC5 |28  D19 
//          Rx    D0    2| PD0   PC4 |27  D18 
//          Tx    D1    3| PD1   PC3 |26  D17      
//                D2    4| PD2   PC2 |25  D16     
//                D3    5| PD3   PC1 |24  D15 
//                D4    6| PD4   PC0 |23  D14 
//                      7| VCC   GND |22  
//                      8| GND  AREF |21  
//          Xtal        9| PB6  AVCC |20  
//          Xtal       10| PB7   PB5 |19  D13        
//                D5   11| PD5   PB4 |18  D12     
//                D6   12| PD6   PB3 |17  D11       
//                D7   13| PD7   PB2 |16  D10     
//                D8   14| PB0   PB1 |15  D9 
//                       +-----------+
//


#include <Servo.h>


//Inputs/outputs


#define RightBumper 19      // digital pin 19
#define LeftBumper  18      // digital pin 18
#define Motor_1     17      // Right Motor
#define Motor_2     16      // Right Motor
#define Motor_3     15      // Left Motor
#define Motor_4     14      // Left Motor
#define SPICLOCK    13      //sck
#define DATAIN      12      //miso  ISD17xx
#define DATAOUT     11      //mosi
#define SLAVESELECT 10      //ss
#define Echo        9       // digital pin 9 
#define Trig        8       // digital pin 8 
#define SoundON     7       // digital pin 7
#define RightSens   6       // digital pin 6
#define LeftSens    2       // digital pin 5
#define LedPin      4       // digital pin 4   
#define PanPin      3       // digital pin 3
#define EnableMotor 5       // digital pin 2
//servo
#define center 94

//opcodes ISD17xx
#define PU          0x01
#define STOP        0x02
#define RESET       0x03
#define CLR_INT     0x04
#define RD_STATUS   0x05
#define RD_PLAY_PTR 0x06
#define PD          0x07
#define RD_REC_PTR  0x08
#define DEVID       0x09
#define PLAY        0x40
#define REC         0x41
#define ERASE       0x42
#define G_ERASE     0x43
#define RD_APC      0x44
#define WR_APC1     0x45
#define WR_APC2     0x65
#define WR_NVCFG    0x46
#define LD_NVCFG    0x47
#define FWD         0x48
#define CHK_MEM     0x49
#define EXTCLK      0x4A
#define SET_PLAY    0x49
#define SET_REC     0x81
#define SET_ERASE   0x82


//Variables
byte dir=0;
int turn90=600;
int turn45=300;
int stopTime=200;
int USdistance=0;
int treshold=20; //20cm min distance
int value=0;
int m=0;
int brake=40;
Servo Pan; 
 
//-----------------------------------------------------------------------------


void setup() { 
   //start serial
    Serial.begin (19200);
    Serial.println("start");

  
  //ISD17xx 
  byte clr;
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device  
  SPCR = B01111111; //data lsb, clock high when idle, samples on falling
  clr=SPSR;
  clr=SPDR;
  delay(10);
  
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(PU); // power up
  spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT,HIGH);
  delay(100);  

  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(CLR_INT); // clear interupt and eom bit
  spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT,HIGH);
  delay(100);

  
 //ON/OFF 
  pinMode(SoundON, INPUT);
  digitalWrite(SoundON, HIGH); //turn on pull up
  Stop();
  // set motor pins as output and LOW so the motors are breaked
  pinMode(Motor_1, OUTPUT);
  pinMode(Motor_2, OUTPUT);
  pinMode(Motor_3, OUTPUT);
  pinMode(Motor_4, OUTPUT);
  pinMode(EnableMotor, OUTPUT);
  digitalWrite(EnableMotor, LOW);
  
  //usonic
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  
  //bamper ,track sens L298
  pinMode(LeftBumper, INPUT); 
  digitalWrite(LeftBumper, HIGH); //turn on pull ups
  pinMode(RightBumper, INPUT); 
  digitalWrite(RightBumper, HIGH); //turn on pull ups
  pinMode(LeftSens, INPUT); 
  digitalWrite(LeftSens, HIGH); //turn on pull ups
  pinMode(RightSens, INPUT); 
  digitalWrite(RightSens, HIGH); //turn on pull ups
  
  //servo
  Pan.attach(PanPin);
  Pan.write(center); //90
  StepDelay();

 
 //LED, buzzer
  pinMode(LedPin, OUTPUT);      
  digitalWrite(LedPin, LOW);  

  
} 

void loop(){
 
  
  
  //ON 
if (digitalRead(SoundON)==LOW){
//digitalWrite(LedPin, HIGH);

 Forward();

   digitalWrite(SLAVESELECT,LOW);
   spi_transfer(PLAY); // clear interupt and eom bit
   spi_transfer(0x00); // data byte
   digitalWrite(SLAVESELECT,HIGH); 
 
 
  while(m < 400){
// выполнить  повторив 400 раз
    Drive();
Serial.println(m); 
    
 m++;

}  
 
 //OFF
 //ISD17xx
 digitalWrite(SLAVESELECT,LOW);
 spi_transfer(STOP); // clear interupt and eom bit
 spi_transfer(0x00); // data byte
 digitalWrite(SLAVESELECT,HIGH);
 
 //digitalWrite(LedPin, LOW);
 digitalWrite(EnableMotor, LOW);
 Stop();
 m=0;
delay(1000);
}

}


void Drive(){
   //ISD17xx

 digitalWrite(SLAVESELECT,LOW);
  spi_transfer(FWD); // clear interupt and eom bit
  spi_transfer(0x00); // data byte
  digitalWrite(SLAVESELECT,HIGH);

  
  
  //Work sensor
  if (digitalRead(LeftBumper)==LOW){
  digitalWrite(LedPin, HIGH);  
    Stop();
    StepDelay();
  digitalWrite(LedPin, LOW);  
    Reverse();
    StepDelay();
    Stop();
    StepDelay();
    Right();
    delay(turn45); //turn45
    Stop();
    StepDelay();
    Forward();
  }
  if (digitalRead(RightBumper)==LOW){
  digitalWrite(LedPin, HIGH);  
    Stop();
    StepDelay();
  digitalWrite(LedPin, LOW);  
    Reverse();
    StepDelay();
    Stop();
    StepDelay();
    Left();
    delay(turn45); //turn45
    Stop();
    StepDelay();
    Forward();
  }
  if (digitalRead(LeftSens)==LOW){
  digitalWrite(LedPin, HIGH);  
    Stop();
    StepDelay();
  digitalWrite(LedPin, LOW);  
    Reverse();
    StepDelay();
    Stop();
    StepDelay();
    Right();
    delay(turn45); //turn45
    Stop();
    StepDelay();
    Forward();
  }
  if (digitalRead(RightSens)==LOW){
  digitalWrite(LedPin, HIGH);  
    Stop();
    StepDelay();
  digitalWrite(LedPin, LOW);  
    Reverse();
    StepDelay();
    Stop();
    StepDelay();
    Left();
    delay(turn45); //turn45
    Stop();
    StepDelay();
    Forward();
}
  //usonic
  USdistance=Read_Ping_Sensor();
  Serial.print("USdistance ");
  Serial.println(USdistance);
  if(USdistance>40)analogWrite(EnableMotor,1000);
               else analogWrite(EnableMotor,400);
  if (USdistance<10){
    Stop();
    StepDelay();
    TurnAround();
  }
  if (USdistance<treshold){
    Stop();
    StepDelay();
    Avoid();
    Forward();
  }
  delay(50);

}
//work servo
void TurnAround(){
    Reverse();
    Pan.write(center);
    StepDelay();
    Stop();
    Left();
    delay(turn90);
    delay(turn90);
    Stop();
    StepDelay();
    Forward();
}

void Avoid(){
  int prev=0;
  dir=2;
  for (byte i=0; i<5; i++){
    Pan.write(i*45);
    StepDelay();
    StepDelay();
    USdistance=Read_Ping_Sensor();
    if (USdistance>prev){
      dir=i;
      prev=USdistance;
    }
  }
  Pan.write(center);
  StepDelay();
  switch (dir){
    case 0:
      Right();
      delay(turn90);
      Stop();
      StepDelay();
      break;
    case 1:
      Right();
      delay(turn90); //turn45
      Stop();
      StepDelay();
      break;
    case 2:
      Forward();
      break;
    case 3:
      Left();
      delay(turn90); //turn45
      Stop();
      StepDelay();
      break;
    case 4:
      Left();
      delay(turn90);
      Stop();
     // speaker.Beep();
      StepDelay();
      break;
  }
  delay(500);
}  

// Read Sensors
int Read_Ping_Sensor(){ 
  int cm=0;
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  value=pulseIn(Echo, HIGH);
  value=(value/2) /29.1;
  cm=int(value);
  return cm;
}
   void StepDelay() {
    for (byte t=0; t<10; t++){
 //SoftwareServo::refresh();
      delay(20);
    }
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//Work motors
void Forward(){
  digitalWrite(EnableMotor, HIGH);
  //analogWrite(EnableMotor,USdistance); 
  digitalWrite(Motor_1,  LOW); 
  digitalWrite(Motor_2, HIGH); 
  digitalWrite(Motor_3,  LOW); 
  digitalWrite(Motor_4, HIGH);
  Serial.println("Forward");Serial.println(USdistance);
  return;
}

void Reverse(){
  digitalWrite(EnableMotor, HIGH);
  digitalWrite(Motor_1, HIGH); 
  digitalWrite(Motor_2,  LOW); 
  digitalWrite(Motor_3, HIGH); 
  digitalWrite(Motor_4,  LOW); 
  Serial.println("Reverse");
  return;
}

void Right(){
  digitalWrite(EnableMotor, HIGH);
  digitalWrite(Motor_1,  LOW); 
  digitalWrite(Motor_2, HIGH); 
  digitalWrite(Motor_3, HIGH);
  digitalWrite(Motor_4,  LOW); 
  Serial.println("Right");
  return;
}

void Left(){
  digitalWrite(EnableMotor, HIGH);
  digitalWrite(Motor_1, HIGH); 
  digitalWrite(Motor_2,  LOW); 
  digitalWrite(Motor_3,  LOW); 
  digitalWrite(Motor_4, HIGH); 
  Serial.println("Left");
  return;
}

void Stop()
{
  digitalWrite(EnableMotor, LOW);
  digitalWrite(Motor_1, LOW); 
  digitalWrite(Motor_2, LOW); 
  digitalWrite(Motor_3, LOW);  
  digitalWrite(Motor_4, LOW); 
  Serial.println("Stop");
  return;
}
 //ISD17XX
  char spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait for the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}

[/code]

посмотри мож пригодится

ребенке делал ездит кричит и спотыкается ))))



 

zugni
Offline
Зарегистрирован: 14.06.2015

Спасибо попробую ))

zugni
Offline
Зарегистрирован: 14.06.2015

Кто не буть погите переделать код (kayot ) пользователя на 2 wd я не селен в программирование на деюсь на ваше понимание )

kayot
kayot аватар
Offline
Зарегистрирован: 11.04.2014

дык а в чем же ты силен тогда ?

там на 2wd и сделано

заточено под драйвер двигателя LM298

 

zugni
Offline
Зарегистрирован: 14.06.2015

kayot пишет:

дык а в чем же ты силен тогда ?

там на 2wd и сделано

заточено под драйвер двигателя LM298

 

А у Вас чей Мега 

 

не понятно как подключать к LM298N к ардуино уно ?





#define RightBumper 19      // digital pin 19
#define LeftBumper  18      // digital pin 18
#define Motor_1     17      // Right Motor
#define Motor_2     16      // Right Motor
#define Motor_3     15      // Left Motor
#define Motor_4     14      // Left Motor
#define EnableMotor 5       // digital pin 2

И не нашел к какому пину подключина Серво
 

хотябы картинку показали бы или проект как все это выглядит потаму что половину не понял что у вас там за билеотеки обьявлены короче наглядо посмотреть бы .

kayot
kayot аватар
Offline
Зарегистрирован: 11.04.2014

могу послать

могу не послать

глаза мыть нужно по утрам (серва на 3 пине )

картинка внутри скетча (для особо одаренных)

библиотек там кроме сервы нет

все остальное в гугле

 

zugni
Offline
Зарегистрирован: 14.06.2015

Спасибо