60 nap alatt Arduino #08 - Házi feladatok - Knight Rider

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3215
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. július 24. kedd, 7:42

Nyomogomb - antiprell – IF Modelezés:

Ha (digitalRead(6) == LOW.
A programunk igy fut:

Kód: Egész kijelölése

void loop() {
az  feltétel nem teljesül ezért át ugorja.
delay (100);
  digitalWrite(7, HIGH);
az  feltétel nem teljesül ezért át ugorja.
delay (100);
  digitalWrite(7, LOW);
}

Láthatóan kevesebb lesz a várakozás, ezért gyorsabb a LED villogás.

A Prel elemzését meghagyom másnak!
8)

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3215
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. július 24. kedd, 7:47

És az eredeti program (Aki még nem kaptavolna meg.):

Nyomogomb - antiprell - IF
Demonstracios program
60 nap alatt arduino tanfolyam része

Kód: Egész kijelölése

void setup(){
  pinMode(6, INPUT);       // Input switch
  pinMode(7, OUTPUT);      // Output LED
  digitalWrite(6, HIGH);   //Pull-up
}
 
void loop() {
  if (digitalRead(6) == HIGH) {
    delay (5);
    if (digitalRead(6) == HIGH) {
      delay(900);
    }
  }
  delay (100);
  digitalWrite(7, HIGH);
  if (digitalRead(6) == HIGH) {
     delay(5);
     if (digitalRead(6) == HIGH) {     
       delay(900);
     }
  }
  delay (100);
  digitalWrite(7, LOW);
}


(kérdés: ha épp prell alatt/közben vagyunk és nem érzékeljük az IF-fel, akkor mi történik? Próbáld lemodellezni...).
:wink:

Avatar
TryMan
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. május 10. csütörtök, 6:00

HozzászólásSzerző: TryMan » 2012. július 25. szerda, 14:20

Nekem van egy motorshieldem, amin van 4 led, ezekkel csináltam:

Kód: Egész kijelölése

byte led[6] = {8,11,12,13,12,11};

void setup() {               
  pinMode(8, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  for(int i=0;i<6;i++)
  {
    digitalWrite(led[i], HIGH);   
    delay(100);
    digitalWrite(led[i], LOW);   
  }
}


sry a ciklusért :)
1114 byte így, ha ciklusban menne a ledek inicializálása, az 8 bytetal több :)

Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00
Tartózkodási hely: Bp

knight rider v3

HozzászólásSzerző: macsek » 2012. augusztus 7. kedd, 16:06

Robert írta:OK. Témában megnyitom az Arduino - haladóknak részt :P.


Ez vicc volt? Mert kerestem, de valszeg nem jól, ui nem találtam ilyen topikot.

Ha mégis lenne kérek iránymutatást, h hova kellene írni.

// Knight rider futofeny v3
// irta Kapu48 (Arduino hardverre) C nyelven 
// belepiszkalt Macsek: ket egymas utani ciklus helyett irany_jelzo

char debug=1; // akarunk-e futasi uzeneteket
char d; // valtozok nevet alapvetoen kis betuvel irjuk ;-)
char irany=0; // ha 1: D0->D7, ha 0: D7->D0 iranyba futunk eppen

void setup()

  DDRD = B11111111;   // sets Arduino pins 0 to 7 as outputs
  d = B00000001;      // kezdeti kimeneti minta
  if(debug)
  {
    Serial.begin(9600);
    Serial.println("Futofeny indul"); // azert kell, h tutira jo eredmenyt irjon egybol
  }


void loop()

  char i;
  irany = !irany;  // minden ujabb loop korben iranyt valtunk

  for(i=1; i<8; i++)
  {
    PORTD = d;
    if(debug)
    {
      Serial.print(millis());
      Serial.print(" [i=");
      Serial.print(i);
      Serial.print("] irany:");
      Serial.print(irany);
      Serial.print(" ");
      Serial.print(d, BIN);
      Serial.print(" (");
      Serial.print(d);
      Serial.println(")");
    }
      
    delay(200);
    if(irany) // tanuloknak: ez azt jelenti, h if(irany != 0) tehat, h nem nulla
      d = d<<1;  // tanuloknak: 1 bittel balra tolas, azaz 2-vel szorzas
    else
      d = d>>1;  // tanuloknak: 1 bittel jobbra tolas, azaz 2-vel osztas
  } //for vege
// loop vege


Avatar
Robert
Elektronbűvölő
Hozzászólások: 9812
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 7. kedd, 16:57

http://avr.tavir.hu/modules.php?name=Fo ... forum&f=23
Ez a standard Arduino fórum...

Itt a programhoz pár kiegészítés (Fontos! Ez a haladó szint és az Arduino jónéhány belső szabályát áthágod! Keveredik a sima C nyelv és az Arduino nyelvezet!)


Kód: Egész kijelölése

for(i=1; i<8; i++)

Számolj I=1-től 8-ig, úgy hogy minden lépésnél az i-t eggyel növeled. Ha I=8, akkor léphetsz tovább.


Kód: Egész kijelölése

 DDRD = B11111111;   // sets Arduino pins 0 to 7 as outputs

Minden egyes kivezetés 3 ún. regiszterrel bír:
DDRx - Data Direction Register: azaz a láb ki/bemenet. És minden egyes ilyen regiszter DDRD (D port (lábcsoport) regisztere, mely az Arduinonál a D0...D7-et jelenti), DDRB (B port regisztere: Arduino D8...D13 es a D14/D15 nincs kivezetve a tokon kívülre)
PINx: Adott lábcsoport milyen szinten van (kívülről lehúzva vagy felemelve H szintre)
PORTx: Adott lábcsoport ha kimenet, akkor ez mondja meg, hogy magas vagy alacsony szinten legyen. Ha a láb bemenet, akkor a belső felhúzóellenállás.
FONTOS!Arduino alatt _TILOS_ használni, erre a DigitalWrite() [kb. PORTx] / DigitalRead() [PINx] és a pinMode() [DDRx] való [zárójelben, hogy melyiknek mi felel meg. DE csak komplett lábcsoportra értelmezhetőek a PINx, PORTx és DDRx utasítások!]


d = d<<1; // tanuloknak: 1 bittel balra tolas, azaz 2-vel szorzas
Azaz ha a D BINÁRIS értéke:
00100100, akkor a d<<2 esetén balra tolom, így a d értéke:
01001000 lesz. A felső bit kiesik és alsóban bejön a 0.
A d=d<<1 pedig ennek az ellentéte. Az 1 azt mondja, hogy 1 ilyen léptetést kell végezni.


Kód: Egész kijelölése

if(debug)

Az if utasítás attól függően, hogy a paramétereként megadott változó/művelet vagy műveletsor értéke igaz vagy hamis, attól függően megy tovább a normál vagy az else ágra. A debug értéke IGAZ esetén lehet:
1, true
minden más: HAMIS



irany=!irany
Ez azt jelenti, hogy irany= NOT irany. Azaz legyen az ellenkezője.
Csalóka, mert ha az értéke 0 és char (8 bit / 1 byte) definíciójú, akkor (ha jól emlékszem), minden egyes _bit_ negatív lesz. Azaz ha irany=0000.0000, akkor !irany= NOT irany = 1111.1111
Szerk: HIBÁS a leírásom! Lentebb 2 hsz-l javítva!
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2012. augusztus 7. kedd, 17:16-kor.

Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00
Tartózkodási hely: Bp

HozzászólásSzerző: macsek » 2012. augusztus 7. kedd, 17:07

Robert írta:http://avr.tavir.hu/modules.php?name=Forums&file=viewforum&f=23
Ez a standard Arduino fórum...


Köszönöm

Tök jó magyarázatokat írtál.

Robert írta:Itt a programhoz pár kiegészítés (Fontos! Ez a haladó szint és az Arduino jónéhány belső szabályát áthágod! Keveredik a sima C nyelv és az Arduino nyelvezet!)

Én csak Kapu48 programját módosítottam, de attól még igazad van.

Robert írta:A d=d<<1 pedig ennek az ellentéte. Az 1 azt mondja, hogy 1 ilyen léptetést kell végezni.

Elírás, kérlek javítsd, az én hsz-omból meg kitörölheted ezt a részt :)

Robert írta:irany=!irany
Ez azt jelenti, hogy irany= NOT irany. Azaz legyen az ellenkezője.
Csalóka, mert ha az értéke 0 és char (8 bit / 1 byte) definíciójú, akkor (ha jól emlékszem), minden egyes _bit_ negatív lesz. Azaz ha irany=0000.0000, akkor !irany= NOT irany = 1111.1111


Nem, az a bináris negálásnál (~ operátor) igaz, itt (mint a soros monitor mutatja is) 1 -> 0 -> 1 -> 0

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9812
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 7. kedd, 17:18

Az irany =! irany pontosan az irany = NOT irany. Binarisan a háttérben:
irany=0000.000
.
irany = !irany //0000.0001
.
irany = !irany //0000.0000

Azaz csak az utolso bit valtozik meg!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3215
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 7. kedd, 17:59

Ha már megtanultuk mi a különbség (! = bináris NOT) és (~ = bináris negálás) között szemléltessük is!

Kód: Egész kijelölése

// Knight rider futofeny v3
// irta Kapu48 (Arduino hardverre) C nyelven 
// belepiszkalt Macsek: ket egymas utani ciklus helyett irany_jelzo

char debug=1; // akarunk-e futasi uzeneteket
char d; // valtozok nevet alapvetoen kis betuvel irjuk 
char irany=0; // ha 1: D0->D7, ha 0: D7->D0 iranyba futunk eppen

void setup()
 { 
   DDRD = B11111111;   // sets Arduino pins 0 to 7 as outputs
   d = B00000001;      // kezdeti kimeneti minta
   if(debug)
   {
     Serial.begin(9600);
     Serial.println("Futofeny indul"); // azert kell, h tutira jo eredmenyt irjon egybol
   }
 } 

void loop()
 { 
   char i;
   irany = !irany;  // minden ujabb loop korben iranyt valtunk
   d = ~d;            //Szemléltetés képen (d = d bináris negálása)
   
   for(i=1; i<8; i++)
   {
     PORTD = d;
     if(debug)
     {
       Serial.print(millis());
       Serial.print(" [i=");
       Serial.print(i);
       Serial.print("] irany:");
       Serial.print(irany);
       Serial.print(" ");
       Serial.print(d, BIN);       // Majd itt figyeljetek!
       Serial.print(" (");
       Serial.print(d);
       Serial.println(")");
     }
       
     delay(200);
     if(irany) // tanuloknak: ez azt jelenti, h if(irany != 0) tehat, h nem nulla
       d = d<<1;  // tanuloknak: 1 bittel balra tolas, azaz 2-vel szorzas
     else
       d = d>>1;  // tanuloknak: 1 bittel jobbra tolas, azaz 2-vel osztas
   } //for vege
 } // loop vege


Csak egy kevés módosítás és más lett az eredmény!
:wink:

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9812
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 7. kedd, 18:36

int inByte = 0; // bejovo adat

void setup()
{
  Serial.begin(9600); // start serial port 9600 bps
  Serial.println("Start...");
  
}

void loop()
{
  inByte=!inByte; //itt a lenyeg!
  Serial.println(inByte,HEX);
    delay(100);
}



Mintakód (Edit -> Copy for Forum).

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3215
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 7. kedd, 19:43

Van még 1 rossz hírem!

Az a debug módszer jól néz ki.
De már nem fér bele az M168-asba!

:(

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9812
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 7. kedd, 19:53

SRAM vagy FLASH hiba?
Ekkora nem lehet a kód..... :(

Mondjuk az Arduino nem az, aki szűken bánik a kódmérettel :P .

Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00
Tartózkodási hely: Bp

HozzászólásSzerző: macsek » 2012. augusztus 8. szerda, 0:20

kapu48 írta:Az a debug módszer jól néz ki.
De már nem fér bele az M168-asba!

:(


Ott valami más bibi lesz.

nálam a fordító ezt írta:Binary sketch size: 2,838 bytes (of a 30,720 byte maximum)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9812
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 8. szerda, 6:05

Arduino verzió? Panel? Telepítés ideje?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3215
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 8. szerda, 8:05

Nem tudom mi lehetett a tegnapi fordítási hiba oka?
Mára megszűnt! És nem tudom megismételni.
:lol:

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9812
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. augusztus 8. szerda, 8:10

Windows csillagállás.... :P


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég