Я новичок как в Arduino, так и в python, и мне не удалось найти рабочий ответ. В настоящее время мой проект требует, чтобы я отправлял данные на свой arduino uno из текстового файла. Я пытался использовать программу python для чтения значений из текстового файла и отправки их на свой Arduino. Затем arduino должен использовать эти значения для управления двигателем. Я пробовал более простые тесты, такие как отправка высокого и низкого сигнала на двигатель, но проблема, похоже, возникает при отправке целых чисел и чисел с плавающей запятой в качестве входных данных для analogWrite (). Я бы предпочел использовать числа с плавающей запятой для большей точности, но рабочая система важнее.
Изменить: исправлено путем изменения b'number 'на number.encode (). Мне все еще интересно решение проблемы с Serial.available ().
Arduino :
const int motorPin = 9;
float input = 0;
void setup() {
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
}
void loop(){
if (Serial.available()) {
Serial.println("data has been entered");
float x = Serial.parseFloat();
if (x > 0) {
input = x;
analogWrite(motorPin, input);
}
}
Serial.print(input);
Serial.println(" was used");
}
В качестве примечания: у меня также была проблема где Serial.available () всегда будет возвращать истину после чтения всех значений, и я бы прочитал одно дополнительное значение 0. Это аргумент в пользу второго оператора if. Если есть способ получше, дайте мне знать. Я хотел бы прочитать 0, если они есть в данных.
Python:
import serial
import time
#Set by deault to COM4 -- change as needed
arduino = serial.Serial('COM4', 9600)
#Allow connection between the ports to clear
time.sleep(2)
#Start an infinite loop to send data from acceleration text file to Arduino
f = open("accel_vals-1.txt", "r")
while 1:
#will need to check later on if file can write while loop is running
for number in f:
arduino.write(b'number')
print(number + " entered")
time.sleep(1)
#Close file after program ends
f.close()
Текстовый файл :
0
10
20
30
40
50
60
70
80
90
100
90
80
70
60
50
40
30
20
10
0
100
200
250
200
100
0