Lập trình nhúng trên Raspberry Pi bằng ngôn ngữ Javascript trong môi trường NodeJS - chìa khóa thành công

Mô tả dự án: 

Với kinh nghiệm của một hardcore developer, đã từng dùng nhiều ngôn ngữ lập trình như C++, python, bash, js,... trên Raspberry Pi. Mình nhận thấy, Javascript trên NodeJS là một trong những ngôn ngữ lập trình "làm việc tốt nhất" trên Raspberry Pi. Vì sao? Vì đơn giản, nó chạy trong môi trường NodeJS mà NodeJS là một hệ sinh thái với hệ thống thư viện mở lớn nhất thế giới. Tuy nhiên, nó không dễ tiếp cận như Python, Ruby. Vì vậy, bạn cần lườm trước mọi thứ trước khi dấn thân vào Javascript. Tuy nhiên, lợi ích của bạn khi biết Javascript đó là có thể lập trình MỌI NỀN TẢNG từ những board mạch nhỏ nhất như (Raspberry Pi, Intel Galileo, Arduino Yún,...) cho đến môi trường Web.

Javascript là gì?

Javascript là một ngôn ngữ lập trình kịch bản hướng sự kiện dựa vào đối tượng phát triển có sẵn hoặc tự định nghĩa ra, javascript được sử dụng rộng rãi trong các ứng dụng Website. Javascript được hỗ trợ hầu như trên tất cả các trình duyệt như Firefox, Chrome, ... thậm chí các trình duyệt trên thiết bị di động cũng phải hỗ trợ nó.

Và với môi trường NodeJS, bạn có thể chạy được Javascript trên các thiết bị nhúng hay trên server chạy NodeJS. Để rõ hơn các bạn có thể xem bài của ksp.

Cài đặt NodeJS trên Raspberry Pi

Đã chơi với Raspberry Pi thì bạn cần phải cài Raspbian nhé. Hệ điều hành khác thì thế giới không hỗ trợ để dev nhiều.

Kinh nghiệm của mình là cài bảng 4.0 vì nó rất ổn định và không cần phải nâng cấp GCC và G++ để biên dịch một số gói extension của nodejs.

Đối với bản Raspberry Pi Model A, B, B+

wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv6l.tar.gz 
tar -xvf node-v4.0.0-linux-armv6l.tar.gz 
cd node-v4.0.0-linux-armv6l

Đối với bản Raspberry Pi 2 trở lên

wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv7l.tar.gz 
tar -xvf node-v4.0.0-linux-armv7l.tar.gz 
cd node-v4.0.0-linux-armv7l

Sau đó, bản nào cũng phải chạy lệnh sau

sudo cp -R * /usr/local/

Để test mình có cài xong chưa thì bạn chạy lệnh

node -v
npm -v

Trong đó:

  • node: chương trình sẽ thực thi các file javascript sau này!
  • npm: chương trình quản lý gói của nodejs, thêm thuộc tính (-g) khi cài đặt gói sẽ biến đó là gói toàn cục, còn không có thuộc tính -g thì nó là gói cục bộ!

Cài đặt Johnny-Five - "ông trùm" thư viện giúp bạn lập trình Raspberry Pi bằng Javascript trong môi trường NodeJS

Johnny-five là một thư viện Javascript trong lĩnh vực Robotics & IOT. Nó đa được công bố vào năm 2012 và hiện giờ lực lượng dev của nó rất lớn với hơn 70 thành viên. Cộng đồng IOT thế giới rất yêu thích sử dụng nó vì nó port tất cả các mạch nhúng linux về một dạng lập trình chung và bạn chỉ việc thay đổi gói "interface" cho phù hợp với board mình dùng thì code của bạn có thể chạy ngay.

Một cách dễ hiểu nhất, Johnny-five sẽ giúp bạn làm robot cực kỳ nhanh thông qua việc quản lý các file IO với bộ thư viện bá cháy của nó. Qua mình thực nghiệm thì gần như mọi lại cảm biến, thiết bị chạy được trên Arduino đều chạy được trên Raspberry Pi hay các board khác qua thư viện này.

Và quan trọng hơn nữa, bạn chỉ cần biết dùng nó thì mọi board khác bạn đều lập trình được, chứ không phải như wiringPi trong Raspberry Pi hay thư viện gì khác cho từng board nhé heart.

Đã là dev thì phải tìm thư viện và môi trường nào có khả năng "write once run everywhere" nhé! Đừng vì mình không biết ngôn ngữ đó mà không dám khám phá sức mạnh của những ngôn ngữ khác. Phải biết vận dụng và tùy cơ ứng biến devil.

Cài đặt Johnny-Five

npm install johnny-five -g

Đơn giản vậy thôi heart

Cài đặt Interface Raspberry Pi cho Johnny Five

Johnny Five giống như là một hệ sinh thái hơn là một thư viện đơn thuần, vì nó giúp bạn lập trình mọi nền tảng mà nó hỗ trợ với một hệ sinh thế lớn hơn thế là NodeJS. 

Để JohnnyFive chạy được trên board của bạn, trong trường hợp này là Raspberry Pi, bạn cần cài một interface để Johnny Five hiểu và chạy được một cách ổn định.

Thực ra cái interface này là gì? Cũng không có gì to tát cả, nó đơn thuần có thể hiểu như là một dạng hàm ảnh để ánh xạ (mapping) các cổng GPIO thôi mà.

