Trang chủ Khóa họcKITM5GO Lập trình điều khiển M5Go từ xa

Lập trình điều khiển M5Go từ xa

Bởi tr1nh

Giới thiệu

Trong bài viết này, chúng ta sẽ lập trình đề M5Go nhận được các yêu cầu điều khiển từ xa. Sau đó thực hiện các hành động được yêu cầu.

Áp dụng với hai bài hướng dẫn trước, mục tiêu của chúng ta là lập trình để M5Go nhận được tín hiệu từ xa. Khi nhận được yêu cầu thì phát ra một câu hỏi, sau đó ghi âm lại câu trả lời. Cuối cùng, gửi tệp vừa ghi âm được lại cho người dùng.

Để biết khi nào có tín hiệu yêu cầu được gửi từ người dùng, chúng ta sẽ lập trình M5Go có chức năng như một máy chủ (server). Máy chủ này luôn lắng nghe các yêu cầu được gửi từ người dùng và thực hiện các hành động được lập trình từ trước.

Quá trình này giống như khi chúng ta truy cập một trang web. Đầu tiên, chúng ta nhập đường dẫn (URL) vào thanh địa chỉ của trình duyệt và nhấn nút enter. Lúc này trình duyệt sẽ gửi yêu cầu đến máy chủ, máy chủ nhận được yêu cầu và trả về nội dung trang web cho trình duyệt. Trình duyệt nhận được phản hồi và hiển thị nội dung đó cho chúng ta.

Nguồn từ Ruslan’s Blog.

Tương tự như vậy, chúng ta sẽ lập trình để M5Go nhận được yêu cầu từ người dùng, rồi thực hiện phát âm thanh và ghi âm thay vì phản hồi trang web cho người dùng.

Chuẩn bị

Trước khi bắt đầu lập trình, chúng ta cần chuẩn bị:

  • M5Go
  • Một thẻ nhớ microSD có chứa một file âm thanh định dạng wav.
  • Trình duyệt web.

Thực hiện

Để lập trình chức năng máy chủ cho M5Go, chúng ta sẽ dùng module microwebsrv. Đây là một module giúp chúng ta nhanh chóng tạo một máy chủ bằng ngôn ngữ lập trình python. Microwebsrv cũng có một bản tài liệu chi tiết cho người sử dụng tham khảo trên github.

Đầu tiên kết nối M5Go với M5stack, các bạn có thể xem lại hướng dẫn ở bài viết lập trình M5Go phát âm thanh.

Lập trình M5Go kết nối mạng và mount thẻ nhớ

Trước hết, chúng ta cần khai báo module và thư viện cần thiết để lập trình.

from m5stack import *
from m5ui import *
from uiflow import *
from machine import I2S
from microWebSrv import MicroWebSrv
import wifiCfg, os, uos, wave, time

M5Go sẽ nhận yêu cầu và phản hồi với người dùng thông qua một mạng wifi nhất định. Do đó, đầu tiên chúng ta phải lập trình để M5Go kết nối với mạng wifi.

# kết nối wifi và xuất ra thông báo
wifiCfg.doConnect('<tên wifi>', '<mật khẩu wifi>')
ip = wifiCfg.wlan_sta.ifconfig()
# in ra kết quả
if wifiCfg.wlan_sta.isconnected():
  lcd.print('Your IP Address is: ' + str(ip[0]), 0, 0, color=0x00ff00)
else:
  lcd.print('Wifi not connected', 0, 0, color=0xff0000)

Sau khi kết nối mạng wifi thành công, M5Go cần phải mount thẻ nhớ để làm việc với các file âm thanh.

# tiến hành mount thẻ nhớ
# uncomment the following line if you have issues mounting the sd
uos.sdconfig(uos.SDMODE_SPI, clk=18, mosi=23, miso=19, cs=4)
try:
  uos.mountsd()
  lcd.print('sdcard mounted', 0, 15, 0x00ff00)
except:
  lcd.print('sdcard not mounted', 0, 15, 0xff0000)
  pass

Như vậy, chúng ta đã lập trình xong các bước khởi tạo môi trường cần thiết cho M5Go.

Lập trình M5Go phát và thu âm thanh

Tiếp theo chúng ta sẽ lập trình hàm phát âm thanh và thu âm thanh.

# hàm phát âm thanh của một file wav truyền vào
def speaking(file_wav):
  # khởi tạo và thiết lập speaker:
  i2s = I2S(  mode = I2S.MODE_MASTER | I2S.MODE_TX | I2S.MODE_DAC_BUILT_IN,
              rate = 16000,
              bits = 16,
              channel_format = I2S.CHANNEL_ONLY_RIGHT,
              data_format = I2S.FORMAT_I2S_MSB)
  
  # tùy chỉnh
  wav = wave.open(file_wav)
  i2s.set_dac_mode(I2S.DAC_RIGHT_EN)
  i2s.sample_rate(wav.getframerate())
  i2s.bits(wav.getsampwidth() * 8)
  i2s.nchannels(wav.getnchannels())
  i2s.volume(20) # âm lượng của M5Go (0 - 100)

  # bắt đầu phát
  while True:
    data = wav.readframes(1024)
    if len(data) > 0:
      i2s.write(data)
    else:
      wav.close()
      i2s.deinit()
      break


# hàm thu âm thanh từ speaker trong một khoảng thời gian quy định và lưu lên thẻ nhớ
def recording(file_name, duration=None):
  # khởi tạo và thiết lập speaker:
  i2s = I2S(  mode = I2S.MODE_MASTER | I2S.MODE_TX | I2S.MODE_RX | I2S.MODE_DAC_BUILT_IN | I2S.MODE_ADC_BUILT_IN,
              rate = 16000,
              bits = 16,
              channel_format = I2S.CHANNEL_ONLY_RIGHT,
              data_format = I2S.FORMAT_I2S_MSB)
  i2s.sample_rate(16000)
  i2s.nchannels(1)
  i2s.set_adc_pin(34) # Set the ADC Pin 34
  i2s.adc_enable(True)

  # quy định cho file ghi âm được lưu
  audio = wave.open(file_name, 'wb')
  audio.setparams([1, 2, 16000, 0, 'NONE', 'not compressed'])
  
  if duration:
    duration_time = (time.ticks_ms() + duration*1000) if duration else 0

  data = bytes(0)
  
  lcd.print('recording...', 0, 30, 0xffffff)
  while True:
    data = i2s.read(8000)
    audio.writeframes(data)
    if duration:
      if time.ticks_ms() > duration_time:
          break
  i2s.adc_enable(False)
  i2s.deinit()
  audio.close()
  lcd.print('recording ended!', 0, 30, 0xffffff)
  wait_ms(5000)

Lập trình M5Go lắng nghe yêu cầu

Bắt đầu đến phần lập trình máy chủ cho M5Go.

Trước hết, chúng ta sẽ quy định các yêu cầu mà máy chủ có thể nhận cũng như hành động sau khi nhận được yêu cầu.

# định nghĩa các phản hồi khi nhận được yêu cầu từ app
# -- Khi có yêu cầu phát câu hỏi
def _httpHandlerQuestion(httpClient, httpResponse):
  speaking('/flash/res/mix.wav')
  recording('/sd/record.wav', 5)
  httpResponse.WriteResponseFileAttachment( filepath        = '/sd/record.wav', 
                                            attachmentName  = 'record.wav', 
                                            headers         = None)
  
# -- Khi có yêu cầu trang web (root /)
def _httpHandlerIndex(httpClient, httpResponse):
    httpResponse.WriteResponseOk(headers        = None,
                                contentType     = 'text/html',
                                contentCharset  = 'UTF-8',
                                content         = '<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>M5Go webserver</title></head><style> .button { padding: 10px; font-size: 18px; border: 1px solid #341f97; border-radius: 3px; background-color: white; color: #341f97; } .button:hover { background-color: #341f97; color: white; cursor: pointer; }</style><body><form onsubmit="/question"> <input class="button" type="button" value="yêu cầu phát câu hỏi"></form></body></html>')

routeHandlers = [
  ('/', 'GET', _httpHandlerIndex),
  ('/question', 'GET', _httpHandlerQuestion)
]

Trong đoạn code trên, mình đã định nghĩa hai đường dẫn URL mà M5Go có thể nhận được.

Đường dẫn chỉ có một dấu / duy nhất là đường dẫn gốc. Khi được người dùng yêu cầu thì M5Go sẽ phản hồi lại một website.

Còn đường dẫn /question sẽ yêu cầu M5Go phát câu hỏi rồi thu âm câu trả lời, sau đó phản hồi lại cho người dùng.

Cuối cùng, chúng ta sẽ cho M5Go bắt đầu lắng nghe các yêu cầu.

# thiết lập server
server = MicroWebSrv(routeHandlers = routeHandlers)
server.MaxWebSocketRecvLen = 256
server.WebSocketThreaded = False


# Khởi động server
lcd.print("Listening request...", 0, 30, color=0x000000)
server.Start(threaded=False)

Kết luận

Sau khi nạp chương trình cho M5Go. Các bạn dùng trình duyệt web và nhập vào địa chỉ ip được hiển thị trên M5Go kèm với các yêu cầu phía sau.

Ngoài sử dụng trình duyệt trình để yêu cầu máy chủ. Còn có rất nhiều cách để người dùng thực hiện gửi yêu cầu. Các bạn có thể xem bài viết lập trình App Inventor điều khiển thiết bị M5Go để lập trình ứng dụng android gửi yêu cầu đến M5Go.

Related Posts

2 Bình luận

Lập trình App Inventor điều khiển thiết bị M5Go - share4happy .com Tháng mười một 25, 2019 - 7:16 chiều

[…] Ngoài ra, các bạn cần một bộ M5Go đã được lập trình để có thể điều khiển từ xa theo bài viết lập trình điều khiển M5Go từ xa. […]

Phản hồi
Debbie Tanner Tháng hai 24, 2020 - 8:38 chiều

Go Here To Review Our Service

Hi,

Thelocation3 is a website that collects opinions from webmasters/bloggers/business owners for Bing, Bluehost, etc.

We are looking for people like you to test our website.

They spend *,000,000,000 dollars each year collecting data, and then improving their products.
Thelocation3 pays to each member $ *** daily for their opinions.

Interested? Click here: https://www.thelocation3.com/paidsurvey

Looking forward to hearing from you,

Debbie Tanner

^^^^^^^^
Unsubscribe: https://www.thelocation3.com/unsubscribe

Phản hồi

Để lại một bình luận