Маніпулятор для гри у тетріс на базі МЕМС-акселерометра
Моя курсова робота на 3-му курсі університету (at the end of 2009). Маніпулятор представляє собою пристрій що закріплюється на руці і дозволяє рухами руки керувати грою: рухами вправо і вліво можна пересунути фігуру у відповідному напрямку, вперед - перевернути фігуру, вниз - опустити.
Схема:
Плата під'єднується до комп'ютера за допомогою data cable від мобільного телефону.
Програма для мікроконтролера:
#include "./avr/io.h" #include "./avr/interrupt.h" #define F_CPU 7372800UL #define ubrr F_CPU/16/9600-1 unsigned char min[3]={255, 255, 255}, max[3]={0, 0, 0}; void init(void) { DDRD=(1<<2); PORTD=4; // no sleepmode DDRB=(1<<1)|(1<<2); PORTB=0; //1.5 g ADMUX=0; // external reference // port 1 - MUX3_0=0001 // port 2 - MUX3_0=0010 // port 3 - MUX3_0=0011 ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); // ADC enabled // free running off // ADC frequency - 230.4 kHz UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); UCSRC=(1<<UCSZ1)|(1<<UCSZ0); UBRRH=(unsigned char)(ubrr>>8); UBRRL=(unsigned char)(ubrr); TIMSK=(1<<TOIE0); // T0 overflow innterrupt enabled TCCR0=(1<<CS00)|(1<<CS02); TCNT0=219; // T=5ms sei(); } void setmaxg(char g) { PORTB=g<<1; } void conversion(void) { // voltage to code unsigned char res; // channel 1 ADMUX=(1<<MUX0); ADCSRA|=(1<<ADSC); //start convesion while(ADCSRA & (1<<ADSC)); res=(ADCL>>2)+(ADCH<<6); if(res>max[0])max[0]=res; if(res<min[0])min[0]=res; // channel 2 ADMUX=(1<<MUX1); ADCSRA|=(1<<ADSC);//start convesion while(ADCSRA & (1<<ADSC)); res=(ADCL>>2)+(ADCH<<6); if(res>max[1])max[1]=res; if(res<min[1])min[1]=res; // channel 3 ADMUX=(1<<MUX0)|(1<<MUX1); ADCSRA|=(1<<ADSC);//start convesion while(ADCSRA & (1<<ADSC)); res=(ADCL>>2)+(ADCH<<6); if(res>max[2])max[2]=res; if(res<min[2])min[2]=res; // maximums and minimums are saved } ISR(TIMER0_OVF_vect) { // T0 overflow TCNT0=219; conversion(); sei(); // all interrupts enabled } void sendbyte(unsigned char data) {// sending data to PC (1 byte) while(!(UCSRA & (1<<UDRE))); UDR=data; } void senddata(void) { //sending maximums and minimums to PC unsigned char i; for(i=0;i<=2;i++) { sendbyte(min[i]); sendbyte(max[i]); min[i]=255; max[i]=0; } } ISR(USART_RXC_vect) { // USART: data catched switch(UDR) { case 0x31: senddata(); break; case 0x32: setmaxg(0); break; case 0x33: setmaxg(1); break; case 0x34: setmaxg(2); break; case 0x35: setmaxg(3); } sei(); // all interrupts enabled } int main(void) { init(); while(1); return 0; }
Тетріс був написаний ще влітку на Delphi, just for fun, потрібно було лише додати підтримку маніпулятора.
Licensed under CC BY-SA 3.0