Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor programare PWM pentru motoare raspberry pi - python


matzah

Postări Recomandate

Salutari,

 

Nou fiind in ale programarii incerc sa scriu un programel ce mi-ar permite ca folosind o tastatura sa comand 2 motoare (printr-un L298) . Ma intereseaza atat sa pot porni motoarele (inainte, inapoi, stanga. dreapta - un fel de masinuta telecomandata) cat si folosind pwm sa stabilesc viteza de deplasare. Inspirandu-ma din diferite surse am compus urmatorul programel:

import RPi.GPIO as gpioimport timeimport sys, tty, termios, timeimport osgpio.setmode(gpio.BOARD)motorpwm1_in1_pin = 12motorpwm1_in2_pin = 16gpio.setup(motorpwm1_in1_pin, gpio.OUT)gpio.setup(motorpwm1_in2_pin, gpio.OUT)motorpwm1 = gpio.PWM(12,100)motorpwm1 = gpio.PWM(16,100)motorpwm1.start(0)motorpwm1.ChangeDutyCycle(0)motorpwm2_in1_pin = 18motorpwm2_in2_pin = 22gpio.setup(motorpwm2_in1_pin, gpio.OUT)gpio.setup(motorpwm2_in2_pin, gpio.OUT)motorpwm2 = gpio.PWM(18,100)motorpwm2 = gpio.PWM(22,100)motorpwm2.start(0)motorpwm2.ChangeDutyCycle(0)    gpio.setmode(gpio.BOARD)gpio.setup(7, gpio.OUT)gpio.setup(11, gpio.OUT)gpio.setup(13, gpio.OUT)gpio.setup(15, gpio.OUT)   def inainte():    gpio.output(7, False)    gpio.output(11, True)    gpio.output(13, True)    gpio.output(15, False)    def inapoi():    gpio.output(7, True)    gpio.output(11, False)    gpio.output(13, False)    gpio.output(15, True)def stanga():    gpio.output(7, True)    gpio.output(11, True)    gpio.output(13, True)    gpio.output(15, False)    def dreapta():    gpio.output(7, False)    gpio.output(11, True)    gpio.output(13, False)    gpio.output(15, False)    def pivot_stanga():    gpio.output(7, True)    gpio.output(11, False)    gpio.output(13, True)    gpio.output(15, False)def pivot_dreapta():    gpio.output(7, False)    gpio.output(11, True)    gpio.output(13, False)    gpio.output(15, True)def stop():    gpio.output(7, False)    gpio.output(11, False)    gpio.output(13, False)    gpio.output(15, False)    def getch():    fd = sys.stdin.fileno()    old_settings = termios.tcgetattr(fd)    try:        tty.setraw(sys.stdin.fileno())        ch = sys.stdin.read(1)    finally:        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)    return ch    while True:    char = getch()    if char == 'w':        inainte()    elif char == 's':        inapoi()    elif char == 'a':        stanga()    elif char == 'd':        dreapta()    elif char == 'q':        pivot_stanga()    elif char == 'e':        pivot_dreapta()    elif char == 'm':        stop()    elif char == '1':        speed == 40    elif char == 'x':        print("Shutdown")        break    else:        pass       

deci, programelul defineste 4 pini GPIO pentru comanda ON/OFF a motoarelor si 4 pini pentru PWM. Apoi am definit cateva functii (inainte, inapoi etc) ce contin ce-ar trebui sa trimita pinii GPIO pentru a actiona motoarele intr-un anume fel. Folosind getch fac "achizitia" de caractere de la tastatura. Apoi in functie de tasta apasata, initiez vreuna din functiile mele definite mai sus.

 

Nu stiu cum sa introduc in  program si partea de PWM, respectiv as fi dorit ca de exemplu, cand apas tasta 1 - sa folosesc motoarele la 33% din viteza, cand apas 2 - 66% din viteza si cand apas 3 - 100% din viteza.

As fi putut defini o variabila, speed sa-i zicem si atunci cand apas "1" si verific cu if char == '1' sa trec un speed == 33

Apoi in functia "inainte" ar aparea inca o linie motorpwm1.ChangeDutyCycle(speed) unde speed este variabila mea cu valoarea de 33 stabilita anterior.

 

Problema este ca asa cum e scris programul atunci cand apas 1 si "selectez" prima viteza, cand voi apasa ulterior w si voi initia functia "inainte" ea nu va tine cont de ce s-a intamplat anterior cand am apasat 1. Este un if/else acolo, ori asa - ori asa.

Stiu ca .. cumva trebuie ca speed sa fie un neam de variabila globala, odata alocata o valoare sa ramana in memorie pana o schimb cu alta, iar celelalte functii (inainte, inapoi etc) s-o foloseasca ca atare, cu ultima valoare definita, dar nu stiu cum sa transpun asta in cod.

 

Ma poate ajuta cineva?

Link spre comentariu
  • Răspunsuri 7
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    4

  • matzah

    4

Top autori în acest subiect

Imagini postate

nu am o schema propriu zisa dar lucrurile se leaga cam asa

 

pinii pt motorul 1 (on/off) merg la raspberry, pinul 7 si pinul 11

pinii pt motorul 2 (on/off) merg la raspberry, pinul 13 si pinul 15

 

pinii pwm (enable a. pt motor 1, la l298) merg la raspberry, pinul 12 si pinul 16

pinii pwm (enable b. pt motor 2, la l298) merg la raspberry, pinul 18 si pinul 22

 

l298 la mine vine montat pe o astfel de placuta:

post-175659-0-80986700-1424762526_thumb.jpg

Editat de matzah
Link spre comentariu

OK, am inteles.Ce te face sa crezi ca o data setat duty-cycle (cu "1") se va schimba cand modifici directia?Dupa parerea mea, daca modifici duty-cycle pentru motorul 1 ca in codul:

    elif char == '1':        speed == 40        motorpwm1.ChangeDutyCycle(speed)
vei stabili viteza motorului 1 indiferent de ce comenzi dai mai departe.Daca vrei sa folosesti diverse taste pe post de acceleratie/frana, poti folosi codul anterior cu un pas
    elif char == '1':        speed == speed + step        motorpwm1.ChangeDutyCycle(speed)    elif char == '2':        speed == speed - step        motorpwm1.ChangeDutyCycle(speed)
Repet, parerea mea.
Link spre comentariu

Sa inteleg ca daca folosesc prima bucatica de cod prezentata de tine, motorpwm1.ChangeDutyCycle(0) declarat in inceputul programului postat de mine se modifica cu motorpwm1.ChangeDutyCycle(speed) iar alte comenzi ulterioare ce folosesc vreuna din functiile "inainte" "inapoi" etc, folosesc aceleasi setari pentru PWM?

 

parca stiu ca facusem chestia asta si se plangea de ceva legat de niste variabile declarate aiurea... nu mai retin exact..

o sa incerc diseara mai exact sa vad cum se comporta si revin.

Link spre comentariu

PWM-ul nu are motive sa se modifice in if char == 'w'.Posteaza erorile. N-am facut eu nimic cu python pana acum, da' poate ma prin eu, poate se mai uita si altcineva.PS Acum vad. Nu cred ca e o idee buna sa folosesti char pe post de nume de variabila, s-ar putea sa fie cuvant cheie in python.Foloseste un nume de care sa fii sigur ca nu deranjeaza (readChar ?).LE M-am uitat acum si se pare ca in python char nu e cuvant cheie.

Link spre comentariu

s-a rezolvat. uitandu-ma in programul salvat de mine ultima data, facusem exact cum ai zis insa primeam o eroare precum ca "name speed not assigned" din cauza ca foloseam "speed == 40". Aparent trebuie sa folosesc "speed = 40" . E o... chestie de python. Din cauza asta credeam ca atunci cand fac un if char == 'w' programul uita de speed. Acum merge corect. am folosit varianta a 2-a data de tine si o sa adaug un if pentru a verifica sa nu depasesc pwm 100.

Multumesc ca m-ai adus pe directia buna, eu deja studiam variabile globale si alte chestii de genul...

Editat de matzah
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări