SlideShare a Scribd company logo
1 of 26
UNGDUNGMAYTINH.COM
Chương 3: Hệ điều hành khác và phiên bản
Linux
Hệ điều hành Stock Raspbian rất tuyệt vời cho máy tính với mục đích chung,
nhưng đôi khi có thể điều chỉnh Pi cho mục đích cụ thể, như một trung tâm truyền
thông độc lập hoặc bàn đạp hiệu ứng guitar. Hệ điều hành Linux phong phú phần
mềm cho mọi ứng dụng có thể tưởng tượng được. Một số người đã dành thời gian
để gói tất cả các phần mềm phù hợp với nhau để những người khác không phải làm
điều đó. Chương này sẽ trình bành một vài phiên bản Linux chuyên biệt hơn và các
hệ điều hành khác.
Khi nói về "phiên bản Linux", thường nói về ba thứ:
• Nhân Linux và trình điều khiển
• Phần mềm được cài đặt sẵn cho một ứng dụng cụ thể
• Các công cụ hoặc công cụ cấu hình đặc biệt được định cấu hình sẵn cho một
nhiệm vụ cụ thể (ví dụ: để khởi động vào một chương trình cụ thể)
Như đã thấy trong Chương 1, về cơ bản có bốn phiên bản có mục đích chung phổ
biến. Sẽ tìm thấy ba điều sau đây trong trình cài đặt NOOBS:
Raspbian
Phiên bản được đề nghị từ nhà sản xuất; dựa trên Debian. Nếu không chắc chắn
nên chọn phiên bản nào, đây là phiên bản thích hợp.
Arch Linux
Arch Linux đặc biệt nhắm vào các máy tính dựa trên ARM, vì vậy nó hỗ trợ Pi từ
rất sớm.
Pidora
Pidora là phiên bản Fedora cho Pi.
Ubuntu MATE
Ubuntu MATE là một phiên bản rất phổ biến của Linux. Nó có màn hình máy tính
để bàn mỏng hơn hoạt động khá tốt trên Raspberry Pi 2 và Raspberry Pi 3. Nó sẽ
không hoạt động trên các phiên bản trước của Raspberry Pi vì Ubuntu chỉ hỗ trợ
ARMv7 trở lên.
Dưới đây là một vài phiên bản và hệ điều hành Linux chuyên dụng thú vị khác.
Phiên bản cho phòng nhạc (home theater)
Một hệ điều hành được sử dụng một thời gian dài cho phòng hát là XBMC, bắt đầu
như một dự án trung tâm truyền thông để chạy trên bảng điều khiển trò chơi Xbox.
Tuy nhiên, trong những năm qua, XBMC đã trở thành một nền tảng giải trí tổng
hợp hơn và hoạt động rất tốt trên Pi. Vào mùa hè năm 2014, Quỹ XBMC đã đổi tên
phần mềm thành Kodi để đưa nó vào các dự án. Có một vài phên bản Pi giúp dễ
dàng đưa Kodi vào trang chủ:
OSMC
Trước đây gọi là Raspbmc, phiên bản OSMC dựa trên Debian và Kodi. Nó có hỗ
trợ tuyệt vời cho Raspberry Pi và có thể được cài đặt từ NOOBS. (Hình 3-1).
Hình 3-1. Giao diện của OSMC.
OpenELEC
Trung tâm giải trí Open Embedded Linux là một phiên bản được cải tiến của Kodi
có thể thu hút nhiều người dùng hơn (Hình 3-2).
UNGDUNGMAYTINH.COM
Hình 3-2. Menu chính cho The Open Embedded Linux Entertainment Center
(OpenELEC)
Phiên bản cho âm nhạc
Nó rẻ và phù hợp với hộp đựng hiệu ứng guitar, nên thế giới âm nhạc điện tử đã có
bước phát triển mới từ khi Pi phát hành phiên bản này. Dưới đây là một số ví dụ:
Vệ tinh CCRMA
Sự phân phối này từ Trung tâm Nghiên cứu Máy tính Âm nhạc và Âm học của
Stanford (CCRMA) với mục tiêu hướng tới các nhạc cụ và các bản cài đặt nghệ
thuật được nhúng, cũng như các âm nền hiệu ứng. Nó có thể chạy các phần mềm
khác, nhưng cốt lõi là Pure Data Extended, Faust, JackTrip, và ChucK. Lý do cơ
bản được mô tả trong bài báo “Vệ tinh CCRMA: Một tương tác âm nhạc và nền
tảng tổng hợp âm thanh” của Edgar Berdahl và Wendy Ju.
Volumio
Một máy nghe nhạc cho audiophiles. Dự án này phát triển từ RaspyFi.
Ngoài ra trong thế giới âm nhạc, còn có nền tảng âm nhạc mô-đun SunVox của Pi.
Retrocomputing và Retrogaming
Pi được lấy cảm hứng từ những chiếc máy tính cá nhân rẻ tiền của những năm
1980, do đó có một số phiên bản để hòi niệm retrocomputing hoặc chơi game:
Hệ điều hành RISC
Khởi động thẳng vào BASIC!
Retropie
Hình ảnh thẻ SD và board phần cứng GPIO giúp việc xây dựng bảng điều khiển
retrogaming dễ dàng hơn.
PiPlay
Bản dựng sẵn để chơi trò chơi và mô phỏng dựa trên MAME (trước đây là
PiMAME).
[Nó không phải là một hệ điều hành, nhưng nếu đang sử dụng các văn bản retro,
hãy thử Frotz: sudo apt-get install frotz]
Internet of Things
Internet of Things hoặc IoT là thiết bị được kết nối với Internet. Đây có thể là bộ
điều nhiệt, chuông cửa, … có thể được truy cập từ xa qua Web hoặc trong ứng
dụng dành cho thiết bị di động. Các lĩnh vực của IoT không chỉ sử dụng trong gia
đình. Các công ty lớn đặt thiết bị của họ trực tuyến để theo dõi tài sản, có thể theo
giỏi ở khắp nơi trên thế giới.
Do kết nối và chi phí thấp của Raspberry Pi, nó là lựa chọn tuyệt vời cho thử
nghiệm với Internet of Things. Trong khi có thể sử dụng Raspbian cho điều này
(xem “Kết nối Web với thế giới thực” trên trang 163), đây là một vài hệ điều hành
được hướng tới IoT.
Snappy Ubuntu Core
Có sẵn cho Raspberry Pi 2, Snappy Ubuntu Core là một phiên bản của Linux nhằm
vào các thiết bị và máy chủ đám mây. Đó là một hệ điều hành cơ bản, bao gồm các
phương pháp cụ thể về phiên bản ứng dụng nào được cài đặt để hỗ trợ dự án. Nó
nhỏ gọn, nhanh hơn, đáng tin cậy hơn và an toàn hơn. Mặc dù nó rất mới và chưa
được hỗ trợ đầy đủ nhưng nó đáng để quan tâm.
Windows 10 IoT Core
Với việc phát hành Windows 10 vào tháng 7 năm 2015, Microsoft đã quan tâm về
IoT với việc phát hành Windows 10 IoT Core. Mặc dù không có màn hình máy
tính để bàn Windows đầy đủ, các nhà phát triển hiện có thể triển khai các ứng dụng
UNGDUNGMAYTINH.COM
Windows phổ biến cho Raspberry Pi 2. Nếu đã có kinh nghiệm phát triển các ứng
dụng Windows, hãy thử Windows 10 IoT Core trên Raspberry Pi 2. Nếu đã quen
với việc bắt đầu, Microsoft cung cấp tài liệu làm quen ( hướng dẫn) tuyệt vời.
Các phiên bản hữu ích khác
Dưới đây là một vài phiên bản khác có thể tham khảo:
Qt trên Pi
Một gói hệ điều hành nhằm vào các nhà phát triển "thiết bị chuyên dụng" độc lập
bằng cách sử dụng GUI Qt framework.
Web kiosk
Để tạo Internet kiosk và biển báo kỹ thuật số.
Openwrt
Biến Pi thành một bộ định tuyến mạnh mẽ với nền tảng bộ định tuyến nguồn mở.
OctoPrint
Với OctoPrint, có thể điều khiển máy in 3D qua mạng. Chỉ cần kết nối nó với một
Raspberry Pi và khởi động từ hình ảnh thẻ SD OctoPi.
PiNet
PiNet là một cách để giáo viên quản lý lớp học bằng Raspberry Pi. Đó là một
phương pháp để khởi động Pi từ một máy chủ trung tâm trên mạng. Tài khoản sinh
viên được lưu trữ trên máy chủ và có sẵn các công cụ dành riêng cho lớp học.
UNGDUNGMAYTINH.COM
Chương 4: Python trên Pi
Python là một ngôn ngữ lập trình tuyệt vời, rõ ràng và dễ dàng để bắt đầu và chạy.
Quan trọng hơn, có rất nhiều người dùng quan tâm.
Guido van Rossum đã tạo ra Python rất sớm và sử dụng nó như một ngôn ngữ đầu
tiên cho máy tính. Năm 1999, van Ros- sum đã cùng ông đưa ra một đề xuất được
gọi rộng rãi là “Computer Pro- gramming for Everybody”, đưa ra một tầm nhìn
cho một chương trình đầy tham vọng để dạy lập trình sử dụng Python ở các trường
tiểu học và trung học. Hơn một thập kỷ sau, điều đó được tiến hành với sự xuất
hiện của Raspberry Pi.
Python là một ngôn ngữ thông dịch, có nghĩa là có thể viết một chương trình hoặc
tập lệnh và thực thi nó trực tiếp thay vì biên dịch nó thành mã máy. Các ngôn ngữ
được phiên dịch nhanh hơn một chút so với chương trình và có một số lợi ích phụ.
Ví dụ: bằng Python, không phải phiên dịch cho máy tính hiểu biến có phải là số,
danh sách hay chuỗi không; chỉ cần nhập các kiểu dữ liệu khi thực thi tập lệnh.
Trình thông dịch Python có thể được chạy theo hai cách: là một trình tương tác để
thực thi các lệnh riêng lẻ, hoặc như một chương trình dòng lệnh để thực thi các tập
lệnh độc lập. Môi trường phát triển tích hợp (IDE) đi kèm với Python và Raspberry
Pi được gọi là IDLE.
Phiên bản Python Conundrum
Lý do có hai phiên bản IDLE là có hai phiên bản Python được cài đặt trên Pi. Đây
là thực tế phổ biến (mặc dù có một chút khó hiểu). Theo phiên bản này, Python 3 là
mới nhất, nhưng thay đổi được thực hiện cho ngôn ngữ giữa các phiên bản 2 và 3
làm cho các phiên bản sau này không tương thích ngược. Mặc dù Python 3 đã tồn
tại trong nhiều năm nhưng phải mất một thời gian để nó được chấp nhận rộng rãi,
và rất nhiều gói do người dùng đóng góp chưa được nâng cấp lên Python 3. Nó
thậm chí còn khó hiểu hơn khi tìm kiếm tài liệu Python; cần đảm bảo đang tìm
kiếm đúng phiên bản!
Phiên bản Python mặc định trên Pi là 2,7. Có thể chạy một Python 3 với:
python3
Các ví dụ trong cuốn sách này sẽ hoạt động với Python 2.7 hoặc 3.X, trừ khi có ghi
chú khác.
Xin chào, Python
Cách tốt nhất để bắt đầu học Python là bắt đầu ngay lập tức. Mặc dù có thể sử dụng
bất kỳ trình soạn thảo văn bản nào để bắt đầu lập trình, trong cuốn sách này sẽ bắt
đầu sử dụng IDE. Mở ứng dụng IDLE 3. Để chạy IDLE, nhấp vào menu trên màn
hình ở phía dưới bên trái và chọn Pro- gramming → Python (IDLE 3).
Khi IDLE mở ra, một cửa sổ có trình tương tác sẽ xuất hiện. Ba dấu lớn (>>>) là
dấu nhắc tương tác; khi thấy lời nhắc, điều đó có nghĩa là chương trình đã sẵn
sàng, gõ như sau:
>>> print("Saluton Mondo!")
Nhấn Enter hoặc Return. Python thực hiện câu lệnh đó và cho kết quả trong cửa sổ
trình tương tác. Bạn có thể sử dụng trình tương tác như một loại máy tính để kiểm
tra các câu lệnh hoặc tính toán:
>>> 3+4+5
Hãy suy nghĩ về các câu lệnh được thực thi trong trình tương tác như một chương
trình đang chạy một dòng tại một thời điểm. Có thể thiết lập biến hoặc nhập mô-
đun:
>>> import math
>>> (1 + math.sqrt(5)) / 2
Lệnh nhập vào kích hoạt tất cả các chức năng toán học của Python có sẵn cho
chương trình (tìm hiểu thêm về các mô-đun trong “Đối tượng và Mô-đun” trên
trang 57). Để thiết lập một biến, sử dụng toán tử gán (=):
>>> import math
>>> radius = 20
>>> radius * 2 * math.pi
1256.6370614359173
Nếu muốn xóa tất cả các biến và bắt đầu ở trạng thái mới, chọn Shell → Restart
Shell để bắt đầu lại. Cũng có thể sử dụng trình tương tác để nhận thông tin về cách
sử dụng một chương trình con cụ thể, mô-đun hoặc các chủ đề Python khác với sự
trợ giúp ():
help("print")
Để có danh sách tất cả các chủ đề có sẵn, hãy thử:
help("topics")
help("keywords")
UNGDUNGMAYTINH.COM
help("modules")
Trình biên dịch Python rất tốt cho các lệnh kiểm thử hoặc các phép toán đơn giản,
khi muốn chạy chương trình Python như một ứng dụng độc lập. Để bắt đầu một
chương trình Python mới, chọn File → New Window, và IDLE sẽ xuất hiện một
cửa sổ soạn thảo chương trình (xem Hình 4-1).
Hãy thử gõ một dòng code và chọn Run → Run Module. Sẽ nhận được cảnh báo
rằng "Source Must Be Saved OK To Save?". Lưu tập lệnh trong thư mục chính
dưới dạng SalutonMondo.py và nó sẽ được thực hiện trong trình tương tác.
Hình 4-1. Trình tương tác IDLE (bên trái) và cửa sổ trình soạn thảo (bên phải)
Nếu không muốn sử dụng môi trường IDLE, để chạy một chương trình từ dòng
lệnh, hãy mở Terminal và gõ:
python SalutonMondo.py
Thêm một chút về Python
Nếu học Python từ thế giới Arduino thì có lẽ đã quen với việc viết các chương
trình (được gọi là bản phác thảo trong Arduino, nhưng thường được gọi là các
chương trình trong Python) theo định dạng thiết lập / vòng lặp, trong đó setup() là
một hàm chạy một lần và loop () là một hàm thực thi lặp đi lặp lại. Ví dụ sau đây
cho thấy làm thế nào để làm điều này trong Python. Chọn Cửa sổ mới từ trình
tương tác trong IDLE 3 và nhập như sau:
# Setup
n = 0
# Loop
while True:
n = n + 1
# The % is the modulo operator
if ((n % 2) == 0):
print(n)
Chọn Run Module và đặt tên cho tập lệnh (chẳng hạn như Count- Evens.py). Khi
nó chạy, tất cả các số nguyên được in (nhấn Ctrl-C để tạm ngừng đầu ra, bởi vì nó
sẽ chạy mãi mãi). Cũng có thể thực hiện điều này bằng cách sử dụng vòng lặp for
mà chỉ đếm 100 số nguyên đầu tiên:
for n in range(0, 100):
if ((n % 2) == 0):
print(n)
[Trong ví dụ trên, mỗi hàm con thụt lề là bốn dấu cách, không phải là một tab
(nhưng có thể nhấn Tab trong IDLE và nó sẽ chèn thêm không gian). Thụt lề có ý
nghĩa cấu trúc trong Python. Đây là một trong những trở ngại lớn cho người mới
bắt đầu, hoặc khi sao chép và dán mã. Tuy nhiên, việc sử dụng không gian trắng
bắt buộc làm cho Python trở thành một ngôn ngữ khá dễ đọc. Xem Nguyên tắc về
cấu trúc trình bày Python để biết các mẹo viết code.]
Python là một ngôn ngữ có cấu trúc cao, sử dụng khoảng trắng để xác định cấu
trúc. Trong ví dụ tiếp theo, các hàm con sẽ được thụt vào một mức dưới hàm loop()
và được coi là một phần của hàm đó. Sự kết thúc của một vòng lặp được xác định
bởi vị trí thụt lề (hoặc kết thúc của tập lệnh). Điều này khác với các ngôn ngữ như
C phân biệt các hàm trong code bằng dấu ngoặc hoặc các cách đánh dấu khác.
Sử dụng các hàm để đặt đoạn code vào một đoạn code có thể được gọi từ các vị trí
khác trong tập lệnh. Để viết lại ví dụ trước với các hàm, hãy làm như sau (khi chạy
nó, lưu nó dưới dạng CountEvens.py):
# Declare global variables
n = 0
# Setup function
def setup():
global n
n = 100
def loop():
UNGDUNGMAYTINH.COM
global n
n = n + 1
if ((n % 2) == 0):
print(n)
# Main
setup()
while True:
loop()
Trong ví dụ này, đầu ra sẽ là các số chẵn từ 102 trở đi. Đây là cách nó hoạt động:
• Đầu tiên, biến n được định nghĩa là một biến chính có thể được sử dụng
trong bất kỳ đoạn code nào trong chương trình lệnh.
• Ở đây, hàm setup () được định nghĩa (nhưng chưa được chạy).
• Tương tự, đây là định nghĩa của hàm loop ().
• Trong code chính, setup () được gọi một lần, sau đó đến loop (). Việc sử
dụng từ khóa chính trong dòng đầu tiên của mỗi hàm là quan trọng; nó thông
báo cho trình biên dịch sử dụng biến chính n thay vì tạo một biến thứ hai
(cục bộ, hoặc riêng cho hàm đó) n chỉ có thể sử dụng trong hàm.
Hướng dẫn này quá ngắn để trở thành một chương trình Python đầy đủ. Để thực sự
tìm hiểu ngôn ngữ, có thể bắt đầu với Learn Python the Hard Way, Think Python,
hoặc Python Pocket Reference. Phần còn lại của chương này sẽ cung cấp dây đủ
ngữ cảnh để lập trình và chạy với các ví dụ và chỉ ra các tính năng cơ bản và các
mô-đun có sẵn.
Dòng lệnh trong IDLE
Đầu ra của IDLE rất chậm khi chạy code ví dụ để in ra trình tương tác. Để biết nó
chậm như thế nào, hãy giữ IDLE mở và mở một cửa sổ mới bên cạnh. Trong
IDLE, chạy chương trình CountEvens bằng cách sử dụng Run Module; nó sẽ khởi
đầu. Sau đó gõ lệnh sau tại dấu nhắc dòng lệnh của terminal:
python CountEvens.py
Khá khó khăn từ việc sử dụng IDE trên các thiết bị khá hạn chế của Pi. Các ví dụ
sau trong cuốn sách sẽ được thực hiện từ dòng lệnh, nhưng IDLE vẫn có thể được
sử dụng như một trình soạn thảo.
Đối tượng và mô-đun
Có thể hiểu cú pháp cơ bản của việc xử lý các đối tượng và các mô-đun thông qua
các ví dụ trong cuốn sách này. Python là một ngôn ngữ rõ ràng, chỉ với 34 từ khóa
dành riêng (xem Bảng 4-1). Những từ khóa này là phần cốt lõi của ngôn ngữ cho
phép cấu trúc và kiểm soát hoạt động trong tập lệnh. Khá nhiều thứ không phải là
một từ khóa có thể được coi là một đối tượng. Đối tượng là kết hợp dữ liệu và hành
vi có tên. Có thể thay đổi dữ liệu của một đối tượng, lấy thông tin từ nó, và thậm
chí thao tác với các đối tượng khác.
Bảng 4-1. Python chỉ có 34 từ khóa dành riêng
Điều kiện Loop Chức năng tích
hợp sẵn
Hàm Classes,
mô-đun
Xử lý lỗi
if for print class try
else in pass def def
elif while del global finally
not break break raise
or as nonlocal assert
and continue yield with
is import
True return
False from
None
Trong Python, chuỗi, danh sách, hàm, mô-đun và số chẵn là các đối tượng. Một đối
tượng Python có thể được coi như một tập hợp các thuộc tính và hệ thống. Có
quyền truy cập vào các thuộc tính và hệ thống này bằng cách sử dụng cú pháp dấu
chấm đơn giản. Ví dụ, gõ lệnh này tại dấu nhắc trình tương tác để thiết lập một đối
tượng chuỗi và gọi hệ thống cho phép nó viết hoa chính nó:
>>> myString = "quux"
>>> myString.capitalize()
'Quux'
Hoặc sử dụng reverse () để sắp xếp lại một danh sách theo thứ tự ngược lại:
>>> myList = ['a', 'man', 'a', 'plan', 'a', 'canal']
>>> myList.reverse()
>>> print(myList)
['canal', 'a', 'plan', 'a', 'man', 'a']
UNGDUNGMAYTINH.COM
[Cả chuỗi và danh sách đều được xây dựng trong các mô-đun của thư viện
standard, có sẵn từ bất kỳ chương trình Python nào. Trong mỗi trường hợp, chuỗi
và danh sách mô-đun đã xác định một loạt các chức năng để xử lý các chuỗi và
danh sách, bao gồm capitalize() và reverse().]
Một số mô-đun thư viện chuẩn không được tích hợp sẵn và cần phải nói rõ rằng sẽ
sử dụng chúng với lệnh nhập. Để sử dụng mô đun thời gian từ thư viện chuẩn để
truy cập vào các hàm hữu ích để xử lý thời gian và thông tin thời gian, hãy sử
dụng:
import time
Cũng có thể nhập để đổi tên mô-đun trong chương trình:
import time as myTime
Hoặc nhập để tải các chức năng lựa chọn từ một mô-đun:
from time import clock
Dưới đây là một ví dụ ngắn về một chương trình Python sử dụng các mô-đun thời
gian và datetime (ngày giờ) từ thư viện chuẩn để in thời gian hiện tại một lần mỗi
giây:
from datetime import datetime
from time import sleep
while True:
now = str(datetime.now())
print(now)
sleep(1)
Hàm sleep dừng việc thực hiện chương trình trong một giây. Điều sẽ nhận thấy sau
khi chạy code này là thời gian sẽ chênh lệch một chút.
Đó là vì hai lý do:
• Code không tính đến lượng thời gian cần để tính toán thời gian hiện tại.
• Các quy trình khác đang chi phối CPU và có thể mất các khoảng thời gian
nhỏ nhất định để thực hiện chương trình. Đây là điều quan trọng cần nhớ:
khi lập trình trên Raspberry Pi, không thực hiện trên màn hình thời gian
thực.
Nếu đang sử dụng hàm sleep(), nó chính xác đến hơn 5ms trên Pi.
Tiếp theo, hãy sửa ví dụ để mở một tệp văn bản và ghi lại một số dữ liệu vào nó
một cách định kỳ. Mọi thứ đều là chuỗi khi xử lý các tệp văn bản. Sử dụng hàm str
() để chuyển đổi các số thành chuỗi (và int () để thay đổi về một số nguyên):
from datetime import datetime
from time import sleep
import random
log = open("log.txt", "w")
for i in range(5):
now = str(datetime.now())
# Generate some random data in the range 0-1024
data = random.randint(0, 1024)
log.write(now + " " + str(data) + "n")
print(".")
sleep(.9)
log.flush()
log.close()
[Trong một ứng dụng ghi dữ liệu thực, cần có ngày và giờ chính xác được thiết lập
trên Raspberry Pi, như được mô tả trong phần "Đặt ngày và giờ" trên trang 41.]
Đây là một ví dụ khác (ReadFile.py) mà đọc trong một tên tập tin như một đối số
từ dòng lệnh (chạy nó từ trình tương tác với python3 có tên tệp ReadFile.py).
Chương trình mở tệp, đọc từng dòng dưới dạng một chuỗi và in nó. Lưu ý rằng
print () hoạt động giống như println () thực hiện bằng các ngôn ngữ khác, nó thêm
một dòng mới vào chuỗi được in. Đối số kết thúc với print () ngăn chặn dòng mới:
# Open and read a file from command-line argument
import sys
if (len(sys.argv) != 2):
print("Usage: python ReadFile.py filename")
sys.exit()
scriptname = sys.argv[0]
filename = sys.argv[1]
file = open(filename, "r")
lines = file.readlines()
file.close()
for line in lines:
print(line, end = '')
Nhiều mô-đun khác
UNGDUNGMAYTINH.COM
Một trong những lý do Python rất phổ biến là có một số lượng lớn các mô-đun do
người dùng đóng góp xây dựng trên thư viện chuẩn. Python Package Index (PyPI)
là danh sách trình bày (hoặc các mô-đun) chính xác. Sử dụng một số mô-đun này,
đặc biệt là mô đun GPIO để truy cập vào các đầu vào và đầu ra chung của
Raspberry Pi.
Để sử dụng một trong số các trình bày trên, cần tải xuống code, định cấu hình và
cài đặt nó. Mô-đun NumPy, ví dụ, có thể được cài đặt như sau:
sudo apt-get install python-numpy
Nếu một trình bày đã được tổng hợp bởi người tạo ra nó bằng cách sử dụng
phương pháp chuẩn để tổng hợp các mô-đun (với công cụ biên dịch của Python),
tất cả những gì cần làm là tải tệp, giải nén nó và nhập:
python setup.py install
Dễ dàng cài đặt mô-đun với Pip
Nhiều module có thể được cài đặt với apt-get. Cũng có thể xem xét trình cài đặt
Pip, một công cụ giúp việc cài đặt các tệp từ PyPI trở nên dễ dàng. Cài đặt Pip
bằng apt-get:
sudo apt-get install python-pip
Sau đó, có thể cài đặt hầu hết các mô-đun bằng cách sử dụng Pip để quản lý tải
xuống và phụ thuộc. Ví dụ:
pip install flask
Trong các chương sau, sử dụng các mô-đun cụ thể cho ứng dụng một cách rộng rãi,
nhưng đây là một ví dụ cho thấy mức độ mạnh mẽ của một số mô-đun. Mô-đun
Feedparser là một trình phân tích cú pháp tổng quát cho phép lấy các nguồn cấp dữ
liệu RSS hoặc Atom và dễ dàng truy cập vào nội dung. Bởi vì hầu hết các nguồn
thông tin trên Web đều có đầu ra RSS hoặc Atom, Feedparser là một trong nhiều
cách để đưa Raspberry Pi kết nối với Internet of Things.
Trước tiên, cài đặt mô-đun Feedparser bằng Pip (xem “Mô-đun dễ dàng Cài đặt với
Pip” trên trang 62):
sudo pip install feedparser
Để sử dụng nó, chỉ cần cung cấp chức năng phân tích cú pháp URL của nguồn cấp
dữ liệu RSS. Feedparser sẽ tìm nạp XML của nguồn cấp dữ liệu, phân tích cú pháp
và chuyển nó thành cấu trúc dữ liệu danh sách đặc biệt được gọi là từ điển. Từ điển
Python là danh sách các khóa / giá trị, đôi khi được gọi là mảng nhỏ hoặc mảng kết
hợp. Nguồn cấp dữ liệu được phân tích cú pháp là từ điển và các mục được phân
tích cú pháp trong nguồn cấp dữ liệu cũng là từ điển, như được minh họa trong ví
dụ này, lấy thời tiết hiện tại ở Providence, RI, từ http://weather.gov:
import feedparser
feed_url = "http://w1.weather.gov/xml/current_obs/KPVD.rss"
feed = feedparser.parse(feed_url)
RSSitems = feed["items"]
for item in RSSitems:
weather = item["title"]
print weather
Khởi chạy các chương trình khác từ Python
Python dễ dàng kích hoạt các chương trình khác trên Pi với mô-đun
sys.subprocess. Hãy thử những điều sau đây:
from datetime import datetime
from time import sleep
import subprocess
for count in range(0, 60):
filename = str(datetime.now()) + ".jpg"
subprocess.call(["fswebcam", filename])
sleep(60)
Đây là một tập lệnh thời gian đơn giản sẽ chụp ảnh từ webcam một lần một phút
trong một giờ. Máy ảnh được trình bày chi tiết hơn trong Chương 9, nhưng chương
trình này sẽ hoạt động với máy ảnh USB được kết nối và chương trình fswebcam
được cài đặt; chạy lệnh này trước để cài đặt nó:
sudo apt-get install fswebcam
Hàm subprocess.call nhận danh sách các chuỗi, kết hợp chúng lại với nhau (với
dấu cách) và thực thi chương trình được chỉ định. Nếu nó là một chương trình hợp
lệ, thì Rasp- berry Pi sẽ sinh ra một quá trình riêng biệt cho nó, nó sẽ chạy cùng
với chương trình Python. Lệnh trong ví dụ trước giống như khi gõ câu lệnh sau tại
dấu nhắc termial:
fswebcam 20160812.jpg
Để thêm các tham số khác vào hàm gọi chương trình, chỉ cần thêm các chuỗi vào
danh sách trong hàm subprocess.call:
subprocess.call(["fswebcam", "-r", "1280x720", filename])
UNGDUNGMAYTINH.COM
Điều này sẽ gửi chương trình fswebcam một tham số để thay đổi độ phân giải của
hình ảnh được chụp.
Chạy một tập lệnh Python
Tự động khởi động
Bởi vì Pi có thể hoạt động như một thiết bị độc lập, một câu hỏi phổ biến là làm thế
nào để khởi chạy một chương trình Python tự động khi Pi khởi động. Câu trả lời là
thêm một mục vào tệp / etc / rc.local, để sử dụng cho chính xác điều này trong
Linux. Chỉ cần chỉnh sửa tệp:
sudo nano /etc/rc.local
và thêm một lệnh để thực thi chương trình giữa section và exit 0:
python /home/pi/foo.py&
Ký hiệu ở cuối sẽ chạy chương trình như một quá trình nền, nó sẽ cho phép tất cả
các dịch vụ khác của Pi bắt đầu khởi động.
Khắc phục sự cố
Chắc chắn, sẽ gặp rắc rối khi viết code, sẽ cần theo dõi và sửa lỗi. Chế độ tương
tác IDLE có thể giúp tìm lỗi; trình Debug cung cấp một số công cụ giúp biết code
đang hoạt động như thế nào. Có thể tùy chọn xem tất cả các biến và kiểm tra qua
từng dòng thực hiện.
Lỗi cú pháp là lỗi dễ giải quyết nhất; thường thì đây chỉ là lỗi đánh máy hoặc lỗi
chính tả của ngôn ngữ. Lỗi ngữ nghĩa – lỗi chương trình được hình thành tốt nhưng
không hoạt động như mong đợi có thể khó sửa hơn. Đó là nơi trình gỡ lỗi có thể
giúp giải quyết một lỗi phức tạp. Việc gỡ lỗi hiệu quả mất nhiều năm để tìm hiểu,
nhưng đây là một bảng điều khiển nhanh để kiểm tra khi lập trình Pi trong Python:
• Sử dụng print () để hiển thị khi chương trình đến một điểm cụ thể.
• Sử dụng print () để hiển thị các giá trị của các biến khi chương trình thực thi.
• Kiểm tra lại khoảng trắng để đảm bảo các hàm được xác định.
• Khi gỡ lỗi cú pháp, hãy nhớ rằng lỗi thực tế đã được chỉ ra trước khi trình biên
dịch báo cáo lỗi đó.
• Kiểm tra kỹ tất cả các biến chính và cục bộ.
• Kiểm tra các dấu ngoặc đơn phù hợp.
• Hãy chắc chắn rằng thứ tự của các hoạt động là chính xác trong tính toán; chèn
dấu ngoặc đơn nếu không chắc chắn. Ví dụ: 3 + 4 *2 và (3 + 4) * 2 cho kết quả
khác nhau.
UNGDUNGMAYTINH.COM
Chương 5: Arduino và Pi
Như sẽ thấy trong một vài chương tiếp theo, có thể sử dụng các chân GPIO trên
Raspberry Pi để kết nối với các cảm biến hoặc những thứ như đèn LED nhấp nháy
và động cơ. Và nếu có kinh nghiệm sử dụng nền tảng phát triển vi điều khiển
Arduino, cũng có thể sử dụng nó cùng với Raspberry Pi.
Khi Raspberry Pi lần đầu tiên được công bố, rất nhiều người hỏi đó có phải là đối
thủ của Arduino không. Đối với cùng một mức giá, Pi cung cấp nhiều tính năng xử
lý hơn: tại sao sử dụng Arduino khi đã có một Pi? Vì có hai nền tảng bổ trợ nhau,
và Raspberry Pi có thể làm máy chủ lưu trữ tuyệt vời cho Arduino. Có khá nhiều
dự án kết hợp Arduino và Pi lại với nhau:
• Để sử dụng số lượng lớn các thư viện và các ví dụ có thể chia sẻ cho Arduino.
• Để bổ sung một dự án Arduino với tính năng xử lý nhiều hơn. Ví dụ, có một bộ
điều khiển MIDI đã được nối với một bộ tổng hợp, nhưng bây giờ cần nâng cấp để
tổng hợp âm thanh trực tiếp trên Pi.
• Khi đang xử lý nguồn 5V. Pi hoạt động với nguồn 3.3V, và nó không thể hoạt
động ở 5V. Arduino có thể hoạt động như một “bộ chuyển đổi” giữa hai nguồn.
• Khi làm thí nghiệm có thể làm cho một số lỗi gây tổn hại cho chip. Ví dụ: sinh
viên cố gắng điều khiển động cơ trực tiếp từ các chân trên Arduino (đừng thử); nó
rất dễ dàng làm cho chip vi điều khiển bị hư. Với Paspberry Pi thì sẽ không bị như
vậy.
• Khi gặp sự cố yêu cầu điều khiển chính xác trong thời gian thực, chẳng hạn như
bộ điều khiển cho máy in 3D. Như trong Chương 4, Raspbian không phải là một hệ
điều hành thời gian thực, và các chương trình không nhất thiết phải phụ thuộc vào
cùng một "chỉ thị cho mỗi chu kỳ đồng hồ" của một vi điều khiển.
Các ví dụ trong phần này giả định rằng đã biết những điều cơ bản về Arduino và
phần mềm phát triển tích hợp (IDE).
Hình 5-1. Arduino và Raspberry Pi là BFF
Cài đặt Arduino trong Raspbian
Để lập trình một board phát triển Arduino, cần kết nối nó với một máy tính bằng
cáp USB, sau đó biên dịch và flash một chương trình lên board bằng cách sử dụng
Arduino IDE. Có thể làm điều này với bất kỳ máy tính nào, hoặc có thể sử dụng
Raspberry Pi làm máy chủ để lập trình Arduino.
Sử dụng Raspberry Pi để lập trình Arduino sẽ nhanh hơn để gỡ lỗi, nhưng việc
biên dịch sẽ chậm hơn một chút so với máy tính xách tay hoặc máy tính để bàn
hiện đại. Việc biên dịch sẽ mất ít thời gian hơn sau lần biên dịch đầu tiên, vì
Arduino chỉ biên dịch code đã thay đổi kể từ lần biên dịch cuối cùng.
Để cài đặt Arduino IDE trên Raspberry Pi, hãy nhập như sau vào terminal:
sudo apt-get update
sudo apt-get install arduino
• Đảm bảo có phiên bản phần mềm mới nhất
• Sau đó tải nó xuống.
UNGDUNGMAYTINH.COM
Nó sẽ cài đặt Java cộng với nhiều phần mềm kèm theo khác. Phần mềm Arduino sẽ
xuất hiện dưới phần Electronics của menu chương trình (không khởi chạy nó).
Chỉ có thể cắm Arduino vào một trong các cổng USB mở. Kết nối USB sẽ cung
cấp đủ nguồn cho Arduino, nhưng có thể cấp nguồn cho Arduino riêng, tùy thuộc
vào ứng dụng (ví dụ: nếu đang chạy động cơ hoặc bộ gia nhiệt).
[Lưu ý rằng cần phải cắm cáp USB Arduino vào sau khi Raspberry Pi khởi động.
Nếu cắm vào lúc khởi động, Raspberry Pi có thể treo vì nó cố gắng tìm ra tất cả
các thiết bị trên bus USB]
Khi khởi chạy Arduino IDE, nó sẽ tìm tất cả các thiết bị USB và liệt kê một danh
sách được hiển thị trong menu Tools → Serial Port. Nhấp vào Tools→Serial và
chọn cổng nối tiếp (như / dev / ttyACM0), sau đó nhấp vào Tools → Board và
chọn loại Arduino Board (ví dụ: Uno). Nhấp vào File→Exam-
ples→01.Basics→Blink để tải code mẫu cơ bản. Nhấp vào nút Upload trên
thanh công cụ hoặc chọn File → Upload để tải lên code và sau khi nạp code, đèn
LED trên board Arduino sẽ bắt đầu nhấp nháy.
Tìm Serial Port
Nếu vì một lý do nào đó, / dev / ttyACM0 không hoạt động, cần thực hiện một
công việc nhỏ. Để tìm cổng nối tiếp USB mà Arduino được cắm vào mà không cần
tìm trong menu, hãy thử làm quen với dòng lệnh. Nếu không thấy Arduino kết nối,
hãy gõ:
ls /dev/tty*
Cắm Arduino, sau đó thử lại lệnh tương tự và xem điều gì đã thay đổi. Trên
Raspberry Pi, lúc đầu có / dev / ttyAMA0 được liệt kê (đây là hub USB trên
board). Khi cắm vào Arduino, / dev / ttyACM0 xuất hiện trong danh sách.
Cải thiện trải nghiệm người dùng
Trong khi đang thiết lập, có thể nhận thấy rằng chất lượng của phông chữ mặc định
trong trình chỉnh sửa Arduino là phông mặc định. Có thể thay đổi nó bằng cách tải
xuống phông chữ nguồn mở Inconsolata. Để cài đặt (khi Arduino IDE đóng), hãy
nhập:
sudo apt-get install fonts-inconsolata
Sau đó chỉnh sửa tệp tùy chọn Arduino:
nano ~/.arduino/preferences.txt
và thay đổi các dòng sau thành:
editor.font=Inconsolata,medium,14
editor.antialias=true
Khi khởi động lại Arduino, trình soạn thảo sẽ sử dụng phông chữ mới.
Giao tiếp trong Serial
Để giao tiếp giữa Raspberry Pi và Arduino qua kết nối nối tiếp, sử dụng thư viện
nối tiếp được tích hợp sẵn trong Arduino và mô-đun pySerial Python ở bên Rasp
Pi. Nó được cài đặt sẵn trên Jessie, nhưng nếu cần cài đặt nó, tệp là:
sudo apt-get install python-serial python3-serial
Mở IDE Arduino và tải code này lên Arduino:
void setup() {
Serial.begin(9600);
}
void loop() {
for (byte n = 0; n < 255; n++) {
Serial.write(n);
delay(50);
}
}
Nó sẽ đếm và in từng số qua serial chuyển tiếp.
[Lưu ý rằng trong Arduino, Serial.write () in ra số thực, sẽ được biên dịch dưới
dạng mã ký tự ASCII. Nếu muốn in chuỗi “123” thay vì số 123, sử dụng lệnh
Serial.print ().]
Tiếp theo, cần biết cổng nối tiếp USB nào Arduino được phép kết nối (xem “Tìm
cổng nối tiếp” trên trang 70). Trong chương trình Python; nếu cổng không phải là /
dev / ttyACM0, hãy thay đổi giá trị của cổng. (Xem Chương 4 để biết thêm về
Python). Lưu nó bằng tên SerialEcho.py và chạy nó với python SerialEcho.py:
import serial
port = "/dev/ttyACM0"
serialFromArduino = serial.Serial(port,9600)
serialFromArduino.flushInput()
while True:
if (serialFromArduino.inWaiting() > 0):
input = serialFromArduino.read(1)
print(ord(input))
UNGDUNGMAYTINH.COM
• Mở Serial Port được kết nối với Arduino.
• Xóa bộ đệm đầu vào.
• Đọc một byte từ serial buffer.
• Thay đổi byte vào thành một số thực ord ().
[Sẽ không thể tải lên Arduino khi Python mở serial port, vì vậy hãy đảm bảo đã
xóa chương trình Python bằng Ctrl-C trước khi nạp code. Có thể tải lên một
Arduino Leonardo hoặc Arduino Micro, nhưng làm như vậy sẽ phá vỡ kết nối với
chương trình Python, vì vậy sẽ cần phải khởi động lại nó bằng cách nào đó.]
Arduino sẽ gửi một số đến chương trình Python, nó giải thích con số đó dưới dạng
một chuỗi. Biến đầu vào sẽ chứa bất kỳ ký tự nào trỏ tới số đó trong bảng ASCII.
Để có ý tưởng tốt hơn, hãy thử thay thế dòng cuối cùng của tập lệnh Python bằng
cách này:
print(str(ord(input)) + " = the ASCII character " + input +
".")
Đặt Serial Port làm Đối số
Nếu muốn đặt cổng làm đối số dòng lệnh, hãy sử dụng mô-đun sys để lấy đối số
đầu tiên:
import serial, sys
if (len(sys.argv) != 2):
print("Usage: python ReadSerial.py port")
sys.exit()
port = sys.argv[1]
Sau đó chạy chương trình:
python SerialEcho.py /dev/ttyACM0
Ví dụ đơn giản đầu tiên chỉ gửi một byte đơn; điều này có thể sẽ tốt hơn nếu chỉ
gửi một loạt code từ Arduino. Ví dụ: nếu nút trái được bấm, gửi 1; nếu bấm thêm
lần nữa, gửi 2. Tuy nhiên, nó chỉ hoạt động tốt cho 255 ký tự rời rạc; nhiều hơn có
thể gửi chuỗi tùy ý. Ví dụ: nếu đang đọc cảm biến analog với Arduino, có thể gửi
các số trong khoảng 0 đến 1.023.
Phân tích cú pháp các số tùy ý có trong một byte tại một thời điểm có thể phức tạp
hơn khi phân tích bằng các ngôn ngữ khác nhưng với Python và chuỗi xử lý
pySerial làm cho nó trở nên dễ dàng hơn. Ví dụ đơn giản, cập nhật Arduino với
code tiếp theo có giá trị từ 0 đến 1.024:
void setup() {
Serial.begin(9600);
}
void loop() {
for (int n = 0; n < 1024; n++)
Serial.println(n, DEC);
delay(50);
}
}
Điểm khác biệt chính là trong lệnh println (). Trong ví dụ trước, hàm Serial.write ()
được sử dụng để ghi số nguyên vào cổng nối tiếp. Với println (), Arduino định
dạng số này thành chuỗi thập phân và gửi mã ASCII cho chuỗi. Vì vậy, thay vì gửi
một byte với giá trị 254, nó sẽ gửi chuỗi 254  r  n.  R thay cho trở về đầu dòng,
và  n là qua dòng mới (đây là những khái niệm được chuyển từ máy đánh chữ vào
máy tính: di chuyển đến đầu dòng; bắt đầu một dòng văn bản mới).
Về phía Python, có thể sử dụng readline () thay vì read (), nó sẽ đọc tất cả các ký tự
cho đến khi (và bao gồm cả) dòng trả về và dòng mới. Python có các hàm để
chuyển đổi giữa các kiểu dữ liệu và chuỗi khác nhau. Chỉ có thể sử dụng hàm int ()
để thay đổi chuỗi được định dạng thành một số nguyên:
import serial
port = "/dev/ttyACM0"
serialFromArduino = serial.Serial(port,9600)
serialFromArduino.flushInput()
while True:
input = serialFromArduino.readline()
inputAsInteger = int(input)
print(inputAsInteger * 10)
Lưu ý rằng nó chỉ đơn giản để thực hiện ví dụ này: nó sẽ đọc một đầu vào analog
và gửi kết quả; chỉ cần thay đổi vòng lặp:
void setup() {
Serial.begin(9600);
}
void loop() {
int n = analogRead(A0);
Serial.println(n, DEC);
delay(100);
}
UNGDUNGMAYTINH.COM
Giả sử muốn thay đổi chương trình Python chỉ cần nhập inputAsInteger thay vì
inputAsInteger * 10, nên nhập một giá trị bất kỳ trong khoảng 200 nếu không có
kết nối với chân 0. Với một số dây điện, kết nối chân 0 đến GND và giá trị phải là
0. Kết nối nó với chân 3.3V còn giá trị vào khoảng 715 và 1.023 khi kết nối với
chân 5V.
Sử dụng Arduino Compatibles
Có rất nhiều board vi điều khiển tương thích với Arduino IDE. Một số sử dụng bộ
chuyển đổi đặc biệt từ FTDI xử lý tất cả các giao tiếp nối tiếp từ USB đến TTL. Để
kết nối với các board (thường rẻ hơn), có thể sử dụng cáp FTDI hoặc bộ chuyển
đổi như USB BUB hoặc FTDI Friend. Trong phiên bản Jessie, trình điều khiển
FTDI cho các board chủ này đã được cài đặt, vì vậy chúng sẽ hoạt động bên ngoài.
Các board này thường hiển thị dưới dạng thiết bị / dev / ttyUSB0.
Sử dụng Firmata
Khi vào sâu hơn, nhiều dự án sẽ có code cho giao tiếp cơ bản. Như với bất kỳ hình
thức giao tiếp nào, mọi thứ trở nên khó khăn khi sâu hơn "hello, world"; sẽ cần
phải tạo các giao thức (hoặc tìm một giao thức hiện có và thực hiện nó) để các bên
hiểu nhau.
Một giải pháp tốt hơn đi kèm với Arduino là Firmata của Hans-Christoph Steiner,
một giao thức nối tiếp đa năng, đơn giản và dễ đọc. Nó có thể không hoàn hảo cho
tất cả các ứng dụng, nhưng nó tốt để bắt đầu. Dưới đây là ví dụ nhanh:
1. Chọn File → Examples → Firmata → StandardFirmata trong Arduino; nó sẽ mở
code Firmata mẫu cho phép gửi và nhận tin nhắn đến Arduino và nhận thông tin về
tất cả các chân.
2. Tải code đó lên Arduino giống như cách đã làm trong các ví dụ trước.
3. Cần code Python trên Pi để gửi lệnh tới Arduino để truy vấn hoặc thay đổi trạng
thái của nó. Cách dễ nhất là sử dụng mô-đun pyFirmata. Cài đặt nó bằng Pip (xem
“Easy”
Cài đặt mô-đun với Pip” trên trang 62):
sudo pip install pyfirmata
4. Bởi vì Firmata là một giao thức nối tiếp, giao tiếp với Arduino từ Python theo
cách tương tự như trong các ví dụ trước, nhưng sử dụng pyFirmata thay vì
pySerial. Sử dụng phương thức write () để tạo ra một chân kỹ thuật số high hoặc
low trên Arduino:
from pyfirmata import Arduino
from time import sleep
board = Arduino('/dev/ttyACM0')
while (1):
board.digital[13].write(1)
print("on")
sleep(1)
board.digital[13].write(0)
print("off")
sleep(1)
Code này sẽ nhấp nháy đèn LED trên board Arduino Uno được kết nối với chân
13. Mô-đun đầy đủ trên trang pyFirmata GitHub.

More Related Content

What's hot

Hướng dẫn sử dụng hệ điều hành Ubuntu
Hướng dẫn sử dụng hệ điều hành UbuntuHướng dẫn sử dụng hệ điều hành Ubuntu
Hướng dẫn sử dụng hệ điều hành UbuntuQuang Ngoc
 
Bat dau voi stm32 (demo)
Bat dau voi stm32 (demo)Bat dau voi stm32 (demo)
Bat dau voi stm32 (demo)Thien Ta
 
Cach su dung Ubuntu
Cach su dung UbuntuCach su dung Ubuntu
Cach su dung UbuntuKien Ma
 
Thiết kế hệ thống nhúng cho thiết bị nội soi nha khoa
Thiết kế hệ thống nhúng cho thiết bị nội soi nha khoaThiết kế hệ thống nhúng cho thiết bị nội soi nha khoa
Thiết kế hệ thống nhúng cho thiết bị nội soi nha khoahttps://www.facebook.com/garmentspace
 
[Demo] Begin STM32 vol-2
[Demo] Begin STM32 vol-2[Demo] Begin STM32 vol-2
[Demo] Begin STM32 vol-2Thien Ta
 
bao cao linux
bao cao linuxbao cao linux
bao cao linuxbinhnv186
 
E-book Wordpress
E-book WordpressE-book Wordpress
E-book WordpressHOSTVN
 
