Jump to content

[SA] Wanted level led licht


Crypteq

Recommended Posts

En dan zit je daar op je vrije zondag,wilt wel weer eens gaan modden maar je weet niet wat je moet maken.

Toen kwam ik op het idee: Waarom niet delen van het spel visualiseren in de "echte wereld".

Dus om makkelijk te beginnen: Politie licht wanneer je wanted hebt.

Welke hardware heb ik gebruikt:

  • Een Arduino
  • RGB Led lichtje
  • 330Ω weerstandje
  • En wat kabeltjes

Ik maak gebruik van een common anode RGB ledje. Op de volgende manier is het aangesloten op de Arduino (open spoiler):

arduino_rgb_led_ca.jpg

En voor de software:

  • Programma geschreven voor de Arduino die "luistert" of er een signaal binnen komt met een bepaalde waarde.
  • CLEO Plugin die op een eigen thread naar de seriële verbinding van de Arduino kan schrijven.
  • Een Cleo script die controleert of er een wanted level is en communiceert dit via een opcode naar de CLEO plugin.

Een video van dit hele gebeuren, niet veel spannends. puh2.gif

Wat heb je er aan? Niets, maar het kan, dat is voor mij reden genoeg. blij.gif

Als je suggesties heb wat je zou willen zien (display die de health laat zien, knoppen die iets in het spel laten gebeuren, etc.) post ze, dan zal ik zien wat ik kan doen. smile3.gif

Overigens, zoiets zou ook met GTA IV mogelijk zijn.

Het onderstaande diagram laat zien in welke volgorde welke onderdelen nodig zijn om opdrachten te geven aan de Arduino waar het lichtje mee verbonden is:

opbouw.png

Legenda:

GTA SA

Dit spreekt wel voor zich knipoog.gif

CLEO Script

Dit is een CLEO script welke kijk of men een wanted level heeft. Wanneer het detecteert dat de speler een wanted level heeft roept het een zelf ontwikkelde functie aan die data zend naar de Arduino.

{$CLEO .cs}

thread 'ARDUINO_TEST'
0006: 1@ = 0 //ConnectionState
0006: 2@ = 5 //retrycount
0006: 3@ = 0 //retrycounter
0006: 5@ = 0 //wanted level
0006: 6@ = 0 //wanted level update
06D2: 20@v = "COM3" // COM PORT

:INIT
wait 1000
if
  Player.Defined($PLAYER_CHAR)
else_jump @INIT

:CONNECT															     
0ACE: show_formatted_text_box "Trying to connect with the Arduino at port %s" 20@v
wait 250
0D00: Arduino_Initialize_Serial_Communication_At_COM_Port 20@v
wait 500

:CHECK_CONNECTION
wait 200				    
if
   003B:   3@ == 2@  // (int)
then
   03E6: remove_text_box
   0ACE: show_formatted_text_box "Can not connect with the Arduino"
   jump @EXIT
end

0D02: 1@ = Arduino_Serial_Is_Connected	   
if
   0039:   1@ == 1
then
   03E6: remove_text_box
  0ACE: show_formatted_text_box "Arduino is successfully connected!"
  jump @LOOP
else
   000A: 3@ += 1
   jump @CHECK_CONNECTION
end



:LOOP
wait 100
 if
    Player.Defined($PLAYER_CHAR)  
   then
    01C0: 5@ = player $PLAYER_CHAR wanted_level
    if
	    803B:   not  6@ == 5@
    then	  
	    if
		    0019:   5@ > 0
	    then
		    0DB0: Arduino_Serial_Write_Char 1
		    0085: 6@ = 5@ // (int)
	    else
		    0DB0: Arduino_Serial_Write_Char 0
		    0085: 6@ = 5@ // (int)
	    end   
    end
   end
jump @LOOP

0A93: end_custom_thread

CLEO Plugin

Dit is een zelf ontwikkelde CLEO plugin die data kan lezen en schrijven van en naar een seriële verbinding, wat een Arduino ook gebruikt.

COM Port

Dit is simpelweg een soort poort wat je toegang geeft om data naar toe te sturen en te lezen. De Arduino is toegankelijk via een COM poort.

Arduino

De Arduino draait zelf geschreven software, wanneer ik hier een bepaald signaal naartoe zend dan zal het licht aan of uit gaan.

int redPin = 5;
int greenPin = 6;
int bluePin = 3;

boolean policeLightEnabled = false;
boolean initlight = false;

void setup()
{
 pinMode(redPin, OUTPUT);
 pinMode(greenPin, OUTPUT);
 pinMode(bluePin, OUTPUT);

 Serial.begin(9600);

 analogWrite(redPin, 255);
 analogWrite(greenPin, 255);
 analogWrite(bluePin, 255);

 initlight = true;
}

