digitalRead uitlezen wil niet lukken

Arduino specifieke Software
Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

digitalRead uitlezen wil niet lukken

Berichtdoor FonzieBonzo » 01 Okt 2015, 12:07

Ik ben de hele dag al aan het blindstaren op iets waar ik maar niet uitkom.
Via een Arduinobordje bestuur ik een arm waar ik een begin en een eindstop van uitlees.

Bij de functie void ArmUp() en void ArmDown() gaat het uitlezen van digitalRead(PinIsArmUp) en digitalRead(PinIsArmDown) goed
maar bij de functie void SendSerial() krijg ik steeds PinIsArmUp=0,PinIsArmDown=0 terug.

Het enige verschil is dat de ene een while.. en de andere een if.. statment is.

Ik hoop dat iemand het licht ziet anders wordt het een zware nacht voor mij :D

Volledige code :
Code: Alles selecteren
int inByte = 0;       // de de byte van de serial port

int SchijfPos = 0;

char t;
int nnn;

long DownTijd = 4500;

int PinLaOpen1 = 1;
int PinLaOpen2 = 2;

int PinSchijfPlus = 4;   
int PinSchijfMin = 5;

int CorrPlus1 = 0;  // c
int CorrPlus2 = 0;  // d
int CorrPlus3 = 0;  // e
int CorrPlus4 = 0;  // f

int CorrMin1 = 0;   // g
int CorrMin2 = 0;   // h
int CorrMin3 = 0;   // i
int CorrMin4 = 0;   // j

int PinSchijf1 = 9;
int PinSchijf2 = 10;
int PinSchijf3 = 11;
int PinSchijf4 = 12;

int PinIsArmUp = 2;   
int PinIsArmDown = 3;

int PinArmUp = 6;
int PinArmDown = 7;

int MetTerugkoppeling =0;

int PinZuig = 8;

void setup()   {               
  Serial.begin(9600);

  pinMode(PinSchijfPlus, OUTPUT);     
  pinMode(PinSchijfMin, OUTPUT);   
  pinMode(PinZuig, OUTPUT);
  pinMode(PinArmUp, OUTPUT);
  pinMode(PinArmDown, OUTPUT);

  pinMode(PinSchijf1, INPUT);
  pinMode(PinSchijf2, INPUT);
  pinMode(PinSchijf3, INPUT);
  pinMode(PinSchijf4, INPUT);

  pinMode(PinIsArmUp, INPUT);
  pinMode(PinIsArmDown, INPUT);   
 
  digitalWrite(PinSchijfPlus, LOW);
  digitalWrite(PinSchijfMin, LOW);
  digitalWrite(PinArmUp, LOW);
  digitalWrite(PinArmDown, LOW);
  digitalWrite(PinZuig, LOW);
}


void ArmUp()
{
  digitalWrite(PinArmDown, LOW);   
  digitalWrite(PinArmUp, HIGH); 
  while (digitalRead(PinIsArmUp)==1)
  {
    digitalWrite(PinArmUp, HIGH); 
  }
  digitalWrite(PinArmUp, LOW);
}

void ArmDown()
{
  digitalWrite(PinArmUp, LOW);
  digitalWrite(PinArmDown, HIGH); 
  while (digitalRead(PinIsArmDown)==1)
  {
    digitalWrite(PinArmDown, HIGH); 
  }
   digitalWrite(PinArmDown, LOW); 
}

void SendSerial()
{
  if (digitalRead(PinIsArmUp)==1) {Serial.write("PinIsArmUp=1,");} else {Serial.write("PinIsArmUp=0,");};   
  if (digitalRead(PinIsArmDown)==1) {Serial.write("PinIsArmDown=1");} else {Serial.write("PinIsArmDown=0");};   
  Serial.println(); // geeft altijd PinIsArmUp=0,PinIsArmDown=0
 }


