segítség!!

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Lezárt
robroy007
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2015. május 8. péntek, 19:43

Re: segítség!!

Hozzászólás Szerző: robroy007 »

Sziasztok!

PLEASE HELP!


az elmúlt egy hónapban lassan kihordok egy agyvérzést lábon a millis() alkalmazásának kudarcai miatt

akárhogy próbálkozok sehogy se sikerül rávenni a helyes működésre az eszközeimet, mert azóta már többet is próbáltam ahogy sorra érkeztek az újabbak az ebay-ről

program arduino 1.0.6
AVR ISP mkII

eszközök:
DCcEle DCcduino
Arduino UNO R3 ATmega328P CH340 USB Development Board
Nano V3.0 ATmega328P 5V 16M Micro-controller Board CH340

tisztában vagyok vele, hogy ezek mint klónok, de nem gondolnám, vagyis már nem tudom, hogy emiatt ne sikerülne a feladat

az alábbi kód lett feltöltve, a 12-es láb GND-vel való összezárása után a led világít, de sosem alszik el!!!
más kódok esetén is hiába
amire tudok gondolni esetleg, hogy a fő feltételen belül egy másik feltételbe kéne az időt elbírálni, így esetleg nem mindegy hol adom meg a kezdő időt, de bárhová pakoltam nem sikerült

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

int szamlalo=0;
void setup()
{
  pinMode(13,OUTPUT); //13-as lábon LED van
  pinMode(12,INPUT); //12. lab es GND kozt gomb
  digitalWrite(12,HIGH); //12-es lab belso felhuzoellenallas felhuz
}

void loop() {
  if (digitalRead(12) == LOW) {  //ha a 12-es labon a gomb nyomva (GND-re megy)
    szamlalo=millis()+1000;  //a szamlalo a millis ertek (azaz MOST)+ 1 secundum legyen
    if (szamlalo>millis()) { //ha nem erte el a millis() msec szamlalo a bellitott idot 
      digitalWrite(13,HIGH); // a D13 LED vilagitson
    } 
    else { //kulonben
      digitalWrite(13,LOW);  //D13 kikapcsolva
    }
  }
}

értem én hogy gőzgép, de most már kritikusan közel van az éles alkalmazás ideje és még gyakorlatilag sehol se járok a feladat megoldásában, a késleltetett megszakítás figyelésről nem is beszélve



Robert a te álltal írt kód annyiban lett csak módosítva, hogy az input output nagybetűs lett illetve a void került a setup és loop elé, mert már annyira lefárasztott, hogy nem is az eredeti elgondolásom szerinti kódba próbáltam meg integrálni a millis alkalmazását, hanem csak egyszerűen képes-e arra egy egyszerű programocskában amit kell csinálnia, de így se sikerült

Robert írta:Valami ilyesmi kód kell, ha számlálózni - időzíteni akarsz:
(az utasitasok megertesehez kell a Arduino Notebook illetve az arduino.cc oldalon a referenciatáblázat)

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

int szamlalo=0;
setup()
{
pinMode(13,output); //13-as lábon LED van
pinMode(12,input); //12. lab es GND kozt gomb
digitalWrite(12,HIGH); //12-es lab belso felhuzoellenallas felhuz 
}

loop() {
if (digitalRead(12) == LOW) {  //ha a 12-es labon a gomb nyomva (GND-re megy)
   szamlalo=millis()+1000;  //a szamlalo a millis ertek (azaz MOST)+ 1 secundum legyen
if (szamlalo>millis()) { //ha nem erte el a millis() msec szamlalo a bellitott idot  
  digitalWrite(13,HIGH); // a D13 LED vilagitson
} else { //kulonben
digitalWrite(13,LOW);  //D13 kikapcsolva
}
}
ez lenne a kész program már ha menne végre (a megszakítás még kicsit kínai, hogyan kéne kinéznie pontosan)

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

//változók
int spindle = 4; // főorsó szivattyú kimenet
int error = 5; // hiba kimenet
// int water = 2; // vízáram szenzor bemenet INT0 D2 lábon
int start = 9; // start jel bemenet
int work = 13; // start/utánfutás jelzés led
int utanfutas_jel = 0; //utánfutás engedélyezése

//segéd változók
long varakozas_t, utanfutas_t, start_t;

//időzítések
int varakozas = 5; //start utáni várakozás (mp)
int utanfutas = 5; //leállás utánfutás (perc)

// megszakítás jel
volatile int error_sign = HIGH;

//--------------------------------------------------------------

void setup() {
  //időzítés meghatározás
  varakozas_t = varakozas*1000;
  utanfutas_t = utanfutas*60000;

  //I/O meghatározás
  pinMode(spindle, OUTPUT); //szivattyú kimenet
  pinMode(error, OUTPUT); //hibajel kimenet
 // pinMode(water, INPUT); //vízáram szenzor bemenet
  pinMode(start, INPUT); //startjel bemenet
  pinMode(work, OUTPUT); //LED visszajelzés

  Serial.begin(9600); //soros kommunikáció

  //indulási alap állapotok
  digitalWrite(start, HIGH); //felhúzó ellenállás bekapcsol

  // relé és led alap állapot
  digitalWrite(spindle, HIGH);  //relé GND-re húz be 
  digitalWrite(error, HIGH); //relé GND-re húz be
  digitalWrite(work, LOW); //üzemjelzés led kikapcsolva

  //  megszakítás beállítása D2 lábon
  attachInterrupt(0, blink, RISING); // alapból magas, menet közben GND-re húz, ha megáll a víz ismét magasra váltásra megszakít

  // idő alap beállítás
  start_t = millis(); 
}

//--------------------------------------------------------------

void loop() 
{
  // Serial.println("STOP");
  if (digitalRead(start == LOW)) //ha van startjel
  {
    // Serial.println(uzem);
    start_t = millis(); // kezdő idő módosítása 
    uzem(); 
  }
  else if (digitalRead (start == HIGH && utanfutas_jel == HIGH)) //startjel nincs ÉS van utánfutásjel
  {
    // Serial.println(utanfutas);
    start_t = millis(); // kezdő idő módosítása 
    utanfutas_uzem();
  }
  else
  {
    digitalWrite(spindle, HIGH); //szivattyú leállítás
    digitalWrite(work, LOW); //led kikapcsol
    utanfutas_jel = LOW; //utánfutás kikapcsolása
  }
}

//--------------------------------------------------------------
//alprogram részek

void uzem () //üzem
{
  digitalWrite(spindle, LOW); // szivattyú indítás
  digitalWrite(work, HIGH); //LED bekapcsolás
  utanfutas_jel = HIGH;
}

void utanfutas_uzem() //utánfutas
{
  if(digitalRead(start)== LOW && start_t + utanfutas_t >= millis())
  {
    // Serial.println("UTANFUTAS"); //utánfutás kiírása
    digitalWrite(spindle, LOW);  //szivattyú bekapcsolás (bekapcsolva marad)
    villog();
  }
  utanfutas_jel = LOW; //utánfutás kikapcsolása
}

void villog() //utánfutas jelzés
{
  digitalWrite(work, HIGH); //led be
  delay(100);               // várakozás 100ms
  digitalWrite(work, LOW);  //led ki 
  delay(100);               // várakozás 100ms
}
//--------------------------------------------------------------
//megszakítás program része

void blink () //megszakítás
{
  if(start_t + varakozas_t < millis() && (start == LOW))  //ha az időzítés kissebb mint az indulás + várakozás ÉS van start jel akkor: 
  { 
    digitalWrite(error, LOW); // error relé behúz
    delay(1000);
    digitalWrite(error, HIGH); // error vissza áll alaphelyzetbe
  }
  /* 
   else 
   {
   digitalWrite(error, HIGH); // error relé elenged
   } 
   */
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: segítség!!

Hozzászólás Szerző: Robert »

Persze. Mis csinálsz:

Ha gomb van nyomva - világíts és a késleltetés legyen 1000 ms
ha nincs nyomva kapcsold ki.

Mi hiányzik? Ha nincs nyomva és nem telt le az idő: akkor kapcsold be!


Vedd a programot két részre:

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

loop {
Ha gomb nyomva, akkor a leallitas = mostidő +1000. Ha nincs nyomva, nem kell semmit tenni.
Ha az idő<leallitas akkor eg, kulonben kikapcsol
}

Igaz van külső felhúzóellenállás is a 12. lábon?
Sorosporton irasd vissza, hogy mi a láb állapota (azaz a chip tényleg veszi e a 12-es lab GND-jét)
Penorbe
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2015. július 29. szerda, 21:26

Re: segítség!!

Hozzászólás Szerző: Penorbe »

uno, sensor shield v5. 2 dc motor. egy servo. servo nélkül minden program tökéletes. De ha bármilyen akárcsak 1 másodpercig menj hátra, majd előre program mellé bekerül egy servo mozgatás is, az egyik motor nem forog. Ha bluetoothon próbálom bekapcsolni, akkor aktiválás után megszakad a kapcsolat.
Ennél a kódnál pedig éppen hogy csak megmozdul a servo ha lehúzom számitógépről.
Az uno-t 9voltos elemről használom. A shieldhez 4 AA elem csatlakozik.

Mi lehet a probléma? :(

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

#include <Servo.h>
Servo servoMain; 
int pinfrontLights = 4;
int pinbackLights = 7;
int pinhorn =5;
int state;
int flag=0;
int stateStop=0;
void setup() {
   Serial.begin(9600);
   servoMain.attach(2); 
   
  //Jobb motor
  pinMode(9, OUTPUT); 
  pinMode(8, OUTPUT); 

  //Bal motor
  pinMode(7, OUTPUT); 
  pinMode(6, OUTPUT);
  pinMode(pinhorn, OUTPUT);
  pinMode(pinfrontLights , OUTPUT);
  pinMode(pinbackLights , OUTPUT);

}
void loop() {
    servoMain.write(45);   // Turn Servo Left to 0 degrees
   delay(500);  
    servoMain.write(90);   // Turn Servo Left to 0 degrees
   delay(500);  
   servoMain.write(135); // Turn Servo Right to 180 degrees
   delay(500);    
      servoMain.write(90);   // Turn Servo Left to 0 degrees
   delay(500); // Wait 1 second
        // Wait 1 second  
    if (state == 'V') {
       digitalWrite(pinhorn, HIGH);
       }
    if (state == 'v') {
       digitalWrite(pinhorn, LOW);
       }
    if (state == 'U') {
       digitalWrite(pinfrontLights, HIGH);
       }
       if (state == 'u') {
       digitalWrite(pinfrontLights, LOW);
       }
      if (state == 'W') {
        digitalWrite(pinbackLights, HIGH);          
      }
        if (state == 'w') {
       digitalWrite(pinbackLights, LOW);
       }
        
    // Motorok ki
    if (state == 'S') {
       digitalWrite(9, LOW);
       digitalWrite(8, LOW);
       analogWrite(11, 255);
       digitalWrite(7, LOW);
       digitalWrite(6, LOW);
       analogWrite(10,255);
       if(flag == 0){
          Serial.println("Motor: off");
          flag=1;
        }
    }
       
    if(Serial.available() > 0){     
      state = Serial.read();   
      flag=0;
    } 
   // Elore
   if (state == 'F') { 
      //MotorJobb
       digitalWrite(9, HIGH);
       digitalWrite(8, LOW);
       analogWrite(11, 255);
     //Motor Bal
       digitalWrite(7, LOW);
       digitalWrite(6, HIGH);
       analogWrite(10,255);
        if(flag == 0){
          Serial.println("ELORE!");
          flag=1;
        }
    }
    
    // hatra
    else if (state == 'B') {
      //MotorJobb
       digitalWrite(9, LOW);
       digitalWrite(8, HIGH);
       analogWrite(11, 255);
      //Motor Bal
       digitalWrite(7, HIGH);
       digitalWrite(6, LOW);
       analogWrite(10,255);
       if(flag == 0){
          Serial.println("HATRA");
          flag=1;
        }
    }
    // Jobbra forog
   else if (state == 'R') {
     //MotorJobb
       digitalWrite(9, HIGH);
       digitalWrite(8, LOW);
       analogWrite(10, 255);
      //Motor Bal
       digitalWrite(7, HIGH);
       digitalWrite(6, LOW);
       analogWrite(11,255);
       
       if(flag == 0){
          Serial.println("forog jobbra");
          flag=1;
        }
    }
    // Balra forog
    else if (state == 'L') {
      //Motor jobb
       digitalWrite(9, LOW);
       digitalWrite(8, HIGH);
       analogWrite(10, 255);
      //Motor Bal
       digitalWrite(7,LOW);
       digitalWrite(6, HIGH);
       analogWrite(11,255);
       
       if(flag == 0){
          Serial.println("forog balra");
        flag=1;
        }
    
    }
    // jobbra 
    if (state == 'I') { 
      //Motor jobb
       digitalWrite(9,HIGH);
       digitalWrite(8, LOW);
       analogWrite(10, 250);
      //Motor Bal
       digitalWrite(7, LOW);
       digitalWrite(6, LOW);
       analogWrite(11,150);
       if(flag == 0){
          Serial.println("Jobbra!");
          flag=1;
        }
    }
     // balra
     if (state == 'G') { 
       //Motor jobb
       digitalWrite(9,LOW);
       digitalWrite(8, LOW);
       analogWrite(10, 150);
      //Motor Bal
       digitalWrite(7, LOW);
       digitalWrite(6, HIGH);
       analogWrite(11,250);
        if(flag == 0){
          Serial.println("Jobbra!");
          flag=1;
     }
}
}
 
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: segítség!!

Hozzászólás Szerző: Robert »

A 9V-os elemből állítod elő a rendszer 5V-ot.
A 9V elem terhelhetősége 10...50mA
Ezt a felsorolt eszközökkel simán túlléped....
Lezárt