Go Down

Topic: Automaatpook aansturen auto (Read 286 times) previous topic - next topic

mark040

Goedemorgen Mensen

ik ben bezig met een projectje om mijn automatenpook met een lineare actuator aan te sturen vanaf de Arduino
wil de pook graag weg hebben en een elektronische pook aan het stuur maken
nu heb ik het al zover dat ik 4 posities heb die ik aan kan roepen met 4 drukknoppen
het enigste waar ik niet aan uit kom is de posities pas op te kunnen roepen zodra ik mijn rem ingedrukt heb 
ik heb hier de code die ik nu werkend heb en hoop dat iemand mij kan helpen
ik kan het signaal van de auto wat gewoon een massa signaal is dus wel in een digitale ingang aansluiten

</>

// Add button library
#include <Button.h>

// Use the jumpers on the board to select which pins will be used
int EnablePin = 8; // use pin 8 to enable board
int PWMPinA1 = 3;  // motor pin A for actuator
int PWMPinB1 = 11; // motor pin B for actuator

// Declare our buttons and specify the correponding pins
Button ManualUp(9);      // use pin 9 to move elevator up manually
Button ManualDown(10);   // use pin 10 to move elevator down manually
Button PresetPark(6);    // use pin 6 to move elevator to park level
Button PresetDrive(7); // use pin 7 to move elevator to drive level
Button PresetReverse(4); // use pin 4 to move elevator to drive level
Button PresetNeutral(5); // use pin 5 to move elevator to drive level


// Specify our input pin for actuator position
int SensorPin = A3;

// Set other globally used variables
int delaytime = 5*1000; // 5 seconds times 1,000 to convert to milliseconds
int ParkLevel = 1000;    // will store/read these values from EEPROM for production
int DriveLevel = 10; // will store/read these values from EEPROM for production
int ReverseLevel = 700; // will store/read these values from EEPROM for production
int NeutralLevel = 400; // will store/read these values from EEPROM for production
int CurrentPos = 0;   // use to read the current position of actuator
int TargetPos = 0;    // use to set the target position of actuator
int Accuracy = 10;    // use to make sure we stop the actuator within the ballpark of target
bool AutoPilot = false; // if true, we are on autopilot

void setup() {
  // put your setup code here, to run once:

  // initialize our buttons
  ManualUp.begin();
  ManualDown.begin();
  PresetPark.begin();
  PresetDrive.begin();
  PresetReverse.begin();
  PresetNeutral.begin();
  
  // initialize serial port
  Serial.begin(9600);

  // initialize MegaMoto board 
  pinMode(EnablePin, OUTPUT); //Enable the board
  pinMode(PWMPinA1, OUTPUT);
  pinMode(PWMPinB1, OUTPUT);  //Set motor outputs

  // set our sensor pin to read
  pinMode(SensorPin, INPUT);

  // make sure we don't move the actuator upon start
  analogWrite(PWMPinA1, 0);
  analogWrite(PWMPinB1, 0);

  // enable the megamoto shield
  Serial.println("Enabling MegaMoto shield");
  // delay(delaytime);
  digitalWrite(EnablePin, HIGH);
  Serial.println("MegaMoto shield is now enabled");

}

void loop() {

  CurrentPos = ReadPos();

  if ((AutoPilot) && (ReachedTarget(CurrentPos))) {
      ElevatorStop();
      AutoPilot = false;
  }
  if (PresetPark.pressed()) {
    AutoPilot = true;
    TargetPos=ParkLevel;
    GoToTarget();
  }
  if (PresetDrive.pressed()) {
    AutoPilot = true;
    TargetPos=DriveLevel;
    GoToTarget();
  }
  if (PresetReverse.pressed()) {
    AutoPilot = true;
    TargetPos=ReverseLevel;
    GoToTarget();
  }
  if (PresetNeutral.pressed()) {
    AutoPilot = true;
    TargetPos=NeutralLevel;
    GoToTarget();
  }
  if (ManualUp.pressed()) {
    AutoPilot = false;
    ElevatorUp();
  }
  if (ManualDown.pressed()) {
    AutoPilot = false;
    ElevatorDown();
  }
  if (ManualUp.released() || ManualDown.released()) {
    ElevatorStop();
  } 
}

void ElevatorUp() {
  // Activate pin A and deactivate pin B  
  analogWrite(PWMPinA1, 255);
  analogWrite(PWMPinB1, 0); // speed 0-255

  // Print starting point
  Serial.print("Moving elevator up from position: ");
  Serial.println(ReadPos());
}

void ElevatorDown() {
  // Activate pin B and deactivate pin A  
  analogWrite(PWMPinA1, 0);
  analogWrite(PWMPinB1, 255); // speed 0-255

  // Print starting point
  Serial.print("Moving elevator down from position: ");
  Serial.println(ReadPos());
}

void ElevatorStop() {
  // Deactivate both pins  
  analogWrite(PWMPinA1, 0);
  analogWrite(PWMPinB1, 0); // speed 0-255

  // Print stopping point
  Serial.print("Elevator stopped at position: ");
  Serial.println(ReadPos());
}

int ReadPos() {
  return analogRead(SensorPin);
}

void GoToTarget() {
    
  if (ReachedTarget(CurrentPos)) {
    Serial.println("Elevator already at target.");
  }
  else if (TargetPos < CurrentPos) {
     ElevatorDown();
  }
  else if (TargetPos > CurrentPos) {
    ElevatorUp();
  }
}