void serialEvent()
{
   if (Serial.available()) {
   char value = (char)Serial.read();
   if(value == 1)
   {
	  policeLightEnabled = true;
   }
   else if(value == 0)
   {
	 policeLightEnabled = false;
   }
   }
}

void loop()
{
 if(policeLightEnabled)
 {
   analogWrite(greenPin, 255);
   analogWrite(redPin, 0);
   delay(150);

   analogWrite(bluePin, 0);
   analogWrite(redPin, 255);
   delay(150);
 }
 else if(initlight)
 {
   analogWrite(redPin, 255);
   analogWrite(greenPin, 0);
   analogWrite(bluePin, 255);
   delay(750);
   initlight = false;
 }
 else
 {
   analogWrite(redPin, 255);
   analogWrite(greenPin, 255);
   analogWrite(bluePin, 255);
 }
}

De plugin om dit mogelijk te maken en een tutorial met de uitleg zal ik op een later moment vrij geven.

Link to comment
Delen op andere websites

Doet me denken aan de PS4 versie van GTA 5, daar heb je dit ook.

Wat je misschien kan proberen, is dat hoe meer sterren je hebt, des te sneller het gaat flitsen zoals op de PS4 versie van GTA5.

Of inderdaad wat Guardian zei, voor iedere ster een ledje zeg maar.

Iig, wel erg gaaf gedaan :tu:

Link to comment
Delen op andere websites

Tnx voor de aanmoedigende reacties. smile3.gif

Het idee om met meer ledjes te doen, was ook in mij al opgekomen maar heb helaas hier maar 4 RGB-ledjes liggen. Heb nog wel 100 groene ledjes, misschien dat ik daarmee wel kan laten zien.

Voor nu heb ik eerste de CLEO plugin uitgebreid met de volgende opcodes:

0D00: Arduino_Initalize_Serial_Communication_At_COM_Port "COM3"
0D01: Arduino_Disconnect_Serial_Communication
0D02: 0@ = Arduino_Serial_Is_Connected
0DA0: 0@ = Arduino_Serial_Read_Char
0DA1: 0@ = Arduino_Serial_Read_Short
0DA2: 0@ = Arduino_Serial_Read_Long
0DA3: 0@ = Arduino_Serial_Read_Float
0DA4: 0@v = Arduino_Serial_Read_String_Long
0DA5: 0@s = Arduino_Serial_Read_String_Short
0DB0: Arduino_Serial_Write_Char 0@
0DB1: Arduino_Serial_Write_Short 0@
0DB2: Arduino_Serial_Write_Long 0@
0DB3: Arduino_Serial_Write_Float 0@
0DB4: Arduino_Serial_Write_String_Long 0@v
0DB5: Arduino_Serial_Write_String_Short 0@s

Een SCM/CLEO Script om verbinding te maken en een char te versturen ziet er nu zo uit:

{$CLEO .cs}

thread 'ARDUINO_TEST'
0006: 1@ = 0 //ConnectionState
0006: 2@ = 5 //retrycount
0006: 3@ = 0 //retrycounter
06D2: 20@v = "COM3" // COM PORT

:INIT
wait 1000
if
  Player.Defined($PLAYER_CHAR)
else_jump @INIT

:CONNECT															     
0ACE: show_formatted_text_box "Trying to connect with the Arduino at port %s" 20@v
0D00: Arduino_Initalize_Serial_Communication_At_COM_Port 20@v
wait 500

:CHECK_CONNECTION
wait 200				    
if
   003B:   3@ == 2@  // (int)
then
   03E6: remove_text_box
   0ACE: show_formatted_text_box "Can not connect with the Arduino"
   jump @EXIT
end

0D02: 1@ = Arduino_Serial_Is_Connected	   
if
   0039:   1@ == 1
then
   03E6: remove_text_box
  0ACE: show_formatted_text_box "Arduino is successfully connected!"
  jump @LOOP
else
   000A: 3@ += 1
   jump @CHECK_CONNECTION
end



:LOOP
wait 1500
0DB0: Arduino_Serial_Write_Char 1
jump @LOOP

:EXIT
0D01: Arduino_Disconnect_Serial_Communication

0A93: end_custom_thread

Nu ik dit werkend heb, is de volgende stap:

- Meerdere ledjes laten knipperen (wanted level weergeven)

- Health weergeven (op wat voor manier dan ook)

- Fysieke knoppen om iets in het spel te laten gebeuren.

Zal de "geslaagde" pogingen hier wel posten. smile3.gif

Link to comment
Delen op andere websites

Je kan misschien een health/armor bar maken met al die ledjes, zou ook wel vet zijn. Ik heb hier ook nog een arduino liggen en enkele kleine ledjes, en met java en arduino al gecommuniceerd, maar niet met c++ (heb ook niet echt ervaring met c++). Zin om de plugin te releasen? :puh:

Link to comment
Delen op andere websites

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...