Buggfix Plus
Aktuellt datum och tid: 19.08 2018-04-25

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 22 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
InläggPostat: 21.25 2018-03-22 

Blev medlem: 21.14 2018-03-22
Inlägg: 11
Hej,
jag försöker lära mig att programmera Python för att styra en Arduino mha Pyfirmata. Uppgiften är att grafiskt visa utslaget från en vridpotentiometer. Det ska ske "live" Problemet är att fönstret öppnar, men det är väldigt litet samt att ingen graf skrivs ut i fönstret.
Koden ser ut som följer:

#!/usr/bin/python

# This code is supporting material for the book
# Python Programming for Arduino
# by Pratik Desai
# published by PACKT Publishing

import sys, csv
from matplotlib import pyplot
import pyfirmata
from time import sleep
import numpy as np

# Associate port and board with pyFirmata
port = 'COM5'
board = pyfirmata.Arduino(port)

# Using iterator thread to avoid buffer overflow
it = pyfirmata.util.Iterator(board)
it.start()

# Assign a role and variable to analog pin 0
a0 = board.get_pin('a:0:i')

# Initialize interactive mode
pyplot.ion()

pData = [0.0] * 25
fig = pyplot.figure()
pyplot.title('Real-time Potentiometer reading')
ax1 = pyplot.axes()
l1, = pyplot.plot(pData)
pyplot.ylim([0, 1])

# Real-time plotting loop
while True:
try:
#print pData
sleep(1)
pData.append(float(a0.read()))
pyplot.ylim([0, 1])
del pData[0]
l1.set_xdata([i for i in xrange(25)])
l1.set_ydata(pData) # update the data

pyplot.draw() # update the plot
except KeyboardInterrupt:
board.exit()
break


Några "libs" finns nog där för framtida bruk, tror jag...

Nån som kan hjälpa mig på traven?


Upp
 Profil  
 
InläggPostat: 21.37 2018-03-22 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 36305
Ort: Söderköping
Jag har inget direkt svar, men det skulle i alla fall
underlätta för den som vill kolla koden om du postar
den med [code][/code] taggarna före och efter.


Upp
 Profil  
 
InläggPostat: 21.46 2018-03-22 

Blev medlem: 21.14 2018-03-22
Inlägg: 11
Tack för tipset! Testar igen...

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#!/usr/bin/python

# This code is supporting material for the book
# Python Programming for Arduino
# by Pratik Desai
# published by PACKT Publishing

import sys, csv
from matplotlib import pyplot
import pyfirmata
from time import sleep
import numpy as np

# Associate port and board with pyFirmata
port = 'COM5'
board = pyfirmata.Arduino(port)

# Using iterator thread to avoid buffer overflow
it = pyfirmata.util.Iterator(board)
it.start()

# Assign a role and variable to analog pin 0
a0 = board.get_pin('a:0:i')

# Initialize interactive mode
pyplot.ion()

pData = [0.0] * 25
fig = pyplot.figure()
pyplot.title('Real-time Potentiometer reading')
ax1 = pyplot.axes()
l1, = pyplot.plot(pData)
pyplot.ylim([0, 1])

# Real-time plotting loop
while True:
    try:
        sleep(1)
        pData.append(float(a0.read()))
        pyplot.ylim([0, 1])
        del pData[0]
        l1.set_xdata([i for i in xrange(25)])
        l1.set_ydata(pData)  # update the data
         pyplot.draw()  # update the plot
    except KeyboardInterrupt:
        board.exit()
        break


Upp
 Profil  
 
InläggPostat: 21.56 2018-03-22 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 144
Ort: Uppsala
Har du kört något fungerande exempel med bara pyplot, så att du vet att det fungerar som det ska? Det finns exempel som du kan testa på https://matplotlib.org/examples/pyplots/index.html.


Upp
 Profil  
 
InläggPostat: 22.07 2018-03-22 

Blev medlem: 21.14 2018-03-22
Inlägg: 11
Jag använde pyplot framgångsrikt i föregående övning, som såg ut som följer:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#!/usr/bin/python

# This code is supporting material for the book
# Python Programming for Arduino
# by Pratik Desai
# published by PACKT Publishing


import csv
from matplotlib import pyplot

i = []
mValues = []
pValues = []

with open('SensorDataStore.csv', 'r') as f:
    reader = csv.reader(f)
    header = next(reader, None)
    for row in reader:
        i.append(int(row[0]))
        pValues.append(float(row[1]))
        if row[2] == 'True':
            mValues.append(1)
        else:
            mValues.append(0)

pyplot.subplot(2, 1, 1)
pyplot.plot(i, pValues, '-')
pyplot.title('Line plot - ' + header[1])
pyplot.xlim([1, 25])
pyplot.xlabel('X Axis')
pyplot.ylabel('Y Axis')

pyplot.subplot(2, 1, 2)
pyplot.bar(i, mValues)
pyplot.title('Bar chart - ' + header[2])
pyplot.xlim([1, 25])
pyplot.xlabel('X Axis')
pyplot.ylabel('Y Axis')

pyplot.tight_layout()

pyplot.show()


Upp
 Profil  
 
InläggPostat: 22.20 2018-03-22 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 144
Ort: Uppsala
En vild gissning bara men kanske det saknas ett pyplot.show() innan loopen?


Upp
 Profil  
 
InläggPostat: 20.23 2018-03-23 

Blev medlem: 21.14 2018-03-22
Inlägg: 11
Testade med en pyplot.show() på lite olika ställen i programmet. Ingen skillnad. Fönstret öppnar, men är mycket litet och när jag hovrar markören i fönstret så snurrar "timglaset".

Några fler uppslag att prova?


Upp
 Profil  
 
InläggPostat: 21.32 2018-03-23 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 144
Ort: Uppsala
Då tänker jag att det kanske är något i loopen. Vad händer om du ersätter den med koden nedan?

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
# Real-time plotting loop
pData.append(float(a0.read()))
pyplot.ylim([0, 1])
del pData[0]
l1.set_xdata([i for i in xrange(25)])
l1.set_ydata(pData)  # update the data
pyplot.draw()  # update the plot


Upp
 Profil  
 
InläggPostat: 09.46 2018-03-24 

Blev medlem: 21.14 2018-03-22
Inlägg: 11
Jag antog att du menade inne i try:-uttrycket. Jag provade att ersätta koden, ingen skillnad i resultat.
Sleep(1) är väl där för att skapa fördröjning för att uppdatera värdet varje sekund?

Jag för även nedanstående felmeddelande i kommandoprompten när jag startar upp programmet.Förstår det inte fullt ut, men har provat att namnge x- och y-axeln med pyplot.xlabel('tid'). Då blir det ett syntax error.

C:\Python27\lib\site-packages\matplotlib\cbook\deprecation.py:107: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
warnings.warn(message, mplDeprecation, stacklevel=1)


Upp
 Profil  
 
InläggPostat: 11.24 2018-03-24 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 144
Ort: Uppsala
Jag menade att du tar bort själva loopen, det vill säga while-uttrycket. Då ska det se ut så här istället:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#!/usr/bin/python

# This code is supporting material for the book
# Python Programming for Arduino
# by Pratik Desai
# published by PACKT Publishing

import sys, csv
from matplotlib import pyplot
import pyfirmata
from time import sleep
import numpy as np

# Associate port and board with pyFirmata
port = 'COM5'
board = pyfirmata.Arduino(port)

# Using iterator thread to avoid buffer overflow
it = pyfirmata.util.Iterator(board)
it.start()

# Assign a role and variable to analog pin 0
a0 = board.get_pin('a:0:i')

# Initialize interactive mode
pyplot.ion()

pData = [0.0] * 25
fig = pyplot.figure()
pyplot.title('Real-time Potentiometer reading')
ax1 = pyplot.axes()
l1, = pyplot.plot(pData)
pyplot.ylim([0, 1])

# Real-time plotting loop
pData.append(float(a0.read()))
pyplot.ylim([0, 1])
del pData[0]
l1.set_xdata([i for i in xrange(25)])
l1.set_ydata(pData)  # update the data
pyplot.draw()  # update the plot


Med andra ord ska koden ovan bara ta en mätning med a0.read() och sedan visa grafen. Det är tanken i alla fall. Funkar den koden?


Upp
 Profil  
 
InläggPostat: 11.33 2018-03-24 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 144
Ort: Uppsala
Felmeddelandet som du får är inget syntaxfel, det är en varning som författarna av matplotlib har lagt in för att varna användare i förtid att beteendet i API:et kommer att förändras i en framtida version.


Upp
 Profil  
 
InläggPostat: 12.01 2018-03-24 

Blev medlem: 08.04 2012-06-19
Inlägg: 137
Ort: Lund
Det kan vara en genväg till snabbt resultat att klippa in ett stycke kod någonstansifrån och sedan "bara ändra lite", men eftersom du säger
Citera:
jag försöker lära mig att programmera Python...
och inte "jag vill bara få precis det här programmet att snurra", så kanske en annan metod är att föredra, speciellt om man kört fast.

Några tips, i all välmening
- När du får problem, försök isolera det, till exempel genom att försöka skapa ett så litet program som möjligt som har problemet. Då löser det sig ofta. Om du fortfarande behöver hjälp, posta det minimala problemet.
- Inkludera inte en massa saker du inte använder. Kolla om inte din editor kan göra grundläggande koll av koden.
- Läs felmeddelandena. En "Warning" är inte ett "syntax error". Det kanske känns otillräckligt, men texten är för att hjälpa dig.
- Om du är osäker, tex på vad "sleep(1)" gör, läs på och/eller testa, tex genom att skriva ett minimalt program
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  print("före")
  sleep(1)
  print("efter")
Sedan lider jag lite med dig för jag tycker inte att pyplots API(er) är speciellt lättbegripliga.


Upp
 Profil  
 
InläggPostat: 15.54 2018-03-24 

Blev medlem: 21.14 2018-03-22
Inlägg: 11
Provade med att ta bort loopen och ersätta enligt förslag, men ingen skillnad.

Ska kika på om jag kan isolera felet mer. Har försökt i ett par timmar tre kvällar i rad men inte lyckats än...


Upp
 Profil  
 
InläggPostat: 16.38 2018-03-24 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 144
Ort: Uppsala
Hur kör du koden? Från någon IDE typ IDLE, från en IPython-prompt eller genom python.exe?


Upp
 Profil  
 
InläggPostat: 16.47 2018-03-24 

Blev medlem: 08.04 2012-06-19
Inlägg: 137
Ort: Lund
matplotlib :evil:

Här har du en grund som du kanske kan använda
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
from matplotlib import pyplot as plt
from math import sin

plt.ion()
plt.show()

for x in range(10):
        plt.plot([sin((x + t)/3.14) for t in range(20)])
        plt.draw()
        plt.pause(1)


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 22 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 3 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
    Agstu.se
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010