Помогите. Что не так сделал. Новичок
- Войдите на сайт для отправки комментариев
Вс, 15/11/2015 - 11:34
Что не так сделали, робот уборщик не работает.
1. DFrduino Romeo 1.1
2. Дальномер Sharp 2Y0A22 пин 0
3. ИК датчик линии аналоговые 2 шт пин 1, 2
4. сервоприводы 4 шт.
5. Моторы
#include <Servo.h> Servo myservo0; // назначаем вывод 1 сервы Servo myservo1; // назначаем вывод 2 сервы Servo myservo2; // назначаем вывод 3 сервы // Моторы подключаются к клеммам M1+,M1-,M2+,M2- // Motor shield использует четыре контакта 6,5,7,4 для управления моторами #define SPEED_LEFT 6 #define SPEED_RIGHT 5 #define DIR_LEFT 7 #define DIR_RIGHT 4 #define SENSOR_PIN 1 int i; int j; int p[18]; // массив, здесь будем записывать данные с ИК дальномера int gp,gp1,gp2,g; int b; int pos = 0; // Скорость, с которой мы движемся вперёд (0-255) #define SPEED 100 // Скорость прохождения сложных участков #define SLOW_SPEED 35 #define BACK_SLOW_SPEED 30 #define BACK_FAST_SPEED 50 // Коэффициент, задающий во сколько раз нужно затормозить // одно из колёс для поворота #define BRAKE_K 4 #define STATE_FORWARD 0 #define STATE_RIGHT 1 #define STATE_LEFT 2 #define STATE_BACK 3 #define SPEED_STEP 2 #define FAST_TIME_THRESHOLD 500 int state = STATE_FORWARD; int currentSpeed = SPEED; int fastTime = 0; void Forward() { state = STATE_FORWARD; fastTime += 1; if (fastTime < FAST_TIME_THRESHOLD) { currentSpeed = SLOW_SPEED; } else { currentSpeed = min(currentSpeed + SPEED_STEP, SPEED); } analogWrite(SPEED_LEFT, currentSpeed); analogWrite(SPEED_RIGHT, currentSpeed); digitalWrite(DIR_LEFT, HIGH); digitalWrite(DIR_RIGHT, HIGH); } void Spin_Right() { state = STATE_RIGHT; fastTime = 0; // Замедляем правое колесо относительно левого, // чтобы начать поворот analogWrite(SPEED_RIGHT, 0); analogWrite(SPEED_LEFT, SPEED); digitalWrite(DIR_LEFT, HIGH); digitalWrite(DIR_RIGHT, HIGH); } void Spin_Left() { state = STATE_LEFT; fastTime = 0; analogWrite(SPEED_LEFT, 0); analogWrite(SPEED_RIGHT, SPEED); digitalWrite(DIR_LEFT, HIGH); digitalWrite(DIR_RIGHT, HIGH); } void Backward() { state = STATE_BACK; fastTime = 0; analogWrite(SPEED_LEFT, SPEED); analogWrite(SPEED_RIGHT, SPEED); digitalWrite(DIR_LEFT, LOW); digitalWrite(DIR_RIGHT, LOW); } void motorStop(){ // Подпрограмма остановки мотора digitalWrite(DIR_LEFT,HIGH); digitalWrite(DIR_RIGHT,HIGH); } void motorRun(){ // Подпрограмма запуска мотора digitalWrite(DIR_LEFT,LOW); digitalWrite(DIR_RIGHT,LOW); } void setup() { // устанавливаем пин как вывод управления сервой myservo0.attach(6); // назначаем порты для 1 сервы myservo1.attach(6); // назначаем порты для 2 сервы myservo2.attach(5); // назначаем порты для 3 сервы // Настраивает выводы платы 4,5,6,7 на вывод сигналов for(int i = 4; i <= 7; i++) pinMode(i, OUTPUT); } void loop() { myservo1.write(15); // раскрываем лапки delay(100); myservo2.write(160); // раскрываем лапки delay(100); myservo0.write(0); delay(200); j=0; for (j=0;j<18;j++){ // для j от 0 до 18 myservo0.write(j*10); // вращение сервы по 10 градусов gp=analogRead(0); // считываем данные с ИК радара delay(50); p[j]=gp; // записываем это значение в массив Serial.println(p[j]); // выводим на экран gp2=(analogRead(2)); // считываем значение датчиков плоскости gp1=(analogRead(1)); g=min(gp1,gp2); // выбираем минимальное значение из двух if (g<4){ // Если значение близко к 0, то отходим назад и разворачиваемся motorRun(); Backward(); delay(500); Spin_Left(); delay(600); motorStop(); } if (p[j]<160){ // если значение с дальномера меньше 150, (примерно 25 см.), то шаг вперед motorRun(); Forward(); delay (50); motorStop();} else { // Иначе //digitalWrite(ledPin1, HIGH); // нажимаем кнопку перемотка //delay(100); //digitalWrite(ledPin1, LOW); // отпускаем кнопку перемотка //delay(100); myservo0.write(90); // поворачиваем голову вперед delay(200); gp=analogRead(0); // считываем данные с ИК радара Serial.println(gp); while(gp<160){ // поворачиваемся, пока не заметим предмет motorRun(); if (j>9){ // если предмет с лева, то Spin_Left();// поворот в сторону объекта } else { // иначе поворот вправо Spin_Right(); } delay (10); motorStop(); gp=analogRead(0); // считываем данные с ИК радара delay(50); } gp=analogRead(0); // считываем данные с ИК радара delay(50); while(gp<400){ //Двигаемся вперед пока предмет не будет на расстоянии 10 см. motorRun(); Forward(); // движение до объекта delay (50); // время движения motorStop(); gp=analogRead(0); // считываем данные с ИК радара delay(50); } myservo0.write(0); // убираем голову в сторону, чтобы она не мешала захвату предмета и транспортировке delay(100); motorRun(); Forward(); // движение до объекта delay (700); // время движения motorStop(); myservo1.write(140); // захват первой лапой delay(500); myservo2.write(15); // захват второй лапой delay(100); gp2=(analogRead(2)); gp1=(analogRead(1)); g=min(gp1,gp2); while(g>4) // движение после захвата до конца плоскости. { gp2=(analogRead(2)); gp1=(analogRead(1)); Serial.println(gp2); g=min(gp1,gp2); motorRun(); Forward(); delay(5); motorStop();} myservo1.write(15); // раскрываем лапки delay(100); myservo2.write(160); // раскрываем лапки delay(100); //digitalWrite(ledPin, HIGH); // нажимаем кнопку стоп //delay(150); //digitalWrite(ledPin, LOW); // отпускаем кнопку стоп //delay(100); motorRun(); Backward(); delay(100); Spin_Right(); delay(600); } } }
вы бы сначала описали что должно получится и как с этим кодом работает
хотели скопировать с этого
http://arduino.ru/forum/proekty/arduino-robot-dlya-nachinayushchikh
вам лень три слова написать, а кто то должен по вашим ссылкам лазить и коды разбирать.
нафиг это кому нужно....
Времени просто не было.
Робот должен найти банки из под сока хватает и отпускает на крае стола и сам должен не упась со стола