Как запрограммировать Arduino с помощью JavaScript

Введение Как вы, вероятно, знаете (или слышали), Arduino [/ arduino-separated] - отличная платформа для изучения и взлома электроники, которую в противном случае было бы очень сложно использовать для новичка. Это отличное введение в программирование, электронику и инженерию в целом. Но даже в этом случае, несмотря на то, что Arduino значительно превосходит традиционный способ работы с электроникой, написание C-подобного кода все равно может быть немного сложным. Так что, если бы вы могли использовать язык более высокого уровня li

Вступление

Как вы, наверное, знаете (или слышали), Arduino - отличная платформа для изучения и взлома электроники, которую в противном случае было бы очень сложно использовать для новичка. Это отличное введение в программирование, электронику и инженерию в целом. Но даже в этом случае, несмотря на то, что Arduino значительно превосходит традиционный способ работы с электроникой, написание C-подобного кода все равно может быть немного сложным. Так что, если бы вместо этого вы могли использовать язык более высокого уровня, такой как JavaScript?

С такими языками, как JavaScript, вам не нужно беспокоиться о низкоуровневых деталях таких вещей, как указатели и выделение памяти, которые могут сбивать с толку новичков. Вместо этого вы можете сосредоточиться на логике приложения и использовать сотни тысяч библиотек с открытым исходным кодом, чтобы дать вашему проекту все виды функциональности с помощью всего лишь нескольких строк кода.

Джонни Пять

Библиотека Johnny Five - это то, что позволяет вам управлять Arduino (или Raspberry Pi, Beaglebone, Photon и многими другими) с помощью JavaScript.

Теперь, как и во многих других хороших вещах, есть небольшая загвоздка. Код JavaScript на самом деле не запускается непосредственно на Arduino, он фактически должен запускаться на главном компьютере и передавать свои инструкции устройству во время выполнения через USB-кабель или другой последовательный протокол / среду. Для некоторых приложений это является препятствием, поскольку они не могут использовать этот физический трос в своем проекте (например, на дроне), но для других это может не иметь большого значения. Например, если все, что вам нужно сделать, это управлять роботизированной рукой на своем столе, Johnny Five может идеально подойти. В конце концов, его основное внимание уделяется робототехнике, отсюда и название .

Библиотека работает с использованием протокола Firmata , который представляет собой способ связи с микроконтроллерами из программного обеспечения на главном компьютере (или смартфоне / планшете и т. Д.). Это означает, что вы можете запускать всю логику программы на своем компьютере, но в любое время, когда вам нужно выполнить любой ввод-вывод на устройстве, например, прочитать вывод GPIO, отправить данные через SPI и т. Д., Настольная программа будет использовать протокол Firmata, чтобы сообщить Arduino для выполнения конкретного ввода-вывода.

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

 var five = require('johnny-five'); 
 
 var board = new five.Board(); 
 
 board.on('ready', function() { 
 var led = new five.Led(13); 
 led.blink(500); 
 }); 

Чтобы запустить его, вы должны сначала загрузить код Arduino Firmata на плату. Сделайте это, открыв IDE Arduino, а затем щелкнув Файл-> Примеры-> Firmata-> StandardFirmata . Это откроет код в окне редактора. Наконец (если ваша плата подключена через USB), нажмите « Загрузить» .

Чтобы запустить часть кода Johnny-Five, перейдите в каталог проекта, убедитесь, что вы запустили npm install , а затем запустите node index.js , предполагая, что файл называется index.js .

В Johnny Five хорошо то, что в типичном для Node стиле есть библиотека практически для всего. Их автор уже написал весь код, необходимый для выполнения типичных задач робототехники, таких как поворот двигателей, считывание входных сигналов датчиков, интерфейс с устройствами связи и многое другое. Вы можете найти огромный список полезных примеров здесь .

Пример: Johnny Five + Arduino + Hacker News.

В этом примере хорошо сочетается высокоуровневое программирование API, как в типичном приложении Node, а также код Johnny Five, помогающий взаимодействовать с ЖК-экраном. Я подумал, что это послужит хорошим примером, чтобы показать вам, как две очень разные платформы могут работать вместе.

Созданный мной проект извлекает 10 самых популярных ссылок из Hacker News и отображает их на ЖК-экране, управляемом Arduino Uno.

