En spelkonsoll med en mekaniskt scannad display. ("PS2 killer")
Bakgrund till projektet.
För ett par år sen såg jag ett häftigt projekt
baserat på en mikrokontroller. Det var Bob Blick från USA som
hade gjort en klocka. Vad var det som var så speciellt med den här
klockan då ? Jo, det var så att den var virtuell. 8 st lysdioder
satt på en arm som roterades, samtidigt som lysdioderna släcktes
och tändes så att en virtuell bild skapades i luften där
lysdioderna passerade. (Detta styrdes av en mikroprocessor som snurrade
med lysdioderna) Detta tyckte jag var häftigt, och började sedan
fundera på om man inte skulle kunna spinna vidare på den idén.
Jag kom fram till att om man ökade antalet lysdioder och lade till
nån form av data överföring så skulle det nog gå
att göra lite vad som helst med det. Så i slutet på 1998
byggde jag ihop lite mekanik och elektronik till ett sådant system,
men det fungerade inte alls, elektroniken "brann upp" och projektet lades
på hyllan. Men nu våren 2000 så tyckte jag att det skulle
vara kul att försöka igen, och den här gången gjorde
jag det som ett projekt i skolan i kursen "Digitala Projekt", så
att det var tvunget att lyckas.
Målet med projetet.
Målet med projektet var att göra ett spelsystem, där
"skärmen" använder samma teknik som Bob Blick's klocka. Skärmen
skulle ha 16 lysdioder, och via ett entråds interface kommunicera
med en huvudenhet som skulle ha hand om spelet. Till huvudenheten skulle
man kunna koppla in två st joysticks för att styra spelen med,
en ljudutgång från en DA omvandlare skulle även finnas.
På spelsystemet skulle spelen Pong och Tetris implementeras, och
även en klocka eftersom det var en klocka som gav mig idén.
Systemet skulle se ut enligt bilden nedan. Grafikkortet som snurrar med
lysdioderna ska hålla reda på skärmens innehåll
och även kunna utföra vissa enkla grafiska operationer. Både
grafikkortet om huvudenheten skulle vara baserade på mikroprocessorn
PIC16F84 eftersom jag ville passa på att prova en C-kompilator för
just den mikroprocessorn, den mikroprocessorn är även lagom avancerad.
(PIC 16F84 har 1024 ords programminne i Flash, där varje ord är
14bitar och varje instruktion är ett ord lång, den har 68byte
ram minne och 64byte data eeprom)
![]() |
Skiss över uppbyggnaden av det virtuella
spelsystemet.
|
Svårigheterna.
En svårighet när man har elektronik som snurrar runt är att få över matningsspänning till den. Bob Blick hade löst detta genom att modifiera motorn och koppla in sig på lindningarna i rotorn, men jag valde att istället sätta på ett antal kullager på motoraxeln och på så vis överföra matningsspänningen via dem. Detta fungerade fint för matningsspänningen, men när jag försökte överföra data på samma sätt gick det inte lika bra. Det var väldigt många mikroavbrott som gjorde signalen alldeles för brusig för att kunna överföra nånting alls. Jag började fundera på om man kanske skulle kunna överföra data via IR, detta skulle vara bökigt, men som tur var så kom jag på en lösning för att minska bruset vid överföringen via kullagret. Om strömmen som flyter genom kullagret är tillräckligt stor (100mA) så kommer de mikrogap, som orsakar avbrotten, att slås igenom och det blir bara lite brus. Dock så uppstod ett annat problem med den ökade strömmen, resistansen i kullagren orsakade ett spänningsfall på ca 2v, så det krävdes en kondensator (och biaserings resistornät) för att bli av med spänningsfallet. Signalen hade ett brus på med en amplitud på en volt både vid hög och låg nivå, och därför krävdes en koparatorkopplad OP-förstärkare för att få ut korrekta spänningsnivåer.
Ett annat problem är att få bilden att stå still och
ha konstant storlek. Att få den att stå still löste jag
med en IR diod och en IR switch, sedan mätte en interrupt rutin i
grafikkortet hur lång tid det tog att rotera ett varv, och ur den
tiden beräknades hur lång tid en pixel ska vara tänd så
att storleken på bilden (till viss del) är oberoende av rotationshastigheten.
![]() |
Detaljbild: Kullageröverföring och IR-synkronisering |
Spelen.
De två spelen Pong och Tetris skulle implementeras på systemet, vilket gick bra. Dock så blev bilden blir väldigt flimmrig då den uppdateras med 4-10Hz beroende på matningsspänning, men det var förväntat.
Pong programmet är mest if-satser som håller koll på att bollen och spelarna håller sig innanför skärmen. Det finns möjlighet att spela mot en datoriserad spelare (Som tyvärr inte är så intelligent). Spelet har även enkla ljud (gjorda med triangelvåg) när bollen studsar.
Tetris programmet var lite svårare att få in på 1024
instruktioner, men C-kompilatorn var imponerande effektiv på att
klämma in allt, så det fick plats efter en del trixande. Dock
så gick det åt mycket ram minne för spelplanen och därför
gick det inte att få musik, då musik kräver en interruptrutin
som i sin tur kräver mycket ramminne.
![]() |
![]() |
Pong in action | Tetris in action |
Klockan.
Klockan gick det inte så bra med, det var problem att kommunicera
med klock-chipet, som skulle hålla reda på tiden. Klockan använde
sig av I2C (en seriell tvåtrådsbus) för att kommunicera.
Rutiner för att kommuniera över I2C fanns tillgängliga från
tillverkaren
av C-kompilatorn, och de fungerade fint när jag testade
de mot ett annat I2C-chip, men klockan var helt död, även när
ett nytt klock-chip införskaffades. Men även om inte klockan
lyckades är jag ganska nöjd ändå då resten gick
fint.
Bilder på hårdvaran.
Eftersom det inte tar mycket längre tid att cadda och etsa ett
kretskort som det tar att vira ett (För mig i alla fall), samt att
resultatet ger ett mer seriöst intryck så valde jag att etsa
korten.
![]() |
![]() |
![]() |
||
Hela den mekansika displayen | Närbild på grafikkortet | Spelkortet |
Länkar
Mer
info om projektet.
Bob
Blick's "propeller" clock.
Den galne konstruktören
Jag som har gjort detta är E96a, heter Rickard Gunée och ser ut så här: