робот на Уз дальномере
- Войдите на сайт для отправки комментариев
Сб, 18/07/2015 - 18:37
Привет всем прошу как не когда раньше помощи для моего робота скетч имеется но работает не коректно этот датчик он не всегда срабатывает иногда робот врезается и стоит на месте так что чем не буть помогите и прижелание добавте серво в скетч чтоб как бы голова крутилась робота
#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); ///ждать пол сек до следующего пинга
}
из вашего поста не понятно, что за железка, сколько моторов и каким образом она уравляется.
с дальномером понятно, допустим по какой-то причине он глючит, но что именно происходит в момент когда робот врезается и стоит на месте, каковы показания дальномера?
какие моторы? шаговые или роторные? если роторные то задержка здесь не нужна, т.к. за это время робот может проделать недопустимо большой путь...
Обычный тех калесный робот 2wd 3й от мебельного столика .
показания с дальномера нормальные
а то что он врезается в программе все дела а как ее мне переписать если вопще не разу не брался у видел готовый скетч заказал игрушку и все думал ездить будет а тут на оборот
на самом деле причин может быть масса, от ошибки в программе до, как вы уже убедились, шерсти в колесах и варианты устрания глюков так же могут отличаться радикально...
все еще недостаточно информации. судя по всему у вас обычные роторные моторчике в этом случае delay(500) не нужен, да и вообще по любому он не нужет, тем более что на момент измерений робот продолжает свое движение в заданном направлении.
так же интересно как себя ведет робот после того как врезался и застрял, если его руками поднять и переместить на другое место - он поедет дальше или так же будет тупить? да и вообще если его поднять колеса крутятся?
опять же застряет когда упирается в стену или исключительно какой-нибудь тонкий/узкий объект типа ножки стула?
где брали пример скетча?
по хорошему нужно выводить лог с показаниями дальномера вполне возможно всплывут какие-нибудь аномалии
где брал не помню я эти примеры давно собирал по инету. а что в место delay(500) писать? да я думаю тут еще один намечается скетч но тут уже другое подключил двигатели как там на картинке и даже в скетче видно как их подключать .робот ездиет как ему вздумается и попрежнему ультрозвукоговой дальномер не совсем точно реагирует.
http://www.khnu.km.ua/root/kaf/ksm/sayt2/robot.htm
delay(500) - это задержка, если ее убрать (т.е. удалить строчку или закомментировать), то опрос датчика и управление двигателями будет осуществляться без задержки, что вообще-то логично особенно если под ногами у робота может болтаться кошка
еще такое "странное" поведение может быть из-за разряженных батарей, плохого контакта в цепях и так же из-за неверной установки дальномера (например наклонен вниз, либо неровный и/или "волосатый" (ковер) пол
вы мне не напишете простенький код чтоб мне от него плясать дальше буду признателен спс
[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]посмотри мож пригодится
ребенке делал ездит кричит и спотыкается ))))
Спасибо попробую ))
Кто не буть погите переделать код (kayot ) пользователя на 2 wd я не селен в программирование на деюсь на ваше понимание )
дык а в чем же ты силен тогда ?
там на 2wd и сделано
заточено под драйвер двигателя LM298
дык а в чем же ты силен тогда ?
там на 2wd и сделано
заточено под драйвер двигателя LM298
А у Вас чей Мега
не понятно как подключать к LM298N к ардуино уно ?
И не нашел к какому пину подключина Серво
хотябы картинку показали бы или проект как все это выглядит потаму что половину не понял что у вас там за билеотеки обьявлены короче наглядо посмотреть бы .
могу послать
могу не послать
глаза мыть нужно по утрам (серва на 3 пине )
картинка внутри скетча (для особо одаренных)
библиотек там кроме сервы нет
все остальное в гугле
Спасибо