Cài đặt interface Raspberry Pi cho Johnny Five thì các bạn chạy lệnh

npm install -g raspi-io

 

Ví dụ led Blink

Vì lý do công việc (dev) nên mình không có sẵn board + led để demo cho các bạn, nên mình sẽ lấy ví dụ ở trang http://johnny-five.io/ để demo cho các bạn nhé.

Bạn tạo một file mới tên là blink.js ở đâu cũng được với nội dung như sau:

var five = require("johnny-five");
var Raspi = require("raspi-io");
var board = new five.Board({
  io: new Raspi()
});

board.on("ready", function() {
  var led = new five.Led("P1-13");
  led.blink();
});

Sau đó chạy lệnh

node blink.js

... và tận hưởng thành quả.

Bạn để ý, lúc này ở comment line bạn sẽ bị treo và không thể gõ lệnh mới, đừng lo lắng, nó là như vậy đấy, bạn chỉ việc nhấn Ctrl+C ra là thoát chương trình! Những chương trình cho nodejs có đặc điểm là chạy forever theo cycle life của javascript. Nên nếu bạn muốn chạy nền (background) thì phải tìm thêm trên mạng. Múc đích bài của mình là làm quen trước đã, phức tạp thì cứ từ từ.

Để ý đoạn code trên, có những từ khóa mới như sau:

  • var five = require("johnny-five");
    var Raspi = require("raspi-io");
    var board = new five.Board({
      io: new Raspi()
    });

    4 dòng code này bạn buộc phải có khi muốn viết code cho raspi dùng Javascript nhé heart. Trong đó từ khóa require giống như #include trong Arduino vậy thôi.

  • Trong JS (javascript) cũng có những nhiều cái mới như là:

    • Bạn không cần khai báo kiểu dữ liệu, chỉ cần dùng một từ khóa var là được.

    • Nó có 4 kiểu dữ liệu chính (không cần khai báo kiểu dữ liệu cho biến đâu nhé): số nguyên, số thực, chuỗi và object. Trong đó object là một kiểu dữ liệu đặc biệt, nó dùng để viết class (đối tượng), function (hàm),... nó rất hay và chính nó tạo nên thương hiệu Javascript đó.

  • Khi lập trình mấy cái này, bạn không cần quan tâm đến khái niệm setup hay loop, vì chỉ có một hàm duy nhất là hàm setup mà thôi! Hàm loop các bạn phải tự tạo qua interval (nói cụ thể thì hơi phức tạp, đợi ví dụ tiếp mình nói ha)!

  • Như các bạn thấy đoạn code còn lại trong ví dụ trên chính là đoạn "setup".

    • Cái này không cần pinMode vì nó cố tình không code theo API của Arduino vì 2 phong cách ngôn ngữ lập trình là khác nhau không thể code như vậy được. Vì sao? Vì Arduino là dạng ngôn ngữ lập trình khai báo rõ ràng kiểu dữ liệu, còn Javascript là dạng ngôn ngữ khai báo không rõ ràng, không cần quan tâm đến kiểu dữ liệu của nó (nôm na vậy là ok).

    • Có 2 dòng chính, dòng này var led = new five.Led("P1-13"); giống như là pinMode led tại chân có số thứ tự là 13, bạn xem thêm ở đây nhé.

    • Còn hàm dưới là hàm cho led đó nhấp nháy với tốc độ là 500ms. Có thể xem thêm tham khảo của nó tại đây.

Các ví dụ khác về Johnny five và Raspberry Pi

Các bạn ở thể vào đây và xem các ví dụ bằng tiếng Anh. Nó khá rõ ràng, từ ngữ dễ chịu và hay, đọc một tí cho lên tay vì Javascript không dễ như C++ (mức căn bản, lên pro thì C++ vẫn khó nhất).

Trong các ví dụ đó, chủ yếu là ví dụ trên board Arduino, các bạn theo như quy tắc đặt tên pin như mình nói ở ví dụ blink trên để sửa lại, cùng sửa phần cài đặt board (4 dòng đầu) của mỗi ví dụ nữa là được!

Đi xa hơn

Bài viết này, mình viết chủ yếu là để giới thiệu về thư viện johnny five và môi trường nodejs trên Raspberry Pi, các bạn cần tự học và tự tay dev nhiều cái vào thì mới lên tay.

Chúc các bạn may mắn trên con đường của mình.

lên
7 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Phát nhạc với Raspberry Pi - USB Audio - Card âm thanh và Raspberry Pi

Arduino đã phát nhạc nhưng lại rất vất vả. Mình muốn Raspberry Pi sẽ đảm nhận việc này để việc này đơn giản hơn. Mình sẽ hướng dẫn các bạn chơi các nhạc ở local (thẻ nhớ) và các bài nhạc ở trên Internet! Một cái hay nữa là, các package mà mình hướng dẫn các bạn đều có thư viện cho nodejs!

lên
8 thành viên đã đánh giá bài viết này hữu ích.

Truyền hình ảnh từ Camera bằng Raspberry Pi

Khi đọc các bài viết về Intel Galileo, mình thấy có bài MJPEG Streamer khá hay. Và qua đây, mình cũng xin chia sẻ cách để chạy MJPEG Streamer trên Raspberry Pi để truyền hình ảnh từ Camera trong mạng LAN.

lên
9 thành viên đã đánh giá bài viết này hữu ích.