void ArmDownTijd()
{
  long Tijd = millis();
 
  digitalWrite(PinArmUp, LOW);
  digitalWrite(PinArmDown, HIGH); 
  while((digitalRead(PinIsArmDown)==1) && (millis()-Tijd<DownTijd))
  {
    digitalWrite(PinArmDown, HIGH); 
  }
  digitalWrite(PinArmDown, LOW);
}


void loop()                     
{
  if (Serial.available() > 0)
  {
    inByte = Serial.read();
   
    //la open
   
    if (inByte == 'y') // lade1
    {
     SendSerial();     
     if (analogRead(PinLaOpen1)<227)
     {
      //SendSerial("Y0");
     } else
     {
      //SendSerial("Y1");
     }
    }
   
    if (inByte == 'z') // lade2
    {
     SendSerial();
     if (analogRead(PinLaOpen2)<227)
     {
      //SendSerial("Z0");
     } else
     {
      //SendSerial("Z1");
     }
    }   


    // int CorrPlus1 =  c  int CorrMin1  g
    if(inByte >= 'c' && inByte <= 'j') // de pauze instellen voor draaischijf
    {
      delay(50); // voor de zekerheid
      nnn=0;
      t = Serial.read(); // Read next character
      nnn += t - '0';
      t = Serial.read(); // Read next character
      nnn *= 10;
      nnn += t - '0';
      t = Serial.read(); // Read next character
      nnn *= 10;
      nnn += t - '0';   

      switch(inByte) // voor welke is het
      {
      case 'c':
        CorrPlus1=nnn;
        break;
      case 'd':
        CorrPlus2=nnn;
        break;
      case 'e':
        CorrPlus3=nnn;
        break;
      case 'f':
        CorrPlus4=nnn;
        break;

      case 'g':
        CorrMin1=nnn;
        break;
      case 'h':
        CorrMin2=nnn;
        break;
      case 'i':
        CorrMin3=nnn;
        break;
      case 'j':
        CorrMin4=nnn;
        break;
      }
     }

    // einde

    if (inByte==43) // de +  de stofzuiger aan
    {
      digitalWrite(PinZuig, HIGH);
      SendSerial(); 
    }

    if (inByte==45) // de -  de stofzuiger uit
    {
      digitalWrite(PinZuig, LOW);
      SendSerial();
    }


    if (inByte>=49 & inByte<=55) // aansturing schijf
    {
      SchijfPos=inByte-48;
    }
   
    // schijfbediening met terugkoppeling indien 1 t/m 4
    // schijfbediening zonder terugkoppeling indien 5 t/m 8
    if (SchijfPos>4)
    {
      SchijfPos=SchijfPos-4;
      MetTerugkoppeling=0;
    } else
    {
      MetTerugkoppeling=1;
    }

    if (inByte=='a') // de letter a 
    {
      ArmUp();
      SendSerial();   
    }


    if (inByte=='b') // de letter b
    { 
      ArmDown();
      SendSerial();
    }
   
    if (inByte=='t') // de letter t
    { 
      ArmDownTijd();
      SendSerial();
    }
   
  }


  // schijf op pos 1 zetten
  if (SchijfPos==1) 
  {
    ArmUp();
    if (digitalRead(PinSchijf4)==1)
    { // achteruit draaien is het kortst
      while (digitalRead(PinSchijf1)!=1)
      {
        digitalWrite(PinSchijfPlus, HIGH);
      }
      delay(CorrPlus1);
      digitalWrite(PinSchijfPlus, LOW);
     
    }
    else
    {  //vorouit draaien is even lang of het kortst
      while (digitalRead(PinSchijf1)!=1)
      {
        digitalWrite(PinSchijfMin, HIGH);
      }
      delay(CorrMin1);
      digitalWrite(PinSchijfMin, LOW);
     
    }
      if  (MetTerugkoppeling==1) {SendSerial();}
   } // einde schijf op pos 1 zetten   



  // schijf op pos 2 zetten
  if (SchijfPos==2)
  {
    ArmUp();
    if (digitalRead(PinSchijf1)==1)
    { // achteruit draaien is het kortst
      while (digitalRead(PinSchijf2)!=1)
      {
        digitalWrite(PinSchijfPlus, HIGH);
      }
      delay(CorrPlus2);
      digitalWrite(PinSchijfPlus, LOW);
     
    }
    else
    {  //vorouit draaien is even lang of het kortst
      while (digitalRead(PinSchijf2)!=1)
      {
        digitalWrite(PinSchijfMin, HIGH);
      }
      delay(CorrMin2);
      digitalWrite(PinSchijfMin, LOW);
     
    }
   if  (MetTerugkoppeling==1) {SendSerial();}
  } // einde schijf op pos 2 zetten   

  // schijf op pos 3 zetten
  if (SchijfPos==3)
  {
    ArmUp();
    if (digitalRead(PinSchijf2)==1)
    { // achteruit draaien is het kortst
      while (digitalRead(PinSchijf3)!=1)
      {
        digitalWrite(PinSchijfPlus, HIGH);
      }
      delay(CorrPlus3);
      digitalWrite(PinSchijfPlus, LOW);
     
    }
    else
    {  //vooruit draaien is even lang of het kortst
      while (digitalRead(PinSchijf3)!=1)
      {
        digitalWrite(PinSchijfMin, HIGH);
      }
      delay(CorrMin3);
      digitalWrite(PinSchijfMin, LOW);
     
    }
   if  (MetTerugkoppeling==1) {SendSerial();}
  } // einde schijf op pos 3 zetten

  // schijf op pos 4 zetten
  if (SchijfPos==4)
    {
    ArmUp();
    if (digitalRead(PinSchijf3)==1)
    { // achteruit draaien is het kortst
      while (digitalRead(PinSchijf4)!=1)
      {
        digitalWrite(PinSchijfPlus, HIGH);
      }
      delay(CorrPlus4);
      digitalWrite(PinSchijfPlus, LOW);
     
    }
    else
    {  //vooruit draaien is even lang of het kortst
      while (digitalRead(PinSchijf4)!=1)
      {
        digitalWrite(PinSchijfMin, HIGH);
      }
      delay(CorrMin4);
      digitalWrite(PinSchijfMin, LOW);
     
    }
  if  (MetTerugkoppeling==1) {SendSerial();}
  } // einde schijf op pos 4 zetten

 SchijfPos=0;

}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: digitalRead uitlezen wil niet lukken

Berichtdoor nicoverduin » 01 Okt 2015, 13:31

eerst die code ff formatteren:
cpp code
int inByte = 0;       // de de byte van de serial port

int SchijfPos = 0;

char t;
int nnn;

long DownTijd = 4500;

int PinLaOpen1 = 1;
int PinLaOpen2 = 2;

int PinSchijfPlus = 4;
int PinSchijfMin = 5;

int CorrPlus1 = 0; // c
int CorrPlus2 = 0; // d
int CorrPlus3 = 0; // e
int CorrPlus4 = 0; // f

int CorrMin1 = 0; // g
int CorrMin2 = 0; // h
int CorrMin3 = 0; // i
int CorrMin4 = 0; // j

int PinSchijf1 = 9;
int PinSchijf2 = 10;
int PinSchijf3 = 11;
int PinSchijf4 = 12;

int PinIsArmUp = 2;
int PinIsArmDown = 3;

int PinArmUp = 6;
int PinArmDown = 7;

int MetTerugkoppeling = 0;

int PinZuig = 8;

void setup() {
Serial.begin(9600);

pinMode(PinSchijfPlus, OUTPUT);
pinMode(PinSchijfMin, OUTPUT);
pinMode(PinZuig, OUTPUT);
pinMode(PinArmUp, OUTPUT);
pinMode(PinArmDown, OUTPUT);

pinMode(PinSchijf1, INPUT);
pinMode(PinSchijf2, INPUT);
pinMode(PinSchijf3, INPUT);
pinMode(PinSchijf4, INPUT);

pinMode(PinIsArmUp, INPUT);
pinMode(PinIsArmDown, INPUT);

digitalWrite(PinSchijfPlus, LOW);
digitalWrite(PinSchijfMin, LOW);
digitalWrite(PinArmUp, LOW);
digitalWrite(PinArmDown, LOW);
digitalWrite(PinZuig, LOW);
}