Я начал с использования request-promise и API Hacker News для извлечения заголовков 10 самых популярных ссылок (или «историй», как они их называют), которые возвращаются в виде массива.

 var util = require('util'); 
 var Promise = require('bluebird'); 
 var request = require('request-promise'); 
 
 var topPostsLink = 'https://hacker-news.firebaseio.com/v0/topstories.json'; 
 var storyLinkTemplate = 'https://hacker-news.firebaseio.com/v0/item/%s.json'; 
 
 var retrieveHnTitles = function() { 
 return request(topPostsLink).then(function(json) { 
 var ids = JSON.parse(json); 
 ids = ids.splice(0, 10); 
 
 var storyRequests = []; 
 ids.forEach(function(id) { 
 var storyUrl = util.format(storyLinkTemplate, id); 
 storyRequests.push(request(storyUrl)); 
 }); 
 
 return Promise.all(storyRequests); 
 }).then(function(stories) { 
 stories = stories.map(JSON.parse); 
 
 var titles = stories.map(function(story) { 
 return story.title; 
 }); 
 
 return titles; 
 }).catch(console.error); 
 }; 

Когда срабатывает событие «готово» платы, мы вызываем указанную выше функцию, создаем строку, содержащую все заголовки из HN, которые мы только что получили, а затем отправляем ее на ЖК-дисплей, используя встроенные функции ЖК-дисплея Johnny-Five.

 board.on('ready', function() { 
 var lcd = new five.LCD({ 
 controller: 'PCF8574' 
 }); 
 
 retrieveHnTitles().then(function(titles) { 
 var titlesString = ''; 
 for (var i = 0; i < titles.length; i++) { 
 var title = titles[i]; 
 var spaces = ''; 
 if (title.length > 32) title = title.substring(0, 29) + '...'; 
 if (title.length < 32) spaces = new Array(32 - title.length + 1).join(' '); 
 titlesString += title + spaces; 
 } 
 
 lcd.autoscroll().print(titlesString); 
 }); 
 }); 

Функция autoscroll() здесь очень удобна, так как у нас такая длинная строка. Топ-10 заголовков историй должны прокручиваться по экрану, и одновременно на экране должна отображаться только одна история.

HN Links on LCDScreen{.ezlazyload}
3 лучших заголовка HN ссылок от 19.09.15.

Если бы я приложил больше усилий к проекту, следующее, что я мог бы сделать, - это запланировать его запуск каждые 5 или 10 минут с использованием библиотеки cron Таким образом, вам не нужно запускать его вручную (что не соответствует цели). Еще вы, возможно, захотите показать количество голосов за каждую ссылку или, возможно, количество комментариев. Но тогда может понадобиться экран побольше :)

Поиск проблемы

Всякий раз, когда вы программируете с помощью оборудования, все не всегда идет так гладко, как с сервером более высокого уровня или настольным приложением (и даже в этом случае есть много устранения неполадок), поэтому я подумал, что было бы полезно оказать некоторую помощь к наиболее частым проблемам, с которыми сталкиваются люди. Если вы получаете сообщение об ошибке при первом запуске программы (не удается подключиться или время ожидания подключения), попробуйте одно из этих решений.

Вы загрузили прошивку?

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

Поддерживается ли ваше оборудование?

В первый раз, когда я попытался использовать Johnny Five, я использовал Arduino Duemilanove и продолжал получать ошибку «Время ожидания соединения истекло». После некоторого базового устранения неполадок я наконец проверил список совместимости, чтобы убедиться, что Duemilanove не указан. Я думал, так как он так похож на Uno, это сработает, но, видимо, нет.

Вы используете Windows?

Да, Windows поддерживается, однако, иногда системы Windows , не будет компилироваться нативные зависимостей. Чтобы исправить это, попробуйте установить Johnny Five с помощью следующей команды:

 npm install johnny-five --msvs_version=2012 

Построй сам

Это довольно дешевый проект, который можно построить самостоятельно. Вот список частей всего, что я использовал:

  • Ардуино Уно
  • ЖК-экран (2x16, I2C)
  • Провода Dupont между мужчинами и женщинами
  • Кабель USB Type-A - Type-B

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

Вы также можете использовать другой ЖК-экран, но только контроллеры I2C-to-parallel PCF8574, PCF8574A и JHD1313M1 официально поддерживаются Johnny Five. В зависимости от реализации I2C могут работать и другие контроллеры.

Заключение

Надеюсь, из этой статьи и примеров, которые я показал, вы лучше понимаете, что возможно с использованием Johnny Five / JavaScript с Arduino, Raspberry Pi, Beaglebone и т. Д. Конечно, C / C ++ может доминировать в области встроенной электроники, но с такими библиотеками, как Johnny Five и протокол Firmata, вы можете легко погрузиться в знакомые инструменты и прототипы даже быстрее, чем раньше.

Обязательно ознакомьтесь с документацией Johnny Five, чтобы узнать больше. Есть несколько отличных руководств и руководств по устранению неполадок, когда вы застряли.

Есть ли какие-нибудь проекты или примеры, которые вы хотели бы видеть с Johnny Five? Дайте нам знать об этом в комментариях!

comments powered by Disqus