Sida 1 av 1

Arduino kod fråga

Postat: 28 juni 2022, 15:36:33
av KristoferV
Håller på med ett projekt där jag tänkt använda mig av Wesley Kagans freevalve kod.

Den är dock för 4takt och jag kan inte förstå var detta defineras? Jag vill ha 2takt, 0-360 grader = en cykel.

Tack på förhand

Kod: Markera allt

//This code is full of test strings and is generally a conglomerate of code from stackexchange and
//bad form. If it looks stupid, I probably wrote it. 
//Wesley Kagan, 2020

const int hall = 2;
int hallcounter = 0;
int hallstate = 0;
int lasthallstate = 0;
unsigned long triggerTime;
unsigned long last_triggerTime;
unsigned long timeGap;
unsigned long last_timeGap;
unsigned int degree;
unsigned int state;
int newstate;


void setup() {
  pinMode(hall, INPUT);
  Serial.begin(115200);
  pinMode(13, OUTPUT);    // sets the digital pin 13 as output
  pinMode(12, OUTPUT);    // sets the digital pin 12 as output
  attachInterrupt(0, magnet_detect, RISING);//Initialize the intterrupt pin digital pin 2
  degree = 0;
}

 void loop()
 {
  //The compiler says this is needed otherwise the govt. takes my cat
   }

void magnet_detect() {
      hallcounter ++;
      triggerTime = millis();
      timeGap = triggerTime - last_triggerTime;
      last_triggerTime = triggerTime;
     
      if (timeGap >= last_timeGap + last_timeGap / 2)
      {
        //Serial.println(state);
        Serial.println("missing tooth");
        hallcounter = 1; 
        state++; //This right here is garbage and you know it.
      }
    
      last_timeGap = timeGap;
      //Serial.println(hallcounter);
    
     degree = hallcounter * 6;
     if ((state % 2) == 0) { //Bool wasn't working so this dumpster fire got started.
        Serial.print("STATE 1 ");
        Serial.println(degree);
        if (6 <= degree && degree <= 180) { //EDIT HERE INTAKE
        digitalWrite(13, HIGH); // sets the digital pin 13 on
        }
        else {
        digitalWrite(13, LOW);  // sets the digital pin 13 off
        }
     }
     if ((state % 2) == 1) {
        Serial.print("STATE 2 ");
        Serial.println(degree);
        if (180 <= degree && degree <= 354) { //EDIT HERE EXHAUST
        digitalWrite(12, HIGH); // sets the digital pin 13 on
        }
        else {
        digitalWrite(12, LOW);  // sets the digital pin 13 off
        }
     }
  lasthallstate = hallstate;
}

Re: Arduino kod fråga

Postat: 28 juni 2022, 15:49:51
av ajje
(state % 2) gör att varannat varv är insug och varannat är utblås.

Tänker du bygga en tvåtaktsmotor med ventiler? :D

Re: Arduino kod fråga

Postat: 28 juni 2022, 19:18:50
av KristoferV
ajje skrev:(state % 2) gör att varannat varv är insug och varannat är utblås.

Tänker du bygga en tvåtaktsmotor med ventiler? :D
Ja typ. Luftmotor som drivs med tryckluft

Ok så (state % 1) bör lösa det?

Re: Arduino kod fråga

Postat: 28 juni 2022, 20:09:26
av ajje
Nej, % 1 kommer att göra så bara den ena fasen körs varje varv

Jag är inte tillräckligt mycket programmerare för att skriva om det där åt dig, särskilt inte nu när jag sitter med telefonen.

Någon annan här kanske kan förbarma sig :D

Re: Arduino kod fråga

Postat: 29 juni 2022, 08:01:25
av FormerMazda
Koden är ju lite hårt skriven, så att ändra en variabel för att ändra 4takt till 2takt blir svårt.

Men dom har magnetpickup och vid varje trigger från den så mäter dom tiden mellan triggers.
Om tiden är större än eller lika med snittet av förra två tidsgapen så antas en tand räknad = avancera state och säg att vi vridit motorn 6°.
Sen har det byggts nån knepig grej med remainders av state och om graderna är inom vissa områden så sätts utgång 12 eller 13 hög eller låg.

Nästan enklare kan vara att du beskriver vad du vill att arduinon ska göra och vad den har för inputs.
Tror inte ett program behöver vara så svårsrkivet.

Re: Arduino kod fråga

Postat: 29 juni 2022, 10:56:23
av svanted
ersätt:
degree = hallcounter * 6;
if ((state % 2) == 0) { //Bool wasn't working so this dumpster fire got started.
Serial.print("STATE 1 ");
Serial.println(degree);
if (6 <= degree && degree <= 180) { //EDIT HERE INTAKE
digitalWrite(13, HIGH); // sets the digital pin 13 on
}
else {
digitalWrite(13, LOW); // sets the digital pin 13 off
}
}
if ((state % 2) == 1) {
Serial.print("STATE 2 ");
Serial.println(degree);
if (180 <= degree && degree <= 354) { //EDIT HERE EXHAUST
digitalWrite(12, HIGH); // sets the digital pin 13 on
}
else {
digitalWrite(12, LOW); // sets the digital pin 13 off
}
}
lasthallstate = hallstate;

med:

degree = hallcounter * 6;

if (6 <= degree && degree <= 180) { //EDIT HERE INTAKE
digitalWrite(13, HIGH); // sets the digital pin 13 on = intake
digitalWrite(12, LOW); // sets the digital pin 12 off = exhaust
}
else {
digitalWrite(13, LOW); // sets the digital pin 13 off
digitalWrite(12, HIGH); // sets the digital pin 12 on
}
lasthallstate = hallstate;
men den kan bara starta med kolven inom typ 6 - 50°

Re: Arduino kod fråga

Postat: 29 juni 2022, 21:18:20
av KristoferV
ajje skrev:Nej, % 1 kommer att göra så bara den ena fasen körs varje varv

Jag är inte tillräckligt mycket programmerare för att skriva om det där åt dig, särskilt inte nu när jag sitter med telefonen.

Någon annan här kanske kan förbarma sig :D
Jo fick det typ att funka, har bara konstaterat att ena outputen funkar med hjälp av led på arduino kortet. Ska koppla in allt strax och se hur det beter sig.

Re: Arduino kod fråga

Postat: 29 juni 2022, 21:35:03
av KristoferV
FormerMazda skrev:Koden är ju lite hårt skriven, så att ändra en variabel för att ändra 4takt till 2takt blir svårt.

Men dom har magnetpickup och vid varje trigger från den så mäter dom tiden mellan triggers.
Om tiden är större än eller lika med snittet av förra två tidsgapen så antas en tand räknad = avancera state och säg att vi vridit motorn 6°.
Sen har det byggts nån knepig grej med remainders av state och om graderna är inom vissa områden så sätts utgång 12 eller 13 hög eller låg.

Nästan enklare kan vara att du beskriver vad du vill att arduinon ska göra och vad den har för inputs.
Tror inte ett program behöver vara så svårsrkivet.
Ja det är en hemmabyggd "2takts" motor med styrda "freevalve" ventiler. Ventilerna öppnar på någon millisekund så behöver bara av/på signal från Arduino, inget krongel med kurvor.

Har en triggerskiva med magneter 42-2, alltså 42 tänder minus 2 som är missing tooth.
Från hall sensorn får jag en positiv signal


Takt 1 0-180 grader, ska gå att justera
Takt 2 180-360 grader, ska gå att justera

Sen har jag en extra funktion som behöver kunna kopplas in exempelvis 0-90 grader.

Det här med tidpunkter är inte hugget i sten, ska labbas en hel del, kan va så att jag behöver överlappa dem trots de snabba ventilerna.

Sen gör det inget om koden är hårt skriven, allt är bara för att kunna testa en teori. Finliret kan man fixa sen