Как отправить номера в Arduino UNO через Python 3 и серийный номер модуля

9

Я новичок в Arduino (и компьютерное программирование в целом), поэтому я прошу прощения, если этот вопрос выглядит глупо.

После того, как я установил основное соединение Arduino-LED, у меня возникают проблемы с отправкой 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()

что я делаю не так или недоразумение? Спасибо.

mickkk
источник
1
Попробуйтеarduino.write(chr(valueToWrite))
Гербен
Это решение не работает даже для символов. Более того, что касается символов, оно работает нормально, просто отправляя их в виде байтов, таких как: b'm '. В любом случае, спасибо за ответ.
Миккк

Ответы:

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))

Или что-то в этом роде.

Игнасио Васкес-Абрамс
источник
Большое спасибо! Это именно то, что я искал!
Миккк
Несмотря на то, что пустое поле для комментариев говорит серый текст, я скажу спасибо! Пытался записать поток битов (программный файл 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()).

jfpoilpret
источник
Этот ответ был не совсем тем, о чем я просил, однако он был очень полезен, и я буду его использовать! Огромное спасибо за помощь!
Миккк