JavaScript >> Javascript 文檔 >  >> JavaScript

如何使用 JavaScript 編寫 Arduino

簡介

您可能知道(或聽說過)​​,Arduino 是學習和破解電子產品的絕佳平台,否則初學者很難使用。它是對編程、電子和工程的一般介紹。但即便如此,與 Arduino 相比,與使用電子產品的傳統方式相比有了很大的改進,編寫類似 C 的代碼仍然有點令人生畏。那麼,如果你可以改用 JavaScript 這樣的高級語言呢?

使用 JavaScript 這樣的語言,您無需擔心指針和內存分配等低級細節,這可能會讓初學者感到困惑。相反,您可以專注於應用程序邏輯並利用數十萬個開源庫,只需幾行代碼即可為您的項目提供各種功能。

約翰尼五世

Johnny Five 庫允許您使用 JavaScript 控制 Arduino(或 Raspberry Pi、Beaglebone、Photon 等)。

現在,就像許多好事一樣,有一個小收穫。 JavaScript 代碼實際上並不直接在 Arduino 上運行,它實際上必須在主機上運行,並在運行時通過 USB 電纜或其他一些串行協議/介質將其指令傳達給設備。對於某些應用程序來說,這是一個大問題,因為他們不能在他們的項目上(比如在無人機上)使用這種物理繫繩,但對於其他應用程序來說,這可能沒什麼大不了的。例如,如果您需要做的只是控制辦公桌上的機械臂,那麼約翰尼五號可能就是完美的選擇。畢竟,它的主要重點是機器人技術,因此得名。

該庫利用 Firmata 協議工作,這是一種通過主機(或智能手機/平板電腦等)上的軟件與微控制器通信的方式。這意味著您可以在計算機上運行所有程序邏輯,但任何時候您需要在設備上執行任何 IO,例如讀取 GPIO 引腳、通過 SPI 發送數據等,桌面程序將使用 Firmata 協議來告訴Arduino 執行特定的 IO。

例如,下面的代碼只是使引腳 13 上的 LED 閃爍。所以它與 Arduino 通信的唯一時間是它想要打開或關閉 LED 時,否則 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 代碼加載到板上。為此,請打開 Arduino IDE,然後單擊 File->Examples->Firmata->StandardFirmata .這將在編輯器窗口中打開代碼。最後(假設您的開發板通過 USB 連接),點擊 Upload .

要運行代碼的 Johnny-5 部分,請導航到項目目錄,確保您已運行 npm install ,然後運行 node index.js ,假設文件名為 index.js .

Johnny Five 的好處在於,以典型的 Node 方式,有一個庫可以容納幾乎所有的東西。他們的作者已經編寫了執行典型機器人任務所需的所有代碼,例如轉動電機、讀取傳感器輸入、與通信設備接口等等。您可以在此處找到大量有用的示例。

示例:約翰尼五世 + Arduino + 黑客新聞

這個例子很好地混合了高級 API 編程,就像您在典型的 Node 應用程序中看到的那樣,以及一些幫助與 LCD 屏幕交互的 Johnny Five 代碼。我認為它可以作為一個很好的例子,向您展示兩個截然不同的平台如何協同工作。

我創建的項目從 Hacker News 中檢索前 10 個鏈接,並將它們顯示在由 Arduino Uno 控制的 LCD 屏幕上。

我開始使用 request-promise 庫和 Hacker News 的 API 來檢索前 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);
};

當板事件'ready'觸發時,我們調用上面的函數,構造一個包含我們剛剛收到的來自HN的所有標題的字符串,然後使用內置的Johnny-Five LCD函數將其發送到LCD。

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 個故事標題應在屏幕上滾動顯示,一次只能在屏幕上顯示一個故事。


2015 年 9 月 19 日排名前 3 的 HN 鏈接標題。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

如果我要在項目上投入更多精力,接下來我可能會使用 cron 安排它每 5 或 10 分鐘運行一次 圖書館。這樣您就不必手動運行它(哪種方式違背了目的)。您可能想要做的另一件事是顯示每個鏈接的讚成票數,或者可能是評論數。但是你可能需要一個更大的屏幕:)

疑難解答

每當您使用硬件進行編程時,事情並不總是像使用更高級別的服務器或桌面應用程序那樣順利(即使這樣也有很多故障排除),所以我認為提供一些幫助會很有幫助人們面臨的最常見的問題。如果您在第一次運行程序時遇到錯誤(無法連接或連接超時),請嘗試以下解決方案之一。

您是否加載了固件?

聽起來很簡單,我自己也犯過幾次這個錯誤。我會嘗試運行 Johnny Five 應用程序,只是意識到它無法連接,因為我忘記將 Firmata 固件加載到 Arduino 上。經常在項目之間切換時,我經常會遇到這種情況,當您無法連接設備時,通常會首先考慮它。

您的硬件支持嗎?

我第一次嘗試使用強尼五號時,我使用的是 Arduino Duemilanove,但一直收到“連接超時”錯誤。經過一些基本的故障排除後,我終於檢查了兼容性列表,發現 Duemilanove 沒有列出。我原以為它與 Uno 非常相似,它會起作用,但顯然不是。

您在使用 Windows 嗎?

是的,Windows 支持,但是,有時 Windows 系統將無法編譯本機依賴項。要解決此問題,請嘗試使用以下命令安裝強尼五號:

npm install johnny-five --msvs_version=2012

自己構建

這是一個相當便宜的項目來構建自己。這是我用過的所有東西的零件清單:

  • 阿杜諾烏諾
  • 液晶屏(2x16,I2C)
  • 公對母杜邦線
  • USB Type-A 轉 Type-B 數據線

只要您周圍有一些其他簡單的電線,並且有一種方法可以剝去兩端的​​塑料外殼,您就可以不用購買杜邦電線就可以逃脫。我只是列出了這些,因為它們更方便。

您也可以使用不同的 LCD 屏幕,但只有 PCF8574、PCF8574A 和 JHD1313M1 I2C 轉並行控制器受強尼五號官方支持。根據 I2C 實現,其他控制器也可以工作。

結論

希望通過本文和我展示的示例,您可以更好地了解將 Johnny Five/JavaScript 與 Arduino、Raspberry Pi、Beaglebone 等結合使用。當然,C/C++ 可能會主導嵌入式電子領域,但是借助 Johnny Five 和 Firmata 協議等庫,您可以輕鬆地使用熟悉的工具和原型進行深入研究,甚至比以前更快。

請務必前往約翰尼五號文檔以了解更多信息。當您遇到困難時,有一些很棒的教程和故障排除指南。

你有什麼想看約翰尼五號的項目或例子嗎?請在評論中告訴我們!


Tutorial JavaScript 教程
  1. Three.js – 模型無法接收到任何陰影

  2. 在html中創建一個小顏色框

  3. 將 Stripe.js 導入為 ES 模塊

  4. remix-domains 如何改進 Remix 項目的(已經很棒的)DX?

  5. 當我想要兩個時,我的 javascript 函數中只有一個按鈕

  6. 我創建了一個只顯示隨機顏色的服務

  7. jquery獲取具有特定類的父元素

  1. JavaScript instanceof 運算符

  2. 如何強制客戶端刷新 JavaScript 文件?

  3. Javascript:轉發接受可變數量參數的函數調用

  4. 明暗模式:操作系統配色方案和主題切換器

  5. 為什麼這個“else if”功能不能與 Google Appscript 上的 onEdit 一起使用?

  6. 擴展 React Calculator xState 示例的功能

  7. 是否可以在 Greasemonkey 腳本中使用工人?

  1. 宣布 Appwrite 官方贓物商店! 🛍

  2. 帶有 SweetAlert2 示例的 Angular 14 彈出通知

  3. 如何構建支持 AI 的自然語言合成 Chrome 擴展

  4. 2019 年 JavaScript 的成本