bool ReachedTarget(int CheckPos) {
  int LimitLow = CheckPos - Accuracy;
  int LimitHigh = CheckPos + Accuracy;

  if ((TargetPos < LimitHigh) && (TargetPos > LimitLow)) {
    Serial.println("Elevator reached target.");
    return true;
  }
  else {
    return false;
  }
}. </>

Koepel

Het is me niet helemaal duidelijk.
Is de PresetPark.pressed() de rem ? of moet die eerst naar een bepaalde positie ?
Is de ManualUp.pressed() voor de verschillende posities die je wilt opvragen ?

Er zijn een heleboel libraries die "Button" heten. Welke gebruik je ?
Welk Arduino board gebruik je ?

mark040

#2
Jan 25, 2021, 04:59 pm Last Edit: Jan 25, 2021, 05:00 pm by mark040
het is de bedoeling dat hij pas naar een preset gaat als ik de rem bedien
ik gebruik de Mega2560
de Manual up kan ik gebruiken om de actuator handmatig in een bepaalde stand te zetten

ik heb nu dit maar werkt nog niet zoals het zou moeten
</>
void loop() {

  CurrentPos = ReadPos();

  if ((AutoPilot) && (ReachedTarget(CurrentPos))) {
      ElevatorStop();
      AutoPilot = false;
  }
  if (PresetPark.pressed () && Brake.pressed ()) {
    AutoPilot = true;  
    TargetPos=ParkLevel;
    GoToTarget();
  }
  if (PresetDrive.pressed() && Brake.pressed()) {
    AutoPilot = true;
    TargetPos=DriveLevel;
    GoToTarget();
  }
  if (PresetReverse.pressed() && Brake.pressed()) {
    AutoPilot = true;
    TargetPos=ReverseLevel;
    GoToTarget();
  }
  if (PresetNeutral.pressed() && Brake.pressed()) {
    AutoPilot = true;
    TargetPos=NeutralLevel;
    GoToTarget();
</>

mark040

#3
Jan 25, 2021, 05:38 pm Last Edit: Jan 25, 2021, 05:43 pm by mark040
ik heb het voor elkaar

</>oid loop() {
 buttonState = digitalRead(buttonPin);
  CurrentPos = ReadPos();

  if ((AutoPilot) && (ReachedTarget(CurrentPos))) {
      ElevatorStop();
      AutoPilot = false;
  }
  if ((PresetPark.pressed () && (buttonState == LOW ))) {
    AutoPilot = true; 
    TargetPos=ParkLevel;
    GoToTarget();
  }
  if ((PresetDrive.pressed() && (buttonState == LOW ))) {
    AutoPilot = true;
    TargetPos=DriveLevel;
    GoToTarget();
  }
  if ((PresetReverse.pressed() && (buttonState == LOW ))) {
    AutoPilot = true;
    TargetPos=ReverseLevel;
    GoToTarget();
  }
  if ((PresetNeutral.pressed() && (buttonState == LOW ))) {
    AutoPilot = true;
    TargetPos=NeutralLevel;
    GoToTarget();</>

mark040

ik had toch nog een vraag,

ik zou graag willen dat de preset neutral pas in actie komt als ik de knop langer als 2 seconden inhoud.
wie kan mij hiermee helpen?

Koepel

Dat soort dingen wil iedereen  :o
Soms lukt het met een delay(), maar vaak is millis() nodig.

Het gebruik van millis() vergt een bepaalde denkwijze. Stel dat de loop() heel vaak en heel snel wordt uitgevoerd. Iedere keer dat loop() doorlopen wordt kijk je op de klok of die 2 seconden al bereikt zijn. Dat is millis().

Je kunt beginnen met dit te lezen: https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay.

mark040

dat begrijp ik dat iedereen dat wil, en ik vraag inderdaad om hulp omdat ik toch het een en ander probeer maar er niet uit kom ben zelf al dagen bezig en al een heel eind gekomen als het mij dan echt niet lukt dan vraag ik het inderdaad.

maar ik ga zelf wel even opzoek toch bedankt

Koepel


MAS3

Hoi mark040.

De wijze waarop je je vraag over de vertraging stelt, bevat heel weinig informatie en het lijkt er daarom op of je vraagt of iemand dat even voor jou wil maken.
Het is een heel ondankbaar werkje voor iemand om dat voor jou te doen, want die persoon hoort er over het algemeen later nooit meer iets van, behalve dat je iets soortgelijks bij je volgende project weer komt vragen.
Dit is dus ook een ding dat iedereen die eens wat wil programmeren onder de knie moet hebben wat je hebt het heel vaak nodig.
Daarom zijn er ook heel veel verschillende voorbeelden van, die uiteindelijk allemaal op dezelfde werkwijze uitkomen.

Wij kunnen niet weten wat je allemaal al hebt geprobeerd en hoe lang je er mee bezig bent geweest (dat laatste is ook niet echt heel erg interessant).
Maar vertel dan eens wat je geprobeerd hebt en waar je op vastloopt.
Want dan kan er op worden ingegaan.
Wees je er van bewust dat de beste voorbeelden waarover ik hierboven sprak, je niet even 1 trucje leren waarmee je dit oplost, maar het een heel pakket is die samen de oplossing bieden (dat klinkt dan weer een beetje te zwaar).
Pak de voorzetten die koepel je gaf eens aan, en lees ook eens mijn bijdragen bovenaan dit forum door.

Kom je er dan nog steeds niet verder mee, kom dan met een specifiek stukje code en stel je vragen daar over zodat iemand je aan de hand daarvan wat verder kunnen helpen.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

mark040

ik heb inderdaad heel het internet uit, en het is gelukt bedankt ook voor jullie hulp 

Go Up