"ЖЕЛЕЗЯКА 1" - ИЛИ РОБОТ ИЗ "ОБЫЧНОГО" МЕТАЛЛИЧЕСКОГО КОНСТРУКТОРА - ЧАСТЬ 5
Предыдущая часть

Программное обеспечение

На деле это самая простая часть — в Интернет полно примеров, как заставить такую тележку «бегать» управляя ей со смартфона или другим способом.

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

Используя данные производителя платы драйвера двигателей по разводке

Motor Control Interface
Pin	Description
B-IA	Motor B Input A (IA)
B-IB	Motor B Input B (IB)
GND	Ground
VCC	Operating Voltage 2.5-12V
A-IA	Motor A Input A (IA)
A-IB	Motor A Input B (IB)


и таблицу истинности

Motor Truth Table
IA	IB	Motor State
L	L	Off
H	L	Forward
L	H	Reverse
H	H	Off


легко задать скетч для Arduino. Конечно легко на словах — я потратил 4 часа, пытаясь найти проблему работы скетча. Как оказалось для Arduino Leonardo (что кстати написано в документации на сайте) надо использовать Serial1, вместо простого Serial. Поэтому если у вас плата, отличная от Leonardo, используйте нужную подпрограмму для вашей платы (для UNO к примеру замените все Serial1 на Serial в тексте).



// wired connections
#define MOTOR_A_PWM 5 // Motor A Input A --> MOTOR A +
#define MOTOR_A_IB 6 // Motor A Input B --> MOTOR A -
#define MOTOR_B_PWM 9 // Motor B Input A --> MOTOR B +
#define MOTOR_B_IB 10 // Motor B Input B --> MOTOR B -

#define DIR_DELAY 300 // brief delay for abrupt motor changes
#define PWM_SPEED 255
int val;

void setup()
{
  Serial1.begin( 9600 );
  while (!Serial1) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  pinMode( MOTOR_A_PWM, OUTPUT );
  pinMode( MOTOR_A_IB, OUTPUT );
  pinMode( MOTOR_B_PWM, OUTPUT );
  pinMode( MOTOR_B_IB, OUTPUT );
  digitalWrite( MOTOR_A_PWM, LOW );
  digitalWrite( MOTOR_A_IB, LOW );
  digitalWrite( MOTOR_B_PWM, LOW );
  digitalWrite( MOTOR_B_IB, LOW );
  Serial1.println( "Ready..." );
}
 
void loop()
{
  // if we get a valid byte, read analog ins:
  if (Serial1.available() > 0) {
    val = Serial1.read();
    // execute the menu option based on the character recieved

      if (val == 'W' or val == 'w') // При нажатии клавиши "W"
       {
        Serial1.println( "Forward..." );
        // set the motor speed and direction
        digitalWrite( MOTOR_A_PWM, LOW ); // direction = forward
        digitalWrite( MOTOR_B_PWM, LOW ); // direction = forward
        analogWrite( MOTOR_B_IB, PWM_SPEED ); // PWM speed
        analogWrite( MOTOR_A_IB, PWM_SPEED ); // PWM speed
       }   
      
      if (val == 'S' or val == 's') // При нажатии клавиши "S"
       {
        Serial1.println( "Backward..." );
        // set the motor speed and direction        
        digitalWrite( MOTOR_A_IB, LOW ); // direction = backward
        digitalWrite( MOTOR_B_IB, LOW ); // direction = backward
        analogWrite( MOTOR_B_PWM, PWM_SPEED ); // PWM speed
        analogWrite( MOTOR_A_PWM, PWM_SPEED ); // PWM speed
       }
        
      if (val == 'A' or val == 'a') // При нажатии клавиши "A"
       {
         Serial1.println( "Left..." );
        // set the motor speed and direction
          digitalWrite( MOTOR_A_PWM, PWM_SPEED ); // direction = forward
          digitalWrite( MOTOR_B_PWM, LOW ); // direction = forward
          analogWrite( MOTOR_B_IB, PWM_SPEED ); // PWM speed
          analogWrite( MOTOR_A_IB, LOW ); // PWM speed
       }   
         
      if (val == 'D' or val == 'd') // При нажатии клавиши "D"
       {
         Serial1.println( "Right..." );
        // set the motor speed and direction
          digitalWrite( MOTOR_A_PWM, LOW ); // direction = forward
          digitalWrite( MOTOR_B_PWM, PWM_SPEED ); // direction = forward
          analogWrite( MOTOR_B_IB, LOW ); // PWM speed
          analogWrite( MOTOR_A_IB, PWM_SPEED ); // PWM speed
       }     
         
      if (val == 'T' or val == 't') // При нажатии клавиши "T" STOP
       {
        digitalWrite( MOTOR_A_IB, HIGH );
        digitalWrite( MOTOR_A_PWM, HIGH );
        digitalWrite( MOTOR_B_IB, HIGH );
        digitalWrite( MOTOR_B_PWM, HIGH );
       }
    }
}


Как видно мы используем стандартную раскладку wasd для движения и T для остановки.

После того как зальете программу в плату, проверьте что моторы подключены правильно и крутятся в нужную сторону, открыв терминал в Arduino IDE и передавая символы команд. Также можете поэкспериментировать со значением PWM.

Теперь приложение для Android. Тут тоже все достаточно просто — мы воспользуемся конструктором приложений MIT AppInventor 2 и создадим вот такую программу (вы можете просто взять мой проект за основу)

ai2.appinventor.mit.edu/#4506360365449216

Как видно у нас есть кнопки движения, поворота и кнопка STOP.



В самой программе мы используем события TouchUp и TouchDown к элементам управления, передавая символ движения при его касании и остановки при отпускании.



Вы можете установить на смартфон специальное приложение для отладки или сформировать пакет для установки на Android смартфон, подключить к тележке батарею (я использовал внешний аккумулятор для смартфона), подключить bluetooth устройство (HC-06 в моем случае) и наслаждаться тем, что вы сами создали радиоуправляемую игрушку.







Как превратить эту игрушку в робота мы поговорим в следующих частях.
Поделиться
Запись добавлена • 0 просмотров

0 комментариев

Оставить комментарий

Комментировать при помощи:


Для добавления комментариев, вы должны войти или зарегистрироваться