Vraag


Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Hallo tweakers,

Ik ben op dit moment druk bezig met mijn PWS. Hiervoor wil ik o.a. een motor aansturen door middel van een druksensor. Wanneer er hoge druk op de sensor is moet de motor een kant op draaien en wanneer er geen druk is een andere kant. Wanneer de druk gemiddeld is moet de motor stil staan. Ik gebruik hiervoor een raspberry pi 3b+ en de volgende verdere onderdelen:
- de motortjes: https://www.conrad.nl/p/j...est&searchSuggest=product
- een uitbreidingsplaat voor de raspberry: https://www.conrad.nl/p/j...h=1&vat=true&insert_kz=8J
- de druksensoren: https://www.conrad.nl/p/j...est&searchSuggest=product
- een analoog naar digitaal converter voor de sensoren: https://www.conrad.nl/p/j...est&searchSuggest=product

Verder gebruik ik nog een aantal jumpercables om alles te verbinden.
Ik heb alles correct aangesloten aan elkaar en de sensoren en motorjes werken apart van elkaar goed. Ik kan via de codes in de commandline de druk en volt van de sensor per seconde aflezen. Ook kan ik de motor laten loopen zodat deze steeds evenver naar links als naar rechts draait, en dit dan constant totdat ik de code afbreek. De vraag is nu hoe ik de twee codes van deze motorjes en sensortjes kan samenvoegen zodat wanneer de volt onder de 1 is de motor linksom draait, de volt tussen 1 en 2 is de motor stil staat en als de volt boven de 2 is rechtom draait. Het moet dus een constante loop worden die naar de voltwaarde van de sensor kijkt en hierop de motor aanpast.

De codes heb ik van internet gehaald en zo aangepast dat ze in mijn situatie werken.

Hier een foto van de setup. Je ziet de twee sensoren en twee motoren (1 met tandwiel om later iets te kunnen laten bewegen).
Afbeeldingslocatie: https://tweakers.net/i/61PZR23bPiZTj4tQIp7gX21i0QM=/x800/filters:strip_icc():strip_exif()/f/image/BWb60OAIA0SjT8MooXhyXtdQ.jpg?f=fotoalbum_large

Ik zal hieronder de huidige codes zetten. De eerste is voor een sensor, de tweede voor een motor.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

import time
import board
import busio
import adafruit_ads1x15.ads1015 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1015(i2c)

# Create single-ended input on channel 0
chan = AnalogIn(ads, ADS.P1)

# Create differential input between channel 0 and 1
# chan = AnalogIn(ads, ADS.P1, ADS.P2)

print("{:>5}\t{:>5}".format("Druk", "Volt"))

while True:
    print("{:>5}\t{:>5.3f}".format(chan.value, chan.voltage))
    time.sleep(2)



Hier de code van de motor:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import RPi.GPIO as GPIO
import time 
motorPins = (7, 16, 18, 22)
CCWStep = (0x01,0x02,0x04,0x08)
CWStep = (0x08,0x04,0x02,0x01)

def setup():
    print ('Program is starting...')
    GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
    for pin in motorPins:
        GPIO.setup(pin,GPIO.OUT)
        
def moveOnePeriod(direction,ms):    
    for j in range(0,4,1):      #cycle for power supply order
        for i in range(0,4,1):  #assign to each pin, a total of 4 pins
            if (direction == 1):#power supply order clockwise
                GPIO.output(motorPins[i],((CCWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
            else :              #power supply order anticlockwise
                GPIO.output(motorPins[i],((CWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
        if(ms<3):       #the delay can not be less than 3ms, otherwise it will exceed speed limit of the motor
            ms = 3
        time.sleep(ms*0.001)    

def moveSteps(direction, ms, steps):
    for i in range(steps):
        moveOnePeriod(direction, ms)

def motorStop():
    for i in range(0,4,1):
        GPIO.output(motorPins[i],GPIO.LOW)

def loop():
    while True:
        moveSteps(1,3,512)
        time.sleep(0.5)
        moveSteps(0,3,512)
        time.sleep(0.5)

def destroy():
    GPIO.cleanup()
if __name__ == '__main__':
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()



Hopelijk kunnen jullie mij helpen. Alvast erg bedankt!

En mocht er extra informatie of iets nodig zijn laat het dan natuurlijk weten.

Beste antwoord (via Cyphax op 27-11-2021 08:37)


  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Hai,
Ik heb gezocht naar oplossingen voor de laatste foutcode en heb een vooruitgang. Na wat trail and error heb ik een soort van werkend systeem. In de code heb ik lijn 14 weggelaten. De code ziet er dan alsvolgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import time
import board
import busio
import adafruit_ads1x15.ads1015 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

import RPi.GPIO as GPIO
motorPins = (7, 16, 18, 22)
CCWStep = (0x01,0x02,0x04,0x08)
CWStep = (0x08,0x04,0x02,0x01)

def setup():
    print ('Program is starting...')
    for pin in motorPins:
        GPIO.setup(pin,GPIO.OUT)

def moveOnePeriod(direction,ms):    
    for j in range(0,4,1):      #cycle for power supply order
        for i in range(0,4,1):  #assign to each pin, a total of 4 pins
            if (direction == 1):#power supply order clockwise
                GPIO.output(motorPins[i],((CCWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
            else :              #power supply order anticlockwise
                GPIO.output(motorPins[i],((CWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
        if(ms<3):       #the delay can not be less than 3ms, otherwise it will exceed speed limit of the motor
            ms = 3
        time.sleep(ms*0.001)    

def moveSteps(direction, ms, steps):
    for i in range(steps):
        moveOnePeriod(direction, ms)

def motorStop():
    for i in range(0,4,1):
        GPIO.output(motorPins[i],GPIO.LOW)

def destroy():
    GPIO.cleanup()

# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1015(i2c)

# Create single-ended input on channel 0
chan = AnalogIn(ads, ADS.P1)

try:
    while True:
        current_voltage = chan.voltage
        if current_voltage < 1:
            current_voltage = max(current_voltage, 0) # zorg dat de spanning altijd tussen 0 V en 1 V zit
            ms = 3 + 47 * current_voltage # 3 ms bij 0 V en 50 ms bij 1 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(0, ms, steps)
        elif current_voltage > 2:
            current_voltage = min(current_voltage, 3.3) # zorg dat de spanning altijd tussen 2 V en 3.3 V zit
            ms = 144 - 47 * current_voltage # 50 ms bij 2 V en 3 ms bij 3 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(1, ms, steps)
        else:
            time.sleep(0.048)

except KeyboardInterrupt:
        destroy()


Als ik deze code nu gebruik gaat er een motortje draaien en zodra ik de sensor indruk stopt deze motor met draaien. Het lijkt niet uit te maken hoeveel druk de sensor krijgt. De motor stop en bij meer druk gaat de motor de andere kant op draaien, wat hij wel zou moeten doen. Maar goed, er is vooruitgang. Wel een vreemd iets is dat de motor erg schokkerig draait, terwijl in de originele code om de motor te laten draaien hij soepel draait.

Wellicht hebben jullie een oplossing voor deze schokkerige beweging en om de motor de andere kant op te laten draaien bij druk hoger dan 2.

Alle reacties


Acties:
  • +2 Henk 'm!

  • fopjurist
  • Registratie: Mei 2021
  • Niet online

fopjurist

mr.drs. fopjurist

Je moet de code een beetje in elkaar vlechten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import time
import board
import busio
import adafruit_ads1x15.ads1015 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

import RPi.GPIO as GPIO
motorPins = (7, 16, 18, 22)
CCWStep = (0x01,0x02,0x04,0x08)
CWStep = (0x08,0x04,0x02,0x01)

def setup():
    print ('Program is starting...')
    GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
    for pin in motorPins:
        GPIO.setup(pin,GPIO.OUT)

def moveOnePeriod(direction,ms):    
    for j in range(0,4,1):      #cycle for power supply order
        for i in range(0,4,1):  #assign to each pin, a total of 4 pins
            if (direction == 1):#power supply order clockwise
                GPIO.output(motorPins[i],((CCWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
            else :              #power supply order anticlockwise
                GPIO.output(motorPins[i],((CWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
        if(ms<3):       #the delay can not be less than 3ms, otherwise it will exceed speed limit of the motor
            ms = 3
        time.sleep(ms*0.001)    

def moveSteps(direction, ms, steps):
    for i in range(steps):
        moveOnePeriod(direction, ms)

def motorStop():
    for i in range(0,4,1):
        GPIO.output(motorPins[i],GPIO.LOW)

def destroy():
    GPIO.cleanup()

# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1015(i2c)

# Create single-ended input on channel 0
chan = AnalogIn(ads, ADS.P1)

setup()
try:
    while True:
        current_voltage = chan.voltage
        if current_voltage < 1:
            moveSteps(0, 3, 16)
        elif current_voltage > 2:
            moveSteps(1, 3, 16)
        else:
            time.sleep(0.048)
except KeyboardInterrupt:
    destroy()

De logica is in de onderste paar regels gecodeerd. Ik heb de aanroep van moveSteps zo veranderd dat hij 16 stapjes doet van 3 ms. De sensor wordt niet wordt uitgelezen tijdens moveSteps, dus bij de oorspronkelijke aanroep (512 stapjes van 3 ms) kan het anderhalve seconde duren voordat het systeem reageert bij een wijziging van de sensor.
Je kunt de rotatiesnelheid nog afhankelijk maken van de sensor door regels 52–57 te vervangen door:
code:
1
2
3
4
5
6
7
8
9
10
11
12
        if current_voltage < 1:
            current_voltage = max(current_voltage, 0) # zorg dat de spanning altijd tussen 0 V en 1 V zit
            ms = 3 + 47 * current_voltage # 3 ms bij 0 V en 50 ms bij 1 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(0, ms, steps)
        elif current_voltage > 2:
            current_voltage = min(current_voltage, 3) # zorg dat de spanning altijd tussen 2 V en 3 V zit
            ms = 144 - 47 * current_voltage # 50 ms bij 2 V en 3 ms bij 3 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(1, ms, steps)
        else:
            time.sleep(0.048)

Beschermheer van het consumentenrecht


Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Hai fopjurist,
Bedankt voor de reactie. Ik heb inmiddels de code naar mijn raspberry gestuurd en uitgeprobeerd. Er is alleen een probleempje, zie de foto. Afbeeldingslocatie: https://tweakers.net/i/L9dYEF_5lg7XcQ-cRTovJ2Wlowo=/800x/filters:strip_icc():strip_exif()/f/image/N9AJFpAcdC3JPLcOAdJv5PZ5.jpg?f=fotoalbum_large

Zou je hier een oplossing voor weten?

Acties:
  • +2 Henk 'm!

  • RudolfR
  • Registratie: Maart 2011
  • Laatst online: 19:21
Volgens mij is de regel teveel ingesprongen, ik denk dat-ie op het zelfde niveau als de 'try' hoort.

code:
1
2
3
4
5
6
7
8
9
10
11
try:
    while True:
        current_voltage = chan.voltage
        if current_voltage < 1:
            moveSteps(0, 3, 16)
        elif current_voltage > 2:
            moveSteps(1, 3, 16)
        else:
            time.sleep(0.048)
except KeyboardInterrupt:
        destroy()

[ Voor 60% gewijzigd door RudolfR op 23-11-2021 18:53 ]


Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Hey, dankjewel RudolfR.

Het probleem lijkt opgelost er is enkel nu wel een nieuw probleempje. Ik heb weer een foto toegevoegd met de fout. Afbeeldingslocatie: https://tweakers.net/i/U5UJV6LtWeU7iwlmV2O-UfXz2xw=/800x/filters:strip_icc():strip_exif()/f/image/pttz0Wvd1ILWz4d7k4NSNP1Q.jpg?f=fotoalbum_large

Enig idee hoe dit op te lossen?

Acties:
  • +1 Henk 'm!

  • RudolfR
  • Registratie: Maart 2011
  • Laatst online: 19:21
Ja, bij het in elkaar vlechten van de programma's is een belangrijk onderdeel van de initialisatie verloren gegaan.

Je moet nog ergens setup() aanroepen, want die stelt de GPIO in.
Misschien is boven de while True: uit het snippet hierboven wel de goede plek.

Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Ik begrijp nog niet helemaal wat je bedoeld. Ik ben nog niet zo erg thuis in het coderen. Zou je het kunnen verduidelijken?

Acties:
  • +1 Henk 'm!

  • cossy nl
  • Registratie: Oktober 2004
  • Laatst online: 20:02
In je oude code zien je dat je setup aanroept.

In de nieuwe code mist die regel. (de regel: setup() bijna onder aan in je oude script)

Deze moet ook in je nieuwe. En @RudolfR suggereerd net boven de while.

Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Oke, de code eindigt nu als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
try:
    setup()
    while True:
        current_voltage = chan.voltage
        if current_voltage < 1:
            moveSteps(0, 3, 16)
        elif current_voltage > 2:
            moveSteps(1, 3, 16)
        else:
            time.sleep(0.048)
 
 except KeyboardInterrupt:
        destroy()


Helaas komt er nu nog steeds een foutcode, wel een andere: Afbeeldingslocatie: https://tweakers.net/i/t_bJlvBLoUwW6SaDTuEMEdsil8A=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/SUwcXXy7RNov0AhNBNo5bQiB.png?f=user_large

Acties:
  • +1 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:06

Cyphax

Moderator LNX
wilbert-jan schreef op dinsdag 23 november 2021 @ 19:50:
Oke, de code eindigt nu als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
try:
    setup()
    while True:
        current_voltage = chan.voltage
        if current_voltage < 1:
            moveSteps(0, 3, 16)
        elif current_voltage > 2:
            moveSteps(1, 3, 16)
        else:
            time.sleep(0.048)
 
 except KeyboardInterrupt:
        destroy()


Helaas komt er nu nog steeds een foutcode, wel een andere: [Afbeelding]
Het is weliswaar heel begrijpelijk, maar het topic wordt nu teveel een help-mij-stap-voor-stap. Het is wel de bedoeling dat je alvorens een vraag te stellen, even kijkt of je met de foutmelding(en) die je krijgt een oplossing kan vinden met een zoekmachine. Bij deze het verzoek die stap eerst te zetten, en als dat geen soelaas biedt een vraag te posten. :)

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Hai Cyphax.
Ik ga nu opzoek naar oplossingen voor de problemen en hoop eruit te komen. Bedankt voor de feedback.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Hai,
Ik heb gezocht naar oplossingen voor de laatste foutcode en heb een vooruitgang. Na wat trail and error heb ik een soort van werkend systeem. In de code heb ik lijn 14 weggelaten. De code ziet er dan alsvolgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import time
import board
import busio
import adafruit_ads1x15.ads1015 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

import RPi.GPIO as GPIO
motorPins = (7, 16, 18, 22)
CCWStep = (0x01,0x02,0x04,0x08)
CWStep = (0x08,0x04,0x02,0x01)

def setup():
    print ('Program is starting...')
    for pin in motorPins:
        GPIO.setup(pin,GPIO.OUT)

def moveOnePeriod(direction,ms):    
    for j in range(0,4,1):      #cycle for power supply order
        for i in range(0,4,1):  #assign to each pin, a total of 4 pins
            if (direction == 1):#power supply order clockwise
                GPIO.output(motorPins[i],((CCWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
            else :              #power supply order anticlockwise
                GPIO.output(motorPins[i],((CWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
        if(ms<3):       #the delay can not be less than 3ms, otherwise it will exceed speed limit of the motor
            ms = 3
        time.sleep(ms*0.001)    

def moveSteps(direction, ms, steps):
    for i in range(steps):
        moveOnePeriod(direction, ms)

def motorStop():
    for i in range(0,4,1):
        GPIO.output(motorPins[i],GPIO.LOW)

def destroy():
    GPIO.cleanup()

# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1015(i2c)

# Create single-ended input on channel 0
chan = AnalogIn(ads, ADS.P1)

try:
    while True:
        current_voltage = chan.voltage
        if current_voltage < 1:
            current_voltage = max(current_voltage, 0) # zorg dat de spanning altijd tussen 0 V en 1 V zit
            ms = 3 + 47 * current_voltage # 3 ms bij 0 V en 50 ms bij 1 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(0, ms, steps)
        elif current_voltage > 2:
            current_voltage = min(current_voltage, 3.3) # zorg dat de spanning altijd tussen 2 V en 3.3 V zit
            ms = 144 - 47 * current_voltage # 50 ms bij 2 V en 3 ms bij 3 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(1, ms, steps)
        else:
            time.sleep(0.048)

except KeyboardInterrupt:
        destroy()


Als ik deze code nu gebruik gaat er een motortje draaien en zodra ik de sensor indruk stopt deze motor met draaien. Het lijkt niet uit te maken hoeveel druk de sensor krijgt. De motor stop en bij meer druk gaat de motor de andere kant op draaien, wat hij wel zou moeten doen. Maar goed, er is vooruitgang. Wel een vreemd iets is dat de motor erg schokkerig draait, terwijl in de originele code om de motor te laten draaien hij soepel draait.

Wellicht hebben jullie een oplossing voor deze schokkerige beweging en om de motor de andere kant op te laten draaien bij druk hoger dan 2.

Acties:
  • +1 Henk 'm!

  • fopjurist
  • Registratie: Mei 2021
  • Niet online

fopjurist

mr.drs. fopjurist

Na regel 50 zou je de waarde van current_voltage eens op je scherm kunnen tonen om te zien of hij inderdaad varieert tussen 0V en 3.3V zoals je verwacht.

Op regel 58 kan de waarde van ms nu onder 3 ms komen. In de oorspronkelijke code staat "the delay can not be less than 3ms, otherwise it will exceed speed limit of the motor". Je kunt de formule wijzigen in:
code:
1
ms = 50 - (47/1.3) * (current_voltage-2) # 50 ms bij 2 V en 3 ms bij 3.3 V


Het schokkerige komt door een lagere draaisnelheid. Als de code eenmaal goed werkt, kun je de motor net zo soepel laten draaien als eerst door de sensor volledig in te drukken of los te laten, zodat ms de waarde 3 heeft.

Beschermheer van het consumentenrecht


Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Hai,
Ik heb nu de regel toegevoegd dat er steeds het huidige voltage op het scherm gegeven wordt. Dit werkt en deze varieert ook tussen de 0 en 3,3V. Alleen wordt er alsnog een foutmelding gegeven, nu over iets heel anders:
Afbeeldingslocatie: https://tweakers.net/i/kJtWmk-D9d49EgwPRsN1YMXtChs=/800x/filters:strip_icc():strip_exif()/f/image/7wQu8c1LjCCOsJfYNYH9VcAQ.jpg?f=fotoalbum_large

Het lijkt dus alsof er geen output is naar de motor, terwijl lijn 23 wel een output definieert.

Hier nog even de code hoe hij er nu uitziet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import time
import board
import busio
import adafruit_ads1x15.ads1015 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

import RPi.GPIO as GPIO
motorPins = (7, 16, 18, 22)
CCWStep = (0x01,0x02,0x04,0x08)
CWStep = (0x08,0x04,0x02,0x01)

def setup():
    print ('Program is starting...')
    for pin in motorPins:
        GPIO.setup(pin,GPIO.OUT)

def moveOnePeriod(direction,ms):    
    for j in range(0,4,1):      #cycle for power supply order
        for i in range(0,4,1):  #assign to each pin, a total of 4 pins
            if (direction == 1):#power supply order clockwise
                GPIO.output(motorPins[i],((CCWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
            else :              #power supply order anticlockwise
                GPIO.output(motorPins[i],((CWStep[j] == 1<<i) and GPIO.HIGH or GPIO.LOW))
        if(ms<3):       #the delay can not be less than 3ms, otherwise it will exceed speed limit of the motor
            ms = 3
        time.sleep(ms*0.001)    

def moveSteps(direction, ms, steps):
    for i in range(steps):
        moveOnePeriod(direction, ms)

def motorStop():
    for i in range(0,4,1):
        GPIO.output(motorPins[i],GPIO.LOW)

def destroy():
    GPIO.cleanup()

# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1015(i2c)

# Create single-ended input on channel 0
chan = AnalogIn(ads, ADS.P1)

try:
    while True:
        print("{:>5.3f}".format(chan.voltage))
        current_voltage = chan.voltage
        if current_voltage < 1:
            current_voltage = max(current_voltage, 0) # zorg dat de spanning altijd tussen 0 V en 1 V zit
            ms = 3 + 47 * current_voltage # 3 ms bij 0 V en 50 ms bij 1 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(0, ms, steps)
        elif current_voltage > 2:
            current_voltage = min(current_voltage, 3.3) # zorg dat de spanning altijd tussen 2 V en 3.3 V zit
            ms = 50 - (47/1.3) * (current_voltage-2) # 50 ms bij 2 V en 3 ms bij 3.3 V
            steps = int(50 / ms) # altijd minimaal 1 stap, maar nooit zoveel stappen dat moveSteps langer dan 50 ms duurt
            moveSteps(1, ms, steps)
        else:
            time.sleep(0.048)

except KeyboardInterrupt:
        destroy()

Acties:
  • +1 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Het aanroepen van `setup()` is weer verdwenen..

Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Goed opgemerkt!
De code lijkt nu te werken, er komt geen foutmelding meer. Wel is de motor wat haperig maar dat is afstelling.Ik denk dat ik er verder zelf wel uit ga komen. In iedergeval erg bedankt iedereen die de moeite heeft genomen dit knaapje te helpen! :)

Acties:
  • +1 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:06

Cyphax

Moderator LNX
@wilbert-jan Fijn dat het gelukt is! Ik heb je eigen antwoord als Beste gemarkeerd, die kwam het dichtst bij de uiteindelijke oplossing. :)
(Laat even weten als je het er niet mee eens bent, het is jouw topic dus het is uiteindelijk jouw keuze, maar je kunt niet zelf je eigen antwoord markeren)

[ Voor 35% gewijzigd door Cyphax op 27-11-2021 08:39 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • wilbert-jan
  • Registratie: Maart 2019
  • Laatst online: 08-04 21:49
Dankjewel voor het markeren van het beste antwoord, helemaal goed.
Pagina: 1