Mục lục:

Vượt ra ngoài tiêu chuẩn Xác nhận dữ liệu - Đã xem lại: 5 bước
Vượt ra ngoài tiêu chuẩn Xác nhận dữ liệu - Đã xem lại: 5 bước

Video: Vượt ra ngoài tiêu chuẩn Xác nhận dữ liệu - Đã xem lại: 5 bước

Video: Vượt ra ngoài tiêu chuẩn Xác nhận dữ liệu - Đã xem lại: 5 bước
Video: 5 bí quyết vượt qua cảm xúc tiêu cực 2024, Tháng bảy
Anonim
Vượt ra ngoài tiêu chuẩn Xác nhận dữ liệu - Đã xem lại
Vượt ra ngoài tiêu chuẩn Xác nhận dữ liệu - Đã xem lại

Cách đây không lâu, tôi đã được Tiến sĩ Martyn Wheeler, một người dùng pymata4, liên hệ để được hướng dẫn thêm hỗ trợ cho cảm biến Độ ẩm / Nhiệt độ DHT22 vào thư viện pymata4. Thư viện pymata4, kết hợp với đối tác Arduino, FirmataExpress, cho phép người dùng điều khiển và giám sát thiết bị Arduino của họ từ xa. Trong một vài vòng trao đổi email, Tiến sĩ Wheeler đã thành công trong việc sửa đổi cả pymata4 và FirmataExpress. Do đó, hỗ trợ cho cảm biến DHT22 và DHT11 hiện là một phần tiêu chuẩn của pymata4 và FirmataExpress.

Vào tháng 5 năm 2014, tôi đã viết một bài báo về việc bổ sung hỗ trợ Firmata cho các thiết bị bổ sung. Ngẫm lại bài báo của mình, tôi nhận ra rằng tôi đã thay đổi nhiều như thế nào kể từ khi tôi cầm bút lên giấy cho bài báo đó. Ngoài bài báo này, Tiến sĩ Wheeler đã ghi lại những nỗ lực của ông và bạn cũng có thể muốn kiểm tra điều đó.

FirmataExpress dựa trên StandardFirmata, và cấu trúc thư mục StandardFirmata đã phát triển. Ngoài ra, API pymata4 cũng hơi khác một chút so với API PyMata gốc của năm 2014. Tôi nghĩ đây sẽ là thời điểm hoàn hảo để truy cập lại và cập nhật bài viết đó. Sử dụng công việc của Tiến sĩ Wheeler làm cơ sở, hãy cùng khám phá cách mở rộng chức năng pymata4 / FirmataExpress.

Trước khi chúng ta bắt đầu - Một số thông tin cơ bản về Arduino / Firmata

Vậy Firmata là gì? Trích dẫn từ trang web Firmata, "Firmata là một giao thức chung để giao tiếp với vi điều khiển từ phần mềm trên máy tính chủ."

Arduino Firmata sử dụng giao diện nối tiếp để vận chuyển cả thông tin lệnh và báo cáo giữa vi điều khiển Arduino và PC, thường sử dụng liên kết nối tiếp / USB được đặt thành 57600 bps. Dữ liệu được truyền qua liên kết này là tệp nhị phân và giao thức được triển khai trong mô hình máy khách / máy chủ.

Phía máy chủ được tải lên vi điều khiển Arduino ở dạng bản phác thảo Arduino. Bản phác thảo StandardFirmata, đi kèm với Arduino IDE, điều khiển các chân I / O của Arduino, theo lệnh của máy khách. Nó cũng báo cáo các thay đổi pin đầu vào và các thông tin báo cáo khác cho khách hàng. FirmataExpress là phiên bản mở rộng của StandardFirmata. Nó chạy với tốc độ liên kết nối tiếp 115200 bps.

Ứng dụng khách Arduino được sử dụng cho bài viết này là pymata4. Nó là một ứng dụng Python được thực thi trên PC. Nó vừa gửi lệnh đến vừa nhận báo cáo từ máy chủ Arduino. Vì pymata4 được triển khai bằng Python nên nó chạy trên máy tính Windows, Linux (bao gồm cả Raspberry Pi) và macOS.

Tại sao sử dụng Firmata?

