Шагомер и трекер линии

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

Я сделал код, который заставляет робота двигаться вперед, если linetracker имеет заданное значение. Проблема в том, что когда я реализую код для line-tracker, мои степперы будут работать очень медленно, вероятно, потому, что arduino постоянно сканирует, если значение linetracker ниже 500.

Мой вопрос: есть ли способ запрограммировать трекер линии, не мешая работе моих шаговых двигателей? (Шаговые двигатели работают плавно без трекера линии)

#include <RedBot.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//Code voor de LCD
#define I2C_ADDR       0x3F // Define I2C Address (use i2c scanner if necessary)
#define BACKLIGHT_PIN  3
#define En_pin         2
#define Rw_pin         1
#define Rs_pin         0
#define D4_pin         4
#define D5_pin         5
#define D6_pin         6
#define D7_pin         7
#define LED_OFF        0

#define LED_ON         1
//Hier worden de eigen functies gemaakt door HEX code
uint8_t battery_1[8]=   {0xe,0x1b,0x11,0x11,0x11,0x11,0x11,0x1f};
uint8_t battery_2[8]=   {0xe,0x1b,0x11,0x11,0x11,0x11,0x1f,0x1f};
uint8_t battery_3[8]=   {0xe,0x1b,0x11,0x11,0x11,0x1f,0x1f,0x1f};
uint8_t battery_4[8]=   {0xe,0x1b,0x11,0x11,0x1f,0x1f,0x1f,0x1f};
uint8_t battery_5[8]=   {0xe,0x1b,0x11,0x1f,0x1f,0x1f,0x1f,0x1f};
uint8_t battery_6[8]=   {0xe,0x1b,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
uint8_t battery_7[8]=   {0xe,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

RedBotSensor left_sen    =    RedBotSensor(A3);   
RedBotSensor right_sen   =    RedBotSensor(A2);
int lineStandard         =    800;

void setup()
{ 
  scherm();
  //stepper 1
  pinMode(13,OUTPUT);   // Step
  pinMode(12,OUTPUT);   // Dir
  //stepper 2
  pinMode(11,OUTPUT);   //Step 2
  pinMode(10,OUTPUT);   //Dir 2 
  Serial.begin(9600);
  Serial.println("IR Sensor Readings:: ");
  //delay(500);
}

void loop()
{
  Serial.print(left_sen.read());
  Serial.print("\t");  
  Serial.print(right_sen.read());
  Serial.println();

  if(right_sen.read() > lineStandard)
    {
      left();
    }

  else if(left_sen.read() > lineStandard)
    {
      right();
    }

  if((left_sen.read() > lineStandard) && (right_sen.read() > lineStandard) )
    {
      Stop ();
    }

  else
    {
      forward();
    }
}

void right() 
{
  //stepper 1
  digitalWrite(13,HIGH);  
  delayMicroseconds(1500); 
  digitalWrite(13,LOW);   
  delayMicroseconds(1500); 
  //stepper 2
  digitalWrite(11,LOW);   
  delayMicroseconds(1500); 
  //Oranje lampje, rechter kant
  //digitalWrite(3,HIGH);
}
void Stop () 
{
  digitalWrite(13, LOW);   
  delay(1500);
  digitalWrite(11, LOW);
  delay(1500);
  //Rood lampje aansturen
  //digitalWrite(2,HIGH);
}
void left() 
{
  //stepper 1
  digitalWrite(11,HIGH);  
  delayMicroseconds(1500); 
  digitalWrite(11,LOW); 
  delayMicroseconds(1500); 
  //stepper 2
  digitalWrite(13,LOW); 
  delayMicroseconds(1500);
  //Oranje lampje, linker kant
  //digitalWrite(4,HIGH);
}
void forward() 
{
  //stepper 1
  digitalWrite(13,HIGH);    
  delayMicroseconds(1500); 
  digitalWrite(13,LOW); 
  delayMicroseconds(1500); 
  //stepper 2
  digitalWrite(11,HIGH);   
  delayMicroseconds(1500); 
  digitalWrite(11,LOW);   
  delayMicroseconds(1500);  
  //Groen lampje sturen
  //digitalWrite(1,HIGH);
}

void scherm()
{
  lcd.begin(16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(LED_ON);
  //Hier worden de eigen symbolen benoemd
  lcd.createChar(1, battery_1);
  lcd.createChar(2, battery_2);
  lcd.createChar(3, battery_3);
  lcd.createChar(4, battery_4);
  lcd.createChar(5, battery_5);
  lcd.createChar(6, battery_6);
  lcd.createChar(7, battery_7);
  lcd.home();
  lcd.print("Batterij Status");
  lcd.setCursor(0, 1);
  //Schrijf de batterij icoontjes naar het LCD
  lcd.write(1);
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  lcd.write(5);
  lcd.write(6);
  lcd.write(7);
}

, 👍2

Обсуждение

Попробуйте удалить оператор последовательной печати. Это снижает производительность. А затем изучите, как использовать прерывания, которые вы могли бы использовать в сочетании с конкурентом., @Sanchises


2 ответа


1

Вы можете использовать драйвер для шаговых двигателей, чтобы управлять двигателями с помощью ШИМ. Вы вызываете ШИМ из Arduino с помощью analogWrite(). После вызова analogWrite() пин будет генерировать устойчивую прямоугольную волну указанного рабочего цикла до следующего вызова analogWrite() (Прочтите эту ссылку со страницы Arduino). Это поможет вам в вашем проекте и, возможно, поможет найти решение ваших проблем при одновременном считывании показаний датчика. Преимущество использования ШИМ в том, что вы также можете сделать движение вашего робота более плавным, когда он пересекает или ищет свой путь.

Я также рекомендую использовать два датчика (я полагаю, вы используете ИК), так что если вы хотите отслеживать черную поверхность и есть поворот, один из датчиков будет обнаруживать линию, а другой — нет. Таким образом, вы можете предположить, в какую сторону должен повернуть робот, что делает его более эффективным.

,

Спасибо за комментарий. Сейчас я использую два датчика отслеживания линии, и они работают отлично. Мой код тоже завершён, но проблема с запаздывающими шаговыми двигателями осталась. Попробую использовать два Arduino., @Jordakoes

Что ж, использование двух плат Arduino будет пустой тратой, если вы планируете реализовать простую функцию отслеживания линии с помощью двух микроконтроллеров, таких как ATmega328P. Поскольку драйвер использует MOSFET для управления роботом, вы обеспечите избыточность в своей схеме. Просто рекомендация. Если у вас нет проблем, продолжайте., @Alejandro Harris Bonet

Кроме того, покупка драйвера должна быть дешевле, чем у других Arduino [ссылка](http://www.ebay.com/itm/1PCS-L298N-Dual-Stepper-Motor-Driver-Controller-Board-Module-RED-/201415143662?hash=item2ee54730ee:g:qY8AAOSw6EhUPcgb), @Alejandro Harris Bonet

Я использую драйверы, это Polulu drv8825, @Jordakoes

Но проблема все еще остается. Может быть, я делаю что-то неправильно в кодировке?, @Jordakoes

@Jordakoes, пожалуйста, обновите новый код. Если нет, то для управления ШИМ следует использовать analogWrite()., @Alejandro Harris Bonet

Извините за столь поздний ответ, у меня были длинные рождественские каникулы. В любом случае, мне интересно, как реализовать ШИМ в моём текущем коде? (Я обновил код в посте выше.), @Jordakoes


0

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

Вы просто генерируете сигнал ШИМ для управления шаговыми двигателями. Так что сделайте эту генерацию в фоновом режиме, например, через таймер isr.

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

,