void ArmUp() {
digitalWrite(PinArmDown, LOW);
digitalWrite(PinArmUp, HIGH);
while (digitalRead(PinIsArmUp) == 1) {
digitalWrite(PinArmUp, HIGH);
}
digitalWrite(PinArmUp, LOW);
}

void ArmDown() {
digitalWrite(PinArmUp, LOW);
digitalWrite(PinArmDown, HIGH);
while (digitalRead(PinIsArmDown) == 1) {
digitalWrite(PinArmDown, HIGH);
}
digitalWrite(PinArmDown, LOW);
}

void SendSerial() {
if (digitalRead(PinIsArmUp) == 1) {
Serial.write("PinIsArmUp=1,");
} else {
Serial.write("PinIsArmUp=0,");
};
if (digitalRead(PinIsArmDown) == 1) {
Serial.write("PinIsArmDown=1");
} else {
Serial.write("PinIsArmDown=0");
};
Serial.println(); // geeft altijd PinIsArmUp=0,PinIsArmDown=0
}

void ArmDownTijd() {
long Tijd = millis();

digitalWrite(PinArmUp, LOW);
digitalWrite(PinArmDown, HIGH);
while ((digitalRead(PinIsArmDown) == 1) && (millis() - Tijd < DownTijd)) {
digitalWrite(PinArmDown, HIGH);
}
digitalWrite(PinArmDown, LOW);
}

void loop() {
if (Serial.available() > 0) {
inByte = Serial.read();

//la open

if (inByte == 'y') // lade1
{
SendSerial();
if (analogRead(PinLaOpen1) < 227) {
//SendSerial("Y0");
} else {
//SendSerial("Y1");
}
}

if (inByte == 'z') // lade2
{
SendSerial();
if (analogRead(PinLaOpen2) < 227) {
//SendSerial("Z0");
} else {
//SendSerial("Z1");
}
}

// int CorrPlus1 = c int CorrMin1 g
if (inByte >= 'c' && inByte <= 'j') // de pauze instellen voor draaischijf
{
delay(50); // voor de zekerheid
nnn = 0;
t = Serial.read(); // Read next character
nnn += t - '0';
t = Serial.read(); // Read next character
nnn *= 10;
nnn += t - '0';
t = Serial.read(); // Read next character
nnn *= 10;
nnn += t - '0';

switch (inByte) // voor welke is het
{
case 'c':
CorrPlus1 = nnn;
break;
case 'd':
CorrPlus2 = nnn;
break;
case 'e':
CorrPlus3 = nnn;
break;
case 'f':
CorrPlus4 = nnn;
break;

case 'g':
CorrMin1 = nnn;
break;
case 'h':
CorrMin2 = nnn;
break;
case 'i':
CorrMin3 = nnn;
break;
case 'j':
CorrMin4 = nnn;
break;
}
}

// einde

if (inByte == 43) // de + de stofzuiger aan
{
digitalWrite(PinZuig, HIGH);
SendSerial();
}

if (inByte == 45) // de - de stofzuiger uit
{
digitalWrite(PinZuig, LOW);
SendSerial();
}

if (inByte >= 49 & inByte <= 55) // aansturing schijf
{
SchijfPos = inByte - 48;
}

// schijfbediening met terugkoppeling indien 1 t/m 4
// schijfbediening zonder terugkoppeling indien 5 t/m 8
if (SchijfPos > 4) {
SchijfPos = SchijfPos - 4;
MetTerugkoppeling = 0;
} else {
MetTerugkoppeling = 1;
}

if (inByte == 'a') // de letter a
{
ArmUp();
SendSerial();
}

if (inByte == 'b') // de letter b
{
ArmDown();
SendSerial();
}

if (inByte == 't') // de letter t
{
ArmDownTijd();
SendSerial();
}

}

// schijf op pos 1 zetten
if (SchijfPos == 1) {
ArmUp();
if (digitalRead(PinSchijf4) == 1) { // achteruit draaien is het kortst
while (digitalRead(PinSchijf1) != 1) {
digitalWrite(PinSchijfPlus, HIGH);
}
delay(CorrPlus1);
digitalWrite(PinSchijfPlus, LOW);

} else { //vorouit draaien is even lang of het kortst
while (digitalRead(PinSchijf1) != 1) {
digitalWrite(PinSchijfMin, HIGH);
}
delay(CorrMin1);
digitalWrite(PinSchijfMin, LOW);

}
if (MetTerugkoppeling == 1) {
SendSerial();
}
} // einde schijf op pos 1 zetten

// schijf op pos 2 zetten
if (SchijfPos == 2) {
ArmUp();
if (digitalRead(PinSchijf1) == 1) { // achteruit draaien is het kortst
while (digitalRead(PinSchijf2) != 1) {
digitalWrite(PinSchijfPlus, HIGH);
}
delay(CorrPlus2);
digitalWrite(PinSchijfPlus, LOW);

} else { //vorouit draaien is even lang of het kortst
while (digitalRead(PinSchijf2) != 1) {
digitalWrite(PinSchijfMin, HIGH);
}
delay(CorrMin2);
digitalWrite(PinSchijfMin, LOW);

}
if (MetTerugkoppeling == 1) {
SendSerial();
}
} // einde schijf op pos 2 zetten

// schijf op pos 3 zetten
if (SchijfPos == 3) {
ArmUp();
if (digitalRead(PinSchijf2) == 1) { // achteruit draaien is het kortst
while (digitalRead(PinSchijf3) != 1) {
digitalWrite(PinSchijfPlus, HIGH);
}
delay(CorrPlus3);
digitalWrite(PinSchijfPlus, LOW);

} else { //vooruit draaien is even lang of het kortst
while (digitalRead(PinSchijf3) != 1) {
digitalWrite(PinSchijfMin, HIGH);
}
delay(CorrMin3);
digitalWrite(PinSchijfMin, LOW);

}
if (MetTerugkoppeling == 1) {
SendSerial();
}
} // einde schijf op pos 3 zetten

// schijf op pos 4 zetten
if (SchijfPos == 4) {
ArmUp();
if (digitalRead(PinSchijf3) == 1) { // achteruit draaien is het kortst
while (digitalRead(PinSchijf4) != 1) {
digitalWrite(PinSchijfPlus, HIGH);
}
delay(CorrPlus4);
digitalWrite(PinSchijfPlus, LOW);

} else { //vooruit draaien is even lang of het kortst
while (digitalRead(PinSchijf4) != 1) {
digitalWrite(PinSchijfMin, HIGH);
}
delay(CorrMin4);
digitalWrite(PinSchijfMin, LOW);

}
if (MetTerugkoppeling == 1) {
SendSerial();
}
} // einde schijf op pos 4 zetten

SchijfPos = 0;

}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: digitalRead uitlezen wil niet lukken

Berichtdoor nicoverduin » 01 Okt 2015, 13:37

Je bent je er wel van bewust dat ArmUp en ArmDown net zolang wachten totdat bijv. PinIsArmUp = 0 wacht enz? Dus zal de sendserial altijd de waarde 0 afgeven omdat die arm funcites er net voor zitten.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: digitalRead uitlezen wil niet lukken

Berichtdoor FonzieBonzo » 01 Okt 2015, 15:42

Ja daar ben ik mij van bewust, uiteindelijk wil ik na iedere (af)handeling van een opdracht een verslag van alle statussen via de seriale poort naar mijn pc terug sturen.

ps hoe kan ik zelf de code in het arduino formaat zetten ? [edit] oh met cpp achter {code2=cpp} {/code2}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: digitalRead uitlezen wil niet lukken

Berichtdoor nicoverduin » 01 Okt 2015, 21:21

Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: digitalRead uitlezen wil niet lukken

Berichtdoor shooter » 02 Okt 2015, 08:49

en denk eraan dat HIGH een ander ding is dan 1 dus goed declareren. een digitale ingang is geen INT.
ben voorzichtig met al die serial instructies want die vertragen je programma heel erg.
verder vind ik de loop veel te groot beter in stukjes en dan functies aanroepen.
zet alle i/o bij elkaar dan heb je overzicht.
voorlopig genoeg.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: digitalRead uitlezen wil niet lukken

Berichtdoor FonzieBonzo » 02 Okt 2015, 10:41

Ik begin inmiddels het vermoeden te krijgen dat het een hardwarematige ontwerpfout is.
Dat de stuurspanning van de eindstop sensor wordt gevoed met het stuursignaal van de motor.
Dus als de motor is gestopt, er ook gestopt wordt met het meten middels de eindstop sensor.
Van het weekend ga ik met de multimeter maar eens kijken of mijn vermoedens klopppen.

Wel bedankt voor het mee denken en de andere input!
Doel je met "denk eraan dat HIGH een ander ding is dan 1 dus goed declareren"
op de code "digitalRead(PinIsArmDown)==1" ?
Deze heb ik uit de officiele handleiding https://www.arduino.cc/en/Reference/DigitalRead
Met LOW / HIGH zal alles <> aan 0 volt een HIGH zijn, betekend dit dat een digitale poort vertaalt naar een INT ook 2, 3 enz kan zijn ?

Gr,
Fonzie

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: digitalRead uitlezen wil niet lukken

Berichtdoor shooter » 02 Okt 2015, 18:39

ja je hebt gelijk maar met high low is netter, en ja het zou ook 2 3 kunnen zijn en dan wordt het wel erg moeilijk.
de rest van het programma is moeilijk te doorgronden zonder hardware
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: digitalRead uitlezen wil niet lukken

Berichtdoor FonzieBonzo » 03 Okt 2015, 10:20

Ok aangepast, inmiddeels alles vervangen door HIGH & LOW.

Meten is weten, ik ben er nu ook inmiddels uit waarom het uitlezen niet goed ging.
De eindstop microswitch(als breekcontact) zit in serie tussen de aanstuur van de motor (PinArmDown) en de motor.
Aan de kant van de motor gaat er dan ook nog vertakking naar PinIsArmDown.
Hierdoor kan ik PinIsArmDown dus niet meten zolang PinArmDown niet HIGH is (de motor naar de eindstop loopt).
Het is een prooiect van een aantal jaar terug van mij maar ik zal voor deze opstelling gekozen hebben omdat je hiermee noulijks het gevaar loopt dat en voorbij je eindstop wordt gegaan omdat de microswitch dit al voorkomt i.p.v het Arduinobordje.

Ik weet het zou ook anders kunnen maar ik hoef in principe de waarde van PinIsArmDown ook niet teruggekoppeld te hebben.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: digitalRead uitlezen wil niet lukken

Berichtdoor shooter » 04 Okt 2015, 20:34

als de switch in serie staat met de motor deze netjes laten zitten en een diode gebruiken om te zorgen dat de motor wel de andere kant opkan.
gebruik dan liever nog een microswitch voor de melding naar de arduino toe (dat voorkomt dat je rare spanningen hebt op je arduino.
je kunt er ook een decoder direct opzetten zodat je precies de stand van je arm weet.
bij aanzetten van het geheel laat je de motor eerst tegen de eindstop oplopen en dan reset je deteller.
paul deelen
shooter@home.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten