matzah Postat Februarie 23, 2015 Partajează Postat Februarie 23, 2015 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
Liviu M Postat Februarie 24, 2015 Partajează Postat Februarie 24, 2015 O schema de conectare a motoarelor (l298) la raspi ai? Link spre comentariu
matzah Postat Februarie 24, 2015 Autor Partajează Postat Februarie 24, 2015 (editat) 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: Editat Februarie 24, 2015 de matzah Link spre comentariu
Liviu M Postat Februarie 24, 2015 Partajează Postat Februarie 24, 2015 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
matzah Postat Februarie 24, 2015 Autor Partajează Postat Februarie 24, 2015 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
Liviu M Postat Februarie 24, 2015 Partajează Postat Februarie 24, 2015 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
matzah Postat Februarie 24, 2015 Autor Partajează Postat Februarie 24, 2015 (editat) 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 Februarie 24, 2015 de matzah Link spre comentariu
Liviu M Postat Februarie 24, 2015 Partajează Postat Februarie 24, 2015 (editat) He, he nici nu m-am uitat la ce am copiat. In mod normal (adica la c, de exemplu) == e folosit pentru a testa egalitatea, iar = e folosti pentru alocare (aloci o valoare unei variabile). Am verificat acum si python are aceleasi "conventii". Editat Februarie 24, 2015 de Liviu M Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum