Дистанційне керування іграшковим автомобілем за допомогою Android Things GPIO
Рейтинг статті: / 6
НайгіршеНайкраще 
Android Things GPIOРозглянемо, як можна використати виводи Android Things GPIO для керування двигунами постійного струму, створивши дистанційне керування автомобілем.
Ви зможете створити автомобіль Android Things, який рухається у всіх напрямках, і зможете керувати ним за допомогою смартфону або браузера.
Android Things пропонує набір API-інтерфейсів, які можемо використовувати для взаємодії з пристроями, що мають два стани, такими як кнопки або світлодіоди, з використанням Android Things GPIO. Виводи Android Things GPIO використовуються для взаємодії з зовнішніми пристроями. GPIO (General Purpose Input Output) - це загальний інтерфейс входів та виходів і це інтерфейс для читання стану зовнішнього пристрою. Використовуючи API для Android Things GPIO, можемо просто прочитати стан виводу або встановити значення сигналу на ньому.
Вивчимо більш детально, як використовувати Android Things GPIO для керування двигунами. У даному проекті будемо використовувати як плати розробника Raspberry Pi, але ви завжди можете використати цей проект з іншими платами, поки змінюєте виводи GPIO. Можливо, ви знаєте й інші способи керування двигунами. Використовуючи виводи Raspberry Pi GPIO, ми можемо тільки ввімкнути або вимкнути двигун, але ми не можемо контролювати його швидкість. виводи GPIO мають лише два стани: високий і низький рівні. Якщо ми хочемо контролювати двигуни більше, застосовуючи пропорційний контроль, то можемо використати виводи Android Things PWM.
Але в цьому контексті ми хочемо лише керувати двигунами: вмикати або вимикати їх, щоб можна було направляти автомобіль віддаленим керуванням Android Things у всіх напрямках. Кінцевий результат показаний на малюнку нижче:
Android Things GPIO Car
Виводи Android Things GPIO (або Raspberry GPIO)
Перш ніж описати, як побудувати віддалено керований автомобіль Android Things, корисно дати загальний огляд використання контактів GPIO. Першим кроком для керування контактом Android Things GPIO є отримання посилання до PeripheralManagerService:
PeripheralManagerService service = new PeripheralManagerService();
Наступним кроком буде відкриття з'єднання з виводом:
pin = service.openGpio(pin_name);
Щоб дізнатись, які виводи є GPIO, відповідно до вашої плати Android Things, ви можете перейти на розгортку Android Things. Як зазначалося раніше, цей проект використовує Raspberry Pi, тому виводи, на які посилаються тут, є виводами Raspberry Pi GPIO.
Після відкриття з'єднання ми можемо встановити значення виводу за допомогою цих команд:
pin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
pin.setValue(true); // High
Щоб дізнатися більше про те, як використовувати шпильки для Android Things GPIO, ви можете звернутися до книги "Android Things Projects".
Перш ніж копатися в деталях проекту, слід прочитати інші статті про Android Things:
Як керувати двигуном в Android Things за допомогою виводів Raspberry GPIO
Зазвичай ми під'єднуємо безпосередньо пристрій до плати Android Things. У всякому разі, коли ми використовуємо двигуни, це неможливо, тому що двигун може потребувати набагато більшого струму, ніж може забезпечити контакт GPIO. У цьому випадку ми повинні забезпечити живлення від зовнішнього джерела та використовувати виводи Android Things GPIO, щоб контролювати стан двигуна. Крім того, ми хочемо керувати напрямком обертання двигуна. З цих причин доцільно використовувати просту плату драйвера двигуна, яка спрощує роботу.
У даному проекті використаємо простий драйвер L298N, який може контролювати два двигуни та напрями їх обертання:
L298N
Цей драйвер також може керувати двигунами, які використовують ШІМ, однак у даному проекті ми не будемо використовувати ці функції. Використовуючи два виводи Android Things GPIO для кожного двигуна, ми можемо контролювати його напрямок обертання або зупинити його.
Давайте подивимося, як підключити цей драйвер до плати Android Things. Наведена нижче схема показує, як підключити виводи GPIO до L298N та двигунів:
connect the GPIO pins
Навіть якщо схема може здатися дещо складною, це дуже просто: у цьому проекті використовуються чотири різні виводи Android Things GPIO:
Виводи Raspberry Pi GPIO призначені для правого двигуна:
• BCM17
• BCM27
Лівий двигун:
• BCM23
• BCM24
Якщо використовуєте іншу плату, ніж Raspberry Pi3, вам доведеться змінити назви виводів. Ви можете звернутися до офіційної документації, щоб дізнатися, як створити портативний додаток Android Things.
Тепер ми можемо створити простий клас Java, який керує двигунами:
public class MotorController {

    PeripheralManagerService service = new PeripheralManagerService();
    private Gpio pin1Motor1;
    private Gpio pin2Motor1;

    private Gpio pin1Motor2;
    private Gpio pin2Motor2;