Tóm tắt lệnh Ubuntu
Tóm tắt lệnh UbuntuTóm tắt lệnh Ubuntu
Tóm tắt lệnh UbuntuQuang Ngoc
 
Kỹ thuật sử dụng bàn phím
Kỹ thuật sử dụng bàn phímKỹ thuật sử dụng bàn phím
Kỹ thuật sử dụng bàn phímMozzila Rosa
 
[Demo] Begin STM32 vol-1
[Demo] Begin STM32 vol-1[Demo] Begin STM32 vol-1
[Demo] Begin STM32 vol-1Thien Ta
 
Phân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuPhân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuLương Kiên
 
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 FithouSlideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 FithouTú Cao
 

What's hot (17)

Hướng dẫn sử dụng hệ điều hành Ubuntu
Hướng dẫn sử dụng hệ điều hành UbuntuHướng dẫn sử dụng hệ điều hành Ubuntu
Hướng dẫn sử dụng hệ điều hành Ubuntu
 
Bat dau voi stm32 (demo)
Bat dau voi stm32 (demo)Bat dau voi stm32 (demo)
Bat dau voi stm32 (demo)
 
Xoa mu linux
Xoa mu linuxXoa mu linux
Xoa mu linux
 
Cach su dung Ubuntu
Cach su dung UbuntuCach su dung Ubuntu
Cach su dung Ubuntu
 
