Arduino med Python via Pyfirmata - problem

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: Arduino med Python via Pyfirmata - problem

Inlägg av KLset »

Om guckrums exempel funkar kan du testa att ersätta sleep(1) som du har i din kod med pyplot.pause(1). Jag gjorde en snabb sökning och fann att pyplot kan behöva ett anrop till just pyplot.pause för att ge tid till att uppdatera. Och att ett anrop till pyplot.draw direkt efter pyplot.pause är redundant, då pyplot.draw anropas inuti pyplot.pause från vad jag läst.
Ampere
Inlägg: 11
Blev medlem: 22 mars 2018, 21:14:21

Re: Arduino med Python via Pyfirmata - problem

Inlägg av Ampere »

Har koden i IDLE. Sen öppnar jag kommandoprompten på min windows-dator och skriver in plotLive.py. Har ändrat i path så att min Python27-mapp finns med där. Har även ställt mig i Python27-mappen med kommandoprompten.

Enligt läroboken jag följer så samspelar .ion(), .draw(), .set_xdata() och .set_ydata(). Pyplot.ion() kallas för det interaktiva modet, dvs det som gör att det skrivs ut live. "Once the interactive mode is set to True, the plot will only be drawn when the draw() method is called."

Sätts pyplot.ion() till sann i koden som den ser ut?

guckrum, KLset, jag ska labba med era tips.
Ampere
Inlägg: 11
Blev medlem: 22 mars 2018, 21:14:21

Re: Arduino med Python via Pyfirmata - problem

Inlägg av Ampere »

guckrum. Din kod funkade. Ska göra ett försök att ändra om i grundkoden efter dessa ideer. Gör en återkoppling i morgon om jag fått till det.
Ampere
Inlägg: 11
Blev medlem: 22 mars 2018, 21:14:21

Re: Arduino med Python via Pyfirmata - problem

Inlägg av Ampere »

Sliter nu mitt hår med denna övning. Jag provade nästa övning och den fungerade. Jag har försökt jämföra de två, men kan ändå inte få till det.

Nästa övning som funkar:

Kod: Markera allt

import sys
from matplotlib import pyplot
import pyfirmata
from time import sleep
import Tkinter


def onStartButtonPress():
    while True:
        if flag.get():
            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
            top.update()
        else:
            flag.set(True)
            break


def onPauseButtonPress():
    flag.set(False)


def onExitButtonPress():
    print "Exiting...."
    onPauseButtonPress()
    board.exit()
    pyplot.close(fig)
    top.quit()
    top.destroy()
    print "Done."
    sys.exit()

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

# Tkinter canvas
top = Tkinter.Tk()
top.title("Tkinter + matplotlib")

# Create flag to work with indefinite while loop
flag = Tkinter.BooleanVar(top)
flag.set(True)

pyplot.ion()

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

# Create Start button and associate with onStartButtonPress method
startButton = Tkinter.Button(top,
                             text="Start",
                             command=onStartButtonPress)
startButton.grid(column=1, row=2)

# Create Stop button and associate with onStopButtonPress method
pauseButton = Tkinter.Button(top,
                             text="Pause",
                             command=onPauseButtonPress)
pauseButton.grid(column=2, row=2)

# Create Exit button and destroy the window
exitButton = Tkinter.Button(top,
                            text="Exit",
                            command=onExitButtonPress)
exitButton.grid(column=3, row=2)

top.mainloop()
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: Arduino med Python via Pyfirmata - problem

Inlägg av KLset »

Som guckrum skrev är det bra att försöka isolera problemet. Utgå från den lilla koden som guckrum postade som ju fungerade, och så lägger du till de anrop som finns i din problemkod i små steg.

Sen är det kanske lite saftigt att börja med att både använda matplotlib och pyfirmata samtidigt om du inte kan Python ännu. Här är några grundläggande saker som du kan börja med att lära dig: loopar (while, for), "iterators", datatyper (list, dictionary, integer, string), funktioner, avbrott/exceptions. Det finns en gratis bok online för Python 2: http://openbookproject.net/thinkcs/python/english2e och en för Python 3: http://openbookproject.net/thinkcs/python/english3e/.
Ampere
Inlägg: 11
Blev medlem: 22 mars 2018, 21:14:21

Re: Arduino med Python via Pyfirmata - problem

Inlägg av Ampere »

Slutligen fick jag till en lösning på det hela. Det var något i hur den ursprungliga loopen var designad som gjorde att pyplots-metod figure hamnade i ett "icke kommunikativt" läge, gissar jag. Ur en kombination av flertal andra fungerande exempel fick jag till nedanstående och fortsätter nu framåt i boken... Återkommer säkert med fler frågeställningar.

Kod: Markera allt

from matplotlib import pyplot
import pyfirmata

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

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

pyplot.ion()                        # Initialize interactive mode

pData = [0.0] * 25              # Set list "pData" to a flat-line, 25 zeroes
pyplot.title('Real-time Potentiometer reading')         # Naming the plot
pyplot.xlim([0, 25])             # Set x-axes min/max
pyplot.ylim([0, 1])               # Set y-axes min/max
l1, = pyplot.plot(pData)        # Assigning pData as y-values 

# Real-time plotting loop
while True:
        pData.append(float(a0.read()))      # Adding potentiometer reading last in list pData
        del pData[0]
        l1.set_ydata(pData)                    # update the data with potentiometer reading
        pyplot.draw()                             # Update the plot
        pyplot.pause(1)                         # Reading potentiometer values every second
Användarvisningsbild
KLset
Inlägg: 207
Blev medlem: 31 augusti 2014, 17:36:19
Ort: Uppsala

Re: Arduino med Python via Pyfirmata - problem

Inlägg av KLset »

Härligt! :tumupp:
Skriv svar