用JS寫個小燈控制器唄

黃小帥發表於2018-04-21

 最近,因為一些不可描述的原因,我踩了個巨坑——JS控制微控制器

用JS寫個小燈控制器唄

先上效果吧,由於不知道掘金怎麼上傳錄影,就放微博啦,連結地址:微博分享

正文

作為一名端茶倒水、遞煙遞酒、擦窗掃地無所不能的全乾打雜工,我是一點想法都沒有,畢竟作為一名前端都算不上合格,更不用講硬體這塊了。

微控制器的開發一般都是C++或者C開發者去搞的,甚至可能還要用到彙編。因此開發者在我腦海的印象一般是這樣的:

用JS寫個小燈控制器唄

看了下自己的髮際線。。。。嗯,看樣子我不適合這個職業。

但萬事不絕對,在堅持不懈的努力下,我找到了個神器——Cylon.js

這是個Node控制微控制器開源庫,據說是為了解決如何處理多個微控制器而生的庫,不得不說這個庫真的很強大,內建了相當多的驅動以及很多想不到的功能,比如控制一個燈的開和關。

首先簡單介紹一下今天的主角:arduino。這是一款開源硬體,有著相當驚人的能力和出色的社群。當然,價格也是相當誘人的。(我絕對不會說是因為便宜才買的它)在某寶上,一塊arduino配上各種零件大約200+左右,並且它的開發也非常簡單,在B站還有各種大佬進行DIY,上次還看到了利用超聲波製作雷達裝置,對大佬的敬仰如同濤濤江水連綿不絕。

廢話說完了,下面就開始正題了。擺在最開頭的是準備工作,我們一步一步往下走。

準備

  1. Node環境:這裡預設大家都裝好了
  2. 驅動:正常來講,板子一插上就能正常操作,但不排除無法識別需要裝驅動。驅動安裝詳細步驟在這裡:www.arduino.cc/en/Guide/Wi…
  3. 開發環境:單單隻有Node環境是不夠的,這裡詳細介紹如何安裝
  4. arduino開發版一塊,麵包板一塊,連線線一根,電阻、導線、led小燈若干
這裡就從第三點開始講,開發環境,這裡因為我用的是arduino+windows,因此我準備的arduino開發環境是適合windows作業系統的,至於其他的應該類似,就不詳談(因為我也不會呀,流下了沒技術的淚水)。順便說一下,官方文件非常神奇,安裝指令的順序有時候會變~


首先需要下載gort,下載地址是:gort.io/documentati…

386版本代表32位系統,amd64代表64位系統,各位看官可以自行選擇。不過在這裡我推薦使用386版本,因為amd64位在之後的操作中一直連不上驅動更新伺服器(已經使用科學上網小工具)

下載完成後,就可以把它解壓到任何地方了。我解壓的位置是 E:\gort。這時候資料夾內會有三個檔案。


用JS寫個小燈控制器唄

這時候,右擊開始選單,開啟具有管理員許可權的命令提示符(CMD),輸入:gort arduino install

這時候將會安裝一個開發工具,不用管它,一路下一步就好了。安裝完成後,關閉命令提示符視窗,重新再開啟一個有管理員許可權的命令提示符,然後將arduino連線到電腦,此時可以執行gort scan serial命令,理論上能看到arduino連線的埠,但很不幸我換了幾臺電腦,都是執行完命令後沒任何輸出。

還好,windows自帶了裝置管理器,能檢視硬體埠。只需要右擊此電腦,選擇屬性,選擇裝置管理器,選擇檢視埠(COM和LPT),應該會看到一個名為“Arduino Uno(COMxx)”的開放埠。若不存在COM和LPT部分,檢視“其他裝置”中的“未知裝置”項,當然,這也是表明你需要安裝驅動,或者你運氣不好買了個廢板子。

記住剛檢視的埠號,我的是COM3

這時候,在命令列中輸入gort arduino upload firmata <COMX>,這裡的COMX則用你們檢視到的埠號代替。如果執行比較順利,那麼恭喜你,開發環境已經搭建完畢,這時候就可以開始上手擼程式碼了,沒錯,擼JS程式碼!

擼碼時間

先上個簡單的,比如說讓led燈每秒閃閃

首先安裝依賴

npm install cylon cylon-firmata cylon-gpio cylon-i2c複製程式碼

var Cylon = require('cylon');

Cylon.robot({
  connections: {
    arduino: { adaptor: 'firmata', port: 'COM3' }
  },

  devices: {
    led1: { driver: 'led', pin: 13 }
  },

  work: function(arduino) {
    setInterval(function(){
    	arduino.led1.toggle()
    }, 1000)
  }
}).start();複製程式碼

然後執行這段程式,你就會發現led小燈開始一閃一閃啦!是不是非常簡單!

於是,野心慢慢變大,既然能讓小燈一閃一閃,那是不是就能用電腦去控制小燈開關?比如我點選開,然後小燈就開了,那還不是美滋滋!

說幹就幹,一番琢磨發現了一個MQTT協議,這玩意能用於arduino和電腦通訊,能夠在使用電腦向arduino傳送指令。在之前的基礎之上,稍加修改就能做到了。

let Cylon = require('cylon');

Cylon.robot({
  name: 'cybot',
  connections: {
    arduino: { adaptor: 'firmata', port: "COM3" }
  },

  devices: {
    led1: {driver: 'led', pin: 8},
    led2: {driver: 'led', pin: 9},
  },

  work: function(bord) {

  },
});

Cylon.api(
  'mqtt',
  {broker: 'mqtt://test.mosquitto.org'}
);

Cylon.start();
複製程式碼

但這還沒完,這段程式碼執行後,arduino就處於接收指令狀態,但本身因為沒有任何操作,因此這時候的板子是沒任何反應的,它在傻傻的等你下命令呢!

所以再新建個檔案,用於傳送指令吧!

const mqtt = require('mqtt');
let client = mqtt.connect('mqtt://test.mosquitto.org');

var payload = JSON.stringify({
    sender: 'self',
    param1: 'uno'
});

client.subscribe('/api/robots');
client.subscribe('/api/robots/cybot/devices/led1/commands/toggle');

setInterval(function(){
	client.publish('/api/robots/cybot/devices/led1/commands/toggle');
}, 1000)
複製程式碼

這是個非常簡單的發指令操作,我來解釋下:

連線url:'mqtt://test.mosquitto.org',這個是上一個程式碼中自定義的連線url

subscribe():註冊指令,一旦使用這個方法,那麼在呼叫publish方法的時候會觸發message事件,獲取板子中由括號內指令產生的資料。

publish():傳送指令,能夠將具體指令傳送至arduino讓其執行。

指令url,/api/robots/cybot/devices/led1/commands/toggle,其中,cybot是上一個程式碼中name值,表示操作哪塊板子,led1表示上一個程式碼中的叫做led1的裝置,toggle則表示led1的具體操作指令(toggle表示切換狀態,如果燈是亮著,執行後就變成熄滅狀態,反之則變成燈亮狀態)。詳細指令在官方文件中能夠查詢。

好了,再次執行,你就會發現你的led又開始一閃一閃起來,只不過和剛才不同,剛才是arduino中的程式控制燈的亮暗,而這次是你傳送指令讓arduino開關燈。因此,似乎騷操作從我腦海裡跳了出來,既然能控制燈的亮暗,那麼我寫個介面去控制燈的開關如何?利用前端知識和後端知識配合Cylon是不是能做出什麼驚天動地的騷操作?比如定時炸彈。。。。不不不,定時開關。

留在最後

至於為什麼視訊錄製會是某音,我也很絕望啊。。。本來想上傳優酷,發現賬號密碼忘了,上傳微博似乎也不錯?但等了一萬年沒等到驗證碼。。。至於B站,有個十秒限制,上傳不上去,所以。。。。大家都是社會人,就不要辣麼在意細節啦!!


小白第一次上手硬體,有什麼不對請看官指出,謝謝大家花時間看完我這篇水文啦!

最後,我還是忍不住想發這張圖

用JS寫個小燈控制器唄





相關文章