Linux Introduction
Linux IntroductionLinux Introduction
Linux Introduction
 
Thiết kế hệ thống nhúng cho thiết bị nội soi nha khoa
Thiết kế hệ thống nhúng cho thiết bị nội soi nha khoaThiết kế hệ thống nhúng cho thiết bị nội soi nha khoa
Thiết kế hệ thống nhúng cho thiết bị nội soi nha khoa
 
[Demo] Begin STM32 vol-2
[Demo] Begin STM32 vol-2[Demo] Begin STM32 vol-2
[Demo] Begin STM32 vol-2
 
Tu hoc su dung linux
Tu hoc su dung linuxTu hoc su dung linux
Tu hoc su dung linux
 
bao cao linux
bao cao linuxbao cao linux
bao cao linux
 
E-book Wordpress
E-book WordpressE-book Wordpress
E-book Wordpress
 
Tóm tắt lệnh Ubuntu
Tóm tắt lệnh UbuntuTóm tắt lệnh Ubuntu
Tóm tắt lệnh Ubuntu
 
Kỹ thuật sử dụng bàn phím
Kỹ thuật sử dụng bàn phímKỹ thuật sử dụng bàn phím
Kỹ thuật sử dụng bàn phím
 
[Demo] Begin STM32 vol-1
[Demo] Begin STM32 vol-1[Demo] Begin STM32 vol-1
[Demo] Begin STM32 vol-1
 
