Tein erästä projektia varten Raspberry Pi:stä demolaitteen, jolla pystyy demoamaan verkon yli luettavia ja ohjattavia sensoreita ja laitteita. Lisävarusteina on srf02-ultraäänianturi ja RC-servo. Lisäksi rakensin napin, jolla RPi:n voi ajaa alas hallitusti ja välttää muistikortin tiedostojärjestelmän leviämisen.

 

Sammutusnappi

Sammutusnapin tekemiseen löytyy netistä ohjeita vaikka kuinka, mutta paras (ja yksinkertaisin) on täältä löytyvä ohje. RPi:n raudan kakkosversiosta on löydetty uusi 8-napainen liitin nimeltään P5. Vakiona siinä on pelkät reiät joten siihen täytyy itse juottaa piikkirima.P5:stä löytyy 4 GPIO:ta, 3.3V, 5V ja kaksi maata.

Yllä näkyvät nastat yhdistämällä saadaan vedettyä GPIO31 maihin ja sen pystyy tunnistamaan yksinkertaisella ylläolevalta sivulta löytyvällä python-ohjelmalla. Ohjelman saa helposti käynnistymään bootissa lisäämällä se root-käyttäjän croniin. Vastuksia yms ei tarvita- riittää että vetää johdot painonapista k.o nastoihin.

 

Ultraäänianturi

srf02 on edullinen ja kätevä UÄA, joka on suosittu monissa robotiikkajutuissa. Anturi tottelee sekä SPI:tä että I2C:ta. Halusin käyttää I2C:ta, koska en ollut sitä koskaan aiemmin käyttänyt ja se kuuluu hakkerin yleistietoon.

+5V:n pystyi kytkemään suoraan RPi:n 5V-ulostuloon. Samoin I2C:n SDA ja SCL-linjat löytyvät sellaisenaan RPi:sta. Mode-nastan voi jättää kytkemättä I2C:ta käytettäessä (sillä saisi valittua SPI:n). Koodit tein pythonilla, sillä sille löytyy helpot ja kivat kirjastot tarvittavien temppujen tekemiseen. Anturia luetaan näin:

 

# Alustetaan i2c:

i2c = smbus.SMBus(1)

# Lähetetään lukukomento (81) laitteelle (laitteen osoite 0x75)

i2c.write_byte_data(0x75, 0, 81)

# Odotellaan datasheetissä määritellyn verran eli 0.07 sekuntia

sleep(0.07)

# Luetaan mittaustulokesn ylempi tavu osoitteesta 2

r2 = self.i2c.read_byte_data(0x75, 2)

# Luetaan mittaustulokesn alempi tavu osoitteesta 3

r3 = self.i2c.read_byte_data(0x75, 3)

# Lasketaan lopullinen tulos senttimetreinä
r = r2*256 + r3

 

Servon ohjaus

Servohan haluaa sisäänsä 5V, maan, ja sopivasti värähtelevän PWM-signaalin. PWM-signaalin täytyy olla 5V mikä aiheuttaa RPi:n kanssa hieman ongelmia, sillä sen kaikki digitaaliulostulot ovat 3.3V. Tämän vuoksi tarvittiin PNP-transistori, jolla ohjataan 5V jännitettä 3.3V GPIO-pinnillä. Tässä kohtaa tapahtui pieni moka, sillä käyttämäni piiri toimii siten että se vetää ulostulon alas, kun transistori johtaa. Eli signaali on käänteinen GPIO:n ulostuloon nähden. Normaalisti käyttämäni servoblaster-kirjasto ei tätä kelpuuta ja ohjaus ei toiminut ollenkaan. Löysin kuitenkin servoblasterista forkatun, PWM-ledien ohjaukseen tarkoitetun kirjaston nimeltään pi-blaster. Pi-blaster toimii hyvin samantyylisesti, mutta siinä on komentorivioptio "invert" joka kääntää PWM-signaalin käänteiseksi. Sitä käyttämällä servo heräsi henkiin ja homma alkoi pelittää. Säädön aikana tosin tuhosin yhden servon ylikuumenemiseen - kannattaa olla varovainen jos antaa servolle vääränlaista signaalia. RC-servoa ohjatessa pi-blasteriin pitää konffata CYCLE_TIME_US 20000 ja järkevät arvot ovat suurinpiirtein alueella 0.03-0.1. Näiden selvittyä servon ohjaus on kohtuu helppoa:

echo 1=0.07 > /dev/pi-blaster

pistää servon suurinpiirtein keskelle. Sama pythoniksi:

call(["echo 1=" + str(servopos) + " > /dev/pi-blaster"], shell=True)

Lopputuloksena tästä projektista oli, että I2C on helpompaa kuin kuvittelin ja sitä on turha pelätä. Kannattaa myös muistaa, että osa I2C-laitteista haluaa 3.3V eikä 5V ja tämä selviää datasheetista (UÄA ei ollut ensimmäinen sensori jota koitin käyttää). Servoja ohjatessa kannattaa etsiä sellainen kytkentä, joka ei käännä signaalia. PWM-ledejä yms ohjatessa tällä ei ole merkitystä. Sammutusnappi taas on liki pakollinen joka raspissa, jossa ei ole käyttöliittymää ja sen tekeminen on P5:n avulla niin triviaalia että se kannattaa aina tehdä.

 

« »