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:


Odkaz na YouTube

 

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 29.9.2012