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
call(["echo 1=" + str(servopos) + " > /dev/pi-blaster"], shell=True)
Share on Twitter Share on Facebook
Comments
There are currently no comments
New Comment