duinozone.cz - Arduino a Raspberry fórum

Autor Téma: Preruseni vice tlacitek na Analog pinu  (Přečteno 696 krát)

Offline Mykee

  • Bastlíř začátečník
  • *
  • Příspěvků: 16
Preruseni vice tlacitek na Analog pinu
« kdy: Únor 27, 2017, 22:40:54 odpoledne »
Ahoj pani, neresil jste nekdo funkci HW preruseni pro vice tlacitek na analogovem pinu ? konkretne mam 2 sady mikrospinacu 1 sada = 1 analogovy pin, kazda sada ma 7 mikrospinacu oddelenych 2Kohmy.(Arduino UNO) funguji dobre ale problem je ze v programu provadim mereni dvouch hodnot vickrat za sebou a pak delim poctem mereni a to dost omezuje cteni techto tlacitek. Tak by me zajimalo jestli to jde neak sikovne osetrit v kodu nebo pouzit treba neaky komparator a vystupy zapojit na piny preruseni ?

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Preruseni vice tlacitek na Analog pinu
« Odpověď #1 kdy: Březen 04, 2017, 20:44:40 odpoledne »
arduino má možnost 2 pinů jako zdroje externích přerušení. Ve výsledku jich je ještě mnohem víc (klidně se můžeš ptát na změnu na celém portu a máš naráz 8 pinů přerušení).
U tebe jde ale o něco trochu jiného. Ty chceš spínat tlačítko přes analogový port a chceš aby ta změna vyvolala přerušení.
Jednu dobu jsem si hrál s tlačítky přes analogový port a štvalo mě, že se meusím dokolečka ptát jeslti není stisknuto nějáké tlačítko.
Jelikož externí přerušení funguje jen na digitální piny udělal jsem malou fintu.
Analogové porty jsem přepnul na digitální režim (piny 14-19 pro arduino uno) a na nich čekal na přerušení.
Hodnoty odporů na tlačítkách jsem celé posunul dolu tak, aby při stisku jakéhokoliv tlačítka kleslo napětí pod 1/3 napájecího napětí.
To totiž vyvolá přerušení. no a když se přerušení provedlo ,tak jsem se přepnul zpět na analogový režim, přečetl si jaké tlačítko se sepnulo a zase pin vrátil do digitálního režimu s přerušením.
Jestli si na to vzpomenu, zkusím najít hodnoty součástek a případně i kod.


Je to to co ji hledal? 

Offline astromik

  • Pokročilý bastlíř
  • ***
  • Příspěvků: 116
Re:Preruseni vice tlacitek na Analog pinu
« Odpověď #2 kdy: Březen 04, 2017, 20:59:31 odpoledne »
A nebo se dá použít expander MCP23017, který má 16 digitálních vstupů(/výstupů) a komunikuje s Arduinem přes I2C.

Je možné na něm nastavit, že když dojde ke změně na některém z těch vstupů, tak se na jeho pinech INTA a INTB změní stav.
Tahle změna stavu se pak odchytává na jednom z přerušovacích pinů Arduina (D2 nebo D3).

Když k přerušení dojde, jen se přes I2C přečte aktuální hodnota portů GPA a GPB na tom expanderu.


Už jsem s tím obvodem dlouho nedělal, ale jestli máš zájem, tak zkusím napsat program.

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Preruseni vice tlacitek na Analog pinu
« Odpověď #3 kdy: Březen 04, 2017, 21:03:36 odpoledne »
kod jsem našel hodnoty odporu ne:
Kód: [Vybrat]
// knihovny
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int button = 0; // promena pro aktualni tlacitko 0 zadne, 1 vlevo, 2 dolu, 3 nahoru, 4 vpravo (select nejde jelikoz ma vysokou hodnotu a digi vstup to nepobere)
unsigned long lastMillisButton = 0; // posledni stisk klavesy
unsigned long ButtonDelay = 500 ; // casova prodleva do dalsiho stisku tlacitka "ms"

void setup() {
  lcd.begin(16, 2); // nastavení LCD
  lcd.clear(); // smaze LCD
  nastav_preruseni();  // nastavuje preruseni na A0
}

void loop() {
 }
 
 void zobraz() { // aktualizuje LCD
  lcd.clear(); 
  lcd.setCursor(0,0); // nastav kurzor na zacatek prvniho radku
  lcd.print(button);
  delay(1000);
  button = 0;
 }

 void nastav_preruseni() { // nastavuje preruseni na A0
  pinMode(A0, INPUT); // nastaveni pinu
  digitalWrite(A0, HIGH);
  cli(); // smaz nastaveni preruseni
  PCICR =0x02; // zapni PCINT1
  PCMSK1 = 0b00000001; //  reaguj na pin A0
  sei(); // aktivuj preruseni
 }
 
ISR(PCINT1_vect) { // od preruseni
  read_Button(); // cteni klaves a reakce na jejich stisk
}

void read_Button() { // cteni klaves a reakce na jejich stisk
  if (button == 0 && (millis() - ButtonDelay) > lastMillisButton) {
    button = 0; // zadna sipka
    if (analogRead(0) < 555) {
      button = 1; // sipka vlevo
      if (analogRead(0) < 380) {
        button = 2; // sipka dolu
        if (analogRead(0) < 195) {
          button = 3; // sipka nahoru
          if (analogRead(0) < 50)  {
            button = 3; // sipka vpravo
          }
        }
      }
    }
    if (button != 0)  { // sipka stisknuta aktualizuji cas posledniho stisku sipky
      lastMillisButton = millis(); 
      zobraz(); // aktualizuj LCD
    } 
  }
 
}

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Preruseni vice tlacitek na Analog pinu
« Odpověď #4 kdy: Březen 04, 2017, 22:27:43 odpoledne »
pull up odpor   1800   ohm   pomocné   LBA   5V      výpočet LBA   rozhod.LBA
1. tlačítko           0           ohm   0           0   0,00      27                   < 30
2. tlačítko          100         ohm   100           54   0,26      83                   < 80
3. tlačítko          120         ohm   220           112   0,54      143                   < 140
4. tlačítko          150         ohm   370           175   0,85      207                   < 200
5. tlačítko          180         ohm   550           240   1,17      273                   < 270
6. tlačítko          220         ohm   770           307   1,50      341                   < 340
7. tlačítko          270         ohm   1040   375   1,83                         < 410
                        
                        
pull up odpor   1800   ohm   pomocné   LBA   5V      výpočet LBA   rozhod.LBA
1. tlačítko            0         ohm   0           0   0,00      27                   < 30
2. tlačítko           100         ohm   100           54   0,26      89                   < 90
3. tlačítko           150         ohm   250           125   0,61      168                   < 170
4. tlačítko           220         ohm   470           212   1,04      264                   < 260
5. tlačítko           330         ohm   800           315   1,54                         < 350


navrhnul jsem rozdělení talčítek na odpory. Pullup odpor je 1K8 a další jsou ve 2 sloupci.
Rozhod.LBA je uroveň od které by se mělo vyhnodnotit sepnutí tlačítka.
« Poslední změna: Březen 04, 2017, 22:34:09 odpoledne od posjirka »

Offline Mykee

  • Bastlíř začátečník
  • *
  • Příspěvků: 16
Re:Preruseni vice tlacitek na Analog pinu
« Odpověď #5 kdy: Březen 05, 2017, 01:05:14 dopoledne »
Diky za motivaci vyzkousim obe varianty. Hodne me zaujmul ten expander jen tak zlehka jsem ho prolustroval a jevi se to jako vychodisko pro muj potencionalni problem s pripojenim grafickeho lcd k UNU. Tak se mu budu asi v budoucnu venovat. Zatim jsem si hral  se zapojenim komparatoru ktery mi aktivuje preruseni. Vice mene to funguje tak jak bych si predstavoval. Jeste jednou dekuji:)

Offline astromik

  • Pokročilý bastlíř
  • ***
  • Příspěvků: 116
Re:Preruseni vice tlacitek na Analog pinu
« Odpověď #6 kdy: Březen 05, 2017, 16:18:59 odpoledne »
Zkusil jsem to s tím expanderem MCP23017.
Je možné sepnout i víc tlačítek zároveň a program to pozná.


Program:
   http://astromik.org/forum/mcp23017_int.ino

Schéma:
  http://astromik.org/forum/mcp23017_int.gif

Offline Mykee

  • Bastlíř začátečník
  • *
  • Příspěvků: 16
Re:Preruseni vice tlacitek na Analog pinu
« Odpověď #7 kdy: Březen 07, 2017, 01:11:38 dopoledne »
Super!!! :) diky za ochotu. Jen jak budu mit expander na stole hned se do toho pustim. Tohle se mi jevi jako velice sympaticke reseni :) Diky :)