Proiectul iși propune realizarea unui joc clasic de Snake, controlat prin mișcarea plăcuței, cu ajutorul unui accelerometru. Afișajul se va face pe LCD-ul unui telefon mobil. Da, nu e nevoie de niciun buton. Inițial, am vrut să folosesc un LCD de la un telefon Nokia 3310, dar în urma unor neplăceri de care nu vreau să aduc aminte, am hotărât să folosesc LCD-ul unui Nokia 1100.
Controller-ul primește input de la un accelerometru. În funcție de înclinația plăcuței, direcția șarpelui se schimbă. Rezultatul se vede pe ecranul de Nokia 1100.
Lista componente necesare:
Inițial am achiziționat un accelerometru ADXL327BCPZ pe care dacă îl vrea cineva, i-l vând cu mare plăcere dacă se simte în stare să-l lipească. (Notă: știam că e foarte mic, dar nu mă așteptam la aşa ceva)
Apoi am purces în a achiziţiona un accelerometru MMA7361, lipit pe o placă. In afară de accelerometru, pe placă se găsesc şi 3 condensatori care trebuiau puşi la ieşirile accelerometrului. La lipirea acestei plăci nu am întâmpinat niciun fel de dificultate.
In ceea ce priveşte LCD-ul, aici am avut probleme serioase, ecranul lui 3310 fiind foarte sensibil. După un expermiment eşuat (nu ştiu dacă l-am ars eu sau era deja stricat) am ucis cu sânge rece un Nokia 1100 găsit prin casă şi l-am lipit conform specificaţiilor de aici (Notă: luaţi foarte în serios a doua propoziţie din caption)
Conform specificaţiilor, ecranul trebuie alimentat la 1.8V pe VddI şi la 3.2V pe Vdd. Deoarece deja obţinusem un voltaj de 3.3V de care aveam nevoie pentru a alimenta LCD-ul de 3310, le-am cuplat pe amândouă la acest voltaj şi (surprinzător sau nu) a mers.
Tensiunea de 3V3 am obţinut-o prin legarea celor 4 diode la Vcc. Practic, voltajul obţinut este ceva mai mare (în jur de 3.7V). La XRES, XCC, SDA şi SCLK am folosit câte un divizor de tensiune, realizat cu rezistenţele de 1k8 şi 3k3.
Accelerometrul trebuie alimentat tot la 3.3V. MMA7361 dispune de un mod de funcţionare în sleep, în care consumă mai puţin şi de care eu nu am avut nevoie. Cum semnalul este activ pe zero, a trebuit să leg şi acest pin la 3V3. Conform datasheet-ului am făcut aceasta printr-o rezistenţă de 10K.
Mai jos sunt schemele electrice. LCD-ul a fost legat la portul B al microcontoller-ului, iar accelerometrul la portul A, câtre convertorul analog-digital.
TODO
Am realizat de asemenea şi o simulare în Proteus, evident doar a părţii de comunicaţie cu LCD-ul. Modelul pentru Nokia 1100 l-am găsit aici (Notă: din câte ştiu modelele de acolo merg doar pentru Proteus > 7). Atenţie: codul în simulare nu funcţionează întocmai ca în realitate, motive obscure legate de mirroring-ul axelor îl împiedică sa facă asta.
Pentru comunicaţia cu LCD-ul am pornit de la un API realizat pentru interfaţarea cu un microcontroller PIC, pe care l-am adaptat pentru ATMEGA. Un alt loc din care m-am inspirat este acesta - API pentru LCD de 3310.
In ceea ce priveşte preluarea datelor de la accelerometru, aceasta se face foarte simplu cerând informaţii de la convertorul analog-digital al controllerului, specificând canalul:
int ADC_get(uint8_t channel) { ADMUX &= 0xE0; ADMUX |= channel; ADCSRA |= _BV(ADEN)|_BV(ADSC); while(!(ADCSRA & (1<<ADIF))); return ADC; }
Logica jocului este foarte simplă: la fiecare jumătate de secundă se consultă ADC-ul pentru a observa dacă utilizatorul a făcut o mişcare pentru a muta şarpele. Coordonatele punctelor sunt reţinute în doi vectori de lungime maximă MAXLEN, coordonatele capului fiind pe ultima poziţie (curr_len - 1). La fiecare pas se verifică dacă şarpele se atinge pe el însuşi (game over), dacă a atins o unitate de hrană (se măreşte lungimea şarpelui şi se generează aleator o altă poziţie pentru hrană), şi dacă şarpele a atins lungimea maximă (you win).
Proiectul este funcţional.
Există anumite bug-uri legate de api-ul pentru Nokia 1100 şi pe care nu am apucat să le corectez. De exemplu, pentru a afişa pe prima linie a ecranului, este necesar să trimiţi comanda pentru linia 2. Nesemnificativ (dar există şi alte neplăceri).
Urmează poze:
Plăcuţă etapa 1:
Plăcuţă etapa 2 (Notă: condensatorul din partea dreaptă şi o pereche de rezistenţe trebuie ignorate. Ele sunt rămase de la tentativa cu 3310):
Nokia 1100:
1. Nu folosiţi LCD de 3310.
2. Nu folosiţi accelerometru decât dacă:
a. Puteţi lipi ceva foarte mic (Notă: foarte mic)
b. Cheltuiţi o anumită sumă pe un accelerometru lipit pe o placă
3. Implementarea software este cel mai uşor pas. Adevăratul challenge, mai ales pentru cineva lipsit de experienţă şi cu puţine cunoştinţe de electronică, este partea de hardware.
4. Apucaţi-vă din timp