Bộ vi điều khiển Arduino là những thiết bị nhỏ tuyệt vời, nhưng tài nguyên bộ xử lý và bộ nhớ có phần hạn chế. Đối với các ứng dụng đòi hỏi nhiều bộ xử lý hoặc bộ nhớ, thường không có lựa chọn nào khác ngoài việc giảm tải nhu cầu tài nguyên lên PC để ứng dụng hoạt động thành công.

Nhưng đó không phải là lý do duy nhất để sử dụng StandardFirmata. Khi phát triển các ứng dụng Arduino có trọng lượng nhẹ hơn, PC có thể cung cấp các công cụ và khả năng gỡ lỗi không có sẵn trực tiếp trên vi điều khiển Arduino. Việc sử dụng máy khách và máy chủ "cố định" giúp giới hạn độ phức tạp của ứng dụng trong PC, dễ quản lý hơn. Sau khi ứng dụng được hoàn thiện, nó có thể được dịch thành một bản phác thảo Arduino độc lập, tùy chỉnh.

Tại sao sử dụng pymata4?

Là tác giả của nó, tất nhiên, tôi có thành kiến. Điều đó đang được nói, nó là ứng dụng Firmata dựa trên Python duy nhất được duy trì liên tục trong vài năm qua. Nó cung cấp một API trực quan và dễ sử dụng. Ngoài các bản phác thảo dựa trên StandardFirmata, Nó hỗ trợ Firmata qua WiFi cho các thiết bị như ESP-8266 khi sử dụng bản phác thảo StandardFirmataWifI.

Ngoài ra, pymata4 được thiết kế để người dùng có thể dễ dàng mở rộng để hỗ trợ các cảm biến và bộ truyền động bổ sung hiện không được StandardFirmata hỗ trợ.

Bước 1: Tìm hiểu về Giao thức Firmata

Hiểu giao thức Firmata
Hiểu giao thức Firmata

Giao thức truyền thông Firmata của Arduino có nguồn gốc từ giao thức MIDI, sử dụng một hoặc nhiều byte 7-bit để biểu diễn dữ liệu.

Firmata được thiết kế để người dùng có thể mở rộng. Cơ chế cung cấp khả năng mở rộng này là giao thức nhắn tin dành riêng cho hệ thống (SysEx).

Định dạng của thông báo SysEx, được xác định bởi Giao thức Firmata, được hiển thị trong hình minh họa ở trên. Nó bắt đầu bằng một byte START_SYSEX với giá trị cố định là 0xF0 hệ thập lục phân và theo sau là một byte lệnh SysEx duy nhất. Giá trị của byte lệnh phải nằm trong dải thập lục phân 0x00-0x7F. Sau đó, byte lệnh được theo sau bởi một số byte dữ liệu 7 bit không xác định. Cuối cùng, thông báo được kết thúc bằng một byte END_SYSEX, với giá trị cố định là 0xF7 thập lục phân.

Mã hóa / giải mã dữ liệu Firmata

Vì phần dữ liệu người dùng của một thông báo SysEx bao gồm một loạt các byte 7 bit, bạn có thể tự hỏi làm thế nào một phần biểu thị một giá trị lớn hơn 128 (0x7f)? Firmata mã hóa các giá trị đó bằng cách tách chúng thành nhiều đoạn byte 7 bit trước khi dữ liệu được sắp xếp theo liên kết dữ liệu. Byte ít quan trọng nhất (LSB) của một mục dữ liệu được gửi đầu tiên, tiếp theo là các thành phần ngày càng quan trọng của mục dữ liệu theo quy ước. Byte quan trọng nhất (MSB) của mục dữ liệu là mục dữ liệu cuối cùng được gửi.

Cái này hoạt động ra sao?

Giả sử chúng tôi muốn kết hợp giá trị 525 vào phần dữ liệu của thông báo SysEx. Vì giá trị 525 rõ ràng lớn hơn giá trị 128, chúng ta cần phải tách hoặc tách nó thành các “phần” byte 7 bit.

Đây là cách điều đó được thực hiện.

Giá trị 525 trong hệ thập phân tương đương với giá trị thập lục phân của 0x20D, một giá trị 2 byte. Để lấy LSB, chúng tôi che dấu giá trị bằng cách VÀ đặt nó với 0x7F. Cả triển khai "C" và Python đều được hiển thị bên dưới:

// Triển khai "C" để cô lập LSB

