ASZK

Bazooka_V1

Jun 25th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 10.07 KB | None | 0 0
  1. #include <Arduino.h>
  2. #include <DFPlayer_Mini_Mp3.h>
  3.  
  4. #define txPinIR   3   //IR carrier output
  5. #define TSOP 9
  6. #define led_red A0
  7. #define led_green A1
  8. #define led_blue A2
  9.  
  10.  
  11. SoftwareSerial mySerial(10, 11); // RX, TX
  12. unsigned long duration;
  13. unsigned long durationold;
  14. String Received = "";
  15.  
  16. unsigned char carrierFreq = 0; //default
  17. unsigned char period = 0; //calculated once for each signal sent in initSoftPWM
  18. unsigned char periodHigh = 0; //calculated once for each signal sent in initSoftPWM
  19. unsigned char periodLow = 0; //calculated once for each signal sent in initSoftPWM
  20. unsigned long sigTime = 0; //used in mark & space functions to keep track of time
  21. unsigned long sigStart = 0; //used to calculate correct length of existing signal, to handle some repeats
  22.  
  23.  
  24. #define NEC_HEX_VALUE 0x20DF22DDUL //UL makes this an unsigned long
  25. #define NEC_BIT_COUNT 24 // header +24 for message
  26. /////////////////////////////////////////////////////////////////////
  27. // MilesTag command pack  (0x...  ...UL)
  28. #define New_GameIM 0x8305E8UL // New Game (Immediate)
  29. #define Explode 0x830BE8UL //Explode
  30. //////////////////////////////////////////////////////////////////
  31.  
  32. /////////////////////////////////////////////////
  33. const String New_GameIM_rcv = "100000110000010111101000";
  34. const String Admin_Kill_rcv = "100000110000000011101000";
  35. const String Clear_Scores_rcv = "100000110001010011101000";
  36. ///////////////////////////////////////////////////
  37.  
  38.  
  39. class Elapsed
  40. {
  41.     unsigned long startus, startms;
  42.  
  43.   public:
  44.  
  45.     // constructor resets time
  46.     Elapsed () {
  47.       reset ();
  48.     };
  49.  
  50.     // reset time to now
  51.     void reset () {
  52.       startus = micros ();
  53.       startms = millis ();
  54.     };
  55.  
  56.     // return Elapsed time in milliseconds
  57.     unsigned long intervalMs () {
  58.       return millis () - startms;
  59.     };
  60.  
  61.     // return Elapsed time in microseconds
  62.     unsigned long intervalUs () {
  63.       return micros () - startus;
  64.     };
  65.  
  66. };    // end of class Elapsed
  67.  
  68.  
  69. static Elapsed t_1, t_2, t_3, t_bazook, t_flash, t_blink, t_itter;
  70. int blink=0;
  71. int bit = 0;
  72. int loopNr = 0;
  73.  
  74. void setup() {
  75.   Serial.begin(2000000); // 2MHz- fastest one
  76.   Serial.println("---Ready----");
  77.   Serial.println("\n");
  78.   pinMode(TSOP, INPUT);
  79.   pinMode(txPinIR, OUTPUT);
  80.  
  81.   mySerial.begin (9600);
  82.   mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
  83.   mp3_set_volume (30);
  84.  
  85.   pinMode(led_red, OUTPUT);
  86.   pinMode(led_green, OUTPUT);
  87.   pinMode(led_blue, OUTPUT);
  88.   digitalWrite(led_red, 0);
  89.   digitalWrite(led_blue, 0);
  90.   digitalWrite(led_green, 0);
  91.  
  92.   //mp3_play (1);
  93.  
  94.  
  95.  
  96. }
  97.  
  98.  
  99. void initSoftPWM(unsigned char carrierFreq) { // Assumes standard 8-bit Arduino, running at 16Mhz
  100.   //supported values are 30, 33, 36, 38, 40, 56 kHz, any other value defaults to 38kHz
  101.   //we will aim for a  duty cycle of circa 33%
  102.  
  103.   period =  (1000 + carrierFreq / 2) / carrierFreq;
  104.   periodHigh = (period + 1) / 3;
  105.   periodLow = period - periodHigh;
  106.  
  107.  
  108.   switch (carrierFreq) {
  109.     case 30  : //delivers a carrier frequency of 29.8kHz & duty cycle of 34.52%
  110.       periodHigh -= 6; //Trim it based on measurementt from Oscilloscope
  111.       periodLow  -= 10; //Trim it based on measurementt from Oscilloscope
  112.       break;
  113.  
  114.     case 33  : //delivers a carrier frequency of 32.7kHz & duty cycle of 34.64%
  115.       periodHigh -= 6; //Trim it based on measurementt from Oscilloscope
  116.       periodLow  -= 10; //Trim it based on measurementt from Oscilloscope
  117.       break;
  118.  
  119.     case 36  : //delivers a carrier frequency of 36.2kHz & duty cycle of 35.14%
  120.       periodHigh -= 6; //Trim it based on measurementt from Oscilloscope
  121.       periodLow  -= 11; //Trim it based on measurementt from Oscilloscope
  122.       break;
  123.  
  124.     case 40  : //delivers a carrier frequency of 40.6kHz & duty cycle of 34.96%
  125.       periodHigh -= 6; //Trim it based on measurementt from Oscilloscope
  126.       periodLow  -= 11; //Trim it based on measurementt from Oscilloscope
  127.       break;
  128.  
  129.     case 56  : //delivers a carrier frequency of 53.8kHz & duty cycle of 40.86%
  130.       periodHigh -= 6; //Trim it based on measurementt from Oscilloscope
  131.       periodLow  -= 12; //Trim it based on measurementt from Oscilloscope
  132.       //Serial.println(periodHigh);
  133.       //Serial.println(periodLow);
  134.  
  135.       break;
  136.  
  137.  
  138.     case 38  : //delivers a carrier frequency of 37.6kHz & duty cycle of 36.47%
  139.     default :
  140.       periodHigh -= 6; //Trim it based on measurementt from Oscilloscope
  141.       periodLow  -= 11; //Trim it based on measurementt from Oscilloscope
  142.       break;
  143.   }
  144. }
  145.  
  146. void mark(unsigned int mLen) { //uses sigTime as end parameter
  147.   sigTime += mLen; //mark ends at new sigTime
  148.   unsigned long now = micros();
  149.   unsigned long dur = sigTime - now; //allows for rolling time adjustment due to code execution delays
  150.   if (dur == 0) return;
  151.   while ((micros() - now) < dur) { //just wait here until time is up
  152.     digitalWrite(txPinIR, HIGH);
  153.     if (periodHigh) delayMicroseconds(periodHigh);
  154.     digitalWrite(txPinIR, LOW);
  155.     if (periodLow)  delayMicroseconds(periodLow);
  156.   }
  157. }
  158.  
  159. void space(unsigned int sLen) { //uses sigTime as end parameter
  160.   sigTime += sLen; //space ends at new sigTime
  161.   unsigned long now = micros();
  162.   unsigned long dur = sigTime - now; //allows for rolling time adjustment due to code execution delays
  163.   if (dur == 0) return;
  164.   while ((micros() - now) < dur) ; //just wait here until time is up
  165. }
  166.  
  167. void sendHexNEC(unsigned long sigCode, byte numBits, unsigned char repeats, unsigned char kHz) {
  168.  
  169. #define NEC_HEADER_MARK 2400
  170. #define NEC_HEADER_SPACE 600
  171. #define NEC_ONE_MARK 1200
  172. #define NEC_ZERO_MARK 600
  173. #define NEC_ONE_SPACE 600
  174. #define NEC_ZERO_SPACE 600
  175. #define NEC_TRAILER_MARK 560
  176.  
  177.   unsigned long bitMask = (unsigned long) 1 << (numBits - 1); //allows for signal from 1 bit up to 32 bits
  178.   //
  179.   if (carrierFreq != kHz)  initSoftPWM(kHz); //we only need to re-initialise if it has changed from last signal sent
  180.  
  181.   sigTime = micros(); //keeps rolling track of signal time to avoid impact of loop & code execution delays
  182.   sigStart = sigTime; //remember for calculating first repeat gap (space), must end 108ms after signal starts
  183.  
  184.   // First send header Mark & Space
  185.   mark(NEC_HEADER_MARK);
  186.   space(NEC_HEADER_SPACE);
  187.  
  188.   while (bitMask) {
  189.     if (bitMask & sigCode) { //its a One bit
  190.       mark(NEC_ONE_MARK);
  191.       space(NEC_ONE_SPACE);
  192.     }
  193.     else { // its a Zero bit
  194.       mark(NEC_ZERO_MARK);
  195.       space(NEC_ZERO_SPACE);
  196.     }
  197.     bitMask = (unsigned long) bitMask >> 1; // shift the mask bit along until it reaches zero & we exit the while loop
  198.   }
  199.   // Last send NEC Trailer MArk
  200.   // mark(NEC_TRAILER_MARK);
  201.  
  202.  
  203.   if (repeats == 0) return; //finished - no repeats
  204.   else if (repeats > 0) { //first repeat must start 108ms after first signal
  205.     space(108000 - (sigTime - sigStart)); //first repeat Header should start 108ms after first signal
  206.     mark(NEC_HEADER_MARK);
  207.     space(NEC_HEADER_SPACE / 2); //half the length for repeats
  208.     mark(NEC_TRAILER_MARK);
  209.   }
  210.  
  211.   while (--repeats > 0) { //now send any remaining repeats
  212.     space(108000 - NEC_HEADER_MARK - NEC_HEADER_SPACE / 2 - NEC_TRAILER_MARK); //subsequent repeat Header must start 108ms after previous repeat signal
  213.     mark(NEC_HEADER_MARK);
  214.     space(NEC_HEADER_SPACE / 2); //half the length for repeats
  215.     mark(NEC_TRAILER_MARK);
  216.   }
  217.  
  218. }
  219.  
  220. void red() {
  221.   digitalWrite(led_red, 0);
  222.   digitalWrite(led_blue, 1);
  223.   digitalWrite(led_green, 1);
  224. }
  225. void blue() {
  226.   digitalWrite(led_red, 1);
  227.   digitalWrite(led_blue, 0);
  228.   digitalWrite(led_green, 1);
  229. }
  230. void green() {
  231.   digitalWrite(led_red, 1);
  232.   digitalWrite(led_blue, 1);
  233.   digitalWrite(led_green, 0);
  234. }
  235. void white() {
  236.   digitalWrite(led_red, 0);
  237.   digitalWrite(led_blue, 0);
  238.   digitalWrite(led_green, 0);
  239. }
  240. void led_off() {
  241.   digitalWrite(led_red, 1);
  242.   digitalWrite(led_blue, 1);
  243.   digitalWrite(led_green, 1);
  244. }
  245.  
  246.  
  247. void shootrocket() {
  248.  
  249.   //led_off();
  250.   delay(50);
  251.   for (int i = 0; i < 5; i++)
  252.   {
  253.     sendHexNEC(Explode, NEC_BIT_COUNT, 1, 56);
  254.     delay(50);
  255.   }
  256.  
  257.   //red();
  258.   //mp3_play (8);
  259.   delay(1000);
  260.   //led_off();
  261.   Serial.print("rakieta");
  262. }
  263.  
  264. void testowanie() {
  265.   Serial.println("test");
  266.   for (int i = 0; i < 5000; i++) {
  267.     blue();
  268.     delay(50);
  269.     led_off();
  270.     delay(200);
  271.     sendHexNEC(New_GameIM, NEC_BIT_COUNT, 1, 56);
  272.     delay(100);
  273.     red();
  274.     delay(50);
  275.     led_off();
  276.     delay(200);
  277.     sendHexNEC(New_GameIM, NEC_BIT_COUNT, 1, 56);
  278.     delay(100);
  279.   }
  280. }
  281.  
  282.  
  283. void order() {
  284.   String commandline = Serial.readString();
  285.   //Serial.println(commandline);
  286.  
  287.   if (commandline.startsWith("new game")) {
  288.     Serial.println(F("Sending New Game (Immediate)"));
  289.     sendHexNEC(New_GameIM, NEC_BIT_COUNT, 1, 56);
  290.   }
  291.  
  292.   if (commandline.startsWith("shoot rockets")) {
  293.     shootrocket();
  294.   }
  295.   if (commandline.startsWith("test")) {
  296.     testowanie();
  297.   }
  298. }
  299.  
  300. void reloading() {
  301.  
  302.   if(blink==2){blink=0;}
  303.  
  304.   if(t_blink.intervalMs()>800){
  305.     if(blink==0){blue();}
  306.     if(blink==1){led_off();}
  307.     blink++;
  308.     t_blink.reset();
  309.     t_itter.reset();
  310.   }
  311.  
  312. }
  313.  
  314.  
  315.  
  316. void loop() {
  317.  
  318.   //testowanie();
  319.  
  320.   duration = pulseIn(TSOP,LOW,5000);
  321.   if(duration != durationold){ //  if new pulse detected do this
  322.  
  323.  
  324.     if((Received.length()!=0)||(duration>2000)){
  325.  
  326.       bit = (log(((duration+50)/600))/(log(2)))+1;
  327.  
  328.       switch(bit){
  329.         case 0:
  330.           Received="";
  331.           break;
  332.         case 1:
  333.           Received.concat(0);
  334.           break;
  335.         case 2:
  336.           Received.concat(1);
  337.           break;
  338.         case 3:
  339.           Received = "2";      
  340.           break;
  341.       }
  342.  
  343.       if ((Received.length() == 15)&&(Received.startsWith("20") )) //Shoot
  344.       {
  345.         Serial.println("Shoot");
  346.         Serial.println(Received);
  347.         shootrocket();
  348.  
  349.         Received="";
  350.       }
  351.  
  352.       if ((Received.length() == 25)&&(Received.startsWith("21") )) //Message
  353.       {
  354.         Serial.println("Message");
  355.         Serial.println(Received);
  356.  
  357.         Received="";
  358.       }
  359.      
  360.  
  361.    
  362.    
  363.  
  364.  
  365.  
  366.      
  367.  
  368.    
  369.  
  370.      durationold = duration;
  371.      }
  372.   }
  373. }
Add Comment
Please, Sign In to add comment