Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul meu este un bord cu afisaj digital pentru simulatorul de curse Project Cars 2. Pe bord apar informatiile care apar si in bordul unei masini de curse: Viteza, turatia, treapta de viteza si un afisaj cu leduri ce indica momentul in care trebuie schimbat in treapta superioara.
Proiectul consta in: Un PC care ruleaza Project Cars 2 si un script de Python ce preia date de la joc si le trimite microcontrolerului prin interfata USB. Afisajul consta in: un afisaj cu 8 caractere, o matrice de leduri si doua benzi de leduri, care sunt conectate in felul urmator:
Lista piese
1 - Display LED cu 8 Cifre MAX7219 1 - Matrice de LED-uri MAX7219 1 - Adafruit NeoPixel 1/4 60 Ring 1 - Adafruit 24 RGB Neopixel LED Ring with Integrated Drivers
Pentru dezvoltarea aplicatiei, am folosit bootloader-ul de Arduino si Arduino IDE. Bootloader-ul l-am incarcat folosind un AVR ISP MKII si proiectul urmator https://github.com/MCUdude/MightyCore .
Implementarea consta din 2 mari componente: primirea datelor de pe portul serial si afisarea, in urma prelucrarii, folosind modulele de afisaj.
Pe portul serial poate primii 2 tipuri de mesaje: - r{max}{red}{green} un mesaj folosit pentru calibrare. Max reprezinta turatia maxima, red turatia la care banda led devine rosie, si green turatia la care devine verde. - c{rev}{speed}{gear}{acc}{brake} un mesaj in care primeste datele curente.
Turatia este afisata pe primele 4 cifre ale display-ului de 8 caractere, cat si liniar pe banda led. Pentru asta folosesc bibliotecile LedControl si Adafruit_NeoPixel. functiile folosite sunt:
for(j=0;j<4;++j) { lc.setDigit(0,4+j,rpm2%10,false); rpm2/=10; }
void revWrite(int a,uint32_t c) { for(uint16_t k=0; k<a; k++) { strip.setPixelColor(k, c); } strip.show(); }
Viteza masinii este afisata pe ultimile 3 caractere ale display-ului cu 8 caractere. Pentru asta folosesc biblioteca LedControl.
int m = 1; if(spe/10 > 0) m=2; if(spe/100 > 0) m=3; for(j=0;j<m;++j) { if(spe != 0 || j!=3) lc.setDigit(0,j,spe%10,false); spe/=10; }
Treapta de viteza este afisata pe matricea de 8×8, folosind biblioteca LedControl si functia:
void showGear(char gear) { byte n[8]={B00000000,B01000010,B01100010,B01010010,B01001010,B01000110,B01000010,B00000000}; byte one[8]={B00000000,B00001000,B00011000,B00101000,B00001000,B00001000,B00001000,B00000000}; byte two[8]={B00000000,B00011000,B00100100,B00000100,B00001000,B00010000,B00111100,B00000000}; byte three[8]={B00000000,B00111000,B00000100,B00000100,B00011000,B00000100,B00000100,B00111000}; byte four[8]={B00000100,B00001100,B00010100,B00100100,B00111110,B00000100,B00000100,B00000100}; byte five[8]={B00000000,B00111100,B00100000,B00100000,B00111100,B00000100,B00000100,B00111100}; byte six[8]={B00000000,B00111100,B00100000,B00100000,B00111100,B00100100,B00100100,B00111100}; byte seven[8]={B00000000,B00111110,B00000010,B00000100,B00001000,B00010000,B00010000,B00000000}; byte * current; current = n; mx.clearDisplay(0); Serial.println(gear); if(gear=='1') current = one; if(gear=='2') current = two; if(gear=='3') current = three; if(gear=='4') current = four; if(gear=='5') current = five; if(gear=='6') current = six; if(gear=='7') current = seven; for(int i=0;i<8;++i) { mx.setRow(0,i,current[i]); } }
Pozitiile pedalelor de acceleratie si frana sunt afisate pe inelul de 24 de LED-uri, fiecare pedala fiind afisata pe o jumatate de inel. Pentru asta folosesc biblioteca Adafruit_NeoPixel.
void ringWrite(int th,int br) { for(uint16_t k=0; k<th; k++) { ring.setPixelColor(k, ring.Color(0,255,0)); } for(uint16_t k=23; k>23-br; k--) { ring.setPixelColor(k, ring.Color(255,0,0)); } ring.show(); }
Am obtinut un bord digital pentru Project Cars 2, dar care poate fi folosit si pentru alte aplicatii.
Codul sursa: Cod sursa
Bootloader Biblioteca Neopixel