int max_distance_LSB = max_distance & 0x7f; // che việc triển khai Python # byte thấp hơn để cô lập LSB max_distance_LSB = max_distance & 0x7F # che byte dưới

Sau khi che, max_distance_LSB sẽ chứa 0x0d. 0x20D & 0x7F = 0x0D.

Tiếp theo, chúng ta cần tách MSB cho giá trị 2 byte này. Để làm điều này, chúng tôi sẽ chuyển giá trị của 0x20D sang bên phải, 7 vị trí.

// Triển khai "C" để tách MSB có giá trị 2 byte

int max_distance_MSB = max_distance >> 7; // dịch chuyển byte bậc cao # Triển khai Python để cô lập MSB của giá trị 2 byte max_distance_MSB = max_distance >> 7 # shift để lấy byte trên Sau khi dịch chuyển, max_distance_MSB sẽ chứa giá trị 0x04.

Khi dữ liệu được sắp xếp theo kiểu "chunkified" được nhận, nó cần được tập hợp lại thành một giá trị duy nhất. Đây là cách dữ liệu được tập hợp lại trong cả "C" và Python

// Triển khai "C" để tập hợp lại byte 2, // Các giá trị 7 bit thành một giá trị duy nhất int max_distance = argv [0] + (argv [1] << 7); # Triển khai Python để tập hợp lại các giá trị 2 byte, # 7 bit thành một giá trị duy nhất max_distance = data [0] + (data [1] << 7)

Sau khi lắp ráp lại, giá trị một lần nữa bằng 525 thập phân hoặc 0x20D thập lục phân.

Quá trình tháo gỡ / lắp ráp lại này có thể được thực hiện bởi máy khách hoặc máy chủ.

Bước 2: Bắt đầu

Hỗ trợ một thiết bị mới yêu cầu các thay đổi đối với cả máy chủ thường trú Arduino và máy khách Python thường trú trên PC. Tác phẩm của Tiến sĩ Wheeler sẽ được sử dụng để minh họa những sửa đổi cần thiết.

Có lẽ bước quan trọng nhất là quyết định xem bạn muốn tích hợp thư viện thiết bị hỗ trợ hiện có vào phía Arduino của phương trình hay viết của riêng bạn. Chúng tôi khuyến nghị rằng nếu bạn có thể tìm thấy một thư viện hiện có, thì việc sử dụng nó sẽ đơn giản hơn nhiều so với việc bạn tự viết từ đầu.

Để được hỗ trợ thiết bị DHT, Tiến sĩ Wheeler đã dựa trên mã mở rộng của mình trên thư viện DHTNew. Rất thông minh, Tiến sĩ Wheeler đã phân chia chức năng của thư viện DHTNew trên các mặt Arduino và pymata4 của phương trình để cung cấp khả năng chặn tối thiểu ở phía Arduino.

Nếu chúng ta nhìn vào DHTNew, nó thực hiện tất cả những điều sau:

  • Đặt chế độ đầu ra kỹ thuật số chân cắm đã chọn.
  • Đóng một tín hiệu được mã hóa để truy xuất các giá trị độ ẩm và nhiệt độ mới nhất.
  • Kiểm tra và báo cáo bất kỳ lỗi nào.
  • Tính toán các giá trị nhiệt độ và độ ẩm mà con người có thể đọc được từ dữ liệu thô được truy xuất.

Để giữ mọi thứ hiệu quả nhất có thể ở phía FirmataExpress, Tiến sĩ Wheeler đã giảm tải các quy trình chuyển đổi dữ liệu từ Arduino sang pymata4.

Bước 3: Sửa đổi FirmataExpress để được hỗ trợ DHT

Cây thư mục FirmataExpress

Dưới đây là tất cả các tệp bao gồm kho FirmataExpress. Cây này giống với cây của StandardFiramata, chỉ khác là một số tên tệp phản ánh tên kho lưu trữ.

Các tệp cần sửa đổi là những tệp có dấu hoa thị (*) bên cạnh.

FirmataExpress

├── * Ban.h

├── ví dụ

│ └── FirmataExpress

│ ├── boardx

│ ├── * FirmataExpress.ino

│ ├── LICENSE.txt

│ └── Makefile

├── * FirmataConstants.h

├── * FirmataDefines.h

├── FirmataExpress.cpp

├── FirmataExpress.h

├── FirmataMarshaller.cpp

├── FirmataMarshaller.h

├── FirmataParser.cpp

└── FirmataParser.h

Hãy xem xét từng tệp và những thay đổi đã được thực hiện.

Boards.h

Tệp này chứa các định nghĩa macro loại pin cho từng loại bảng được hỗ trợ. Nó xác định số lượng thiết bị tối đa được hỗ trợ khi nhiều thiết bị cần được hỗ trợ.

Đối với thiết bị DHT, có thể kết nối tối đa 6 thiết bị cùng một lúc và giá trị này được xác định là:

#ifndef MAX_DHTS

#define MAX_DHTS 6 #endif

Ngoài ra, các macro loại pin có thể được xác định tùy chọn cho thiết bị mới, cho tất cả các loại bảng hoặc chỉ những loại mà bạn quan tâm. Các macro này được sử dụng chủ yếu cho mục đích báo cáo và không được sử dụng để kiểm soát thiết bị. Các macro này xác định cả các chân hỗ trợ thiết bị:

#define IS_PIN_DHT (p) (IS_PIN_DIGITAL (p) && (p) - 2 <MAX_DHTS)

Cũng như macro để xác định chuyển đổi số pin.

#define PIN_TO_DHT (p) PIN_TO_DIGITAL (p)

FirmataConstants.h

Tệp này chứa số phiên bản phần sụn, mà bạn có thể muốn sửa đổi để theo dõi phiên bản nào bạn đã tải lên Arduino của mình. Nó cũng chứa các giá trị thông báo Firmata, bao gồm các thông báo Firmata SysEx.

Bạn sẽ cần gán một tin nhắn mới hoặc tập hợp các tin nhắn cho thiết bị của mình trong tệp này. Đối với DHT, hai thông báo đã được thêm vào. Một định cấu hình một ghim làm ghim “DHT” và một ghim khác, làm thông báo báo cáo, khi gửi dữ liệu DHT mới nhất trở lại máy khách.

static const int DHT_CONFIG = 0x64;

static const int DHT_DATA = 0x65;

Chế độ ghim cũng được chỉ định trong tệp này. Đối với DHT, một chế độ ghim mới đã được tạo:

static const int PIN_MODE_DHT = 0x0F; // pin được định cấu hình cho DHT

Khi thêm chế độ ghim mới, TOTAL_PIN_MODES phải được điều chỉnh:

static const int TOTAL_PIN_MODES = 17;

FirmataDefines.h

Tệp này phải được cập nhật để phản ánh các thông báo mới được thêm vào FirmataConstants.h:

#ifdef DHT_CONFIG # undef DHT_CONFIG #endif #define DHT_CONFIG firmata:: DHT_CONFIG // Yêu cầu DHT #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DATA // DHT trả lời #ifODEf PIN_MODE_Mifde:: PIN_MODE_DHT

FirmataExpress.ino

Trong cuộc thảo luận này, chúng tôi sẽ đề cập đến "điểm cao" của những thay đổi được thực hiện đối với bản phác thảo Arduino này.

Để FirmataExpress hỗ trợ đồng thời tối đa sáu thiết bị DHT, 3 mảng đã được tạo để theo dõi từng số pin liên quan của thiết bị, giá trị WakeUpDelay của nó và loại thiết bị, đó là DHT22 hoặc DHT11:

// Cảm biến DHT

int numActiveDHTs = 0; // số DHT đính kèm uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

Vì cả hai loại thiết bị đều yêu cầu khoảng 2 giây giữa các lần đọc, chúng tôi cần đảm bảo rằng chúng tôi chỉ đọc mỗi DHT một lần trong khung thời gian 2 giây. Một số thiết bị, chẳng hạn như thiết bị DHT và cảm biến khoảng cách HC-SR04, chỉ được truy cập định kỳ. Điều này cho phép họ có thời gian để tương tác với môi trường của họ.

uint8_t nextDHT = 0; // lập chỉ mục thành dht để đọc thiết bị tiếp theo

uint8_t currentDHT = 0; // Theo dõi cảm biến nào đang hoạt động. int dhtNumLoops = 0; // Mục tiêu số lần thông qua vòng lặp b4 truy cập DHT int dhtLoopCounter = 0; // Bộ đếm vòng lặp

