Micropython với WebREPL
Hello anh em, mời ae quay về những năm về trước với series học tập, bắt đầu lại với serie micropython để khởi động cho nóng người.
Bắt nguồn từ bài viết này, đây có thể là bài viết đầu tiên để chúng ta tới với micropython cho các board microcontroller. Nó có vẻ hơi cũ, mình đã coi lại và update, nên ae yên tâm sau 5 nốt nhạc chúng ta đã có version mới nhất. Ae có thể thử và cùng sung sướng với mình vì đã có luôn tutorial đầu tiên. Nếu coi xong ae có hứng thú thì cum back lại post này mình tiếp tục khám phá, còn nếu thấy chán đời quá thì thôi bỏ mình qua học cái khác vui hơn.
Cập nhật: Series đã hoàn thành nha anh em
Trong bài viết này mình sẽ cung cấp 1 hướng tiếp cận mới dễ dàng hơn so với bài đầu tiên, kể cả về cách cài đặt cũng như lập trình, chủ yếu là về môi trường để anh em có thể yên tâm mà nghiên cứu một cách nhanh nhất.
Chuẩn bị
Cần có một số yêu cầu cơ bản trước khi bắt đầu
- Máy tính dùng ubuntu, hoặc máy ảo ubuntu hoặc window với cmd thần t hánh
- Kit esp8266/ esp32
- Dây cáp và wifi
- Tool WebREPL
Với những thứ trên ta có thể vào việc ngay và luôn rồi
Cài đặt môi trường
Thay vì cách flash ở bài trước là trên window và dùng tool ESPFlash để nạp firmware esp micropython mới nhất, thì giờ với linux chúng ta có thể flash bằng cách dùng esptool như sau
Với Linux
Cài đặt esptool
sudo apt update
sudo apt install python3-pip
pip install esptool
Flash firmware sau khi đã tải về bản tương ứng tại https://micropython.org/download/all/
Với esp8266 ta dùng lệnh sau, bạn cần thay đổi /dev/ttyUSB0 và esp8266-20170108-v1.8.7.bin thành cổng COM tương ứng và version micropython mà ta mới tải về
Nếu bạn không biết cổng COM hiện tại đang có trong ubuntu thì có thể sử dụng lệnh sau ll /sys/class/tty/ttyUSB*
ll /sys/class/tty/ttyUSB*
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dout 0 esp8266-20170108-v1.8.7.bin
Với esp32 thì cách làm tương tự và ta dùng lệnh sau
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20180511-v1.9.4.bin
Nếu bị lỗi khi chạy esptool.py file not found thì chơi lệnh này fix nha ae ~/.local/bin/esptool.py -p /dev/ttyUSB0 ...
sudo ~/.local/bin/esptool.py --port /dev/ttyUSB0 erase_flash
sudo ~/.local/bin/esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20210623-v1.16.bin
Sau khi bạn xóa và flash firmware thành công sẽ có thông báo như sau
sc@sckt:~$ sudo ~/.local/bin/esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py v3.1
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 60:01:94:1f:80:c8
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 2.8s
Hard resetting via RTS pin...
vuson@sckt:~$ sudo ~/.local/bin/esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dout 0 esp8266-20170526-v1.9.bin
esptool.py v3.1
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 60:01:94:1f:80:c8
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x00000000 to 0x00092fff...
Flash params set to 0x0340
Compressed 598084 bytes to 390426...
Wrote 598084 bytes (390426 compressed) at 0x00000000 in 9.4 seconds (effective 507.0 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
sc@sckt:~$ sudo ~/.local/bin/esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py v3.1
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 60:01:94:1f:80:c8
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 2.6s
Hard resetting via RTS pin...
Cấu hình WebREPL
Kích hoạt WebREPL
Sau bao tháng ngày chờ đợi thì team micropython cũng đã làm ra được 1 thứ có giá trị, đó là web tool để chúng ta có thể lập trình python ở trên đó, tuy nhiên để có thể sử dụng được thì bạn cần phải enable nó lên thông qua terminal
Mở terminal dùng teraterm và gõ lệnh sau, sau đó bạn nhập password để dùng cho mỗi lần connect với kit ESP8266
import webrepl_setup
Kết quả
>>> import webrepl_setup
WebREPL daemon auto-start status: disabled
Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> E
To enable WebREPL, you must set password for it
New password (4-9 chars): *****
Confirm password: *****
Changes will be activated after reboot
Would you like to reboot now? (y/n) y
WebREPL daemon started on ws://192.168.4.1:8266
Started webrepl in normal mode
MicroPython v1.15 on 2021-04-18; ESP module with ESP8266
Type "help()" for more information.
>>>
Truy cập WebREPL
Đoạn đầu flash dùng Ubuntu xong xuôi rồi, giờ mở mục wifi trên win10 của máy tính bạn ra sau đó lựa chọn wif có tên là MicroPython-*
Bạn cần connect vào nó và nhập mật khẩu micropythoN, lưu ý chữ N viết hoa nha anh em
Sau khi giải nén tool WebREPL ra thì click vào file webrepl.html để mở trên trình duyệt Chrome hoặc Firefox, ta sẽ có giao diện tương ứng như hình sau
Giờ thì hãy đảm bảo rằng PC của bạn đã kết nối vào ESP8266's WiFi, sau đó ấn vào nút Connect (ở đây ta dùng đường dẫn mặc định ws://192.168.4.1:8266/ ).
Khi bạn connect được thì WebREPL sẽ bắt chúng ta phải nhập mật khẩu đã set từ bước trước vào
Tiếp tục code vài dòng python để xem output như thế nào. Với WebREPL sẽ show ra các chức năng giống như là lập trình thông qua serial. Bạn có thể code thoải mái và load code của mình lên board cũng như xem kết quả
Dùng WebREPL với internet
Ở bước trên thì ta có thể connect và code cơ bản, tuy nhiên khá là vất vả nếu bạn cứ phải chuyển đổi qua lại giữa network của micropython và mạng internet, mỗi lần xài WebREPL là coi như khỏi xài internet và ngược lại, tất nhiên sẽ có cách để khắc phục điều này, mình tiếp tục thêm vài bước để có thể xài cả 2, tiện thể hạn chế sử dụng cổng COM để code và debug luôn, tất cả cho về không dây hết và ta có thể code ở bất kỳ máy tính nào, nghĩ tới đã thấy sung sướng tê người rồi
Trước khi làm việc đó thì cần dùng Teraterm mở COM và gõ những dòng code sau trước đã
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('ssid', 'password')
Mục đích chính là cho kit nodemcu của mình có thể kết nối được với internet, với mạng wifi nhà mình đó anh em, các bạn thay ssid và password bằng mạng wifi tương ứng của mình nhé
wlan.isconnected()
wlan.ifconfig()
Sau đó bạn có thể dùng 2 lệnh trên để kiểm tra đã connect vào wifi hay chưa cũng như kiểm tra lại IP của kit sau khi connect, True và hiện ra IP là ngon nha các đồng chí
Kết quả
>>> wlan.isconnected()
True
>>> wlan.ifconfig()
('192.168.1.38', '255.255.255.0', '192.168.1.1', '192.168.1.1')
Lưu ý kết quả đầu tiên từ lệnh ifconfig là địa chỉ IP được gán cho kit ESP8266 (192.168.1.38 trong ví dụ này, nhưng nó sẽ khác nhau tùy thuộc vào mạng WiFi của bạn). Nếu bạn không thấy địa chỉ IP thì có vấn đề với cấu hình WiFi hoặc kết nối mạng. Kiểm tra kỹ SSID và mật khẩu có đúng không và thử lại.
Một điều quan trọng cần lưu ý là ESP8266 sẽ luôn ghi nhớ mạng WiFi cuối cùng mà nó sử dụng và cố gắng tự kết nối lại khởi động lại. Điều này rất tiện lợi vì nó có nghĩa là khi ESP8266 khởi động, nó sẽ tự động kết nối với mạng cuối cùng mà bạn không cần phải chạy lại các lệnh ở trên. Tuy nhiên, nó chỉ nhớ mạng lần cuối cùng truy cập chứ không phải toàn bộ lịch sử của các mạng mà bạn đã kết nối.
Sau khi kit được kết nối với mạng WiFi, ta cần phải kích hoạt lại WebREPL (như được mô tả trong phần trước) và thấy nó in ra hai địa chỉ IP mà nó đang listen:
>>> import webrepl
>>> webrepl.start()
WebREPL daemon started on ws://192.168.4.1:8266
WebREPL daemon started on ws://192.168.1.38:8266
Started webrepl in normal mode
Trong trường hợp này, WebREPL đang lắng nghe trên 192.168.4.1 là điểm truy cập của ESP8266 và 192.168.1.38 là địa chỉ IP của kit ESP8266 trên mạng WiFi của nhà mình.
Bây giờ hãy mở WebREPL và sử dụng địa chỉ IP ở trên thay vì địa chỉ mặc định 192.168.4.1:
Giờ thì ta có thể vừa xài internet vừa code micropython thơm bơ rồi.
Gửi và nhận file với WebREPL
Một tính năng tiện dụng của WebREPL là nó có thể gửi và lấy tệp từ filesystem. Việc này rất thuận tiện khi code python của bạn to lên, bạn không thể gõ từng dòng vào trong command line khi số dòng code của bạn lên tới 1000 dòng, việc truy cập tệp qua WebREPL giúp chúng ta thuận tiện hơn rất nhiều.
Tuy nhiên nó vẫn có hạn chế là file bạn tải sẽ chỉ có một path cố định là root, bạn không thể đưa nó qua đường dẫn khác. Muốn làm được việc đó thì cần phải có những công cụ khác, tạm thời chúng ta sẽ bỏ qua việc chọn path trong bài viết này
Để sử dụng các tính năng tệp của WebREPL bạn có thể sử dụng các công cụ ở bên góc phải
Để tải tệp lên, hãy nhấp vào Choose File và chọn file mình cần đưa lên sau đó ấn nút Send to Device để gửi file xuống kit ESP8266
Để tải xuống tệp từ file system, chỉ cần nhập tên file. Sau đó nhấp vào Get from device và tệp sẽ được tải xuống thông qua trình duyệt vào máy tính của bạn.
Ví dụ minh họa phát luôn nhỉ
Giờ mình code chương trình hello python như sau và lưu lại file hello.py
###########################################################################
# Setup code goes below, this is called once at the start of the program: #
###########################################################################
import time
def run():
print('Hello world! I can count:')
i = 1
while True:
###################################################################
# Loop code goes inside the loop here, this is called repeatedly: #
###################################################################
print(i)
i += 1
time.sleep(1.0) # Delay for 1 second.
Sau đó load file này xuống dưới kit ESP8266 thôi, các bạn có thể quan sát kết quả ở hình dưới
Một số phím tắt tương ứng khi dùng WebREPL để ta có thể thực hiện soft reset nếu chương trình không hoạt động
- Ctrl-A trên dòng trống sẽ vào chế độ raw của REPL. Đây giống như chế độ paste vĩnh viễn, ngoại từ việc các kí tự không được lặp lại.
- Ctrl-B trên cửa sổ trống giống như mode normal của REPL.
- Ctrl-C hủy bất kỳ input nào hoặc sẽ dừng code đang chạy.
- Ctrl-D trên dòng trống sẽ thực hiện soft reset.
Kết
Vậy là chúng ta đã có thể setup một số môi trường để dev micropython trên kit ESP8266 rồi, giờ thì các bạn chuẩn bị tinh thần tiếp tục với các bài hướng dẫn tiếp theo nhé.
Nếu anh em nào còn bỡ ngỡ về python thì ghé thăm bài viết sau để biết code python cơ bản nha anh em
Tham khảo