Мой одноклассник и я работали над этим проектом, основываясь на этой статье Instructables https://www.instructables.com/id/Building-a-Simple-Pendulum-and-Measuring-Motion-Wi/, наша идея состоит в том, чтобы создать маятник, рассчитать силу g (из периода маятника) и затем показать ее значение на ЖК-дисплеемы подключились к Arduino.Мы запустили и запустили код (он рассчитывает период), и мы поняли, что Arduino должен выполнить какой-то тип преобразования (utf-8), чтобы передать значения, которые он получает от потенциометра в Python.Однако, когда мы пытаемся отправить значение, которое мы получаем из расчета периода графика, обратно в arduino и отображаем его на ЖК-дисплее, он показывает 634 или другие подобные значения, мы попытались вместо декодирования, которое оно делает изначально, перейти к другомус кодированием, но это не сработает.Мы не можем проверить значение, которое он получает от последовательного порта, потому что монитор последовательного порта просто не открывается во время работы скрипта python.Какой самый практичный способ мы можем использовать для «переноса» поплавков, рассчитанных в скрипте Python, в Arduino, чтобы мы могли вычислить g и показать его на экране.Многие форумы советуют вместо того, чтобы передавать поплавки, преобразовывать их в строки, так как arduino будет легко получить, но мы не уверены, что это сработает.Я уверен, что это простой вопрос, но мы просто не можем его понять.Если вы обнаружите что-то еще не так с кодом, пожалуйста, дайте мне знать, мы знаем, что это немного схематично.Спасибо.
Код Python:
arduino = serial.Serial('COM3', 115200, timeout=.1) #Open connection to Arduino
samples = 200 #We will take this many readings
angle_data = np.zeros(samples) #Creates a vector for our angle data
time_data = np.zeros(samples) #Creates a vector of same length for time
i = 0;
calibrate = 123 #Value to zero potentiometer reading when pendulum is motionless, read from Arduino
while i!=samples:
data = arduino.readline()[0:-2].decode('utf-8')
if data:
angle_data[i] = (float(data) - calibrate)*math.pi/180
time_data[i] = time.perf_counter()
print(angle_data[i])
i = i + 1
min = np.min(angle_data)
print (min)
min_pos, = np.where(angle_data == min)
min_x = time_data[min_pos]
print (min_x)
nos_left = int(min_pos)
max = 0;
for i in range(nos_left,200):
if angle_data[i] > max: max = angle_data[i]
print (max)
max_pos, = np.where(angle_data == max)
max_x = time_data[max_pos]
print (max_x)
period = (max_x - min_x) * 2
print (period)
gforce = (0.165 * 4 * (math.pi) * (math.pi)) / ((period) * (period))
print (gforce)
value_g = arduino.write(gforce)
plt.plot(time_data,angle_data,'ro')
plt.axis([0,time_data[samples-1],-math.pi,math.pi])
plt.xlabel("Time (seconds)")
plt.ylabel("Angle (Radians)")
plt.title("Pendulum Motion - Measured with Arduino and potentiometer")
plt.show()
arduino.close()
Код Arduino
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int period = 0;
void setup() {
lcd.begin(16, 2);
Serial.begin(115200); // use the same baud-rate as the python side
pinMode(A0,INPUT);
lcd.print(" Pendulo ");
int gforce = 0;
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
// print the number of seconds since reset:
int degrees;
degrees = getDegree();
Serial.println(degrees);
Serial.println("\n");
delay(50);
if (Serial.available() > 0) {
// read the incoming byte:
gforce = Serial.read();
Serial.print("I received: ");
Serial.println(gforce, DEC);
}
lcd.setCursor(0, 1);
lcd.print(gforce);
}
int getDegree()
{
int sensor_value = analogRead(A0);
float voltage;
voltage = (float)sensor_value*5/1023;
float degrees = (voltage*300)/5;
return degrees;
}