Т1 "Рожденный побеждать". Часть 2

Уже скоро стартуют Городские соревнования по робототехнике, и наша команда готовит своего робота к участию в категории "Трасса". Предлагаем вам присоединиться к подготовке и в реальном времени наблюдать, что мы делаем.

Мы делаем с нуля телегу, названную Т1 "Рожденный побеждать". Проект состоит из трёх частей: электроника, конструкция, код. В предыдущем посте мы рассказали про электронику, пришло время кода. 

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

Поехали!

Будем писать библиотеку, которую назовем - сюрприз! - T1.

В хэдере сначала опишем дефайнами все пины, к которым что-то подключено, строго по схеме.

scheme 

1
2
3
4
5
6
7
8
9
10
11
12
#define PIN_SONAR_TRIG A2
#define PIN_SONAR_ECHO A3
 
#define PIN_SENSOR_LEFT A7
#define PIN_SENSOR_RIGHT A0
 
#define PIN_BUTTON 2
 
#define PIN_IN1 9
#define PIN_IN2 3
#define PIN_IN3 6
#define PIN_IN4 5

И после этого пора объявлять класс. Сделаем в нем пять пебличных методов:

1. ПРОЧИТАЙ_ЛЕВЫЙ_СЕНСОР
2. ПРОЧИТАЙ_ПРАВЫЙ_СЕНСОР
3. ПРОЧИТАЙ_СОНАР
4. СКАЖИ_НАЖАТА_ЛИ_КНОПКА
5. ЕХАЙ!

С первыми четырьмя методами всё понятно-просто, а в случае с методом ЕХАЙ есть о чем подумать. В принципе, тут может быть несколько вариантов, но мы решили в данный момент остановиться на таком: сделать один метод drive(int,int), который принимает два аргумента: скорость левого мотора и скорость правого мотора по порядку. Допустимые значения для каждого аргумента: -255...255. Причем отрицательные значения заставляют мотор крутиться назад со скоростью, взятой по модулю. метод drive(int, int) в данном случае оборачивает четыре приватных метода, которые крутят каждый отдельным мотор в каждую отдельную сторону.

Как минимум один суперминус заключается в том, что при указании скорости ниже какого-то порогового значения по модулю, мотор просто не будет крутиться, потому что ему не хватит тока, сообщаемого через ШИМ. Мы пока не занимались поиском этого порога. Может быть, если будет время, переделаем интерфейс с учетом вот этого всего. 

Ну и может вообще такой подход может оказаться не удобным для той задачи, поживем-увидим!

В итоге вот такой у нас получился класс:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class T1 {
  public:
    T1();
    int readSensorL();
    int readSensorR();
    long readSonar();
    bool buttonPressed();
    void drive(int , int );
  private:
    void leftMotorForw(int );
    void leftMotorBack(int );
    void rightMotorForw(int );
    void rightMotorBack(int );
};    

Описания методов лежат в cpp файлике. Если кому интересно, можно посмотреть на github.

Мы также добавили пару примеров, как это работает:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
// подключаем библиотеку
#include <t1.h>
 
// создаем объект класса Т1 и называем его telega
T1 telega = T1();
 
void setup(){ 
	// стартуем последовательное соединение с ПК 
	// на скорости 19200
	Serial.begin(19200); 
} 
 
void loop(){
	// читаем значение с левого сенсора и печатаем
	// без переноса строки
	Serial.print("Left = "); 
	Serial.print(telega.readSensorL()); 
	// читаем значение с правого сенсора и печатаем
	// без переноса строки
	Serial.print(" Right = "); 
	Serial.print(telega.readSensorR()); 
	// читаем значение с сонара и печатаем
	// с переносом строки
	Serial.print(" RF = "); 
	Serial.println(telega.readSonar()); 
	// задержка 100 миллисекунд
	delay(100);
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// подключаем библиотеку
#include <t1.h>
 
// создаем объект класса Т1 и называем его telega
T1 telega = T1();
 
void setup(){ 
	// стартуем последовательное соединение с ПК 
	// на скорости 19200
	Serial.begin(19200); 
} 
 
void loop(){
	// читаем значение с левого сенсора и печатаем
	// без переноса строки
	Serial.print("Left = "); 
	Serial.print(telega.readSensorL()); 
	// читаем значение с правого сенсора и печатаем
	// без переноса строки
	Serial.print(" Right = "); 
	Serial.print(telega.readSensorR()); 
	// читаем значение с сонара и печатаем
	// с переносом строки
	Serial.print(" RF = "); 
	Serial.println(telega.readSonar()); 
	// задержка 100 миллисекунд
	delay(100);
}

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

Читайте далее про конструкцию робота!

Метки: программирование, Arduino

Добавить комментарий


Защитный код
Обновить