Zoeken in deze blog

dinsdag 14 september 2010

Eerste Arduino project werkt !

Het heeft wat voeten in de aarde gehad maar de spanning naar weerstand omzetter werkt!
Bij de DS1804 pootje 7 (vrijgave) ook via de Arduino bestuurd en in het regelatgorithme toch maar een kleine hystereses ingebouwd.
Een tweede probleem was de gelijkstroommotor regelaar. Er wordt een potmeter van 5K verwacht. De DS 1804 is echter 10K dus de Arduino software gelijk gehouden echter de analoge ingangswaarde van de teleradio door twee gedeeld met twee weerstandjes van 15K.

Dit zorgt wel voor een halvering van het aantal regelstapjes maar ......

Hieronder de complete software:
/*
 Dit programma leest de rechter en linker joystickknuppel van een Teleradio afstandbesturing
 De uitgaande analoge signalen 0 tot 10 Volt worden eerst middels een spanningsdeling 10K + 10K
 door 2 gedeeld waardoor het bereik van 0 tot 5 Volt loopt.
 Deze signalen worden aangeboden aan een Arduino bordje met ATMEGA 328P microprocessor

 Afhankelijk van de aangeboden analoge waarde genereerd de microprocessor een pulstrein
 volgens de formule : (gemeten waarde - vorige gemeten waarde) / 10
 Tevens wordt gekeken of de opvolgende gemeten waarde lager of hoger is dan de vorige waarde.

 Parosha groep augustus 2010
 a.koopman@tsotechniek.nl

 */
// Constanten zoals gebruikt in het programma
const int analogLinks = 0;     // linker kanaal gekoppeld aan analoog kanaal 0
const int analogRechts = 1;    // rechter kanaal gekoppeld aan analoog kanaal 1
const int ledPinUR = 6;       // Up-Down potmeter rechts
const int ledPinR = 5;        // Puls potmeter rechts
const int ledPinUL = 4;       // Up-Down potmeter links
const int ledPinL = 3;        // Puls potmeter links
const int threshold = 400;   // an arbitrary threshold level that's in the range of the analog input
const int ledPinVR = 7;     //vrijgave potmeter rechts
const int ledPinVL = 8;     //vrijgave potmeter links
// aantal begin waarden vastleggen
int LinksOud = 0;
int RechtsOud = 0;
int VerschilR = 0;
int VerschilOudR = 0;
int VerschilL = 0;
int VerschilOudL = 0;
int PulsL = 0;
int PulsR = 0;
int eenmaal = 0;
// setup eenmaal doorlopen maak pennen naar DS1804 output
void setup() {
  pinMode(ledPinUR, OUTPUT);
  pinMode(ledPinR,OUTPUT);
  pinMode(ledPinUL,OUTPUT);
  pinMode(ledPinL,OUTPUT);
  pinMode(ledPinVR,OUTPUT);
  pinMode(ledPinVL,OUTPUT);
  // initialize serial communications:
  Serial.begin(9600);
  // print tussen waarden om monitoring mogelijk te maken !
}

// Nu gaat het echt beginnen !
void loop() {
  // potmeters éénmaal naar 0 zetten
  if (eenmaal <1)
  {
    digitalWrite(ledPinUL,LOW);  //verlagen van de pulsen
    digitalWrite(ledPinUR,LOW);
    digitalWrite(ledPinVL,LOW);  // vrijgave potmeter links
    digitalWrite(ledPinVR,LOW);  // vrijgave potmeter rechts
    for (int i=0; i <= 99; i++)
    {
      digitalWrite(ledPinL, HIGH);
      digitalWrite(ledPinR,HIGH);
      delay(1);
      digitalWrite(ledPinL, LOW);
      digitalWrite(ledPinR,LOW);
      delay(1);
    }
 
  digitalWrite(ledPinVL,HIGH);  // blokkeren potmeter links
  digitalWrite(ledPinVR,HIGH);  // blokkeren potmeter rechts
  eenmaal = 1;                  // blokkeren 0 zetten
  delay(1000);                  // even rust !
  }
  // joystick waarden inlezen:
 
  int analogValueL = analogRead(analogLinks);
  delay(2);
  //Serial.write("linkerwaarde = ");
  //Serial.println(analogValueL);
  int analogValueR = analogRead(analogRechts);
  //delay(10);
  Serial.write("rechterwaarde = ");
  Serial.println(analogValueR);
  // Eerst maar even het linker kanaal afhandelen !
  if ((analogValueL - LinksOud) > 5)
  {
    digitalWrite(ledPinUL,HIGH);  //ophogen van de pulsen
    digitalWrite(ledPinVL,LOW);  // vrijgave potmeter
    VerschilL = (analogValueL - LinksOud)/11;
    if ((VerschilL + VerschilOudL) > 90)
    {
      VerschilL = 90;
    }
    else
    {
      VerschilL = VerschilL;
    } 
    LinksOud = analogValueL;
    VerschilOudL = VerschilL;
    // pulstreinje opbouwen 1 ms 
    for (int i=0; i <= VerschilL; i++)
    {
      digitalWrite(ledPinL, HIGH);
      delay(1);
      digitalWrite(ledPinL, LOW);
      delay(1);
    }
  }
  else if(analogValueL < LinksOud)
  {
    digitalWrite(ledPinUL,LOW);  // verlagen van de pulsen
    digitalWrite(ledPinVL,LOW);  // vrijgave potmeter
    VerschilL = (LinksOud - analogValueL)/11;
    VerschilOudL = VerschilL;
    LinksOud = analogValueL;

    // pulstreinje opbouwen 1 ms  
    for (int i=0; i <= VerschilL; i++)
    {
      digitalWrite(ledPinL, HIGH);
      delay(1);
      digitalWrite(ledPinL, LOW);
      delay(1);
    }
  }
  else
  {
    VerschilL = 0;
    VerschilOudL = 0;
    digitalWrite(ledPinVL,HIGH);  // blokkade potmeter
  }
 
 
  // En nu dan het rechter kanaal!
  Serial.write("verschilwaarde = ");
  Serial.println(VerschilR);
  if ((analogValueR - RechtsOud)>5)
  {
    digitalWrite(ledPinUR,HIGH);  //ophogen pulsen
    digitalWrite(ledPinVR,LOW);  // vrijgave potmeter
    VerschilR = (analogValueR - RechtsOud)/11;
    if ((VerschilR + VerschilOudR) > 90)
    {
      VerschilR = 90;
    }
    else
    {
      VerschilR = VerschilR;
      VerschilOudR = VerschilR;
    } 
    RechtsOud = analogValueR;
    // pulstreinje opbouwen 1 ms  
    Serial.write("ophogen!");
    for (int i=0; i <= VerschilR; i++)
    {
      digitalWrite(ledPinR, HIGH);
      delay(1);
      digitalWrite(ledPinR, LOW);
      delay(1);
    }
  }
  else if(analogValueR < RechtsOud)
  {
    digitalWrite(ledPinUR,LOW);
    digitalWrite(ledPinVR,LOW);  // vrijgave potmeter
    VerschilR = (RechtsOud - analogValueR)/11;
    VerschilOudR = VerschilR;
    RechtsOud = analogValueR;
    // pulstreinje opbouwen 1 ms  
    Serial.write("verlagen!");
    for (int i=0; i <= VerschilR; i++)
    {
      digitalWrite(ledPinR, HIGH);
      delay(1);
      digitalWrite(ledPinR, LOW);
      delay(1);
    }
  }
    else
  {
    VerschilR = 0;
    VerschilOudR = 0;
    Serial.write("doe niks!");
    digitalWrite(ledPinVR,HIGH);  //blokkade potmeter                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ,HIGH);  // blokkade potmeter
  }
  // wachtlus van 500 ms anders wordt het zo zenuwachtig !
  delay(500);
}