PWM signaal up en down gearing

Arduino specifieke Software
Berichten: 25
Geregistreerd: 27 Jan 2014, 18:35
Woonplaats: Noord Brabant

PWM signaal up en down gearing

Berichtdoor bouwmeester » 22 Feb 2014, 18:28

Hallo,

Ik heb een uitgaand PWM signaal die variabel moet kunnen zijn van 0-255.
Vaste waardes:
StartSpeed = 255;
GearUp = 63;
GearDown = -63

Als ik een Button aciveer moet het PWM signaal geactiveerd worden met StartSpeed
Als ik de Button los laat moet het PWM signaal 0 zijn.
Als ik binnen 2 seconden de Button weer activeer moet het PWN signaal met 63 verlaagd worden
Als ik binnen dezelfde 2 seconden de button twee keer activeer dan moet het signaal met 63 verhoogd worden.

Ik ben stap voor stap te werk gegaan:
1. Start stop functie zonder GearUp en GearDown. Deze programmering is gelukt :)
2. Het Down gear-en wil nog niet lukken en ben tot het volgende gekomen en het zou moeten werken mijn inziens, maar krijg de Geardown en daarna de Startspeed als ik de button geactiveerd laat?
 
// Pin 13 has an LED connected on most Arduino boards.
// give pins a name:
const int reed = 4;
const int pwm = 13;

const int StartSpeed = 255;
const int GearUp = 63;
const int GearDown = -63;

int buttonState = 0;
int Speed = 0;
int ButtonOnCount = 0
long ButtonOffMoment = 0;
long ButtonOnMoment = 0;
long ButtonOffTime = 0;

// the setup routine runs once when you press reset:
void setup()
{                
  // set button as input
  pinMode(reed, INPUT);
  // set pwm as output
  pinMode(pwm, OUTPUT);
  // init serialize communication at 9600 bits per second
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop()
{
  // read the input pin:
  buttonState = digitalRead(reed);
  if (buttonState == LOW)
  {
    // turn pwm off:
    Speed = 0;
    ButtonOffMoment = millis();
    analogWrite(pwm, Speed);
    delay(300);
    Serial.println("SpeedOff");
  } 
  if (buttonState == HIGH)
  {
    //Hoe lang is button off geweest?
    ButtonOnMoment = millis();
    ButtonOffTime = ButtonOnMoment - ButtonOffMoment;
    
    if (ButtonOffTime <= 2000)
    {
      Speed = Speed + GearDown;
      Serial.println("GearDown");
    }
    
    else
    {
      Speed = StartSpeed;
      Serial.println("StartSpeed");
    }
    
    
    // turn pwm on with speed:
    analogWrite(pwm, Speed);
    delay(300);
  }
   
  if (Speed > 255) Speed = 255;
  if (Speed < 0) Speed = 0;
}



Waar gaat het mis? Misschien kan iemand mij helpen.

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: PWM signaal up en down gearing

Berichtdoor pjh » 22 Feb 2014, 21:42

pin 13 heeft geen PWM (op een UNO)

Berichten: 25
Geregistreerd: 27 Jan 2014, 18:35
Woonplaats: Noord Brabant

Re: PWM signaal up en down gearing

Berichtdoor bouwmeester » 23 Feb 2014, 13:29

Het is een micro , ik krijg overigens wel een pwm signaal eruit

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: PWM signaal up en down gearing

Berichtdoor pjh » 23 Feb 2014, 17:22

Als ik een Button aciveer moet het PWM signaal geactiveerd worden met StartSpeed (1)
Als ik de Button los laat moet het PWM signaal 0 zijn. (2)
Als ik binnen 2 seconden de Button weer activeer moet het PWN signaal met 63 verlaagd worden (3)
Als ik binnen dezelfde 2 seconden de button twee keer activeer dan moet het signaal met 63 verhoogd worden.(4)


Scenario
ik druk knop in (1)
=> startspeed wordt 255
ik laat knop los (2)
=> startSpeed wordt 0
ik druk < 2 sec nogmaals (3)
==>startspeed wordt 0 (eigenlijk -63)
nogmaals < 2 seconden
==>startspeed wordt 63 (4)

Hmm. Wat als je na 2 seconden drukt, of 2 > seconden ingedrukt houdt?
Het is mij niet helemaal duidelijk wat alle mogelijke scenario's zijn.
Verder mis ik de debounce van de knopjes. Of heb je dat hardwarematig opgelost?

Berichten: 25
Geregistreerd: 27 Jan 2014, 18:35
Woonplaats: Noord Brabant

Re: PWM signaal up en down gearing

Berichtdoor bouwmeester » 24 Feb 2014, 23:45

Debounce wilde ik als laatste toevoegen. Het is maar 1 knop.
Ik wil bij activering een startspeed hebben.
Bij loslaten moet de motor stoppen als ik 1 keer "puls" dan moet de snelheid met 63 verlagen.
En als ik twee keer "puls" moet de snelheid met 63 verhoogd worden.
De "pulsen" moeten de waarde verhogen/verminderen van de laatste snelheid. Met als uitzondering als de pauze meer is als 2 seconden, dan moet er bij activering weer gestart worden met de startspeed.

Berichten: 25
Geregistreerd: 27 Jan 2014, 18:35
Woonplaats: Noord Brabant

Re: PWM signaal up en down gearing

Berichtdoor bouwmeester » 27 Feb 2014, 21:02

Ik ben weer een stapje verder, alleen doet het upgearen en het downgearen het om de beurt. Het moet eigenlijk een enkele klik binnen 2 sec downgearen en een dubbele klik binnen 2 sec upgearen.
Wie kan mij helpen?

// Pin 13 has an LED connected on most Arduino boards.
// give pins a name:
const int reed = 4;
const int pwm = 13;
const int StartSpeed = 127;
const int GearUp = 32;
const int GearDown = -32;

int buttonState = 0;
int Speed = 0;
int LastSpeed = 0;
int ButtonOnCount = 0;

boolean Motorstatus = LOW;

long ButtonOffMoment = 0;
long ButtonOnMoment = 0;
long ButtonOffTime = 0;

// the setup routine runs once when you press reset:
void setup()
{                
  // set button as input
  pinMode(reed, INPUT);
  // set pwm as output
  pinMode(pwm, OUTPUT);
  // init serialize communication at 9600 bits per second
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop()
{
  // read the input pin:
  buttonState = digitalRead(reed);
  if (buttonState == LOW) {
    if (Motorstatus == HIGH) {
      ButtonOffMoment = millis();
      Speed = 0;
      Serial.println("SpeedOff");
    }
    Motorstatus = LOW;
    analogWrite(pwm, Speed);
  } 
  if (buttonState == HIGH) {
    if (Motorstatus == LOW) {
      //Hoe lang is button off geweest?
      ButtonOnMoment = millis();
      ButtonOffTime = ButtonOnMoment - ButtonOffMoment;
      ButtonOnCount++;
      if (ButtonOffTime < 2000) {
        if (ButtonOnCount == 1) {
          Speed = LastSpeed + GearDown;
          Serial.print("number of button pushes: ");
          Serial.println(ButtonOnCount);
          Serial.println("GearDown");
        }
        if (ButtonOnCount == 2) {
          Speed = LastSpeed + GearUp;
          Serial.print("number of button pushes: ");
          Serial.println(ButtonOnCount);
          Serial.println("GearUp");
        }
        if (ButtonOnCount >= 2) {
          ButtonOnCount = 0;
        }
      }
      if (ButtonOffTime > 2000) {
        Speed = StartSpeed;
        ButtonOnCount = 0;
        Serial.print("number of button pushes: ");
        Serial.println(ButtonOnCount);
        Serial.println("StartSpeed");
      }
      LastSpeed = Speed;
      Motorstatus = HIGH;
      if (LastSpeed > 255) Speed = 255;
      if (LastSpeed < 32) Speed = 32;
    }
    // turn pwm on with speed:
    analogWrite(pwm, Speed);
  }
}


Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: PWM signaal up en down gearing

Berichtdoor pjh » 27 Feb 2014, 21:41

Ben ik weer. Jij schrijft:
enkele klik binnen 2 sec downgearen en een dubbele klik binnen 2 sec upgearen

Probleem is dat je pas weet dát er maar één keer is gedrukt, zodra de tweede druk uitblijft.
Lijkt triviaal, maar als je dat niet scherp in je programma krijgt, krijg je problemen.

Jij programmeert:
Code: Alles selecteren
 if (ButtonOffTime < 2000) {
        if (ButtonOnCount == 1) {

Jij lijkt hier 1 x drukken binnen twee seconden te hebben, maar dan ga je ER BLIND vanuit dat er geen tweede druk komt. Zoals je het nu doet, heb je altijd bij twee drukken binnen twee seconden je programma eerst "1x drukken" uitvoert. Ofwel:
Code: Alles selecteren
 if (ButtonOffTime < 2000) {
        if (ButtonOnCount == 1) {
          Speed = LastSpeed + GearDown;
        }
        if (ButtonOnCount == 2) {
          Speed = LastSpeed + GearUp;
          }

Bij twee keer drukken krijg je dus:
druk No-1: Speed = LastSpeed + GearDown;
druk No-2: Speed = LastSpeed + GearUp;
==> Speed = LastSpeed + GearDown + GearUp = Lastspeed + 32 - 32 = LastSpeed
==> Speed = LastSpeed
==> er gebeurd niks.

Druk je één keer en wacht je 2 seconden, dan zal het wel goed gaan, maar 2 keer niet...

OFWEL: het moet anders.... ;)

Mijn inziens kun je twee kanten op.
1. Je maakt de beslissing gearUp of Down pas Ná 2 seconden.
2. Je definieert de tijd tussen twee keer drukken korter. Zeg 300 ms. Ruim voldoende voor een comfortabele dubbelclick. Dan hoef je geen twee seconden te wachten, maar heb je een "lag" van 300 ms bij 1 x klicken.

Anderen ook ideeën?
Laatst gewijzigd door pjh op 27 Feb 2014, 21:51, in totaal 1 keer gewijzigd.

Berichten: 25
Geregistreerd: 27 Jan 2014, 18:35
Woonplaats: Noord Brabant

Re: PWM signaal up en down gearing

Berichtdoor bouwmeester » 27 Feb 2014, 21:50

Ja was ik idd achter, maar loop een beetje vast. Iemand een oplossing of een duwtje in de goede richting.

gr

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: PWM signaal up en down gearing

Berichtdoor pjh » 27 Feb 2014, 21:54

Ik heb al wat toegevoegd aan mijn bericht.
Wat je ook kunt doen is twee keer of drie keer klicken nemen. Dan heb je immers altijd een interval.
edit: slecht idee, is van regen in drup.

Ik zou voor de 300 ms gaan en aantal knopclicken dus niet <2000 maar > 300 ms beoordelen.

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: PWM signaal up en down gearing

Berichtdoor pjh » 27 Feb 2014, 22:07

Trouwens, nu je weet hoe 'scheef de muur' van je programma is, kun je wél een korte snelle oplossing maken.
Immers: deze som was DELTA NUL:
Speed = LastSpeed + GearDown + GearUp = Lastspeed + 32 - 32 = LastSpeed
En daarom is
Speed = LastSpeed + GearDown + 2 x GearUp = Lastspeed + 32 - 64 = LastSpeed plus 32

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: agudulaivoniw, ovatidekefu en 15 gasten