Cristian DUȚESCU (78314) - Racing Dashboard

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

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.

Descriere generală

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:

Hardware Design

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

Schema de conexiuni

Software Design

Mediu de dezvoltare

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

Implementarea consta din 2 mari componente: primirea datelor de pe portul serial si afisarea, in urma prelucrarii, folosind modulele de afisaj.

Portul serial

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.

  1. rev - un numar de 4 cifre ce reprezinta turatia,
  2. speed - un numar de 3 cifre ce reprezinta viteza masinii
  3. gear - o cifra ce reprezinta trapta de viteza in care se afla
  4. acc - un numar intre 0 si 12 ce reprezinta pozitia pedalei de acceleratie
  5. brake - un numar intre 0 si 12 ce reprezinta pozitia pedalei de frana.

Afisarea

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();
}

Rezultate

Am obtinut un bord digital pentru Project Cars 2, dar care poate fi folosit si pentru alte aplicatii.

Download

Codul sursa: Cod sursa

Bibliografie/Resurse

Bootloader Biblioteca Neopixel

  • Documentația în format PDF
pm/prj2018/amocanu/cristian.dutescu.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0