Cấu hình và đọc thiết bị DHT

Khi FirmataExpress nhận được lệnh SysEx để cấu hình một chân cho hoạt động DHT, nó sẽ xác minh rằng số lượng thiết bị DHT tối đa không bị vượt quá. Nếu DHT mới có thể được hỗ trợ, các mảng DHT sẽ được cập nhật. Nếu loại DHT không xác định, một thông báo chuỗi SysEx sẽ được tạo và truyền trở lại pymata4

case DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; if (numActiveDHTs <MAX_DHTS) {if (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } else if (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } else {Firmata.sendString ("LỖI: LOẠI CẢM BIẾN CHƯA BIẾT, CẢM BIẾN HỢP LỆ LÀ 11, 22"); nghỉ; } // kiểm tra cảm biến DHT_PinNumbers [numActiveDHTs] = DHT_Pin; DHT_TYPE [numActiveDHTs] = DHT_type; setPinModeCallback (DHT_Pin, PIN_MODE_DHT);

Sau đó FirmataExpress cố gắng giao tiếp với thiết bị DHT. Nếu có bất kỳ lỗi nào, nó sẽ tạo một thông báo SysEx với dữ liệu lỗi và gửi lại thông báo SysEx tới pymat4. Biến _bits giữ dữ liệu do thiết bị DHT trả về để pymata4 xử lý bổ sung nếu muốn.

Firmata.write (START_SYSEX);

Firmata.write (DHT_DATA); Firmata.write (DHT_Pin); Firmata.write (DHT_type); for (uint8_t i = 0; i> 7 & 0x7f); } Firmata.write (abs (rv)); Firmata.write (1); Firmata.write (END_SYSEX);

Nếu dữ liệu hợp lệ được trả về, số lượng DHT đang hoạt động sẽ tăng lên. Một biến theo dõi có bao nhiêu lần lặp vòng lặp để hoàn thành trước khi kiểm tra dữ liệu DHT tiếp theo cũng được điều chỉnh. Biến này đảm bảo rằng bất kể có bao nhiêu DHT được thêm vào hệ thống, tất cả chúng sẽ được đọc trong khoảng thời gian 2 giây.

int rv = readDhtSensor (numActiveDHTs);

