Шагомер и трекер линии
Я создаю программу, которая будет использовать шаговые двигатели и датчик отслеживания линии. Идея заключается в том, что когда линейный трекер обнаруживает черную поверхность, оба шаговых двигателя должны двигаться вперед, а когда линейный трекер не обнаруживает черную поверхность, он должен сканировать поверхность на предмет черной поверхности.
Я сделал код, который заставляет робота двигаться вперед, если 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);
}
@Jordakoes, 👍2
Обсуждение2 ответа
Вы можете использовать драйвер для шаговых двигателей, чтобы управлять двигателями с помощью ШИМ. Вы вызываете ШИМ из 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
Есть ли способ запрограммировать трекер линии, не мешая работе моих шаговых двигателей?
Вы просто генерируете сигнал ШИМ для управления шаговыми двигателями. Так что сделайте эту генерацию в фоновом режиме, например, через таймер isr.
Таким образом, ваш основной цикл() будет выполнять только низкоприоритетные задачи.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Попробуйте удалить оператор последовательной печати. Это снижает производительность. А затем изучите, как использовать прерывания, которые вы могли бы использовать в сочетании с конкурентом., @Sanchises