This is an old revision of the document!
Proiectul constă într-o mașinuță LEGO Technic Porsche 911 RSR controlată la distanță, prin Bluetooth, printr-o aplicație de telefon.
Scopul este ca mașina să se poată deplasa la fel ca una normală, înainte, înapoi, cât și să își schimbe direcția prin rotirea roților. Va dispune și de un set de leduri albe, galbene și roșii, pentru a imita farurile, stop-urile, avariile și semnalizarea unei mașini reale. De asemenea, aceasta va avea un senzor ultrasonic care va funcționa ca un senzor de parcare (va declanșa un buzzer dacă mașina este prea aproape de un obstacol, buzzer-ul va emite din ce în ce mai multe semnale pe masură ce distanța devine mai mică).
Ideea a pornit de la un prieten, care are mai multe astfel de mașinuțe și care îmi tot spunea că a văzut oameni pe net care au motorizat astfel de jucării. Mi-a spus că ar vrea și el să facă asta și am zis de ce nu.
Proiectul este util în primul rând pentru că ar acoperi o varietate de concepte studiate la această materie și în al doilea rând e un Porsche LEGO teleghidat, care ar putea (dacă iese bine) să facă drift-uri.
Pentru comunicarea Bluetooth am folosit modulul USART0 al microcontrolerului, configurat să declanșeze o întrerupere la finalul fiecărei recepții, astfel încât să pună caracterele primite într-un buffer și să seteze un flag atunci când a detectat finalul unui mesaj (când a detectat newline).
void USART0_init(unsigned int ubrr) { /* baud rate registers */ UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr; /* enable TX and RX */ UCSR0B = _BV(RXEN0) | _BV(TXEN0); // enable receive complete interrupt UCSR0B |= _BV(RXCIE0); /* frame format: 8 bits, 2 stop, no parity */ UCSR0C = _BV(USBS0) | (3<<UCSZ00); } ... ISR(USART_RX_vect) { // read data register into buffer and increase its length uint8_t new_data = UDR0; usart_buffer[usart_buffer_len++] = new_data; // reset buffer length on overflow if (usart_buffer_len >= USART_BUFFER_MAX_LEN - 1) { usart_buffer_len = 0; } // set string received flag if (new_data == '\n') { string_received = true; } }
Pentru a putea detecta lumina din mediul înconjurător cu ajutorul unui fotorezistor am folosit modulul de convertor analogic digital, care să interpreteze practic lumina ca o valoare pe 10 biți (0-1023).
void adc_init() { // channel 7 ADMUX |= _BV(MUX0) | _BV(MUX1) | _BV(MUX2); // AVcc with external capacitor at AREF PIN ADMUX |= _BV(REFS0); ADCSRA = 0; // set 128 prescaler ADCSRA |= _BV(ADPS0); ADCSRA |= _BV(ADPS1); ADCSRA |= _BV(ADPS2); // enable ADC ADCSRA |= _BV(ADEN); } uint16_t adc_get_light_value() { // start conversion ADCSRA |= (1 << ADSC); // wait until conversion is complete while ((ADCSRA & (1 << ADSC))); return ADC; }
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.