|
Raspberry Pi
21) Joystick
K mému hlavnímu projektu (ovládání dalekohledu) jsem
potřeboval nějaký joystick, pomocí kterého bych najížděl na
referenční pozici. Jako nejlepší řešení mi připadalo koupit
minijoystick od Číňanů a přidělat ho do nějaké krabičky, která
by se dobře držela v ruce:
http://dx.com/p/5-pin-2-way-arduino-ps2-joystick-game-controller-module-black-green-137911
Nakonec jsem ten minijoystick trochu vsadil do krabičky od staré
kuličkové myši a
myslím, že to vůbec není špatné (musel jsem trochu seříznout plošňák,
aby se tam ten joystick vešel):
Protože je krabička šišatá, musel jsem si trochu pohrát
s nasměrováním minijoysticku.
Proto to na fotkách vypadá, že je tam
ten joystick vlepený našikmo - to je ale záměrně.
Jedná se o analogový joystick, takže k vyhodnocení
vychýlení páčky je třeba použít A/D převodník. Zapojení A/D převodníku
jsem tu popisoval už v kapitole 18).
Joystick
má v sobě také tlačítko jehož zatlačením je možné potvrdit nastavenou polohu.
Toto tlačítko je sice stavový výstup (je buď sepnuté, nebo
rozepnuté) ale pro jeho jeho čtení využívám také jeden z analogových
vstupů A/D převodníku. Když je tlačítko rozepnuté, je na vstupu CH2
téměř plné napájecí napětí, takže hodnota za A/D převodníkem se
blíží číslu 4095. Když je tlačítko sepnuté, je na vstupu 0V a
hodnota za A/D převodníkem by se měla blížit 0.
Ovládací program je níže, ale pokud si ho chcete vyzkoušet,
musíte si ho přizpůsobit tak, aby odpovídal vašemu hardwéru.
Moje schéma, na které je přizpůsobený program vypadá takto:
Tady je výpis programu v pythonu
Část programu se čtením A/D převodníku jsem opsal a upravil z těchto
stránek: http://learn.adafruit.com/...
#!/usr/bin/env python
import time
import os
import RPi.GPIO as GPIO
import sys
import getopt
GPIO.setmode(GPIO.BCM)
DEBUG = 1
# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)
GPIO.output(clockpin, False) # start clock low
GPIO.output(cspin, False) # bring CS low
commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin, True)
else:
GPIO.output(mosipin, False)
commandout <<= 1
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(14):
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1
GPIO.output(cspin, True)
adcout >>= 1 # first bit is 'null' so drop it
return adcout
# change these as desired - they're the pins connected from the
# SPI port on the ADC to the Cobbler
SPICLK = 11
SPIMISO = 9
SPIMOSI = 10
SPICS = 21
# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)
citlivost = 200 # sirka pasma necitlivosti kolem nulove polohy joysticku
btnjoy = 4095
while btnjoy > 2000 :
btnjoy = readadc(2, SPICLK, SPIMOSI, SPIMISO, SPICS)
osax = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)
if osax < 2048 - citlivost:
xnapis = "-X :" + str(int(100 * osax/4095)) + "%"
if osax > 2048 + citlivost:
xnapis = "+X :" + str(int(100 * osax/4095)) + "%"
if osax >= 2048 - citlivost and osax <= 2048 + citlivost:
xnapis = "X bez vychylky"
osay = readadc(1, SPICLK, SPIMOSI, SPIMISO, SPICS)
if osay < 2048 - citlivost:
ynapis = "-Y :" + str(int(100 * osay/4095)) + "%"
if osay > 2048 + citlivost:
ynapis = "+Y :" + str(int(100 * osay/4095)) + "%"
if osay >= 2048 - citlivost and osay <= 2048 + citlivost:
ynapis = "Y bez vychylky"
print xnapis , ynapis
time.sleep (0.5)
exit (0)
|
Program předpokládá, že při nulové poloze jsou
trimry nastavené přesně uprostřed dráhy. Ve skutečnosti to není úplně
pravda. Pokud tedy chcete přesné nastavení, nahraďte konstanty 2048
v podmínkách hodnotami příslušného kanálu při nevychýlené páčce.
Pokud ale budete používat joystick jenom jako ovladač směru (jen jako
4 spínače), není to potřeba. V tom případě stačí jen trochu rozšířit
pásmo necitlivosti změnou hodnoty konstanty citlivost.
A tady je video se spuštěným programem:
|
|
|