if (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // tất cả ổn }

Nếu một hoặc nhiều thiết bị DHT đã được cấu hình trong chức năng vòng lặp của bản phác thảo, thì thiết bị DHT tiếp theo sẽ được đọc. Dữ liệu hợp lệ hoặc trạng thái lỗi của nó được trả về pymata4 dưới dạng thông báo SysEx:

if (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT); uint8_t current_pin = DHT_PinNumbers [nextDHT]; uint8_t current_type = DHT_TYPE [nextDHT]; dhtLoopCounter = 0; currentDHT = nextDHT; if (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0; } if (rv == DHTLIB_OK) {// KIỂM TRA CHECKSUM uint8_t sum = _bits [0] + _bits [1] + _bits [2] + _bits [3]; if (_bits [4]! = sum) {rv = -1; }} // gửi lại thông báo với trạng thái lỗi Firmata.write (START_SYSEX); Firmata.write (DHT_DATA); Firmata.write (current_pin); Firmata.write (loại_tính hiện_tại); for (uint8_t i = 0; i <sizeof (_bits) - 1; ++ i) {Firmata.write (_bits ); // Firmata.write (_bits ;} Firmata.write (abs (rv)); Firmata.write (0); Firmata.write (END_SYSEX);}}

Mã được sử dụng để giao tiếp với thiết bị DHT được lấy trực tiếp từ thư viện DHTNew:

int readDhtSensor (int index) {

// INIT BUFFERVAR ĐỂ NHẬN DỮ LIỆU uint8_t mask = 128; uint8_t idx = 0; // EMPTY BUFFER // memset (_bits, 0, sizeof (_bits)); for (uint8_t i = 0; i 5 BYTES for (uint8_t i = 40; i! = 0; i--) {loopCnt = DHTLIB_TIMEOUT; while (digitalRead (pin) == LOW) {if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;} uint32_t t = micros (); loopCnt = DHTLIB_TIMEOUT; while (digitalRead (pin) == HIGH) {if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;} if ((micros () - t)> 40) {_bits [idx] | = mask;} mask >> = 1; if (mask == 0) // byte tiếp theo? {Mask = 128; idx ++;}} return DHTLIB_OK;}

Bước 4: Sửa đổi Pymata4 để hỗ trợ DHT

private_constants.h

Để hỗ trợ DHT, chúng tôi cần thêm cả thông báo pin-type và SysEx mới vào tệp này:

# chế độ chân INPUT = 0x00 # chân đặt làm đầu vào OUTPUT = 0x01 # chân đặt làm đầu ra ANALOG = 0x02 # chân tương tự ở chế độ đầu vào tương tự PWM = 0x03 # chân kỹ thuật số ở chế độ đầu ra PWM SERVO = 0x04 # chân số ở chế độ đầu ra Servo I2C = 0x06 # chân có trong thiết lập I2C STEPPER = 0x08 # chân bất kỳ ở chế độ bước SERIAL = 0x0a PULLUP = 0x0b # Bất kỳ chân nào ở chế độ kéo lên SONAR = 0x0c # Bất kỳ chân nào ở chế độ SONAR TONE = 0x0d # Bất kỳ chân nào ở chế độ âm báo PIXY = 0x0e # dành riêng cho chế độ máy ảnh pixy DHT = 0x0f # cảm biến DHT IGNORE = 0x7f # DHT SysEx thông báo lệnh DHT_CONFIG = 0x64 # dht lệnh cấu hình DHT_DATA = 0x65 # dht cảm biến trả lời

Loại pin được thêm vào và các lệnh SysEx phải khớp với các giá trị trong FirmataConstants.h được thêm vào FirmataExpress.

pymata4.py

Pymata4 sử dụng từ điển Python để nhanh chóng kết hợp một thông điệp Firmata đến với một trình xử lý thông báo. Tên của từ điển này là report_dispatch.

Định dạng cho một mục từ điển là:

{MessageID: [message_handler, số byte dữ liệu sẽ được xử lý]}

Một mục đã được thêm vào từ điển để xử lý các tin nhắn DHT đến:

{PrivateConstants. DHT_DATA: [self._dht_read_response, 7]}

7 byte dữ liệu trong thông báo là số pin kỹ thuật số Arduino, loại thiết bị DHT (22 hoặc 11) và 5 byte dữ liệu thô.

Phương thức _dht_read_response kiểm tra mọi lỗi được báo cáo. Nếu không có lỗi nào được báo cáo, độ ẩm và nhiệt độ được tính bằng thuật toán được chuyển từ thư viện Arduino DHTNew.

Các giá trị được tính toán được báo cáo thông qua phương thức gọi lại do người dùng cung cấp. Chúng cũng được lưu trữ trong cấu trúc dữ liệu pin_data nội bộ. Giá trị cuối cùng được báo cáo có thể được gọi lại bằng cách polling pin_data bằng phương thức dht_read.

Cấu hình thiết bị DHT mới

Khi thêm một thiết bị DHT mới, phương thức set_pin_mode_dht được gọi. Phương pháp này cập nhật dữ liệu pin_data cho các chân kỹ thuật số. Nó cũng tạo và gửi một thông điệp DHT_CONFIG SysEx đến FirmataExpress.

Bước 5: Kết thúc

Như chúng ta đã thấy, việc thêm hỗ trợ Firmata cho một thiết bị mới yêu cầu bạn phải sửa đổi mã máy chủ Arduino FirmataExpress và mã máy khách pymata4 dựa trên Python. Mã FirmataExpress có thể khó gỡ lỗi. Một phương thức gọi là printData đã được thêm vào FirmataExpress để hỗ trợ gỡ lỗi. Phương pháp này cho phép bạn gửi các giá trị dữ liệu từ FirmataExpress và sẽ in chúng trên bảng điều khiển pymata4.

Hàm này yêu cầu cả một con trỏ đến một chuỗi ký tự và giá trị bạn muốn xem. Nếu giá trị dữ liệu được chứa trong một biến có tên là argc, bạn có thể gọi printData với các tham số sau.

printData ((char *) "argc =", argc);

Nếu bạn có bất kỳ câu hỏi nào, chỉ cần để lại bình luận, và tôi sẽ sẵn lòng giải đáp.

Chúc bạn viết mã vui vẻ!

Đề xuất: