Airsoft čítač munice - Arduino program

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Zeppy
Příspěvky: 67
Registrován: 30 říj 2014, 01:00

Airsoft čítač munice - Arduino program

#1 Příspěvek od Zeppy »

Zdravím všechny přísedící! :)

Tuto problematiku jsem řešil už o sekci výše, ale tam jde hlavně o tu fyzickou část jak to ubastlit a to máme víceméně hotovo, děkuju za pomoc :)
Viz. http://www.ebastlirna.cz/modules.php?na ... ic&t=67022 ...můžete si to tam pročíst
Jsem airsofťák, takovej ten magor co běhá s puškou na kuličky po lese a střílí na ostatní magory s puškami na kuličky...no a občas se stane že kuličky nehlídám a zrovna když je tak potřebuju, žiju si v libém snu, že kulí dost ale ono prd...tak mě napadlo udělat čítač munice. Normálně jak máte ve hrách napsanou munici, já bych to měl naživo.
K funkci. Nastavila by se výchozí hodnota tlačítkem (klikáním by se přidávaly desítky, kdybych to 2 sekundy podržel, tak by se klikáním přidávaly jednotky a dalším 2 sekundovým přidržením by se to potvrdilo, muselo by si to pamatovat i po vypnutí až když to zapnu, tak tam.bude, to co jsem si předtím nastavIl. IR brána na konci hlavně by při průletu kuličkou odečetla z tohoto čísla
až bych byl na nule, tak by to mohlo při dalších výstřelech třeba zablikat. Další závora by byla v šachtě, kde po vytažení zásobníku by se resetovalo zpět na nastavenou hodnotu. Ty čidla fungují jako tlačítko (programově) a při přetnutí nějakým objektem vydá log. 1. Ostatně když prolítnete to odkázané fórum, všechno tam je. Display je 2 ciferný 7 segment řízený přes dvě 74HC595. Kvůli úspoře drátů a výstupů. Tlačítka budou tlačítka a srdcem všeho bude Arduino Nano, to mi však ještě nedošlo z ebaye, tak se musíme spokojit s prototypem na arduino uno.
Takže jsou tu chytré hlavičky, co by mi pomohly s prográmkem arduino? Jsem začátečník

Uživatelský avatar
Zaky
Příspěvky: 6129
Registrován: 30 říj 2010, 02:00
Bydliště: Praha

#2 Příspěvek od Zaky »

Najdi si na netu nějaký tutorial, rozblikej ledku, přečti tlačítko, nauč se rozpoznat krátký a dlouhý stisk, naprogramuj řízení displeje, obsluž přerušení, zatím třeba od tlačítka, na něm pak bude viset optozávora výstřelu. Postupně a po jednom. Až to budeš umět, dej to dohromady a postupně zrealizuj svoje zadání. Jen tak se to naučíš a bude to pro tebe mnohem větším přínosem, než si to nechat od někoho napsat. Pokud jsi ještě s AVR nedělal, alternativně se podívej na Cypress PSOC4, viz: http://cz.farnell.com/cypress-semicondu ... dp/2420489 , mám tyhle procesory mnohem radši, než AVR, IDE PSOC Creator ti umožní programovat v C, aniž bys musel studovat jakékoli konfigurace registrů, Cypress má i dost pěkně udělané video tutorialy. Pokud si k tomu koupíš Miniprog3, nebo levněji místo CY8KIT-049 si koupíš http://cz.farnell.com/cypress-semicondu ... dp/2311054 , umožní ti to i debugging přímo v procesoru, což je obrovská výhoda.

Uživatelský avatar
Jeejda_teda_puvodne
Příspěvky: 142
Registrován: 08 dub 2012, 02:00

#3 Příspěvek od Jeejda_teda_puvodne »

Naposledy upravil(a) Jeejda_teda_puvodne dne 25 říj 2016, 13:33, celkem upraveno 1 x.

Uživatelský avatar
Zeppy
Příspěvky: 67
Registrován: 30 říj 2014, 01:00

#4 Příspěvek od Zeppy »

No přesunul jsem to, protože je konstrukce a teda i její téma dokončené, tam je všechno vymyšleno a hotovo. Teď už jde pouze a jenom o ten program a když se někdo víc zajímá o programování, spíš poleze sem a mohl by mi tu pomoct. Fajn že mi nabízíte jiné platformy, ale já už to arduino mám u sebe a i jeho program jakš takš znám. Ostatní řekněme vůbec. Mezitím už jsem udělal nějaký progress...bude video :D

Uživatelský avatar
Zeppy
Příspěvky: 67
Registrován: 30 říj 2014, 01:00

#5 Příspěvek od Zeppy »

Zde je video http://youtu.be/O1BQXsF69eY ...snad vám nevypálí oči nízká kvalita :D

Uživatelský avatar
bandolik
Příspěvky: 78
Registrován: 26 zář 2014, 02:00

#6 Příspěvek od bandolik »

Teda chlape video je dobré myslím že pomoc už nepotřebuješ funguje to skvěle už to jen nacpat do té zbraně a máš hotovo. Pokud jde o to tlumení jasu už jsem ti to jednou nakousnul co kdybys udělal takový sklápěcí dvířka z nějakého tmavého plexi ? Přes den budeš mít otevřený a za šera zavřeno a světlo s počtem kuliček neprozradí tvou plohohu. Jinak to provedení vypadá moc dobře je vidět že to tam prostě chceš mít :lol: :lol: možná bych na hlavni použil černou pásku a ještě taková technická otázka nebylo by lepší dát tu bránu víc dovnitř? mám pocit že je to dost vidět na to že to má být infra ale to může být kamerou která to dokáže zachytit a normální oko to nevidí. Jinak chválím počítá to skvěle myslím že můžeš být na svou práci hrdý :lol: :guns: :aplause: :potlesk:

Uživatelský avatar
Jeejda_teda_puvodne
Příspěvky: 142
Registrován: 08 dub 2012, 02:00

#7 Příspěvek od Jeejda_teda_puvodne »

Naposledy upravil(a) Jeejda_teda_puvodne dne 25 říj 2016, 13:34, celkem upraveno 1 x.

Uživatelský avatar
Zeppy
Příspěvky: 67
Registrován: 30 říj 2014, 01:00

#8 Příspěvek od Zeppy »

Prográmek není zdaleka hotov, ještě chybí noční režim, reset a vlastně čidlo na zásobník. K tomu na hlavni...je to jen provizorně, ta páska tam nebude vůbec :D a lidským okem to nejde vidět...no a nakonec chci dodat, že tam bude arduino nano, jen mi ještě nedošlo z ebaye :D
Problém u toho displaye je, že je to už zalité a k vývodům se fakt nedostanu, je to připojeno na zemi. Takže asi zkončím s trimtrem, co? :D

masar
Příspěvky: 12295
Registrován: 03 pro 2005, 01:00

#9 Příspěvek od masar »

Pokud tam máš 74HC595, pak lze napětí snižovat až na +2V. Pak by šlo použít i PWM s integračním článkem a popř. sledovačem na výstupu.
Pokud tam máš ale 74HCT595, tak podle datasheetu končíš s regulací na +4,5V.
To platí za předpokladu, že nemůžeš oddělit napájení číslicovek od řadičů. :wink:

Uživatelský avatar
Zeppy
Příspěvky: 67
Registrován: 30 říj 2014, 01:00

#10 Příspěvek od Zeppy »

Je to 74HC595 v SMD variantě SO16 nxp
No..napadlo mě že kdyby se dalo číslo (říkejme tomu číslo nic 0b11111111 páč by nic nesvítilo) a rychle by blikalo se současnou hodnotou, tak by to bylo jak pwm

Uživatelský avatar
Zeppy
Příspěvky: 67
Registrován: 30 říj 2014, 01:00

#11 Příspěvek od Zeppy »

Po konzultaci se známým a posezením u "čaje" vzniklo těchto pár řádků:

A ještě přibude noční režim a kosmetické vychytávky ...jinak je to v podstatě funkční věc...odčítá kuličky, resetuje po vytažení zásobníku, mění jas :)

Kód: Vybrat vše

const byte ledCharSet[10] = { 0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b0000010,0b11111000,0b10000000,0b10010000 }; 
const int latchPin = 8; 
const int clockPin = 12; 
const int dataPin = 11; 
const int IRhlaven=2;
const int tl_jas=3;
const int tl_zasobnik=4;
const int BoardLED=13;

const unsigned int zpozdeni = 3; // kolikrat se obslouzi displej za jeden cyklus (pri nizke rychlosti hrozi vynechavani snimace)
unsigned char pwm_data = 3; // stupen jasu displeje 
const unsigned int korekce_jasu[7] = {1,20,40,100,300,500,1020}; // predem nadefinovane stupne jasu

unsigned char kapacita_zasobniku = 0; // kapacita zasobniku
unsigned char plny_zasobnik = 65; // kolik kuli je v zasobniku po naplneni

unsigned char stav_snimace_zas = 0;
unsigned char stav_snimace_jas = 0;



void setup() 
{ 
   pinMode(latchPin, OUTPUT); 
   pinMode(clockPin, OUTPUT); 
   pinMode(dataPin, OUTPUT); 
   pinMode (IRhlaven, INPUT);
   pinMode (tl_jas, INPUT);
   pinMode (tl_zasobnik, INPUT);
   pinMode (BoardLED, OUTPUT);
   attachInterrupt(0,strelba, FALLING);
} 
 
void strelba()
{
   detachInterrupt(0); 
   if(kapacita_zasobniku >= 1)
   {
      kapacita_zasobniku--; 
   }
   RizeniJasu(zpozdeni);
   attachInterrupt(0,strelba, FALLING);
}

void DisplayNumber(unsigned char num) 
{ 
   unsigned char tens; 
   unsigned char ones; 
   if (num > 100 || num < 0) 
   { 
      num = 0; 
   } 
   ones = num % 10; 
   if (num < 10) 
   { 
      tens = 0; 
   } 
   else 
   { 
      tens = num/10; 
   }   
   digitalWrite(latchPin, 0); 
   shiftOut(dataPin, clockPin, MSBFIRST, ledCharSet[ones]); 
   shiftOut(dataPin, clockPin, MSBFIRST, ledCharSet[tens]); 
   digitalWrite(latchPin, 1); 
}

void RizeniJasu(unsigned int delka) // funkce starajici se o rizeni displeje (ta z predchozich pokusu)
{
   while(delka--) // odpocitavani poctu smycek PWM
   {
      for(unsigned int pwm_pocitadlo = 0; pwm_pocitadlo < 1024; pwm_pocitadlo++)
      {
         if(pwm_pocitadlo == 0)
         {
            DisplayNumber(kapacita_zasobniku); 
         }
         if(korekce_jasu[pwm_data] == pwm_pocitadlo)
         {
            digitalWrite(latchPin, 0); 
            shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); 
            shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); 
            digitalWrite(latchPin, 1); 
         }
         delayMicroseconds(10);
      }
   }
}

void StavZasobnik() // obsluha resetu zasobniku
{
   if((digitalRead(tl_zasobnik) == HIGH) && (stav_snimace_zas == 0)) 
   { 
      kapacita_zasobniku = plny_zasobnik; 
      stav_snimace_zas = 1; 
      RizeniJasu(zpozdeni);
   } 
   if((digitalRead(tl_zasobnik) == LOW) && (stav_snimace_zas == 1)) 
   { 
      stav_snimace_zas = 0; 
      kapacita_zasobniku = 0; 
   } 
}

void UlozeniJasu()
{
   while(EECR & (1<<EEPE));
   EEAR = 1;
   EEDR = pwm_data;
   EECR |= (1<<EEMPE);
   EECR |= (1<<EEPE);
}

void NacteniJasu()
{
   while(EECR & (1<<EEPE));
   EEAR = 1;
   EECR |= (1<<EERE);
   pwm_data = EEDR;
}

void NastaveniJasu() // obsluha tlacitka jasu
{
   if((digitalRead(tl_jas) == HIGH) && (stav_snimace_jas == 0)) 
   { 
      pwm_data++; 
      if(pwm_data >= 7)
      {
         pwm_data = 0; 
      }
      stav_snimace_jas = 1; 
      UlozeniJasu();
      RizeniJasu(zpozdeni);
   } 
   if((digitalRead(tl_jas) == LOW) && (stav_snimace_jas == 1)) 
   { 
      stav_snimace_jas = 0; 
   } 
}


void loop() 
{ 
   digitalWrite (BoardLED, LOW);
   NacteniJasu();
   while(1) 
   { 
      RizeniJasu(zpozdeni);
      StavZasobnik();
      NastaveniJasu();
   } 
}
Naposledy upravil(a) Zeppy dne 04 pro 2014, 20:51, celkem upraveno 2 x.

masar
Příspěvky: 12295
Registrován: 03 pro 2005, 01:00

#12 Příspěvek od masar »

Bravo. Snad by bylo dobré sem dát odkaz na video, jak to tvoje PWM vypadá na displeji. :wink:

Uživatelský avatar
bandolik
Příspěvky: 78
Registrován: 26 zář 2014, 02:00

#13 Příspěvek od bandolik »

:potlesk: :potlesk: :potlesk: velká gratulace nezapomeň přidat video jak to funguje a nejlíp už namontované ať máme představu co krásného jsi stvořil.
Program vypadá funkčně tak se těším na video.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#14 Příspěvek od AB1 »

Zeppy:
Proč nepoužíváš tlačítko "Code"?
Číst kód kde všechny řádky jsou zarovnané doleva je utrpení.

Uživatelský avatar
Zeppy
Příspěvky: 67
Registrován: 30 říj 2014, 01:00

#15 Příspěvek od Zeppy »

Jojo pardón na code jsem zapoměl :D
Ještě tomu dám par kosmetickech funkcí a bude funkční prototyp hotov.
Jistěže bude video, to se stává mou tradicí! :) Do dvou týdnů bude hotovo

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“