Phân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên UbuntuPhân quyền trên file và thư mục trên Ubuntu
Phân quyền trên file và thư mục trên Ubuntu
 
Lập trình java
Lập trình javaLập trình java
Lập trình java
 
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 FithouSlideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
Slideshow - Tạo và quản lý người dùng, phân quyền trong ubuntu - 10b4 Fithou
 
Luận văn: Mạch phát hiện sự rò rỉ khí Gas sử dụng KIT, HOT
Luận văn: Mạch phát hiện sự rò rỉ khí Gas sử dụng KIT, HOTLuận văn: Mạch phát hiện sự rò rỉ khí Gas sử dụng KIT, HOT
Luận văn: Mạch phát hiện sự rò rỉ khí Gas sử dụng KIT, HOT
 

Similar to Bat dau voi Raspberry Pi (demo)

Bài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mởBài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mởMasterCode.vn
 
ĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdf
ĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdfĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdf
ĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdfMan_Ebook
 
Báo cáo hdh
Báo cáo hdhBáo cáo hdh
Báo cáo hdhhuyltrn
 
Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ
Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ
Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ Vu Hung Nguyen
 
Hướng dẫn cài đặt & sử dụng git, github
Hướng dẫn cài đặt & sử dụng git, githubHướng dẫn cài đặt & sử dụng git, github
Hướng dẫn cài đặt & sử dụng git, githubnukeviet
 
TRIỂN KHAI OPENVPN TRÊN UBUNTU SERVER
TRIỂN KHAI OPENVPN TRÊN UBUNTU SERVERTRIỂN KHAI OPENVPN TRÊN UBUNTU SERVER
TRIỂN KHAI OPENVPN TRÊN UBUNTU SERVERBảo Bối
 
Lệnh CMD_NewStar-LPI1.pdf
Lệnh CMD_NewStar-LPI1.pdfLệnh CMD_NewStar-LPI1.pdf
Lệnh CMD_NewStar-LPI1.pdfTruongVanTuyen3
 
tài liệu Mã nguồn mở Lap trình tren linux
tài liệu Mã nguồn mở  Lap trình tren linuxtài liệu Mã nguồn mở  Lap trình tren linux
tài liệu Mã nguồn mở Lap trình tren linuxThuyet Nguyen
 

Similar to Bat dau voi Raspberry Pi (demo) (20)

Bài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mởBài 2: Hệ điều hành và các ứng dụng mã nguồn mở
Bài 2: Hệ điều hành và các ứng dụng mã nguồn mở
 
ĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdf
ĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdfĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdf
ĐỒ ÁN MÔN HỌC HỆ THỐNG NHÚNG MẠNG KHÔNG DÂY - Contiki OSreport.pdf
 
Báo cáo hdh
Báo cáo hdhBáo cáo hdh
Báo cáo hdh
 
Linux+03
Linux+03Linux+03
Linux+03
 
1 linux
1 linux1 linux
1 linux
 
1 linux
1 linux1 linux
1 linux
 
Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ
Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ
Đỗ Văn Xê: Kinh nghiệm triển khai FOSS ở Đại học Cần Thơ
 
Hướng dẫn cài đặt & sử dụng git, github
Hướng dẫn cài đặt & sử dụng git, githubHướng dẫn cài đặt & sử dụng git, github
Hướng dẫn cài đặt & sử dụng git, github
 
Python
PythonPython
Python
 
Bai giangvb.net
Bai giangvb.netBai giangvb.net
Bai giangvb.net
 
Tìm hiêu về Raspberry Pi và ứng dụng làm Websever dùng giám sát và điều khiển...
Tìm hiêu về Raspberry Pi và ứng dụng làm Websever dùng giám sát và điều khiển...Tìm hiêu về Raspberry Pi và ứng dụng làm Websever dùng giám sát và điều khiển...
Tìm hiêu về Raspberry Pi và ứng dụng làm Websever dùng giám sát và điều khiển...
 
Tai lieu ve phan cung
Tai lieu ve phan cungTai lieu ve phan cung
Tai lieu ve phan cung
 
Tai lieu ve phan cung
Tai lieu ve phan cungTai lieu ve phan cung
Tai lieu ve phan cung
 
Chuong 1 tongquan
Chuong 1 tongquanChuong 1 tongquan
Chuong 1 tongquan
 
TRIỂN KHAI OPENVPN TRÊN UBUNTU SERVER
TRIỂN KHAI OPENVPN TRÊN UBUNTU SERVERTRIỂN KHAI OPENVPN TRÊN UBUNTU SERVER
TRIỂN KHAI OPENVPN TRÊN UBUNTU SERVER
 
Linux os family
Linux os familyLinux os family
Linux os family
 
Lệnh CMD_NewStar-LPI1.pdf
Lệnh CMD_NewStar-LPI1.pdfLệnh CMD_NewStar-LPI1.pdf
Lệnh CMD_NewStar-LPI1.pdf
 
TỰ HỌC LPI 1
TỰ HỌC LPI 1 TỰ HỌC LPI 1
TỰ HỌC LPI 1
 
Chuong 1 gt linux
Chuong 1  gt linuxChuong 1  gt linux
Chuong 1 gt linux
 
tài liệu Mã nguồn mở Lap trình tren linux
tài liệu Mã nguồn mở  Lap trình tren linuxtài liệu Mã nguồn mở  Lap trình tren linux
tài liệu Mã nguồn mở Lap trình tren linux
 

