Projekteja yhteisöltä


In the junkpil.. I mean in the lot of incoming hardware was a new toy. A usb controller toy robot arm. Quick googling revealed it is pretty common toy and there were already some solutions on how to control it without using the original software.

In one hour the robot arm was moving by command.


# ROBOT ARM CONTROL PROGRAM
#
# http://tampere.hacklab.fi
# http://vaasa.hacklab.fi
#
# //kengu
# //2014-04-21
#
# robotic arm movement ideas and basis from
# http://martinsant.net/?page_id=983
#
# keyboard control based on
# http://content.gpwiki.org/index.php/Python:Pygame_keyboard_input
#
# also some ideas from
# http://stackoverflow.com/questions/16044229/how-to-get-keyboard-input-in-pygame
# http://stackoverflow.com/questions/14580935/pygame-keydown-event-line-not-updating-position
#

# uses pygame

import usb.core, usb.util, time
import pygame
from pygame.locals import *

# Allocate the name 'RoboArm' to the USB device
RoboArm = usb.core.find(idVendor=0x1267, idProduct=0x0000)

# Check if the arm is detected and warn if not
if RoboArm is None:
raise ValueError("Arm not found")

# Create a variable for duration
Duration=1

# Define a procedure to execute each movement
def MoveArm(Duration, ArmCmd):
# Start the movement
RoboArm.ctrl_transfer(0x40,6,0x100,0,ArmCmd,1000)
# Stop the movement after waiting specified duration
time.sleep(Duration)
ArmCmd=[0,0,0]
RoboArm.ctrl_transfer(0x40,6,0x100,0,ArmCmd,1000)

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Robot arm control')
#pygame.mouse.set_visible(0)

datastring = 0
rotate = 0
done = False

while not done:

MoveArm(0.01,[datastring,rotate,0])

for event in pygame.event.get():
if (event.type == KEYUP) or (event.type == KEYDOWN):
datastring = 0
rotate = 0

keys = pygame.key.get_pressed()
if keys[K_a]:
datastring +=128

if keys[K_q]:
datastring +=64

if keys[K_s]:
datastring +=32

if keys[K_w]:
datastring +=16

if keys[K_d]:
datastring +=8

if keys[K_e]:
datastring +=4

if keys[K_f]:
datastring +=2

if keys[K_r]:
datastring +=1

if keys[K_g]:
rotate = 1

if keys[K_t]:
rotate = 2

# print event
# print keys
if (event.key == K_ESCAPE):
done = True

#MoveArm(1,[0,0,1]) #Light on
#MoveArm(1,[0,0,0]) #Light off
#MoveArm(1,[64,0,1]) #Shoulder up
#MoveArm(1,[128,0,0]) #Shoulder down
#MoveArm(1,[16,0,0]) #Elbow up
#MoveArm(1,[32,0,0]) #Elbow down
#MoveArm(1,[4,0,0]) #Wrist up
#MoveArm(1,[8,0,0]) # Wrist down
#MoveArm(1,[1,0,0]) #Grip close
#MoveArm(1,[2,0,0]) #Grip open
#MoveArm(1,[0,1,0]) #Rotate base anti-clockwise
#MoveArm(1,[0,2,0]) #Rotate base clockwise

Tiistaina oli jälleen perinteinen avointen ovien päivä (kuten joka tiistai). Pajalle oli ilmestynyt pari uutta konetta, nimittäin hiekkapuhalluskone:

Sekä uuni, joka lämpenee 1500 asteeseen:

Näillä tehdään vielä jotain hienoa.

 

Jäsenistö viritteli projektejaan. Ezzkoram väsäsi akryylistä ja lasersäteistä saippuatelineen kylppäriin:

Cos viritteli uuden version askelmoottorikäyttöisestä lineaariservostaan:

Kaikenlaista muutakin väsättiin (saa lisätä tähän postauksen jatkoksi). Mm. videotykille speksailtiin valkokangasta jonka voi kiinnittää nosto-oveen. Säätäminen jatkuu.

Here’s the first wireless charging The Other Half made at Tampere Hacklab. It has a custom 3D-printed case, Samsung S3 wireless receiver, and connectors made with copper tape and some thin wire. There were some issues in placing the wireless receiver. It did not work when placed in the center of the phone, possibly due to interference caused by battery. Placing it in the bottom half of the case solved the issue. This is the first prototype and improved versions will be made later.

 

 

 

Our friends at Jolla today released The Other Half developer kit. Tampere Hacklab 5w got an exclusive pre-release version of the Jolla TOH 3D-model in the end of December. The model is the exact CAD model from which the TOH’s are built from. As the first step we decided to print it without any modifications with our Ultimaker 3D printer. The package contains also a 3D model of the phone’s back side which can be useful while designing new hardware. The 3D models are released in .stl and .stp formats.

 

This is how it looks in Cura printing software. As you can see, the model is very detailed. It is not optimized for printing and contains some small notches which won’t print properly. Also the edges are not completely flat so they will not print with full quality.

 

Printing time was about 50 minutes. Layer height of 0.1 mm and 30% fill were used. The material is yellow slightly transparent PLA.

 

The finished product after cleaning up.

 

TOH mated with a Jolla phone. Some knife work was necessary to fit the TOH properly. It stays on pretty well and can be considered success already. Acetone vapour treatment could be used to give the TOH smooth shiny surface.

 

 

The next step was to modify the model to be more suitable for 3D printing. This included flattening the back and removing the small notches which wouldn’t print correctly anyway. Also the holes for buttons and connectors needed to be enlarged. We created three different sizes for experimenting with electronics. You can downloads the stl files here. These print nicely and fit the phone. Note that there are also reverse-engineered TOH 3d models posted in talk.maemo.org but those have been created before the official release.

First print-optimized TOH with a friendly robot watching. The material is PLA which glows in the dark.

 

Three sizes to choose from.

We are currently experimenting with wireless charging TOH’s using Samsung S3 Qi receiver pads and extra battery TOH. If you live in Tampere area, pay us a visit some Tuesday night and print a TOH for yourself! Thanks for Jolla for releasing these. I hope community will find good use for them.

Tämän vuoden merkittävimpiä projekteja on ehkä ollut naapurikopin työstökoneiden käyttöönotto ja opettelu. Jo heti alkuvuodesta saatiin laserleikkurilla leikattua ensimmäiset palaset ja hyvin pian havaittiin, että ohjausjärjestelmä kannattaa tehdä uusiksi. Kiinalaisen moshidraw:n tilalle linuxcnc ja pieniä elektroniikkamuutoksia kytkentöihin mahdollistivat laitteen järkevämmän käytön. Samalla saatiin myös parannettua turvallisuutta kytkemällä muutama turvakytkin.

Laserleikkurin linssien ja peilien puhdistusta

Laserin jälkeen vuorossa olivat plasmaleikkuri ja jyrsin. Molemmat isoja koneita. Plasmaleikkurissa ja jyrsimessä oli molemmissa kiinalainen NCStudio. Jyrsimen mukana tuli myös jyrsimeen sopivat asetukset, mutta plasmaan ei asetuksia löytynyt. Neuvottelulla ohjainkorttien valmistajan (Weihong) kanssa ei päästy plasman kanssa pidemälle ja kuukauden yrittämisen jälkeen hylättiin ajatus saada NCStudio toimimaan plasman kanssa. Korvaaviksi palikoiksi Linuxcnc ja Mesanetin io-kortti.

Korvaavien palikoiden saapumista odotellessa suunnattiin panokset sitten jyrsimen suuntaan. Jyrsimen NCStudio toimii jyrsimen kanssa juuri niin hyvin kuin sitä osaamme käyttää. Automaattista työkalunvaihdinta ei vielä olla saatu toimimaan ja muutenkin työstöarvot ovat vähän hakusessa ja puruimuri pitäisi myös virittää. Muuten kyllä ihan toimiva peli.

Plasman korttien saavuttua pienellä parin päivän askartelulla kortit paikoilleen ja linuxcnc:n asetukset kohdilleen. Ja kas, toimiva plasmaleikkuri. Vielä tarvitaan parempi savupoisto.

 

Eilen hackasin lisäakun GoPro Hero-videokameraani. Vakiona tuleva 1.1Ah akku jaksaa nykykunnossaan lämpimässä nauhoittaa 2.5-3h, kun 32gb muistikortille mahtuisi 6h. Intternetsissä tekemäni tutkimuksen mukaan kameran piirilevyltä löytyy helposti suoraan akulle menevät juotospisteet ja niihin pystyy kytkemään rinnalle toisen akun. Tällöin kameran elektroniikka huolehtii akkujen latauksesta ja suojaa niitä alijännitteeltä. Mitään ylimääräistä elektroniikkaa ei tarvita, mutta sisäisen ja ulkoisen akun jännitteet täytyy pitää samana lataamalla ja purkamalla niitä aina yhdessä. Käyttämäni ulkoinen akku on 2.2Ah LiPo-kenno jolloin yhteiskapasiteetti on 3Ah luokkaa ja 6h tallennusaika pitäisi helposti onnistua.

Kamera aukesi helposti ja juotospisteet löytyi nopsaan yleismittarilla piippaamalla. Miinusnapa on akkuliittimen vasemmalla puolella oleva iso kupariympyrä ja plusnapa siitä alaspäin oleva piirilevyjä yhdistävä tinaklunssi. Dremelöin kameraan aukon johon kuumaliimasin riviliittimen jolloin voin käyttää kameraa myös ilman lisäakkua.

Lopputulos alla:

 

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 0×75)

i2c.write_byte_data(0×75, 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(0×75, 2)

# Luetaan mittaustulokesn alempi tavu osoitteesta 3

r3 = self.i2c.read_byte_data(0×75, 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ä.