Як надіслати номери Arduino UNO через Python 3 та серійний модуль


9

Я новачок у Arduino (і комп'ютерному програмуванні взагалі), тому прошу вибачення, якщо це питання виглядає нерозумно.

Після встановлення базового ардуїно-світлодіодного з'єднання у мене виникли проблеми з надсиланням INTEGERS до arduino через послідовний порт. Я легко можу надсилати символи, такі як 'm', 'o' і т. Д. Однак, якщо я надішлю номер, він виглядає так, що його просто не отримують.

Ось код Arduino, в ідеалі він повинен отримати значення з порту usb через python або послідовний монітор, а потім відрегулювати яскравість світлодіода відповідно до значення. (значення повинно бути в діапазоні [0,255]).

ПРИМІТКА. Я використовую ARDUINO UNO та PYTHON 3

// --------------------------

int LED = 10;
int number;

void setup(){

pinMode(LED,OUTPUT);
Serial.begin(9600);
}

void loop(){

number = Serial.read();
Serial.print(number);
Serial.print('\n');
if(number == -1){
number = 0;
}

else if(number > 255){

number = 255;

}

else if(number < 0){

number = 0;
}

analogWrite(LED,number);
delay(1000);
}

Однак, коли я ввожу значення в послідовний порт або через Python, наприклад 0, він дає мені 48 як відповідь (що, що цікаво, є ASCII код на 0!) І загоряється світлодіод, який не має відбуватися з того часу при 0 світлодіод повинен вимкнутись !! Я щось пропускаю, але не можу знайти що ... Скажіть, будь ласка, що не так?

Ось код, який я використовую в Python:

import serial
import time
try:
    arduino = serial.Serial(port,speed)
    time.sleep(2)
    print("Connection to " + port + " established succesfully!\n")
except Exception as e:
    print(e)

#Note: for characters such as 'a' I set data = b'a' to convert the data in bytes
#However the same thing does not work with numbers...
data = 0
data = arduino.write(valueToWrite)
time.sleep(2)
arduino.close()

що я роблю неправильно чи нерозумію? Дякую.


1
Спробуйтеarduino.write(chr(valueToWrite))
Гербен

Це рішення не працює навіть для символів. Крім того, що стосується символів, то воно добре працює, просто надсилаючи їх у вигляді байтів, таких як: b'm '. У будь-якому випадку, дякую за відповідь.
mickkk

Відповіді:


6

Парсинг на Arduino може бути повільним і трудомістким (що погано, якщо ви використовуєте годинник для передвиборного годинника або маєте критичні за часом завдання), тому давайте зробимо це в Python.

Проблема полягає в тому, що ви надсилаєте номери як ASCII, тоді як вам потрібно надсилати їх як необроблені двійкові. Ось де structзаходить.

3>> import struct
3>> print(struct.pack('>B', 0))
b'\x00'
3>> print(struct.pack('>B', 255))
b'\xff'
3>> print(struct.pack('>2B', 255, 0))
b'\xff\x00'
3>> print(struct.pack('>H', 9000))
b'#('

Тож, чого ви дійсно хочете, це:

data = arduino.write(struct.pack('>B', valueToWrite))

або щось для цього.


Дуже дякую! Це саме те, що я шукав!
mickkk

Незважаючи на те, що в порожній коробці коментарів сірий текст говорить, я збираюся сказати подяку! Намагався записати бітовий потік (програмний файл FPGA .bin) на мікросхему SPI, використовуючи Teensy 3.2 з Arduino як інтерфейс для ПК ->, і це було ключовим фактором для того, щоб він працював на ПК.
KyranF

1

Serial.read()зчитує лише один символ із послідовного порту та повертає його значення ASCII, що пояснює 48отримане вами.

Щоб прочитати повне число, у вас є 2 варіанти:

  1. Використовуйте Serial.parseInt()те, що читає стільки символів, скільки потрібно, і виконує перетворення, перш ніж повертати прочитане число як int. Будь ласка, перевірте посилання тут.
  2. Ви читали eachn характеру в циклі (з Serial.read()) до останнього, помістити кожен читання charcater в буфер ( charмасив) , а потім перетворити отриману рядок в число зі стандартною функцією C atoi.

Звичайно, перший варіант є найпростішим, але він повернеться, 0якщо нічого не буде прочитано після тайм-ауту 1-го (налаштовується з Serial.setTimeout()).


Ця відповідь була не точно те, про що я просив, проте вона була дуже корисною, і я буду її використовувати! Дуже дякую за допомогу!
mickkk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.