roboforum.ru

Технический форум по робототехнике.

Тележка с манипулятором и брандспойтом

Re: Тележка с манипулятором и брандспойтом

Angel71 » 05 ноя 2014, 17:20

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

Re: Тележка с манипулятором и брандспойтом

elmot » 05 ноя 2014, 17:39

slom писал(а):сейчас ребенок спит, не могу жужжать, а то 6 моторов не хуже дрели работают :)
но постараюсь сегодня сделать.

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

Программно задействовать. С перегревом мотора лучше бороться через энкодеры, а акселерометром лучше защищаться от переворотов. Гуглить i2c arduino и смотреть родную прошивку тирекса.
А с энкодерами я чот не понял, они должны быть на мотороах, а не на плате

Re: Тележка с манипулятором и брандспойтом

slom » 05 ноя 2014, 17:43

elmot писал(а):А с энкодерами я чот не понял, они должны быть на мотороах, а не на плате


они там и есть, это просто запятую не поставил, на 2х средних моторах энкодеры а аксель на плате... :)

Re: Тележка с манипулятором и брандспойтом

elmot » 05 ноя 2014, 17:46

и что там за энкодеры?

Re: Тележка с манипулятором и брандспойтом

slom » 06 ноя 2014, 00:36

elmot писал(а):и что там за энкодеры?


по идее вот такие:

http://www.dagurobot.com/goods.php?id=87

http://robosavvy.com/forum/viewtopic.php?t=8329

вот кто то самодельный сделал :)
http://robosavvy.com/forum/viewtopic.php?p=34717#34717


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

Добавлено спустя 47 минут 16 секунд:
что за фигня может быть?
при добавлении библиотеки IRremote
компилятор выдает ошибку
C:\Users\SLOM\Desktop\arduino-1.0.6\libraries\RobotIRremote\IRremoteTools.cpp:5: error: 'TKD2' was not declared in this scope

Добавлено спустя 2 часа 12 минут 17 секунд:
вспомнил что у меня есть еще и ик пульт с приемником

нашел вот такой урок

http://cxem.net/arduino/arduino127.php

по нему все сделал, в мониторе выходят данные с нажатия кнопок, далее сделал управление сервой, после загрузки скетча серва принимает положение 90 град а при нажатии кнопок ничего не происходит :(

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


Код: Выделить всёРазвернуть
#include "Servo.h"
#include "IRremote.h"

IRrecv irrecv(7);
decode_results results;
Servo servoMain;

int servPoz = 90; //Начальное положение сервы
int lastPoz = 0;

void setup()
{
  Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
 
  irrecv.enableIRIn();
  servoMain.attach(8); // Servo присоединен к 10 выводу
  servoMain.write(servPoz);
}

void loop() {
  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX); // Отправляем полученную данную в консоль
    int res = results.value;
    Serial.println(res, HEX);
    if(res==0xFFA857)// Если нажата кнопка "+"
    {
      lastPoz=res;
      servPoz++; 
      servoMain.write(servPoz);
    }
    else if(res==0xFFE01F)// Если нажата кнопка "-"
    {
      servPoz--;
      lastPoz=res;
      servoMain.write(servPoz);
    }
    else if(res==0xFFFFFFFF)// Если кнопку удерживают
    {
      if(lastPoz==0xFFA857) servPoz++;// Удерживают "+"
      if(lastPoz==0xFFE01F) servPoz--;// Удерживают "-"   
      servoMain.write(servPoz);
    }

    irrecv.resume();
    delay(100);
  }
}



позднее попробую переделать этот код на управление двигателями... :D

Re: Тележка с манипулятором и брандспойтом

avr123.nm.ru » 06 ноя 2014, 12:03

это правильно?
servoMain.attach(8); // Servo присоединен к 10 выводу

Re: Тележка с манипулятором и брандспойтом

slom » 06 ноя 2014, 14:32

да правильно, я брал за основу чужой код из урока, там был 10 пин в моем случае пин 8, но переписывать сноску я не стал :)

Re: Тележка с манипулятором и брандспойтом

Duhas » 06 ноя 2014, 14:37

а зря. Коментарии важны, особенно верный. или удалите или исправьте.

Re: Тележка с манипулятором и брандспойтом

slom » 06 ноя 2014, 14:47

в чем может быть прикол?

Код: Выделить всёРазвернуть
#include<Ultrasonic.h>  /*включить установленную пользователем библиотеку*/
Ultrasonic ultrasonic(12,13);  /*создать экземпляр УЗ датчика и определить выводы*/
void setup() {
Serial.begin(9600);  /*начать передачу данных на скорости 9600 bps */
}
void loop()
{
  Serial.print(ultrasonic.Ranging(INC));  /* INC для дюймов, CM для сантиметров */
  Serial.println("in");   
  delay(100);
}


монитор выдает

Код: Выделить всёРазвернуть
0in
0in
0in
0in
4in
4in
4in
4in
4in
4in
4in
4in
4in
и тд...


вчера при тестах эхолот показывал большие велечины, чтото вроде 2х метров и тд... сейчас он сходу показывает 0
а если поднести предмет то начинает измерение.

вопрос почему при отсутствии в поле зрения препятствия стал 0 ?

пару раз были небольшие столкновения, но видимых повреждений уз датчика нет, да и в принцыпе он работает, расстояние меряет, только откуда со старта 0?

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

код:

Код: Выделить всёРазвернуть
#include<Ultrasonic.h>  /*включить установленную пользователем библиотеку*/
Ultrasonic ultrasonic(12,13);  /*создать экземпляр УЗ датчика и определить выводы*/

#define DirM1 2
#define PwmM1 3
#define DirM2 10
#define PwmM2 11
#define BrakeM1 4
#define BrakeM2 9



void setup()
{
pinMode (PwmM1, OUTPUT);
pinMode (DirM1, OUTPUT);
pinMode (BrakeM1, OUTPUT);
pinMode (PwmM2, OUTPUT);
pinMode (DirM2, OUTPUT);
pinMode (BrakeM2, OUTPUT);
digitalWrite (BrakeM1, LOW);
digitalWrite (BrakeM2, LOW);

Serial.begin(9600);  /*начать передачу данных на скорости 9600 bps */

}


void loop() {
 
  Serial.print(ultrasonic.Ranging(INC));  /* INC для дюймов, CM для сантиметров */
  Serial.println(" inc ");   
 

  if(ultrasonic.Ranging(INC) < 30) {
    rotateLeft();
                                   }
  else {
  goForward();
       }

  delay(0);
 
}

void goForward ()
{
digitalWrite (DirM1, HIGH);
analogWrite (PwmM1, 100);
digitalWrite (DirM2, HIGH);
analogWrite (PwmM2, 100);
  Serial.println("GO ");
}

void rotateLeft ()
{
digitalWrite (DirM1, HIGH);
analogWrite (PwmM1, 130);
digitalWrite (DirM2, LOW);
analogWrite (PwmM2, 130);

  Serial.println("to left");

}


void startUp ()
{

}

Re: Тележка с манипулятором и брандспойтом

Angel71 » 06 ноя 2014, 17:12

Код: Выделить всёРазвернуть
#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}

void loop() {
/* The following trigPin/echoPin cycle is used to determine the
distance of the nearest object by bouncing soundwaves off of it. */
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

digitalWrite(trigPin, HIGH);
delayMicroseconds(10);

digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.
distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){
/* Send a negative number to computer and Turn LED ON
to indicate "out of range" */
// Serial.println("-1");
digitalWrite(LEDPin, HIGH);
}
else {
/* Send the distance to the computer using Serial protocol, and
turn LED OFF to indicate successful reading. */
Serial.println(distance);
digitalWrite(LEDPin, LOW);
}

//Delay 50ms before next reading.
//delay(50);
}

Re: Тележка с манипулятором и брандспойтом

slom » 06 ноя 2014, 22:57

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

Код: Выделить всёРазвернуть
#include <IRremote.h>

int RECV_PIN = 7;
#define DirM1 2
#define PwmM1 3
#define DirM2 10
#define PwmM2 11
#define BrakeM1 4
#define BrakeM2 9


IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запуск приемника

pinMode (PwmM1, OUTPUT);
pinMode (DirM1, OUTPUT);
pinMode (BrakeM1, OUTPUT);
pinMode (PwmM2, OUTPUT);
pinMode (DirM2, OUTPUT);
pinMode (BrakeM2, OUTPUT);
digitalWrite (BrakeM1, LOW);
digitalWrite (BrakeM2, LOW);
}

void loop() {
if (irrecv.decode(&results)) {
   
if (results.value == 16736925){  //вперед
Serial.println("/|");
     
digitalWrite (DirM1, HIGH);
analogWrite (PwmM1, 120);
digitalWrite (DirM2, HIGH);
analogWrite (PwmM2, 120);
delay(500);
digitalWrite (DirM1, HIGH);
analogWrite (PwmM1, 0);
digitalWrite (DirM2, HIGH);
analogWrite (PwmM2, 0);
    }

if (results.value == 16712445){ //назад
  Serial.println("|/");

digitalWrite (DirM1, LOW);
analogWrite (PwmM1, 120);
digitalWrite (DirM2, LOW);
analogWrite (PwmM2, 120);
delay(500);
digitalWrite (DirM1, LOW);
analogWrite (PwmM1, 0);
digitalWrite (DirM2, LOW);
analogWrite (PwmM2, 0);

    }
if (results.value == 16754775){ //Стоп
  Serial.println("STOP");
     
digitalWrite (DirM1, LOW);
analogWrite (PwmM1, 0);
digitalWrite (DirM2, LOW);
analogWrite (PwmM2, 0);
    }
    irrecv.resume(); // Получаем следующее значение
  }
}


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

результаты в мониоре
Код: Выделить всёРазвернуть
/|
/|
/|
/|
|/
|/
|/
STOP
STOP
STOP
STOP


ик пульт работает, плата работает, программа работает, почему колеса не крутят? :crazy:

Re: Тележка с манипулятором и брандспойтом

Angel71 » 06 ноя 2014, 23:10

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

Re: Тележка с манипулятором и брандспойтом

slom » 06 ноя 2014, 23:37

Angel71 писал(а):как переделали? что значит почти также? что значит не работает? с чего вы взяли, что не работает? и т.д. :good:
потому, что этот код пишите вы. и пока вы не измените своё отношение, не начнёте прислушивать, эта фигня с кодом будет продолжаться.


1. переделал совместив 2 различных кода, один вот этот:

Код: Выделить всёРазвернуть
#include <AFMotor.h>
#include <IRremote.h>

int RECV_PIN = 9;

AF_DCMotor motor_a(1, MOTOR12_64KHZ);
AF_DCMotor motor_b(2, MOTOR12_64KHZ);

IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  motor_a.setSpeed(255);
  motor_b.setSpeed(255);
}

void loop() {
  if (irrecv.decode(&results)){

    /*
    Serial.println(results.value);
    Serial.println(results.value, HEX);
    Serial.println("====");
    */

   if (results.value == 0xFF18E7) { //вперед
      Serial.println("/|");
      motor_a.run(FORWARD);
      motor_b.run(FORWARD);
      delay(100);
      motor_a.run(RELEASE);
      motor_b.run(RELEASE);
    }

    if (results.value == 0xFF4AB5) { //назад
      Serial.println("|/");
      motor_a.run(BACKWARD);
      motor_b.run(BACKWARD);
      delay(100);
      motor_a.run(RELEASE);
      motor_b.run(RELEASE);
    }

    if (results.value == 0xFF10EF) { //налево
      Serial.println("<--");
      motor_b.run(BACKWARD);
      motor_a.run(FORWARD);
      delay(100);
      motor_a.run(RELEASE);
      motor_b.run(RELEASE);
    }

    if (results.value == 0xFF5AA5) { //направо
      Serial.println("-->");
      motor_b.run(FORWARD);
      motor_a.run(BACKWARD);
      delay(100);
      motor_a.run(RELEASE);
      motor_b.run(RELEASE);
    }
    irrecv.resume(); // Receive the next value
  }
}


из темы:
http://arduino.ru/forum/programmirovanie/upravlenie-ik-pdu#comment-87026

у людей работает, но у них там другой мотор шилд, по дего как я понял спец библиотека, мне походу это не надо, у меня движки крутят при вот таком коде:

Код: Выделить всёРазвернуть
#define DirM1 2 
#define PwmM1 3
#define DirM2 10
#define PwmM2 11
#define BrakeM1 4
#define BrakeM2 9

void setup()
{
pinMode (PwmM1, OUTPUT);
pinMode (DirM1, OUTPUT);
pinMode (BrakeM1, OUTPUT);
pinMode (PwmM2, OUTPUT);
pinMode (DirM2, OUTPUT);
pinMode (BrakeM2, OUTPUT);
digitalWrite (BrakeM1, LOW);
digitalWrite (BrakeM2, LOW);
}
//


void loop()
  {
   
// вперед


   digitalWrite (DirM1, HIGH);
analogWrite (PwmM1, 200);
digitalWrite (DirM2, HIGH);
analogWrite (PwmM2, 200);
delay (500); // задержка в течении которой крутит

// стоп
analogWrite (PwmM1, 0);
analogWrite (PwmM2, 0);
delay (2000); // вперед время в течении которого не крутит



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


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

Re: Тележка с манипулятором и брандспойтом

Angel71 » 07 ноя 2014, 00:25

что бы код был понятен, нужно для начала язык подучить. в том числе и на это неоднократно намекалось. хорошо, в кратком переводе с си на русский тот код означает следующее: получать данные с дальномера и отправить в уарт. по выводу можно было понять, у вас с датчиков всё нормально или нет. если не понимаете, почему нельзя по вашему коду и данным с уверенностью делать выводы, обьясняю. что там за код в библиотеки неизвестно, соответственно от полученных данных толку 0.
а что конкретней хотите увидеть, если не хотите понять, что либо играетесь в rc кубики, либо начинаете учиться программированию. или не понимаете, что копаться в ваших бездумно слепленых кусках кода, желающих всё меньше и меньше?

Re: Тележка с манипулятором и брандспойтом

RootAdmin » 07 ноя 2014, 10:26

У меня дальномер давал нулевое расстояние - когда принимал еще не отправленный импульс.


Rambler\'s Top100 Mail.ru counter