Задний план

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

На работе мы занимаемся хардкорной инженерией, поэтому моя команда действительно была склонна создать что-то более легкое и веселое. Кто-то из моей команды также заказал 1000 костей домино на Amazon, и мы решили организовать розыгрыш домино из физического мира в цифровой и обратно в реальный. Физический мир.

Идея

Вот схема общей идеи:

Теперь в основе этого чуда современной техники лежит приложение, которое:

  1. обнаруживает нажатие клавиши с помощью падающего деревянного блока (хм…?)
  2. начинает воспроизводить видео на экране (легко!)
  3. определяет, когда видео перестало воспроизводиться (легко!)
  4. каким-то образом двигает мотор, который переворачивает домино в реальном мире (wtf!?)

# 1 и # 4 - самые сложные части этой проблемы. Начнем с этого…

Деревянный блок вызывает нажатие клавиши (тимберррр!!!)

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

Макбук, ардуино, маленький серводвигатель и немного кода

По сути, то, что нам действительно нужно, — это Arduino (микроконтроллер), который может перемещать двигатель по команде приложения. Вот простая схема.

Давайте разберем это дальше и сосредоточимся только на Arduino и двигателе. Вот подробный взгляд на соединения на этом arduino

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

Так что эту плату arduino нужно запрограммировать. Программа делает 2 вещи:

  1. Получить команду на последовательный порт
  2. Включите серводвигатель

Вот фрагмент кода

#include <Servo.h>
Servo servo;
void setup(){
    servo.attach(8);        //attach the servo to pin 8
    servo.write(0);         //rotate it to zero degrees
    Serial.begin(9600);     //setup serial port at 9600 baud
}
void tipDomino(){
    servo.write(180); delay(500);   //move the motor
    servo.write(0); delay(500);     //move it back
}
void loop(){
    if(Serial.available()){
        //if the character "0" is received on the usb port
        //actuate the motor to tip the domino
        switch(Serial.read()){
            case '0':
                tipDomino();
                break;
        }
    }
}

Используйте arduino IDE, чтобы записать этот код на плату arduino. Теперь всякий раз, когда мы подключаем плату Arduino к USB-порту (когда она включена), этот код будет выполняться бесконечно, и наша маленькая Arduino будет продолжать слушать наш последовательный порт, пока не появится символ 0.

Теперь все, что нам нужно, это приложение, работающее на нашем Macbook / ПК, которое отправляет символ «0» на последовательный порт. И так как я все о Javascript, я буду использовать NodeJS, чтобы это произошло.

Оказывается, есть пакет NPM под названием…. (ждать его)…. 'Серийный порт'

//1 - get the serial port module
const SerialPort = require("serialport");
//2 - these are the port addresses on my macbook
const portAddrs = ['/dev/tty.usbmodem1411','/dev/tty.usbmodem1411'];
//3 - this array will store all the serial port objects
let ports = [];
//4 - let's create a SerialPort object for each address
for(var i = 0 ; i < portAddrs.length; i++){
    ports.push(new SerialPort(portAddrs[i]));
}
//5 - function to write a string to any port
function writeToPort(str){
    for(var i = 0 ; i < ports.length; i++){
        ports[i].write(str);
    }
}
//now just call writeToPort("0") whenever :-)

Чтобы выяснить, какие у вас адреса USB-портов, просто подключите Arduino к MacBook, откройте терминал и запустите эту команду.

ls /dev/* | grep 'usb'

Это покажет все адреса последовательных портов со словом «usb». И наоборот, вы также можете получить эти адреса из вашей Arduino IDE. Перейдите в Инструменты › Последовательный порт… и вуаля!

Запуск воспроизведения видео и обнаружение конца

Разобравшись с трудными частями, нам нужно завершить остальную часть приложения. Вот что должно произойти.

Итак, наше приложение NodeJS должно:

  1. Служить странице, которая показывает видео
  2. Это приложение, в свою очередь, должно иметь возможность воспроизводить видео при нажатии клавиши.
  3. Когда воспроизведение видео завершается, он отправляет запрос AJAX обратно на серверную часть узла (экспресс-сервер).
  4. Когда приложение узла получает этот запрос, оно отправляет «0» на Arduino.

Вы можете получить весь исходный код здесь.

Супер финал

Если вы хотите узнать больше о Modus, приходите проверить нас.