Bat dau voi Raspberry Pi (demo)

  • 1. UNGDUNGMAYTINH.COM Chương 3: Hệ điều hành khác và phiên bản Linux Hệ điều hành Stock Raspbian rất tuyệt vời cho máy tính với mục đích chung, nhưng đôi khi có thể điều chỉnh Pi cho mục đích cụ thể, như một trung tâm truyền thông độc lập hoặc bàn đạp hiệu ứng guitar. Hệ điều hành Linux phong phú phần mềm cho mọi ứng dụng có thể tưởng tượng được. Một số người đã dành thời gian để gói tất cả các phần mềm phù hợp với nhau để những người khác không phải làm điều đó. Chương này sẽ trình bành một vài phiên bản Linux chuyên biệt hơn và các hệ điều hành khác. Khi nói về "phiên bản Linux", thường nói về ba thứ: • Nhân Linux và trình điều khiển • Phần mềm được cài đặt sẵn cho một ứng dụng cụ thể • Các công cụ hoặc công cụ cấu hình đặc biệt được định cấu hình sẵn cho một nhiệm vụ cụ thể (ví dụ: để khởi động vào một chương trình cụ thể) Như đã thấy trong Chương 1, về cơ bản có bốn phiên bản có mục đích chung phổ biến. Sẽ tìm thấy ba điều sau đây trong trình cài đặt NOOBS: Raspbian Phiên bản được đề nghị từ nhà sản xuất; dựa trên Debian. Nếu không chắc chắn nên chọn phiên bản nào, đây là phiên bản thích hợp. Arch Linux Arch Linux đặc biệt nhắm vào các máy tính dựa trên ARM, vì vậy nó hỗ trợ Pi từ rất sớm. Pidora Pidora là phiên bản Fedora cho Pi. Ubuntu MATE Ubuntu MATE là một phiên bản rất phổ biến của Linux. Nó có màn hình máy tính để bàn mỏng hơn hoạt động khá tốt trên Raspberry Pi 2 và Raspberry Pi 3. Nó sẽ
  • 2. không hoạt động trên các phiên bản trước của Raspberry Pi vì Ubuntu chỉ hỗ trợ ARMv7 trở lên. Dưới đây là một vài phiên bản và hệ điều hành Linux chuyên dụng thú vị khác. Phiên bản cho phòng nhạc (home theater) Một hệ điều hành được sử dụng một thời gian dài cho phòng hát là XBMC, bắt đầu như một dự án trung tâm truyền thông để chạy trên bảng điều khiển trò chơi Xbox. Tuy nhiên, trong những năm qua, XBMC đã trở thành một nền tảng giải trí tổng hợp hơn và hoạt động rất tốt trên Pi. Vào mùa hè năm 2014, Quỹ XBMC đã đổi tên phần mềm thành Kodi để đưa nó vào các dự án. Có một vài phên bản Pi giúp dễ dàng đưa Kodi vào trang chủ: OSMC Trước đây gọi là Raspbmc, phiên bản OSMC dựa trên Debian và Kodi. Nó có hỗ trợ tuyệt vời cho Raspberry Pi và có thể được cài đặt từ NOOBS. (Hình 3-1). Hình 3-1. Giao diện của OSMC. OpenELEC Trung tâm giải trí Open Embedded Linux là một phiên bản được cải tiến của Kodi có thể thu hút nhiều người dùng hơn (Hình 3-2).
  • 3. UNGDUNGMAYTINH.COM Hình 3-2. Menu chính cho The Open Embedded Linux Entertainment Center (OpenELEC) Phiên bản cho âm nhạc Nó rẻ và phù hợp với hộp đựng hiệu ứng guitar, nên thế giới âm nhạc điện tử đã có bước phát triển mới từ khi Pi phát hành phiên bản này. Dưới đây là một số ví dụ: Vệ tinh CCRMA Sự phân phối này từ Trung tâm Nghiên cứu Máy tính Âm nhạc và Âm học của Stanford (CCRMA) với mục tiêu hướng tới các nhạc cụ và các bản cài đặt nghệ thuật được nhúng, cũng như các âm nền hiệu ứng. Nó có thể chạy các phần mềm khác, nhưng cốt lõi là Pure Data Extended, Faust, JackTrip, và ChucK. Lý do cơ bản được mô tả trong bài báo “Vệ tinh CCRMA: Một tương tác âm nhạc và nền tảng tổng hợp âm thanh” của Edgar Berdahl và Wendy Ju. Volumio Một máy nghe nhạc cho audiophiles. Dự án này phát triển từ RaspyFi. Ngoài ra trong thế giới âm nhạc, còn có nền tảng âm nhạc mô-đun SunVox của Pi. Retrocomputing và Retrogaming
  • 4. Pi được lấy cảm hứng từ những chiếc máy tính cá nhân rẻ tiền của những năm 1980, do đó có một số phiên bản để hòi niệm retrocomputing hoặc chơi game: Hệ điều hành RISC Khởi động thẳng vào BASIC! Retropie Hình ảnh thẻ SD và board phần cứng GPIO giúp việc xây dựng bảng điều khiển retrogaming dễ dàng hơn. PiPlay Bản dựng sẵn để chơi trò chơi và mô phỏng dựa trên MAME (trước đây là PiMAME). [Nó không phải là một hệ điều hành, nhưng nếu đang sử dụng các văn bản retro, hãy thử Frotz: sudo apt-get install frotz] Internet of Things Internet of Things hoặc IoT là thiết bị được kết nối với Internet. Đây có thể là bộ điều nhiệt, chuông cửa, … có thể được truy cập từ xa qua Web hoặc trong ứng dụng dành cho thiết bị di động. Các lĩnh vực của IoT không chỉ sử dụng trong gia đình. Các công ty lớn đặt thiết bị của họ trực tuyến để theo dõi tài sản, có thể theo giỏi ở khắp nơi trên thế giới. Do kết nối và chi phí thấp của Raspberry Pi, nó là lựa chọn tuyệt vời cho thử nghiệm với Internet of Things. Trong khi có thể sử dụng Raspbian cho điều này (xem “Kết nối Web với thế giới thực” trên trang 163), đây là một vài hệ điều hành được hướng tới IoT. Snappy Ubuntu Core Có sẵn cho Raspberry Pi 2, Snappy Ubuntu Core là một phiên bản của Linux nhằm vào các thiết bị và máy chủ đám mây. Đó là một hệ điều hành cơ bản, bao gồm các phương pháp cụ thể về phiên bản ứng dụng nào được cài đặt để hỗ trợ dự án. Nó nhỏ gọn, nhanh hơn, đáng tin cậy hơn và an toàn hơn. Mặc dù nó rất mới và chưa được hỗ trợ đầy đủ nhưng nó đáng để quan tâm. Windows 10 IoT Core Với việc phát hành Windows 10 vào tháng 7 năm 2015, Microsoft đã quan tâm về IoT với việc phát hành Windows 10 IoT Core. Mặc dù không có màn hình máy tính để bàn Windows đầy đủ, các nhà phát triển hiện có thể triển khai các ứng dụng
  • 5. UNGDUNGMAYTINH.COM Windows phổ biến cho Raspberry Pi 2. Nếu đã có kinh nghiệm phát triển các ứng dụng Windows, hãy thử Windows 10 IoT Core trên Raspberry Pi 2. Nếu đã quen với việc bắt đầu, Microsoft cung cấp tài liệu làm quen ( hướng dẫn) tuyệt vời. Các phiên bản hữu ích khác Dưới đây là một vài phiên bản khác có thể tham khảo: Qt trên Pi Một gói hệ điều hành nhằm vào các nhà phát triển "thiết bị chuyên dụng" độc lập bằng cách sử dụng GUI Qt framework. Web kiosk Để tạo Internet kiosk và biển báo kỹ thuật số. Openwrt Biến Pi thành một bộ định tuyến mạnh mẽ với nền tảng bộ định tuyến nguồn mở. OctoPrint Với OctoPrint, có thể điều khiển máy in 3D qua mạng. Chỉ cần kết nối nó với một Raspberry Pi và khởi động từ hình ảnh thẻ SD OctoPi. PiNet PiNet là một cách để giáo viên quản lý lớp học bằng Raspberry Pi. Đó là một phương pháp để khởi động Pi từ một máy chủ trung tâm trên mạng. Tài khoản sinh viên được lưu trữ trên máy chủ và có sẵn các công cụ dành riêng cho lớp học.
  • 6.
  • 7. UNGDUNGMAYTINH.COM Chương 4: Python trên Pi Python là một ngôn ngữ lập trình tuyệt vời, rõ ràng và dễ dàng để bắt đầu và chạy. Quan trọng hơn, có rất nhiều người dùng quan tâm. Guido van Rossum đã tạo ra Python rất sớm và sử dụng nó như một ngôn ngữ đầu tiên cho máy tính. Năm 1999, van Ros- sum đã cùng ông đưa ra một đề xuất được gọi rộng rãi là “Computer Pro- gramming for Everybody”, đưa ra một tầm nhìn cho một chương trình đầy tham vọng để dạy lập trình sử dụng Python ở các trường tiểu học và trung học. Hơn một thập kỷ sau, điều đó được tiến hành với sự xuất hiện của Raspberry Pi. Python là một ngôn ngữ thông dịch, có nghĩa là có thể viết một chương trình hoặc tập lệnh và thực thi nó trực tiếp thay vì biên dịch nó thành mã máy. Các ngôn ngữ được phiên dịch nhanh hơn một chút so với chương trình và có một số lợi ích phụ. Ví dụ: bằng Python, không phải phiên dịch cho máy tính hiểu biến có phải là số, danh sách hay chuỗi không; chỉ cần nhập các kiểu dữ liệu khi thực thi tập lệnh. Trình thông dịch Python có thể được chạy theo hai cách: là một trình tương tác để thực thi các lệnh riêng lẻ, hoặc như một chương trình dòng lệnh để thực thi các tập lệnh độc lập. Môi trường phát triển tích hợp (IDE) đi kèm với Python và Raspberry Pi được gọi là IDLE. Phiên bản Python Conundrum Lý do có hai phiên bản IDLE là có hai phiên bản Python được cài đặt trên Pi. Đây là thực tế phổ biến (mặc dù có một chút khó hiểu). Theo phiên bản này, Python 3 là mới nhất, nhưng thay đổi được thực hiện cho ngôn ngữ giữa các phiên bản 2 và 3 làm cho các phiên bản sau này không tương thích ngược. Mặc dù Python 3 đã tồn tại trong nhiều năm nhưng phải mất một thời gian để nó được chấp nhận rộng rãi, và rất nhiều gói do người dùng đóng góp chưa được nâng cấp lên Python 3. Nó thậm chí còn khó hiểu hơn khi tìm kiếm tài liệu Python; cần đảm bảo đang tìm kiếm đúng phiên bản! Phiên bản Python mặc định trên Pi là 2,7. Có thể chạy một Python 3 với: python3 Các ví dụ trong cuốn sách này sẽ hoạt động với Python 2.7 hoặc 3.X, trừ khi có ghi chú khác.
  • 8. Xin chào, Python Cách tốt nhất để bắt đầu học Python là bắt đầu ngay lập tức. Mặc dù có thể sử dụng bất kỳ trình soạn thảo văn bản nào để bắt đầu lập trình, trong cuốn sách này sẽ bắt đầu sử dụng IDE. Mở ứng dụng IDLE 3. Để chạy IDLE, nhấp vào menu trên màn hình ở phía dưới bên trái và chọn Pro- gramming → Python (IDLE 3). Khi IDLE mở ra, một cửa sổ có trình tương tác sẽ xuất hiện. Ba dấu lớn (>>>) là dấu nhắc tương tác; khi thấy lời nhắc, điều đó có nghĩa là chương trình đã sẵn sàng, gõ như sau: >>> print("Saluton Mondo!") Nhấn Enter hoặc Return. Python thực hiện câu lệnh đó và cho kết quả trong cửa sổ trình tương tác. Bạn có thể sử dụng trình tương tác như một loại máy tính để kiểm tra các câu lệnh hoặc tính toán: >>> 3+4+5 Hãy suy nghĩ về các câu lệnh được thực thi trong trình tương tác như một chương trình đang chạy một dòng tại một thời điểm. Có thể thiết lập biến hoặc nhập mô- đun: >>> import math >>> (1 + math.sqrt(5)) / 2 Lệnh nhập vào kích hoạt tất cả các chức năng toán học của Python có sẵn cho chương trình (tìm hiểu thêm về các mô-đun trong “Đối tượng và Mô-đun” trên trang 57). Để thiết lập một biến, sử dụng toán tử gán (=): >>> import math >>> radius = 20 >>> radius * 2 * math.pi 1256.6370614359173 Nếu muốn xóa tất cả các biến và bắt đầu ở trạng thái mới, chọn Shell → Restart Shell để bắt đầu lại. Cũng có thể sử dụng trình tương tác để nhận thông tin về cách sử dụng một chương trình con cụ thể, mô-đun hoặc các chủ đề Python khác với sự trợ giúp (): help("print") Để có danh sách tất cả các chủ đề có sẵn, hãy thử: help("topics") help("keywords")
  • 9. UNGDUNGMAYTINH.COM help("modules") Trình biên dịch Python rất tốt cho các lệnh kiểm thử hoặc các phép toán đơn giản, khi muốn chạy chương trình Python như một ứng dụng độc lập. Để bắt đầu một chương trình Python mới, chọn File → New Window, và IDLE sẽ xuất hiện một cửa sổ soạn thảo chương trình (xem Hình 4-1). Hãy thử gõ một dòng code và chọn Run → Run Module. Sẽ nhận được cảnh báo rằng "Source Must Be Saved OK To Save?". Lưu tập lệnh trong thư mục chính dưới dạng SalutonMondo.py và nó sẽ được thực hiện trong trình tương tác. Hình 4-1. Trình tương tác IDLE (bên trái) và cửa sổ trình soạn thảo (bên phải) Nếu không muốn sử dụng môi trường IDLE, để chạy một chương trình từ dòng lệnh, hãy mở Terminal và gõ: python SalutonMondo.py Thêm một chút về Python Nếu học Python từ thế giới Arduino thì có lẽ đã quen với việc viết các chương trình (được gọi là bản phác thảo trong Arduino, nhưng thường được gọi là các chương trình trong Python) theo định dạng thiết lập / vòng lặp, trong đó setup() là một hàm chạy một lần và loop () là một hàm thực thi lặp đi lặp lại. Ví dụ sau đây cho thấy làm thế nào để làm điều này trong Python. Chọn Cửa sổ mới từ trình tương tác trong IDLE 3 và nhập như sau:
  • 10. # Setup n = 0 # Loop while True: n = n + 1 # The % is the modulo operator if ((n % 2) == 0): print(n) Chọn Run Module và đặt tên cho tập lệnh (chẳng hạn như Count- Evens.py). Khi nó chạy, tất cả các số nguyên được in (nhấn Ctrl-C để tạm ngừng đầu ra, bởi vì nó sẽ chạy mãi mãi). Cũng có thể thực hiện điều này bằng cách sử dụng vòng lặp for mà chỉ đếm 100 số nguyên đầu tiên: for n in range(0, 100): if ((n % 2) == 0): print(n) [Trong ví dụ trên, mỗi hàm con thụt lề là bốn dấu cách, không phải là một tab (nhưng có thể nhấn Tab trong IDLE và nó sẽ chèn thêm không gian). Thụt lề có ý nghĩa cấu trúc trong Python. Đây là một trong những trở ngại lớn cho người mới bắt đầu, hoặc khi sao chép và dán mã. Tuy nhiên, việc sử dụng không gian trắng bắt buộc làm cho Python trở thành một ngôn ngữ khá dễ đọc. Xem Nguyên tắc về cấu trúc trình bày Python để biết các mẹo viết code.] Python là một ngôn ngữ có cấu trúc cao, sử dụng khoảng trắng để xác định cấu trúc. Trong ví dụ tiếp theo, các hàm con sẽ được thụt vào một mức dưới hàm loop() và được coi là một phần của hàm đó. Sự kết thúc của một vòng lặp được xác định bởi vị trí thụt lề (hoặc kết thúc của tập lệnh). Điều này khác với các ngôn ngữ như C phân biệt các hàm trong code bằng dấu ngoặc hoặc các cách đánh dấu khác. Sử dụng các hàm để đặt đoạn code vào một đoạn code có thể được gọi từ các vị trí khác trong tập lệnh. Để viết lại ví dụ trước với các hàm, hãy làm như sau (khi chạy nó, lưu nó dưới dạng CountEvens.py): # Declare global variables n = 0 # Setup function def setup(): global n n = 100 def loop():
  • 11. UNGDUNGMAYTINH.COM global n n = n + 1 if ((n % 2) == 0): print(n) # Main setup() while True: loop() Trong ví dụ này, đầu ra sẽ là các số chẵn từ 102 trở đi. Đây là cách nó hoạt động: • Đầu tiên, biến n được định nghĩa là một biến chính có thể được sử dụng trong bất kỳ đoạn code nào trong chương trình lệnh. • Ở đây, hàm setup () được định nghĩa (nhưng chưa được chạy). • Tương tự, đây là định nghĩa của hàm loop (). • Trong code chính, setup () được gọi một lần, sau đó đến loop (). Việc sử dụng từ khóa chính trong dòng đầu tiên của mỗi hàm là quan trọng; nó thông báo cho trình biên dịch sử dụng biến chính n thay vì tạo một biến thứ hai (cục bộ, hoặc riêng cho hàm đó) n chỉ có thể sử dụng trong hàm. Hướng dẫn này quá ngắn để trở thành một chương trình Python đầy đủ. Để thực sự tìm hiểu ngôn ngữ, có thể bắt đầu với Learn Python the Hard Way, Think Python, hoặc Python Pocket Reference. Phần còn lại của chương này sẽ cung cấp dây đủ ngữ cảnh để lập trình và chạy với các ví dụ và chỉ ra các tính năng cơ bản và các mô-đun có sẵn. Dòng lệnh trong IDLE Đầu ra của IDLE rất chậm khi chạy code ví dụ để in ra trình tương tác. Để biết nó chậm như thế nào, hãy giữ IDLE mở và mở một cửa sổ mới bên cạnh. Trong IDLE, chạy chương trình CountEvens bằng cách sử dụng Run Module; nó sẽ khởi đầu. Sau đó gõ lệnh sau tại dấu nhắc dòng lệnh của terminal: python CountEvens.py Khá khó khăn từ việc sử dụng IDE trên các thiết bị khá hạn chế của Pi. Các ví dụ sau trong cuốn sách sẽ được thực hiện từ dòng lệnh, nhưng IDLE vẫn có thể được sử dụng như một trình soạn thảo. Đối tượng và mô-đun Có thể hiểu cú pháp cơ bản của việc xử lý các đối tượng và các mô-đun thông qua các ví dụ trong cuốn sách này. Python là một ngôn ngữ rõ ràng, chỉ với 34 từ khóa
  • 12. dành riêng (xem Bảng 4-1). Những từ khóa này là phần cốt lõi của ngôn ngữ cho phép cấu trúc và kiểm soát hoạt động trong tập lệnh. Khá nhiều thứ không phải là một từ khóa có thể được coi là một đối tượng. Đối tượng là kết hợp dữ liệu và hành vi có tên. Có thể thay đổi dữ liệu của một đối tượng, lấy thông tin từ nó, và thậm chí thao tác với các đối tượng khác. Bảng 4-1. Python chỉ có 34 từ khóa dành riêng Điều kiện Loop Chức năng tích hợp sẵn Hàm Classes, mô-đun Xử lý lỗi if for print class try else in pass def def elif while del global finally not break break raise or as nonlocal assert and continue yield with is import True return False from None Trong Python, chuỗi, danh sách, hàm, mô-đun và số chẵn là các đối tượng. Một đối tượng Python có thể được coi như một tập hợp các thuộc tính và hệ thống. Có quyền truy cập vào các thuộc tính và hệ thống này bằng cách sử dụng cú pháp dấu chấm đơn giản. Ví dụ, gõ lệnh này tại dấu nhắc trình tương tác để thiết lập một đối tượng chuỗi và gọi hệ thống cho phép nó viết hoa chính nó: >>> myString = "quux" >>> myString.capitalize() 'Quux' Hoặc sử dụng reverse () để sắp xếp lại một danh sách theo thứ tự ngược lại: >>> myList = ['a', 'man', 'a', 'plan', 'a', 'canal'] >>> myList.reverse() >>> print(myList) ['canal', 'a', 'plan', 'a', 'man', 'a']
  • 13. UNGDUNGMAYTINH.COM [Cả chuỗi và danh sách đều được xây dựng trong các mô-đun của thư viện standard, có sẵn từ bất kỳ chương trình Python nào. Trong mỗi trường hợp, chuỗi và danh sách mô-đun đã xác định một loạt các chức năng để xử lý các chuỗi và danh sách, bao gồm capitalize() và reverse().] Một số mô-đun thư viện chuẩn không được tích hợp sẵn và cần phải nói rõ rằng sẽ sử dụng chúng với lệnh nhập. Để sử dụng mô đun thời gian từ thư viện chuẩn để truy cập vào các hàm hữu ích để xử lý thời gian và thông tin thời gian, hãy sử dụng: import time Cũng có thể nhập để đổi tên mô-đun trong chương trình: import time as myTime Hoặc nhập để tải các chức năng lựa chọn từ một mô-đun: from time import clock Dưới đây là một ví dụ ngắn về một chương trình Python sử dụng các mô-đun thời gian và datetime (ngày giờ) từ thư viện chuẩn để in thời gian hiện tại một lần mỗi giây: from datetime import datetime from time import sleep while True: now = str(datetime.now()) print(now) sleep(1) Hàm sleep dừng việc thực hiện chương trình trong một giây. Điều sẽ nhận thấy sau khi chạy code này là thời gian sẽ chênh lệch một chút. Đó là vì hai lý do: • Code không tính đến lượng thời gian cần để tính toán thời gian hiện tại. • Các quy trình khác đang chi phối CPU và có thể mất các khoảng thời gian nhỏ nhất định để thực hiện chương trình. Đây là điều quan trọng cần nhớ: khi lập trình trên Raspberry Pi, không thực hiện trên màn hình thời gian thực. Nếu đang sử dụng hàm sleep(), nó chính xác đến hơn 5ms trên Pi.
  • 14. Tiếp theo, hãy sửa ví dụ để mở một tệp văn bản và ghi lại một số dữ liệu vào nó một cách định kỳ. Mọi thứ đều là chuỗi khi xử lý các tệp văn bản. Sử dụng hàm str () để chuyển đổi các số thành chuỗi (và int () để thay đổi về một số nguyên): from datetime import datetime from time import sleep import random log = open("log.txt", "w") for i in range(5): now = str(datetime.now()) # Generate some random data in the range 0-1024 data = random.randint(0, 1024) log.write(now + " " + str(data) + "n") print(".") sleep(.9) log.flush() log.close() [Trong một ứng dụng ghi dữ liệu thực, cần có ngày và giờ chính xác được thiết lập trên Raspberry Pi, như được mô tả trong phần "Đặt ngày và giờ" trên trang 41.] Đây là một ví dụ khác (ReadFile.py) mà đọc trong một tên tập tin như một đối số từ dòng lệnh (chạy nó từ trình tương tác với python3 có tên tệp ReadFile.py). Chương trình mở tệp, đọc từng dòng dưới dạng một chuỗi và in nó. Lưu ý rằng print () hoạt động giống như println () thực hiện bằng các ngôn ngữ khác, nó thêm một dòng mới vào chuỗi được in. Đối số kết thúc với print () ngăn chặn dòng mới: # Open and read a file from command-line argument import sys if (len(sys.argv) != 2): print("Usage: python ReadFile.py filename") sys.exit() scriptname = sys.argv[0] filename = sys.argv[1] file = open(filename, "r") lines = file.readlines() file.close() for line in lines: print(line, end = '') Nhiều mô-đun khác
  • 15. UNGDUNGMAYTINH.COM Một trong những lý do Python rất phổ biến là có một số lượng lớn các mô-đun do người dùng đóng góp xây dựng trên thư viện chuẩn. Python Package Index (PyPI) là danh sách trình bày (hoặc các mô-đun) chính xác. Sử dụng một số mô-đun này, đặc biệt là mô đun GPIO để truy cập vào các đầu vào và đầu ra chung của Raspberry Pi. Để sử dụng một trong số các trình bày trên, cần tải xuống code, định cấu hình và cài đặt nó. Mô-đun NumPy, ví dụ, có thể được cài đặt như sau: sudo apt-get install python-numpy Nếu một trình bày đã được tổng hợp bởi người tạo ra nó bằng cách sử dụng phương pháp chuẩn để tổng hợp các mô-đun (với công cụ biên dịch của Python), tất cả những gì cần làm là tải tệp, giải nén nó và nhập: python setup.py install Dễ dàng cài đặt mô-đun với Pip Nhiều module có thể được cài đặt với apt-get. Cũng có thể xem xét trình cài đặt Pip, một công cụ giúp việc cài đặt các tệp từ PyPI trở nên dễ dàng. Cài đặt Pip bằng apt-get: sudo apt-get install python-pip Sau đó, có thể cài đặt hầu hết các mô-đun bằng cách sử dụng Pip để quản lý tải xuống và phụ thuộc. Ví dụ: pip install flask Trong các chương sau, sử dụng các mô-đun cụ thể cho ứng dụng một cách rộng rãi, nhưng đây là một ví dụ cho thấy mức độ mạnh mẽ của một số mô-đun. Mô-đun Feedparser là một trình phân tích cú pháp tổng quát cho phép lấy các nguồn cấp dữ liệu RSS hoặc Atom và dễ dàng truy cập vào nội dung. Bởi vì hầu hết các nguồn thông tin trên Web đều có đầu ra RSS hoặc Atom, Feedparser là một trong nhiều cách để đưa Raspberry Pi kết nối với Internet of Things. Trước tiên, cài đặt mô-đun Feedparser bằng Pip (xem “Mô-đun dễ dàng Cài đặt với Pip” trên trang 62): sudo pip install feedparser Để sử dụng nó, chỉ cần cung cấp chức năng phân tích cú pháp URL của nguồn cấp dữ liệu RSS. Feedparser sẽ tìm nạp XML của nguồn cấp dữ liệu, phân tích cú pháp và chuyển nó thành cấu trúc dữ liệu danh sách đặc biệt được gọi là từ điển. Từ điển Python là danh sách các khóa / giá trị, đôi khi được gọi là mảng nhỏ hoặc mảng kết
  • 16. hợp. Nguồn cấp dữ liệu được phân tích cú pháp là từ điển và các mục được phân tích cú pháp trong nguồn cấp dữ liệu cũng là từ điển, như được minh họa trong ví dụ này, lấy thời tiết hiện tại ở Providence, RI, từ http://weather.gov: import feedparser feed_url = "http://w1.weather.gov/xml/current_obs/KPVD.rss" feed = feedparser.parse(feed_url) RSSitems = feed["items"] for item in RSSitems: weather = item["title"] print weather Khởi chạy các chương trình khác từ Python Python dễ dàng kích hoạt các chương trình khác trên Pi với mô-đun sys.subprocess. Hãy thử những điều sau đây: from datetime import datetime from time import sleep import subprocess for count in range(0, 60): filename = str(datetime.now()) + ".jpg" subprocess.call(["fswebcam", filename]) sleep(60) Đây là một tập lệnh thời gian đơn giản sẽ chụp ảnh từ webcam một lần một phút trong một giờ. Máy ảnh được trình bày chi tiết hơn trong Chương 9, nhưng chương trình này sẽ hoạt động với máy ảnh USB được kết nối và chương trình fswebcam được cài đặt; chạy lệnh này trước để cài đặt nó: sudo apt-get install fswebcam Hàm subprocess.call nhận danh sách các chuỗi, kết hợp chúng lại với nhau (với dấu cách) và thực thi chương trình được chỉ định. Nếu nó là một chương trình hợp lệ, thì Rasp- berry Pi sẽ sinh ra một quá trình riêng biệt cho nó, nó sẽ chạy cùng với chương trình Python. Lệnh trong ví dụ trước giống như khi gõ câu lệnh sau tại dấu nhắc termial: fswebcam 20160812.jpg Để thêm các tham số khác vào hàm gọi chương trình, chỉ cần thêm các chuỗi vào danh sách trong hàm subprocess.call: subprocess.call(["fswebcam", "-r", "1280x720", filename])
  • 17. UNGDUNGMAYTINH.COM Điều này sẽ gửi chương trình fswebcam một tham số để thay đổi độ phân giải của hình ảnh được chụp. Chạy một tập lệnh Python Tự động khởi động Bởi vì Pi có thể hoạt động như một thiết bị độc lập, một câu hỏi phổ biến là làm thế nào để khởi chạy một chương trình Python tự động khi Pi khởi động. Câu trả lời là thêm một mục vào tệp / etc / rc.local, để sử dụng cho chính xác điều này trong Linux. Chỉ cần chỉnh sửa tệp: sudo nano /etc/rc.local và thêm một lệnh để thực thi chương trình giữa section và exit 0: python /home/pi/foo.py& Ký hiệu ở cuối sẽ chạy chương trình như một quá trình nền, nó sẽ cho phép tất cả các dịch vụ khác của Pi bắt đầu khởi động. Khắc phục sự cố Chắc chắn, sẽ gặp rắc rối khi viết code, sẽ cần theo dõi và sửa lỗi. Chế độ tương tác IDLE có thể giúp tìm lỗi; trình Debug cung cấp một số công cụ giúp biết code đang hoạt động như thế nào. Có thể tùy chọn xem tất cả các biến và kiểm tra qua từng dòng thực hiện. Lỗi cú pháp là lỗi dễ giải quyết nhất; thường thì đây chỉ là lỗi đánh máy hoặc lỗi chính tả của ngôn ngữ. Lỗi ngữ nghĩa – lỗi chương trình được hình thành tốt nhưng không hoạt động như mong đợi có thể khó sửa hơn. Đó là nơi trình gỡ lỗi có thể giúp giải quyết một lỗi phức tạp. Việc gỡ lỗi hiệu quả mất nhiều năm để tìm hiểu, nhưng đây là một bảng điều khiển nhanh để kiểm tra khi lập trình Pi trong Python: • Sử dụng print () để hiển thị khi chương trình đến một điểm cụ thể. • Sử dụng print () để hiển thị các giá trị của các biến khi chương trình thực thi. • Kiểm tra lại khoảng trắng để đảm bảo các hàm được xác định. • Khi gỡ lỗi cú pháp, hãy nhớ rằng lỗi thực tế đã được chỉ ra trước khi trình biên dịch báo cáo lỗi đó. • Kiểm tra kỹ tất cả các biến chính và cục bộ. • Kiểm tra các dấu ngoặc đơn phù hợp.
  • 18. • Hãy chắc chắn rằng thứ tự của các hoạt động là chính xác trong tính toán; chèn dấu ngoặc đơn nếu không chắc chắn. Ví dụ: 3 + 4 *2 và (3 + 4) * 2 cho kết quả khác nhau.
  • 19. UNGDUNGMAYTINH.COM Chương 5: Arduino và Pi Như sẽ thấy trong một vài chương tiếp theo, có thể sử dụng các chân GPIO trên Raspberry Pi để kết nối với các cảm biến hoặc những thứ như đèn LED nhấp nháy và động cơ. Và nếu có kinh nghiệm sử dụng nền tảng phát triển vi điều khiển Arduino, cũng có thể sử dụng nó cùng với Raspberry Pi. Khi Raspberry Pi lần đầu tiên được công bố, rất nhiều người hỏi đó có phải là đối thủ của Arduino không. Đối với cùng một mức giá, Pi cung cấp nhiều tính năng xử lý hơn: tại sao sử dụng Arduino khi đã có một Pi? Vì có hai nền tảng bổ trợ nhau, và Raspberry Pi có thể làm máy chủ lưu trữ tuyệt vời cho Arduino. Có khá nhiều dự án kết hợp Arduino và Pi lại với nhau: • Để sử dụng số lượng lớn các thư viện và các ví dụ có thể chia sẻ cho Arduino. • Để bổ sung một dự án Arduino với tính năng xử lý nhiều hơn. Ví dụ, có một bộ điều khiển MIDI đã được nối với một bộ tổng hợp, nhưng bây giờ cần nâng cấp để tổng hợp âm thanh trực tiếp trên Pi. • Khi đang xử lý nguồn 5V. Pi hoạt động với nguồn 3.3V, và nó không thể hoạt động ở 5V. Arduino có thể hoạt động như một “bộ chuyển đổi” giữa hai nguồn. • Khi làm thí nghiệm có thể làm cho một số lỗi gây tổn hại cho chip. Ví dụ: sinh viên cố gắng điều khiển động cơ trực tiếp từ các chân trên Arduino (đừng thử); nó rất dễ dàng làm cho chip vi điều khiển bị hư. Với Paspberry Pi thì sẽ không bị như vậy. • Khi gặp sự cố yêu cầu điều khiển chính xác trong thời gian thực, chẳng hạn như bộ điều khiển cho máy in 3D. Như trong Chương 4, Raspbian không phải là một hệ điều hành thời gian thực, và các chương trình không nhất thiết phải phụ thuộc vào cùng một "chỉ thị cho mỗi chu kỳ đồng hồ" của một vi điều khiển. Các ví dụ trong phần này giả định rằng đã biết những điều cơ bản về Arduino và phần mềm phát triển tích hợp (IDE).
  • 20. Hình 5-1. Arduino và Raspberry Pi là BFF Cài đặt Arduino trong Raspbian Để lập trình một board phát triển Arduino, cần kết nối nó với một máy tính bằng cáp USB, sau đó biên dịch và flash một chương trình lên board bằng cách sử dụng Arduino IDE. Có thể làm điều này với bất kỳ máy tính nào, hoặc có thể sử dụng Raspberry Pi làm máy chủ để lập trình Arduino. Sử dụng Raspberry Pi để lập trình Arduino sẽ nhanh hơn để gỡ lỗi, nhưng việc biên dịch sẽ chậm hơn một chút so với máy tính xách tay hoặc máy tính để bàn hiện đại. Việc biên dịch sẽ mất ít thời gian hơn sau lần biên dịch đầu tiên, vì Arduino chỉ biên dịch code đã thay đổi kể từ lần biên dịch cuối cùng. Để cài đặt Arduino IDE trên Raspberry Pi, hãy nhập như sau vào terminal: sudo apt-get update sudo apt-get install arduino • Đảm bảo có phiên bản phần mềm mới nhất • Sau đó tải nó xuống.
  • 21. UNGDUNGMAYTINH.COM Nó sẽ cài đặt Java cộng với nhiều phần mềm kèm theo khác. Phần mềm Arduino sẽ xuất hiện dưới phần Electronics của menu chương trình (không khởi chạy nó). Chỉ có thể cắm Arduino vào một trong các cổng USB mở. Kết nối USB sẽ cung cấp đủ nguồn cho Arduino, nhưng có thể cấp nguồn cho Arduino riêng, tùy thuộc vào ứng dụng (ví dụ: nếu đang chạy động cơ hoặc bộ gia nhiệt). [Lưu ý rằng cần phải cắm cáp USB Arduino vào sau khi Raspberry Pi khởi động. Nếu cắm vào lúc khởi động, Raspberry Pi có thể treo vì nó cố gắng tìm ra tất cả các thiết bị trên bus USB] Khi khởi chạy Arduino IDE, nó sẽ tìm tất cả các thiết bị USB và liệt kê một danh sách được hiển thị trong menu Tools → Serial Port. Nhấp vào Tools→Serial và chọn cổng nối tiếp (như / dev / ttyACM0), sau đó nhấp vào Tools → Board và chọn loại Arduino Board (ví dụ: Uno). Nhấp vào File→Exam- ples→01.Basics→Blink để tải code mẫu cơ bản. Nhấp vào nút Upload trên thanh công cụ hoặc chọn File → Upload để tải lên code và sau khi nạp code, đèn LED trên board Arduino sẽ bắt đầu nhấp nháy. Tìm Serial Port Nếu vì một lý do nào đó, / dev / ttyACM0 không hoạt động, cần thực hiện một công việc nhỏ. Để tìm cổng nối tiếp USB mà Arduino được cắm vào mà không cần tìm trong menu, hãy thử làm quen với dòng lệnh. Nếu không thấy Arduino kết nối, hãy gõ: ls /dev/tty* Cắm Arduino, sau đó thử lại lệnh tương tự và xem điều gì đã thay đổi. Trên Raspberry Pi, lúc đầu có / dev / ttyAMA0 được liệt kê (đây là hub USB trên board). Khi cắm vào Arduino, / dev / ttyACM0 xuất hiện trong danh sách. Cải thiện trải nghiệm người dùng Trong khi đang thiết lập, có thể nhận thấy rằng chất lượng của phông chữ mặc định trong trình chỉnh sửa Arduino là phông mặc định. Có thể thay đổi nó bằng cách tải xuống phông chữ nguồn mở Inconsolata. Để cài đặt (khi Arduino IDE đóng), hãy nhập: sudo apt-get install fonts-inconsolata Sau đó chỉnh sửa tệp tùy chọn Arduino: nano ~/.arduino/preferences.txt
  • 22. và thay đổi các dòng sau thành: editor.font=Inconsolata,medium,14 editor.antialias=true Khi khởi động lại Arduino, trình soạn thảo sẽ sử dụng phông chữ mới. Giao tiếp trong Serial Để giao tiếp giữa Raspberry Pi và Arduino qua kết nối nối tiếp, sử dụng thư viện nối tiếp được tích hợp sẵn trong Arduino và mô-đun pySerial Python ở bên Rasp Pi. Nó được cài đặt sẵn trên Jessie, nhưng nếu cần cài đặt nó, tệp là: sudo apt-get install python-serial python3-serial Mở IDE Arduino và tải code này lên Arduino: void setup() { Serial.begin(9600); } void loop() { for (byte n = 0; n < 255; n++) { Serial.write(n); delay(50); } } Nó sẽ đếm và in từng số qua serial chuyển tiếp. [Lưu ý rằng trong Arduino, Serial.write () in ra số thực, sẽ được biên dịch dưới dạng mã ký tự ASCII. Nếu muốn in chuỗi “123” thay vì số 123, sử dụng lệnh Serial.print ().] Tiếp theo, cần biết cổng nối tiếp USB nào Arduino được phép kết nối (xem “Tìm cổng nối tiếp” trên trang 70). Trong chương trình Python; nếu cổng không phải là / dev / ttyACM0, hãy thay đổi giá trị của cổng. (Xem Chương 4 để biết thêm về Python). Lưu nó bằng tên SerialEcho.py và chạy nó với python SerialEcho.py: import serial port = "/dev/ttyACM0" serialFromArduino = serial.Serial(port,9600) serialFromArduino.flushInput() while True: if (serialFromArduino.inWaiting() > 0): input = serialFromArduino.read(1) print(ord(input))
  • 23. UNGDUNGMAYTINH.COM • Mở Serial Port được kết nối với Arduino. • Xóa bộ đệm đầu vào. • Đọc một byte từ serial buffer. • Thay đổi byte vào thành một số thực ord (). [Sẽ không thể tải lên Arduino khi Python mở serial port, vì vậy hãy đảm bảo đã xóa chương trình Python bằng Ctrl-C trước khi nạp code. Có thể tải lên một Arduino Leonardo hoặc Arduino Micro, nhưng làm như vậy sẽ phá vỡ kết nối với chương trình Python, vì vậy sẽ cần phải khởi động lại nó bằng cách nào đó.] Arduino sẽ gửi một số đến chương trình Python, nó giải thích con số đó dưới dạng một chuỗi. Biến đầu vào sẽ chứa bất kỳ ký tự nào trỏ tới số đó trong bảng ASCII. Để có ý tưởng tốt hơn, hãy thử thay thế dòng cuối cùng của tập lệnh Python bằng cách này: print(str(ord(input)) + " = the ASCII character " + input + ".") Đặt Serial Port làm Đối số Nếu muốn đặt cổng làm đối số dòng lệnh, hãy sử dụng mô-đun sys để lấy đối số đầu tiên: import serial, sys if (len(sys.argv) != 2): print("Usage: python ReadSerial.py port") sys.exit() port = sys.argv[1] Sau đó chạy chương trình: python SerialEcho.py /dev/ttyACM0 Ví dụ đơn giản đầu tiên chỉ gửi một byte đơn; điều này có thể sẽ tốt hơn nếu chỉ gửi một loạt code từ Arduino. Ví dụ: nếu nút trái được bấm, gửi 1; nếu bấm thêm lần nữa, gửi 2. Tuy nhiên, nó chỉ hoạt động tốt cho 255 ký tự rời rạc; nhiều hơn có thể gửi chuỗi tùy ý. Ví dụ: nếu đang đọc cảm biến analog với Arduino, có thể gửi các số trong khoảng 0 đến 1.023. Phân tích cú pháp các số tùy ý có trong một byte tại một thời điểm có thể phức tạp hơn khi phân tích bằng các ngôn ngữ khác nhưng với Python và chuỗi xử lý pySerial làm cho nó trở nên dễ dàng hơn. Ví dụ đơn giản, cập nhật Arduino với code tiếp theo có giá trị từ 0 đến 1.024:
  • 24. void setup() { Serial.begin(9600); } void loop() { for (int n = 0; n < 1024; n++) Serial.println(n, DEC); delay(50); } } Điểm khác biệt chính là trong lệnh println (). Trong ví dụ trước, hàm Serial.write () được sử dụng để ghi số nguyên vào cổng nối tiếp. Với println (), Arduino định dạng số này thành chuỗi thập phân và gửi mã ASCII cho chuỗi. Vì vậy, thay vì gửi một byte với giá trị 254, nó sẽ gửi chuỗi 254 r n. R thay cho trở về đầu dòng, và n là qua dòng mới (đây là những khái niệm được chuyển từ máy đánh chữ vào máy tính: di chuyển đến đầu dòng; bắt đầu một dòng văn bản mới). Về phía Python, có thể sử dụng readline () thay vì read (), nó sẽ đọc tất cả các ký tự cho đến khi (và bao gồm cả) dòng trả về và dòng mới. Python có các hàm để chuyển đổi giữa các kiểu dữ liệu và chuỗi khác nhau. Chỉ có thể sử dụng hàm int () để thay đổi chuỗi được định dạng thành một số nguyên: import serial port = "/dev/ttyACM0" serialFromArduino = serial.Serial(port,9600) serialFromArduino.flushInput() while True: input = serialFromArduino.readline() inputAsInteger = int(input) print(inputAsInteger * 10) Lưu ý rằng nó chỉ đơn giản để thực hiện ví dụ này: nó sẽ đọc một đầu vào analog và gửi kết quả; chỉ cần thay đổi vòng lặp: void setup() { Serial.begin(9600); } void loop() { int n = analogRead(A0); Serial.println(n, DEC); delay(100); }
  • 25. UNGDUNGMAYTINH.COM Giả sử muốn thay đổi chương trình Python chỉ cần nhập inputAsInteger thay vì inputAsInteger * 10, nên nhập một giá trị bất kỳ trong khoảng 200 nếu không có kết nối với chân 0. Với một số dây điện, kết nối chân 0 đến GND và giá trị phải là 0. Kết nối nó với chân 3.3V còn giá trị vào khoảng 715 và 1.023 khi kết nối với chân 5V. Sử dụng Arduino Compatibles Có rất nhiều board vi điều khiển tương thích với Arduino IDE. Một số sử dụng bộ chuyển đổi đặc biệt từ FTDI xử lý tất cả các giao tiếp nối tiếp từ USB đến TTL. Để kết nối với các board (thường rẻ hơn), có thể sử dụng cáp FTDI hoặc bộ chuyển đổi như USB BUB hoặc FTDI Friend. Trong phiên bản Jessie, trình điều khiển FTDI cho các board chủ này đã được cài đặt, vì vậy chúng sẽ hoạt động bên ngoài. Các board này thường hiển thị dưới dạng thiết bị / dev / ttyUSB0. Sử dụng Firmata Khi vào sâu hơn, nhiều dự án sẽ có code cho giao tiếp cơ bản. Như với bất kỳ hình thức giao tiếp nào, mọi thứ trở nên khó khăn khi sâu hơn "hello, world"; sẽ cần phải tạo các giao thức (hoặc tìm một giao thức hiện có và thực hiện nó) để các bên hiểu nhau. Một giải pháp tốt hơn đi kèm với Arduino là Firmata của Hans-Christoph Steiner, một giao thức nối tiếp đa năng, đơn giản và dễ đọc. Nó có thể không hoàn hảo cho tất cả các ứng dụng, nhưng nó tốt để bắt đầu. Dưới đây là ví dụ nhanh: 1. Chọn File → Examples → Firmata → StandardFirmata trong Arduino; nó sẽ mở code Firmata mẫu cho phép gửi và nhận tin nhắn đến Arduino và nhận thông tin về tất cả các chân. 2. Tải code đó lên Arduino giống như cách đã làm trong các ví dụ trước. 3. Cần code Python trên Pi để gửi lệnh tới Arduino để truy vấn hoặc thay đổi trạng thái của nó. Cách dễ nhất là sử dụng mô-đun pyFirmata. Cài đặt nó bằng Pip (xem “Easy” Cài đặt mô-đun với Pip” trên trang 62): sudo pip install pyfirmata 4. Bởi vì Firmata là một giao thức nối tiếp, giao tiếp với Arduino từ Python theo cách tương tự như trong các ví dụ trước, nhưng sử dụng pyFirmata thay vì
  • 26. pySerial. Sử dụng phương thức write () để tạo ra một chân kỹ thuật số high hoặc low trên Arduino: from pyfirmata import Arduino from time import sleep board = Arduino('/dev/ttyACM0') while (1): board.digital[13].write(1) print("on") sleep(1) board.digital[13].write(0) print("off") sleep(1) Code này sẽ nhấp nháy đèn LED trên board Arduino Uno được kết nối với chân 13. Mô-đun đầy đủ trên trang pyFirmata GitHub.