    public MotorController() {
        try {
            // Right
            pin1Motor1 = service.openGpio("BCM17");
            pin2Motor1 = service.openGpio("BCM27");

            // Left
            pin1Motor2 = service.openGpio("BCM23");
            pin2Motor2 = service.openGpio("BCM24");

            pin1Motor1.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            pin2Motor1.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            pin1Motor2.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            pin2Motor2.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
           
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public void forward() {
        setPinValues(true, false, false, true);
    }

    public void backward() {
        setPinValues(false, true, true, false);
    }

    public void stop(){
        setPinValues(false, false,false,false);
    }

    public void turnLeft() {
        setPinValues(false, false, false, true);
    }

    public void turnRight() {
        setPinValues(true, false, false, false);
    }

    private void setPinValues(boolean p11, boolean p12,
                              boolean p21, boolean p22 ) {

        try {
            pin1Motor1.setValue(p11);
            pin2Motor1.setValue(p12);
            pin1Motor2.setValue(p21);
            pin2Motor2.setValue(p22);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
Цей клас виконує такі завдання:
1. Отримує посилання на PeripheralManagerService
2. Відкриває виводи GPIO
3. Встановлює напрямки обертання та початкове значення
Крім того, він визначає чотири різних способи, які контролюють, як буде рухатися автомобіль:
• Вперед
• Назад
• Повернути ліворуч
• Повернути праворуч
Всі ці рухи можна контролювати, вмикаючи або вимикаючи кожний вивід, визначений вище. Іншими словами, діючи на чотири виводи Raspberry Pi GPIO можна рухати машину у всіх напрямках.
Це все. Пора реалізувати керування автомобілем. Є кілька варіантів, які можемо вибрати для цієї мети. Ми можемо використати простий веб-сервер, який має інтерфейс HTML, або можемо використати, наприклад, Android-суміжне API або навіть з'єднання Bluetooth.
Далі ми розглянемо використання простого веб-інтерфейсу.
Створення HTTP-інтерфейсу Android Things
Як вже говорилося раніше, ми будемо реалізовувати інтерфейс HTTP, щоб можна було використати його для віддаленого керування машиною Android Things. Для реалізації простого веб-сервера HTTP можемо використати NanoHTTPD, який є простим і легким HTTP-сервером. Для цього необхідно змінити файл build.gradle, додавши:
compile 'org.nanohttpd:nanohttpd:2.2.0'
Тепер давайте створимо новий клас під назвою RobotHTTPServer, який обробляє вхідні HTTP-запити:
public class RobotHttpServer extends NanoHTTPD {
 public RobotHttpServer(int port,
                        Context context,
                        CommandListener listener) {
        super(port);
        this.context = context;
        this.listener = listener;
        Log.d(TAG, "Starting Server");
        try {
            start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

   @Override
    public Response serve(IHTTPSession session) {
        Map<String, String> params = session.getParms();

        String control = params.get("control");
        String action = params.get("btn");

        Log.d(TAG, "Serve - Control ["+control+"] - Action ["+action+"]");

        if (action != null && !"".equals(action))
          listener.onCommand(action);

        return newFixedLengthResponse(readHTMLFile().toString());
    }
..
}
Сторінка HTML дуже проста, і вона складається з 5 кнопок, що відображають чотири напрямки та кнопку зупинки.
Ми додамо сторінку HTML до assets/каталогу. Останньою частиною є визначення CommandListener, тобто функції зворотного виклику, яка викликається щоразу, коли HTTP-сервер приймає команду:
public static interface CommandListener {
    public void onCommand(String command);
}
Збірка додатка Android Things для керування дистанційно керованим автомобілем
Останній крок - це все скласти і склеїти ці класи, щоб ми змогли нарешті побудувати дистанційне керування автомобілем за допомогою Android Things. Для цього необхідно створити MainActivity:
public class MainActivity extends Activity {

    private String TAG = getClass().getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(TAG, "OnCreate...");

        final MotorController mc = new MotorController();
        RobotHttpServer server = new RobotHttpServer(8090, this,
                  new RobotHttpServer.CommandListener() {
            @Override
            public void onCommand(String command) {
                Log.d(TAG, "Command received ["+command+"]");
                if (command.equals("F"))
                    mc.forward();
                else if (command.equals("B"))
                    mc.backward();
                else if (command.equals("S"))
                    mc.stop();
                else if (command.equals("L"))
                    mc.turnLeft();
                else if (command.equals("R"))
                    mc.turnRight();
            }
        });
    }
}
Як ви помітили, код дуже простий, щоразу, коли CommandListener отримує нову команду, він викликає метод класу, який обробляє двигуни, щоб керувати ними.
Цей простий проект можна розширити. Ми могли б додати набір таких нових функцій, як Vision, Machine learning тощо. З цієї причини ми використали Android Things, а не Arduino або ESP8266.
Тепер ви знаєте, як взаємодіяти з виводами Android Things GPIO та як їх увімкнути чи вимкнути. Крім того, ви навчилися користуватися двигунами. Отриману вами інформацію використайте для створення своєї першої дистанційної машини Android Things.
Тепер ви можете грати зі своєю іграшкою!
(Джерело EN: survivingwithandroid.com)
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting