|
Raspberry Pi
22) Řízení krokového motoru
Sice k projektu ovládání dalekohledu nepotřebuji žádné
motory (pohon už je součástí dalekohledu), ale i tak by se někdy mohlo
hodit s něčím pohybovat pomocí krokového motoru.
Nebudu tady rozebírat dopodrobna, jak fungují krokové motory.
Informace můžete získat třeba tady:
http://www.mylms.cz/text-krokovy-motor-princip/
http://www.pohonnatechnika.cz/skola/motory/krokovy-motor
Prostě jde o to, posílat na 4 dráty následující
sekvenci osmi logických stavů:
1000
1100
0100
0110
0010
0011
0001
1001
Pro opačný směr je ta sekvence obrácená.
Rychlost, jakou se tyto stavy střídají, udává rychlost otáčení
motoru. Tato rychlost je omezená. Když se signály posílají vyšší
rychlostí, než je motor schopný zpracovat, dochází k výpadkům v běhu.
Koupil jsem od mých oblíbených Číňanů tento malý motorek
a budič:
http://dx.com/p/dc-5v-deceleration-stepper-motor-module-150905?item=1
http://dx.com/p/uln2003-stepper-motor-driver-board-green-151183?item=1
Připojil jsem to k expanderu, který mám vyvedený ven z krabičky.
Pro napájení jsem také použil 5V přímo z RasPI.
Motor si bere docela dost proudu, ale Raspíčko to ještě zvládá. Jen je vidět,
že při točení se trochu sníží jas podsvětu displeje.
Schéma připojení k expanderu je jednoduché:
Pokud nemáte expander, můžete budič připojit přímo
na některé z GPIO portů na Raspi. Pak si ale musíte vymyslet vlastní
program pro posílání signálů do budiče.
Můj "výtvor" je tady:
#!/usr/bin/python
import os
import time
import smbus
import sys
bus = smbus.SMBus(0)) # starsi varianta RasPi (256MB)
#bus = smbus.SMBus(1) # novejsi varianta RasPi (512MB)
addr = 0x24 # I2C adresa vystupniho konektoru
bus.write_byte_data(addr , 0x00 , 0x00) # vsechny piny expanderu nastavit na vystup
# zjistovani parametru z prikazove radky
smer=int(sys.argv[1]) # smer otaceni (1 nebo 2)
pocetcyklu=int(sys.argv[2]) # pocet cyklu (1 cyklus = 8 kroku)
pauza=float(sys.argv[3]) # pauza v sekundach mezi kroky (napr: 0.002)
cyklus = 0
if smer == 1:
while cyklus < pocetcyklu:
cyklus = cyklus +1
bus.write_byte_data(addr , 0x12 , 0x08) # 1000
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x0C) # 1100
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x04) # 0100
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x06) # 0110
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x02) # 0010
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x03) # 0011
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x01) # 0001
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x09) # 1001
time.sleep (pauza)
if smer == 2:
while cyklus < pocetcyklu:
cyklus = cyklus +1
bus.write_byte_data(addr , 0x12 , 0x09) # 1001
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x01) # 0001
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x03) # 0011
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x02) # 0010
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x06) # 0110
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x04) # 0100
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x0C) # 1100
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x08) # 1000
time.sleep (pauza)
bus.write_byte_data(addr , 0x12 , 0x00) # 0000 = po skonceni prestan zatezovat zdroj
|
Program se ovládá třemi parametry:
- První parametr je směr otáčení. Může být 1, nebo
2.
- Druhý parametr je počet cyklů (jeden cyklus obsahuje 8 kroků)
- Třetí parametr je pauza v sekundách mezi jednotlivými kroky (při zadávání
desetinných čísel se jako oddělovač používá desetinná tečka)
Takže třeba rychlé roztočení na jednu stranu o celou
otáčku vypadá takto:
sudo python /home/pi/motor 1 520 0.002
|
A pomalé otočení o půl otáčky zpátky je takhle:
sudo python /home/pi/motor 2 260 0.01
|
Tady je video s otáčením motoru po zadání předchozích dvou příkazů:
A když se spojí krokový motor a joystick z minulé kapitoly 21),
může vzniknout třeba tohle video :
|
|
|