Show Posts
Pages: 1 [2] 3
16  International / Scandinavia / Re: Hvor kan man købe Arduino Starter Kit? on: January 09, 2013, 03:23:08 pm
Hej

Jeg bruger Let-elektronik.
Udbudet af tilbehør er også ved at være OK, og der kommer mere og mere på deres lager.
Og de er altid villige til at hjælpe.

VH
LYDANGER
17  International / Scandinavia / Re: RPM måler on: January 05, 2013, 02:31:32 pm
Hensigten er: der foretages et valg på forhånd med up/down "Profil".
alt efter hvor hurtigt "hjulet" kører (rpm) skal der ske forskellige aktiviteter alt efter hvordan kobinationen af profil og rpm er.
Der er 10 "profiler" hvor der er 2 muligeder pr. profil.
Switch case Serial.println skal i virkeligheden inderholder koder der aktivere film/programmer via GoBeTwino.

Det hele er bygget ind i en kondicykel. Arduinoen skal motiverer børn til at motionerer. Profiler vælges ud fra hvilken film/musik/programmer børnene er interesseret i, og værdien på (rpm) bestemmer om børnene kan se filmen ( højt rpm) eller ikke kan se den (lavt rpm).
18  International / Scandinavia / Re: RPM måler on: January 05, 2013, 12:06:22 pm
Hej Msquare

Nu fungerer koden. Jeg valgte den sidste kode jeg sendte, af en eller grund virker den første ikke. Det er lige meget hvor præcist rmpcount er, da jeg skal bruge variablen i et senere switch case , hvor jeg så justerer tallet så det passer.

Nu er problemmet så at mine Serial.println i switch case'ene bliver ved med at "løbe" på Serial monitoren. De skal kun vises 1 gang, for hvert case skifte.
Kan du se hvad det er jeg koder forkert????
Code:
const int UP = 13;
const int DOWN = 12;
 
volatile int rpm;
 
unsigned long timeold;
unsigned long timenew;
unsigned long timediff;
volatile byte rpmcount;
 

 const int HURTIG = 10;
 const int LANGSOM = 20;
 int lastState;

boolean lastbuttonUP = HIGH;          // debounce//
boolean currbuttonUP = HIGH;
boolean lastbuttonDOWN = HIGH;     
boolean currbuttonDOWN = HIGH;

int PushCounter = 0;

void setup()
{
   pinMode(UP, INPUT);
  digitalWrite(UP, HIGH);
  pinMode(DOWN , INPUT);
  digitalWrite(DOWN, HIGH);
 
 
  Serial.begin(9600);
  attachInterrupt(0, rpm_fun, RISING); // Interrupt triggers on rising edge; when the sensor turns off.
 
 digitalWrite(2, HIGH);
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
 
}
boolean debounceUP(boolean lastUP)              //debounce UP/
{
  boolean currentUP = digitalRead(UP);
  if (lastUP != currentUP)
  {
    delay(50);
    currentUP = digitalRead(UP);
  }
  return currentUP;

}


boolean debounceDOWN(boolean lastDOWN)              //debounce DOWN/
{
  boolean currentDOWN = digitalRead(DOWN);
  if (lastDOWN != currentDOWN)
  {
    delay(50);
    currentDOWN = digitalRead(DOWN);
  }
  return currentDOWN;

}
void loop()
{
    currbuttonUP = debounceUP(lastbuttonUP);                  // up //
  if(lastbuttonUP == HIGH && currbuttonUP == LOW)
  {
    PushCounter++;
    PushCounter = min(PushCounter, 10);
    Serial.print("PROFIL:");
    Serial.println(PushCounter);

  }
  lastbuttonUP = currbuttonUP;



  currbuttonDOWN= debounceDOWN(lastbuttonDOWN);            //DOWN//
  if(lastbuttonDOWN == HIGH && currbuttonDOWN == LOW)
  {
    PushCounter--;
    PushCounter = max(PushCounter, 1);
    Serial.print("PROFIL");
    Serial.println(PushCounter);
  }
  lastbuttonDOWN = currbuttonDOWN;
 
 
  if (rpmcount==1)
    timeold=millis();
 

  else if (rpmcount >= 15) {
    //Update RPM every 20 counts, increase this for better RPM resolution,
    //decrease for faster update
    rpm = 30000L/(millis() - timeold)*(rpmcount-1);
    //timeold = millis();
    rpmcount = 0;
    Serial.println(rpm);
  }

  if ( rpm >= 130 && lastState!=HURTIG)
   switch (PushCounter)
    {
    case 1 :
      Serial.println("HURTIG 1");
      break;
    case 2 :
      Serial.println("HURTIG 2");
      break;
    case 3:
      Serial.println("HURTIG 3");
      break;
    case 4:
      Serial.println("HURTIG 4");
      break;
    case 5:
      Serial.println("HURTIG 5");
      break;
    case 6:
      Serial.println("HURTIG 6");
      break;
    case 7:
      Serial.println("HURTIG 7");
      break;
    case 8:
      Serial.println("HURTIG 8");
      break;
    case 9:
      Serial.println("HURTIG 9");
      break;
    case 10:
      Serial.println("HURTIG 10");
      break;

    }

   
    lastState = HURTIG;
 

 
     if ( rpm <= 129 && lastState!=LANGSOM)
   switch (PushCounter)
    {
    case 1 :
      Serial.println("LANGSOM 1");
      break;
    case 2 :
      Serial.println("LANGSOM 2");
      break;
    case 3:
      Serial.println("LANGSOM 3");
      break;
    case 4:
      Serial.println("LANGSOM 4");
      break;
    case 5:
      Serial.println("LANGSOM 5");
      break;
    case 6:
      Serial.println("LANGSOM 6");
      break;
    case 7:
      Serial.println("LANGSOM 7");
      break;
    case 8:
      Serial.println("LANGSOM 8");
      break;
    case 9:
      Serial.println("LANGSOM 9");
      break;
    case 10:
      Serial.println("LANGSOM 10");
      break;

    }

    lastState = LANGSOM;
 
 
 
}
void rpm_fun()
{
  rpmcount++;
  //Each rotation, this interrupt function is run twice
}

Venlig hilsen

LYDANGER


19  International / Scandinavia / Re: RPM måler on: December 29, 2012, 05:59:21 pm
Hej Mspuare

Du er jo næsten blevet en "tro følgesvend" i mit forsøg på at erober Arduino verdenen.   smiley-lol

Nå...jeg ændrede variablerne, og aktiverede den indbyggede pullup.

og det hjalp rigtig meget.

Dog kunne jeg stadig godt tænke mig at serial.print af "rpm" bliver opdateret ved hvert "interrupt". Har du nogle forslag ud fra den nye sketch???

Code:
volatile int rpm;
 
unsigned long timeold;
unsigned long timenew;
unsigned long timediff;
volatile byte rpmcount;
 

 




void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, rpm_fun, CHANGE);
 
 digitalWrite(2, HIGH);
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
}
 
void loop()
{
  if (rpmcount==1)
    timeold=millis();
 
  else if (rpmcount >= 20) {
    //Update RPM every 20 counts, increase this for better RPM resolution,
    //decrease for faster update
    rpm = 30000/(millis() - timeold)*(rpmcount-1);
    //timeold = millis();
    rpmcount = 0;
    Serial.println(rpm);
  }
}
 
void rpm_fun()
{
  rpmcount++;
  //Each rotation, this interrupt function is run twice
}



VH
Lydfanger
20  International / Scandinavia / LØST RPM måler on: December 29, 2012, 04:35:50 pm
Hej

Jeg forsøger at bruge nedenstående sketch til at måler omdrejninger/min.
Jeg får dog kun en masse 5 cifrede tal ud på Serial monitoren, og tallene kommer hurtigt, uanset om der har været interrupt eller ej.

Jeg bruger en magnetføler til Interrupt.


Jeg vil gerne have at at serial.print af "rpm" bliver opdateret hver gang magnetføleren "interrupter". Grunden til dette er at "hjulet" drejer med kun max 150 omdrejninger/min.

  
Code:
unsigned int rpm;
 
unsigned long timeold;
unsigned long timenew;
unsigned long timediff;



void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, rpm_fun, LOW);
 
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
}
 
void loop()
{
  if (rpmcount==1)
    timeold=millis();
 
  
    rpm = 60000/(millis() - timeold)*(rpmcount-1);
    //timeold = millis();
    rpmcount = 0;
    Serial.println(rpm,DEC);
  }
}
 
void rpm_fun()
{
  rpmcount++;
  //Each rotation, this interrupt function is run twice
}
21  International / Scandinavia / "LØST" Måling af tid mellem tilstande on: December 07, 2012, 05:36:28 am
Så er jeg her igen.

Jeg har brug for at måle tiden mellem skift af 2 tilstande.
Jeg skal bruge "tiden" som variabel til definere forskellige hændelder alt efter værdien.

Jeg har prøvet med "pulseIn" men det har indvirkning på hele loopet og giver store forsinkelser og tilfældige.
Er der nogen der har et bud????

Code:
val = analogRead(mag);



  if(val < 300 && lstState!=TAET)
  {
    Serial.println("TAET");

    lstState = TAET;
  }




  if(val >= 300 && lstState!=LANG)
  {
    Serial.println("LANGT");

    lstState = LANG;
  }
  delay(5);
}
Vh
Lydfanger
22  International / Scandinavia / Re: rotary encoder og trykknap on: November 08, 2012, 04:58:49 pm
Hej

Ja....det var kontakt-debounce, så problemet er løst.
endnu engang yak for hjælpen.

LYDFANGER
23  International / Scandinavia / Re: rotary encoder og trykknap on: November 04, 2012, 04:31:47 pm
Hej igen

tak for din ide. Det fungerer godt.
dog har jeg et lille problem. Efter skiftet til Switch Case skriver Serial.println flere gange, uvilkårligt.
Jeg SKAL kun have Serial.println til at skrive 1 gang,(for hvert tryk på knap) fordi den skal aktivere en fil på computer via Gobetwino. Hvis Serial.println skriver mere end en gang, starter Gobetwino'en filen flere gange.
I sketch'en er "rotary-emneskift-delen" udskiftet med  "trykknap op/ned-emneskift-del".

Code:
const int  KonUP = 13;           //up & down//
const int KonDO = 12;

int buttonPushCounter = 0;   
int buttonState = 0;
int buttonState2 = 0;
int lastButtonState = 0;     
int lastButtonState2 = 0;

const int kon1 = 2;       //knapper//
const int kon2 = 3;


int currState1;
int prevState1;
int currState2;
int prevState2;







void setup() {

  pinMode(KonUP, INPUT);       // Up & down//
  digitalWrite(KonUP, HIGH);
  pinMode(KonDO, INPUT);
  digitalWrite(KonDO, HIGH);

  pinMode(kon1, INPUT);        // knapper//
  digitalWrite(kon1, HIGH);
  pinMode(kon2, INPUT);
  digitalWrite(kon2, HIGH);


  Serial.begin(9600);
}


void loop()

{



  buttonState = digitalRead(KonUP);


  if (buttonState != lastButtonState) {

    if (buttonState == LOW) {

      buttonPushCounter++;

      Serial.print("emne:  ");
      Serial.println(buttonPushCounter);

    }
  }

  lastButtonState = buttonState;

  {

    buttonState2 = digitalRead(KonDO);


    if (buttonState2 != lastButtonState2) {

      if (buttonState2 == LOW) {

        buttonPushCounter--;

        Serial.print("emne:  ");
        Serial.println(buttonPushCounter);

      }
    }

    lastButtonState2 = buttonState2;

  }

  //kontakter koder//


  {
    currState1 = digitalRead(kon1);
    currState2 = digitalRead(kon2);
 



    if (currState1 !=prevState1)            //trykknap 1//
      switch (buttonPushCounter) {
      case 1 :
        Serial.println("1");
        break;
      case 2 :
        Serial.println("11");
        break;
      case 3:
        Serial.println("21");
        break;
      }
    prevState1=currState1 ;
  }

  if (currState2 !=prevState2)            //trykknap 2//
    switch (buttonPushCounter) {
    case 1 :
      Serial.println("2");
      break;
    case 2 :
      Serial.println("12");
      break;
    case 3:
      Serial.println("22");
      break;
    }
  prevState2=currState2 ;
}
24  International / Scandinavia / Re: rotary encoder og trykknap on: October 29, 2012, 04:17:26 pm
Hej igen

Nu virker det.
Mit projekt har 8 trukknapper(currState 1-8) og en "variations vælger--rotary encoder" ,som skal virker for alle 8 knapper,(number x)

Hvis jeg har forstået det rigtigt, skal jeg først sætte
Code:
prevState1 = currState1;
når alle
Code:
if(currState1 == LOW && number == x)
er læst.

25  International / Scandinavia / Re: rotary encoder og trykknap on: October 27, 2012, 05:14:44 pm
Hej

Monitoren viser 1 ved første step på rotary'en, 2 ved næste step, osv. osv. virker i begge retninger. Den har på intet tidspunkt været ustabil. (det er en "potmeter type")
Første gang jeg vælger step 3 (number == 3) og trykker på trykknapen skriver monitoren "udsagn 1" som jeg gerne vil have. Går jeg videre op i step'ene og trykke på knappen sker der ikke noget, med andre ord virker  if(currState1 == LOW && number == 3) kun den ene gang og if(currState1 == LOW && number == 4) kommer aldrig til at virke.
Monitoren viser stadig nye værdier når jeg drejer på rotary'en.



26  International / Scandinavia / LØST rotary encoder og trykknap on: October 25, 2012, 11:20:41 am
Hej

Jeg prøver at få en rotary encoder til at virke som "bank selector" for en gruppe trykknapper. Encoder delen virker, jeg får et brugbart tal ud "number".
Jeg vil så indsætte "number" i forskellige if statements (for trykknap) som så bestemmer handlingen for trykknappen.
Men det virker bare ikke.
Er der nogen der kan se hvor det går galt???????
(har selv en formodning om det er "number" der ikke bliver "husket"...)

Vh
LYDFANGER

Code:
volatile int number = 0;          //encoder      

int oldnumber = number;

volatile boolean halfleft = false;    
volatile boolean halfright = false;

int kon=8;          //Kontakt
int currState1;
int prevState1;

void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);                
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);                
  attachInterrupt(0, isr_2, FALLING);  
  attachInterrupt(1, isr_3, FALLING);

  pinMode(kon, INPUT);
  digitalWrite(kon, HIGH);



}

void loop(){                    //encoder "koder"
  if(number != oldnumber){              
    Serial.println(number);            
    oldnumber = number;       //denne værdi jeg gerne vil bruge
  }
}

void isr_2(){                                              
  delay(1);                                                
  if(digitalRead(2) == LOW){                              
    if(digitalRead(3) == HIGH && halfright == false){    
      halfright = true;                                    
    }  
    if(digitalRead(3) == LOW && halfleft == true){        
      halfleft = false;                                    
      number--;                                            
    }
  }
}
void isr_3(){                                            
  delay(1);                                              
  if(digitalRead(3) == LOW){                              
    if(digitalRead(2) == HIGH && halfleft == false){      
      halfleft = true;                                    
    }                                                    
    if(digitalRead(2) == LOW && halfright == true){      
      halfright = false;                                  
      number++;
    }
  }

  {
    currState1 = digitalRead(kon);

    if(currState1 !=prevState1)               //tryk på knap "koder"
    {
      if(currState1 == LOW && number == 3)
      {
        Serial.println("UDSAGN 1");
      }
    }
    prevState1 = currState1;




    if(currState1 !=prevState1)    
    {
      if(currState1 == LOW && number == 4)
      {
        Serial.println("UDSAGN 2");
      }
    }
    prevState1 = currState1;

  }
}

27  International / Scandinavia / Re: Magnet føler on: October 14, 2012, 11:34:30 am
Hej Msquare

Tak for dit hint.
Det gjorde at jeg fandt frem til at bruge pulseIn(). Den måler tiden mellem to puls-input, og ud kommer et, for mig, brugbart tal jeg kan lege videre med.


Code:
int sens = 2;

unsigned long duration;

void setup()
{
  pinMode(sens, INPUT);
  digitalWrite(sens, HIGH);
 
  Serial.begin(9600);
}

void loop()
{
  duration = pulseIn(sens, HIGH);
Serial.println(duration/1500);

}


endnu en gang tak for hjælpen
28  International / Scandinavia / "LØST" Magnet føler on: October 08, 2012, 03:35:16 pm
Hej der ude.

Jeg kunne godt bruge hints til, hvordan jeg får impuls fra en magnetføler(som cykelcomputer) omsat til val 0-512.
Hvordan får jeg den tid der går mellem hver impuls omsat til val.

Vh
Lydfanger
29  Using Arduino / Interfacing w/ Software on the Computer / Re: starting the Windows media player from the UNO? on: August 06, 2012, 01:29:05 pm
Try, when you have uploaded the Sketch to the arduino, restart you Windows 7 with you Arduino connected to your PC. Then start the "Gobetwino".
I had the same problem, but after a restart of the PC, it seems that the computer and arduino had found each other.
I know it's sounds strange, but it works for me.

30  Using Arduino / Audio / Re: playing sound from computer on: July 29, 2012, 03:17:35 pm
Hello

try this :
Gobetwino        http://mikmo.dk/gobetwino.html

This software makes it possible to send Serial.println from the Arduino, starting up files and/or programs on your PC.

See also the Post "Starting the Windows media Player from the UNO" under "Interfacing w/ Software on the Computer "

Regards
LYDFANGER
Pages: 1 [2] 3