Gå til innhold

Den lille Arduino-tråden


Anbefalte innlegg

Mine Arduinokunnskaper er bredøvelige, så jeg ble ikke klok på funksjonen "frequency counter". Tenker å gjøre det så enkelt som mulig og har  nå lekt meg litt med dette sketchet som jeg trur vil kunne fungere for oppgaven. 

 

Verdi på "buttonStateS" blir høgere og høgere dess fortere hjulet spinner. Leser av verdiene  0,1,2,3,4 og 5 i "SerialMonitor". Men nå ønsker jeg at få Pinne3 til å gå HØG staks verdien "buttonStateS = 5" og forholde seg HØG helt til "buttonStateS < 5".

 

Kan noen modifisere sketchet slik at jeg får ut en terskelverdi på Pinne3 ?

 

(Planen er å bruke nivået ut på Pinne3 til å bestemme om jeg skal mate sykkelens elektronikk med den reelle hjulspinnefrekvensen eller med fast 2,9Hz fra en egenprodusert pulsgenerator).

 

**********************************'

 

// Reads a digital input on pin 2, prints the result to the serial monitor
// digital pin 2 has a reed sensor connected to 5V

int pushButton = 2;

void setup() {
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);
}

void loop() {
  // read the input pin:
  int buttonStateS = 0;
  int buttonState = digitalRead(pushButton);
  delay(50);
   int buttonState2 = digitalRead(pushButton);
   delay(50);
   int buttonState3 = digitalRead(pushButton);
   delay(50);
   int buttonState4 = digitalRead(pushButton);
   delay(50);
   int buttonState5 = digitalRead(pushButton);
   delay(50);
   buttonStateS = (buttonState)+(buttonState2)+(buttonState3)+(buttonState4)+(buttonState5);
  Serial.println (buttonStateS);
  delay(50);        
}

Lenke til kommentar
Videoannonse
Annonse

Mine Arduinokunnskaper er bredøvelige, så jeg ble ikke klok på funksjonen "frequency counter". Tenker å gjøre det så enkelt som mulig og har  nå lekt meg litt med dette sketchet som jeg trur vil kunne fungere for oppgaven. 

 

Verdi på "buttonStateS" blir høgere og høgere dess fortere hjulet spinner. Leser av verdiene  0,1,2,3,4 og 5 i "SerialMonitor". Men nå ønsker jeg at få Pinne3 til å gå HØG staks verdien "buttonStateS = 5" og forholde seg HØG helt til "buttonStateS < 5".

 

Kan noen modifisere sketchet slik at jeg får ut en terskelverdi på Pinne3 ?

 

(Planen er å bruke nivået ut på Pinne3 til å bestemme om jeg skal mate sykkelens elektronikk med den reelle hjulspinnefrekvensen eller med fast 2,9Hz fra en egenprodusert pulsgenerator).

 

 

**********************************'

 

// Reads a digital input on pin 2, prints the result to the serial monitor

// digital pin 2 has a reed sensor connected to 5V

int pushButton = 2;

 

void setup() {

  Serial.begin(9600);

  // make the pushbutton's pin an input:

  pinMode(pushButton, INPUT);

}

 

void loop() {

  // read the input pin:

  int buttonStateS = 0;

  int buttonState = digitalRead(pushButton);

  delay(50);

   int buttonState2 = digitalRead(pushButton);

   delay(50);

   int buttonState3 = digitalRead(pushButton);

   delay(50);

   int buttonState4 = digitalRead(pushButton);

   delay(50);

   int buttonState5 = digitalRead(pushButton);

   delay(50);

   buttonStateS = (buttonState)+(buttonState2)+(buttonState3)+(buttonState4)+(buttonState5);

  Serial.println (buttonStateS);

  delay(50);        

}

 

 

Noe sånn som dette? Hvis ButtonStateS har verdien 5 vil pin 3 være høy, hvis ikke vil den være lav.

 

 

 

// Reads a digital input on pin 2, prints the result to the serial monitor
// digital pin 2 has a reed sensor connected to 5V
int pushButton = 2;

int pin3 = 3;

void setup() {
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);

  pinMode(pin3, OUTPUT);
}

void loop() {
  // read the input pin:
  int buttonStateS = 0;
  int buttonState = digitalRead(pushButton);
  delay(50);
   int buttonState2 = digitalRead(pushButton);
   delay(50);
   int buttonState3 = digitalRead(pushButton);
   delay(50);
   int buttonState4 = digitalRead(pushButton);
   delay(50);
   int buttonState5 = digitalRead(pushButton);
   delay(50);
   buttonStateS = (buttonState)+(buttonState2)+(buttonState3)+(buttonState4)+(buttonState5);
  Serial.println (buttonStateS);
  delay(50);  

  if (buttonStateS == 5){
    digitalWrite(pin3, HIGH);
    }
  else{
    digitalWrite(pin3, LOW);
    }
} 

 

 

Lenke til kommentar

 

Yess!!!!, Testa den no å programmet fungerte akkurat som æ ønska det :-)

 

Tusen takk !!!

 

Men kan samme Arduino gjøre flere ting samtidig? Har nå en annen Arduino-krets som genererer en frekvens på 2,9Hz. Tanken er at når Pin3 er HØG, så skal det gå fast 2,9Hz ut til elektromagneten (på Pin6).

 

Dersom disse to programmene kan kjøre på samme Arduino så ønske æ en 3ms puls ut på Pin6 så snart buttomState = HØG (1), men dersom Pin3 også er HØG, så ønske æ at Pin6 skal gi ut eksakt det samme som Pin7 (altså 2,9Hz).

 

Dette er 2,9 Hz programmet:

// Disse tidene gir en visning på 23km/t på speedometeret.

// Sketsch for å trigge en elektromagnet som lurer Bosch sin Reed Speed detektor.

// the setup function runs once when you press reset or power the board

void setup() {

  // initialize digital pin 7 as an output.

   pinMode(7, OUTPUT);

}

 

void loop() {

  digitalWrite(7, HIGH);

  delay(3);              // wait for a second

  digitalWrite(7, LOW);

  delay(340);              // wait for a second

}

Endret av Professor Balthazar
Lenke til kommentar

Yess!!!!, Testa den no å programmet fungerte akkurat som æ ønska det :-)

 

Men kan en og samme Arduino gjøre flere ting samtidig? Har nå en egen krets som genererer en frekvens på 2,9Hz.

 

Dersom disse to programmene kan kjøre på samme Arduino så ønske æ en 3ms puls ut på Pin6 så snart buttomState = HØG (1), men dersom Pin3 også er HØG, så ønske æ at Pin6 skal gi ut eksakt det samme som Pin7 (altså 2,9Hz).

 

Dette er 2,9 Hz programmet:

// Disse tidene gir en visning på 23km/t på speedometeret.

// Sketsch for å trigge en elektromagnet som lurer Bosch sin Reed Speed detektor.

// the setup function runs once when you press reset or power the board

void setup() {

  // initialize digital pin 7 as an output.

   pinMode(7, OUTPUT);

}

 

void loop() {

  digitalWrite(7, HIGH);

  delay(3);              // wait for a second

  digitalWrite(7, LOW);

  delay(340);              // wait for a second

}

 

Ja, en Arduino kan gjøre mye på en gang. Problemet med å sette sammen disse to sketch'ene er at begge bruker "delay". Det setter hele sketch'en på pause og gjør at den siste koden (2,9Hz) ikke vil fungere. 

 

Ta en titt her for et alternativ til "delay" som ikke påvirker resten av koden: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Lenke til kommentar

Det var jammen en nyttig link. Nå har jeg laget en ny versjon av 2,9Hz generatoren som ikke noen noen delay-funksjon. Den er allerede testet og den klarte å lure kontrolleren til sykkelen like bra som versjon 1. En liten ulempe er at magneten nå holdes inne i 171ms mot bare 3ms tidligere (det viktige er at hele perioden blir på 342ms). Begge deler fungerer like fint, men denne versjonen vil nok trekke mer strøm fra batteriet. Vel, vel.. , men sketchene kan vel ikke slås sammen siden det andre sketchet fortsat bruker delay.

 

Men jeg trenger en funksjon til, en enkel funksjon, "puls inn, puls ut". Vet ikke hvor lang pulsen inn er, men dersom puls ut er på 3ms så passer det fint. "Puls inn, puls ut" programmet er det som skal være aktivt når farten er under 23km/t. Ved høgere fart så er det 2,9Hz programmet som skal gjelde.

 

Kan "puls inn, puls ut" intergreres i noen av disse to programmene? Jeg trur faktisk jeg klarer å leve med å bruke to prosessorer, men håper å slippe å bruke 3.

 

/* Dette er 2,9 Hz program versjon 2 (uten å bruke fonksjonen Delay):
 *  Disse tidene gir en visning på 23km/t på speedometeret.
 *  Sketsch for å trigge en elektromagnet som lurer Bosch sin Reed Speed detektor.
 *   http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */

// constants won't change. Used here to set a pin number :
const int ledPin =  7;      // the number of the LED pin

// Variables will change :
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change :
const long interval = 171 // 171 ms lav og 171ms høg Sum 342ms
;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the
  // difference between the current time and last time you blinked
  // the LED is bigger than the interval at which you want to
  // blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

Endret av Professor Balthazar
Lenke til kommentar

Du kan prøve denne koden.

 

 

 

/* Disse tidene gir en visning på 23km/t på speedometeret.
 *  Sketch for å trigge en elektromagnet som lurer Bosch sin Reed Speed detektor.
 * 
 */

const int magnetPin =  7;      // the number of the magnet pin
const long highInterval = 3;
const long lowInterval = 339; // 341 ms lav og 3 høg Sum 342ms

const int pushButton = 2;
const int outPin = 3;


int magnetState = LOW;             // magnetState used to set the magnet
unsigned long previousMillis = 0;        // will store last time magnet was updated

unsigned long previousButton = 0;

const int buttons = 5;
const int buttonInterval = 50;
int curButton = 1;
int buttonStateS = 0;

const int pulsePin = 8;
const int sensePin = 2;
volatile int signal = LOW;

void setup() {
	Serial.begin(9600);
	
	// set the digital pin as output:
	pinMode(magnetPin, OUTPUT);
	pinMode(outPin, OUTPUT);
  
	pinMode(pushButton, INPUT);
	
	pinMode(pulsePin, OUTPUT);
	attachInterrupt(sensePin, flipSignal, CHANGE);
}

void loop() {

	unsigned long currentMillis = millis();
  
	// begin constant pulse
	if (magnetState == HIGH && currentMillis - previousMillis >= highInterval) {
		// flip magnet state
		magnetState = LOW;
		// save the last time you changed the magnet
		previousMillis = currentMillis;
	}
	else if (magnetState == LOW && currentMillis - previousMillis >= lowInterval) {
		// flip magnet state
		magnetState = HIGH;
		// save the last time you changed the magnet
		previousMillis = currentMillis;
	}
	// set the magnet with the magnetState of the variable:
	digitalWrite(magnetPin, magnetState);
	// end constant pulse
	
	// begin button sensing
	if (curButton <= 5 && currentMillis - previousButton >= buttonInterval) {
		buttonStateS += digitalRead(pushButton);
		curButton += 1;
	}
	else if (curButton > 5) {
		buttonStateS = 0;
		curButton = 1;
	}
	
	Serial.println(buttonStateS);
	if (buttonStateS == 5) {
		digitalWrite(outPin, HIGH);
		noInterrupts();
	}
	else {
		digitalWrite(outPin, LOW);
		interrupts();
	}
	// end button sensing
	
	// begin write signal
	digitalWrite(pulsePin, signal);
	// end write signal
}

void flipSignal() {
	signal = !signal;
}

 

 

Lenke til kommentar

Yess, dåkker e pinade flink, det funka !! Programmet gir en simulert hastighet på 22,9km/t (på Bosch Active Line).

 

Da har jeg to ferdige sketch. Dette som gir ut en 3ms puls til elektromagneten med frekvens 2,9Hz uten å bruke delay-funksjonen og terskel-verdi sketchet som måler reell hastighet på hjulet og legger Pinne 3 HØG så lenge reell hastighet er over 23km/t. Jeg mangler "puls inn, puls ut" programmet for hastigheter under 23km/t (det skal gi ut en 3ms puls umiddelbart etter at det er detektert en puls på inngangen). Det mest elegante hadde nok vært om denne funksjonen ble integrert med sketchet for terskelverdi (siden det sketchet allerede lytter etter pulsene fra speed detektoren). 

 

Programmet for terskelverdi deteksjon ser nå slik ut (ja det bruker fortsatt en delay-funksjon):

(Hvordan lager dere egentlig en "Spoiler", jeg fikk det ikke til ?).

 

// Reads a digital input on pin 2, prints the result to the serial monitor
// digital pin 2 has a reed sensor connected to 5V
// if real speed exceeds 23 km/h then output at thresholdPin3 goes high.
int speedsensor = 2;

int thresholdPin3 = 3;

void setup() {
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(speedsensor, INPUT);

  pinMode(thresholdPin3, OUTPUT);
}

void loop() {
  // read the speedsensor pin:
  int buttonStateS = 0;  // S for sum
  int buttonState = digitalRead(speedsensor);
  delay(50);
   int buttonState2 = digitalRead(speedsensor);
   delay(50);
   int buttonState3 = digitalRead(speedsensor);
   delay(50);
   int buttonState4 = digitalRead(speedsensor);
   delay(50);
   int buttonState5 = digitalRead(speedsensor);
   delay(50);
   buttonStateS = (buttonState)+(buttonState2)+(buttonState3)+(buttonState4)+(buttonState5);
  Serial.println (buttonStateS);
  delay(50);  

  if (buttonStateS == 5){
    digitalWrite(thresholdPin3, HIGH);
    }
  else{
    digitalWrite(thresholdPin3, LOW);
    }
}

Endret av Professor Balthazar
Lenke til kommentar

Spoiler lager du med [ spoiler] Innhold [ /spoiler], uten mellomrom mellom hakeparantesene og spoiler. Hvilke pinner er det du skal bruke som input, og hvilke som output?

 

I koden min la jeg til slik at du kan "speile" input på en pin til en annen, som da kan brukes når farten er under 23 km/t.

 

Du kan prøve sketchen min nå, endret på noen få ting.

 

 

 

/* Dette er 2,9 Hz program versjon 2 (uten å bruke fonksjonen Delay):
 *  Disse tidene gir en visning på 23km/t på speedometeret.
 *  Sketsch for å trigge en elektromagnet som lurer Bosch sin Reed Speed detektor.
 *   http://www.arduino.c...inkWithoutDelay
 */

const int magnetPin =  7;      // the number of the magnet pin
const long highInterval = 3;
const long lowInterval = 339; // 341 ms lav og 3 høg Sum 342ms

const int pushButton = 2;
const int outPin = 3;


int magnetState = LOW;             // magnetState used to set the magnet
unsigned long previousMillis = 0;        // will store last time magnet was updated

unsigned long previousButton = 0;

const int buttons = 5;
const int buttonInterval = 50;
int curButton = 1;
int buttonStateS = 0;

const int pulsePin = magnetPin;
const int sensePin = 2;
volatile int signal = LOW;

void setup() {
	Serial.begin(9600);
	
	// set the digital pin as output:
	pinMode(magnetPin, OUTPUT);
	pinMode(outPin, OUTPUT);
  
	pinMode(pushButton, INPUT);
	
	pinMode(pulsePin, OUTPUT);
	attachInterrupt(sensePin, flipSignal, CHANGE);
}

void loop() {

	unsigned long currentMillis = millis();
  
	// begin constant pulse
	if (magnetState == HIGH && currentMillis - previousMillis >= highInterval) {
		// flip magnet state
		magnetState = LOW;
		// save the last time you changed the magnet
		previousMillis = currentMillis;
	}
	else if (magnetState == LOW && currentMillis - previousMillis >= lowInterval) {
		// flip magnet state
		magnetState = HIGH;
		// save the last time you changed the magnet
		previousMillis = currentMillis;
	}
	// set the magnet with the magnetState of the variable:
	digitalWrite(magnetPin, magnetState);
	// end constant pulse
	
	// begin button sensing
	if (curButton <= 5 && currentMillis - previousButton >= buttonInterval) {
		buttonStateS += digitalRead(pushButton);
		curButton += 1;
	}
	else if (curButton > 5) {
		buttonStateS = 0;
		curButton = 1;
	}
	
	Serial.println(buttonStateS);
	if (curbutton == 6 && buttonStateS == 5) {
		digitalWrite(outPin, HIGH);
		noInterrupts();
	}
	else if (curButton == 6){
		digitalWrite(outPin, LOW);
		interrupts();
	}
	// end button sensing
	
	// begin write signal
	digitalWrite(pulsePin, signal);
	// end write signal
}

void flipSignal() {
	signal = !signal;
}

 

 

Endret av eiik
Lenke til kommentar

Æ e søkkimponert.

 

Nå har jeg testet "eiik"'s siste sketch med å koble en NO Reedkontakt2 mellom +5V og Pin2 og har plassert Reedkontakt2 slik at den mottar en sluttning hver gang magneten som sitter fast på hjulet passerer (en inngangspuls per runde på hjulet).

 

Så har jeg hengt en utgangstransistor på utgangs-Pin7 og lar denne styre en elektromagnet. Elektromagneten er teipet fast til den originale Speeddetektoren fra Bosch. Speedometeret viser nå 23km/t. 

 

Dersom jeg flytter elektromagneten over fra Pin7 til Pin3 så viser speedometeret reell fart.

 

På Pin8 fikk jeg ikke ut noe som helst. Skulle jeg få det? (klarte bare å snurre hjulet opp mot 38km/t).

 

Så kommer stjernespørsmålet. Er det mulig å mate elektromagneten med signaler fra Pin3 så lenge reell fart er under 23km/t og å mate elektromagneten fra Pin7 dersom reell fart er over 23km/t ?

 

(PS: Dersom dette er helt umulig å få til i samme sketch så kan jeg bruke to Arduinokort og et rele for å få switchet mellom de to utgangene avhengig av reell fart).

Endret av Professor Balthazar
Lenke til kommentar

Æ e søkkimponert.

 

Nå har jeg testet "eiik"'s siste sketch med å koble en NO Reedkontakt3 mellom +5V og Pin3 og har plassert Reedkontakt3 slik at den mottar en sluttning hver gang magneten som sitter fast på hjulet passerer (en inngangspuls per runde på hjulet).

 

Så har jeg hengt en utgangstransistor på utgangs-Pin7 og lar denne styre en elektromagnet. Elektromagneten er teipet fast til den originale Speeddetektoren fra Bosch. Speedometeret viser nå 23km/t. 

 

Dersom jeg flytter elektromagneten over fra Pin7 til Pin3 så viser speedometeret reell fart.

 

På Pin8 fikk jeg ikke ut noe som helst. Skulle jeg få det? (klarte bare å snurre hjulet opp mot 38km/t).

 

Så kommer stjernespørsmålet. Er det mulig å mate elektromagneten med signaler fra Pin3 så lenge reell fart er under 23km/t og å mate elektromagneten fra Pin7 dersom reell fart er over 23km/t ?

 

(PS: Dersom dette er helt umulig å få til i samme sketch så kan jeg bruke to Arduinokort og et rele for å få switchet mellom de to utgangene avhengig av reell fart).

 

Så det du ønsker er:

Outputte fast frekvens (2.9 Hz) på pin 7 dersom farten er over 23 km/t, og hvis ikke skal pin 7 speile signalet som kommer inn fra fartssensoren på hjulet? Hvilken pin er denne sensoren koblet til, og hvordan ser signalet ut?

Lenke til kommentar

Så det du ønsker er:

Outputte fast frekvens (2.9 Hz) på pin 7 dersom farten er over 23 km/t, og hvis ikke skal pin 7 speile signalet som kommer inn fra fartssensoren på hjulet? Hvilken pin er denne sensoren koblet til, og hvordan ser signalet ut?

 

 

Sorry, jeg gikk litt i ball. Rettet tekst:

På sykkelramma henger det en "NO Reedkontakt2" mellom +5V og Pin2. Signalet inn på Pin2 henger løst (er LAV) helt til magneten på hjulet passerer sensoren. Da legger NO kontakten inn forbindelse i 2-5ms og Pin2 dras opp til +5V (HØG) i 2-5ms.

 

Alternativ: Dersom det blir veldig vanskelig å få til en hastighetsstyrt switching av ugangen i fra reell fart pulser på Pin3 og fast 23km/t pulser på Pin7 så kan jeg styre denne switchingen enten fra en annen Arduino, eller fra en manuell bryter. Da kan det være kjekt om pulsene som skal sendes ut til elektromagneten sendes ut på en fast port (Pin6) og at vi lager en inngangsport (Pin4) og legger inn i sketchet at Pin6 skal følge Pin3 så lenge Pin4 ligger LAV. Når Pin4 går HØG (enten vstyrt av annen Arduino eller en ekstern bryter på styret), så skal Pin6 følge Pin7.

Endret av Professor Balthazar
Lenke til kommentar

 

Så det du ønsker er:

Outputte fast frekvens (2.9 Hz) på pin 7 dersom farten er over 23 km/t, og hvis ikke skal pin 7 speile signalet som kommer inn fra fartssensoren på hjulet? Hvilken pin er denne sensoren koblet til, og hvordan ser signalet ut?

 

 

Sorry, jeg gikk litt i ball. Rettet tekst:

På sykkelramma henger det en "NO Reedkontakt2" mellom +5V og Pin2. Signalet inn på Pin2 henger løst (er LAV) helt til magneten på hjulet passerer sensoren. Da legger NO kontakten inn forbindelse i 2-5ms og Pin2 dras opp til +5V (HØG) i 2-5ms.

 

Alternativ: Dersom det blir veldig vanskelig å få til en hastighetsstyrt switching av ugangen i fra reell fart pulser på Pin3 og fast 23km/t pulser på Pin7 så kan jeg styre denne switchingen enten fra en annen Arduino, eller fra en manuell bryter. Da kan det være kjekt om pulsene som skal sendes ut til elektromagneten sendes ut på en fast port (Pin6) og at vi lager en inngangsport (Pin4) og legger inn i sketchet at Pin6 skal følge Pin3 så lenge Pin4 ligger LAV. Når Pin4 går HØG (enten vstyrt av annen Arduino eller en ekstern bryter på styret), så skal Pin6 følge Pin7.

 

 

En mulighet er å måle hvor lang tid det går mellom hver gang pin2 går HIGH, og så regne ut farten basert på dekkets radius og tid mellom to passeringer på magneten. Hvis denne kalkulerte farten er under 23km/t kan signalet fra pin2 speiles ut på pin7. Dersom farten er over kan den generere fast frekvens ut på pin7.

 

Du kan prøve denne sketchen, men du må måle radiusen til hjulet og sette r lik radiusen (i meter).

 

 

 

int magnetPin = 7;
int sensePin = 2;

long highInterval = 3;
long lowInterval = 339;
unsigned long prevFlip = 0;

volatile int magnetState = LOW;

volatile long prevPassing = 0;
volatile int speed = 0;

const float r = 0; // radius in meters

void setup() {
	pinMode(magnetPin, OUTPUT); // the pin connected to the electromagnet
	pinMode(sensePin, INPUT); // the pin connected to the wheel sensor
	
	Serial.begin(9600);
	
	attachInterrupt(sensePin, passed, CHANGE);
}


void loop() {
	
	unsigned long currentMillis = millis();
	
	if (speed > 23 && magnetState == HIGH && currentMillis - prevFlip >= highInterval) {
		magnetState = LOW;
		prevFlip = currentMillis;
	}
	else if (speed > 23 && magnetState == LOW && currentMillis - prevFlip >= lowInterval) {
		magnetState = HIGH;
		prevFlip = currentMillis;
	}
	
	Serial.println(speed);
	
	digitalWrite(magnetPin, magnetState);
}

void passed() {
	long curMillis = millis();
	long timePassed = curMillis - prevPassing;
	if (timePassed > 50) {
		speed = ((3.14 * 2 * r) / (timePassed/(60*60))); // calculate speed
	}
	if (speed < 23) {
		magnetState = !magnetState;
	}
	prevPassing = curMillis;
}

 

 

Endret av eiik
Lenke til kommentar

 

 

Så det du ønsker er:

Outputte fast frekvens (2.9 Hz) på pin 7 dersom farten er over 23 km/t, og hvis ikke skal pin 7 speile signalet som kommer inn fra fartssensoren på hjulet? Hvilken pin er denne sensoren koblet til, og hvordan ser signalet ut?

 

 

Sorry, jeg gikk litt i ball. Rettet tekst:

På sykkelramma henger det en "NO Reedkontakt2" mellom +5V og Pin2. Signalet inn på Pin2 henger løst (er LAV) helt til magneten på hjulet passerer sensoren. Da legger NO kontakten inn forbindelse i 2-5ms og Pin2 dras opp til +5V (HØG) i 2-5ms.

 

Alternativ: Dersom det blir veldig vanskelig å få til en hastighetsstyrt switching av ugangen i fra reell fart pulser på Pin3 og fast 23km/t pulser på Pin7 så kan jeg styre denne switchingen enten fra en annen Arduino, eller fra en manuell bryter. Da kan det være kjekt om pulsene som skal sendes ut til elektromagneten sendes ut på en fast port (Pin6) og at vi lager en inngangsport (Pin4) og legger inn i sketchet at Pin6 skal følge Pin3 så lenge Pin4 ligger LAV. Når Pin4 går HØG (enten vstyrt av annen Arduino eller en ekstern bryter på styret), så skal Pin6 følge Pin7.

 

 

En mulighet er å måle hvor lang tid det går mellom hver gang pin2 går HIGH, og så regne ut farten basert på dekkets radius og tid mellom to passeringer på magneten. Hvis denne kalkulerte farten er under 23km/t kan signalet fra pin2 speiles ut på pin7. Dersom farten er over kan den generere fast frekvens ut på pin7.

 

Du kan prøve denne sketchen, men du må måle radiusen til hjulet og sette r lik radiusen (i meter).

 

 

 

int magnetPin = 7;
int sensePin = 2;

long highInterval = 3;
long lowInterval = 339;
unsigned long prevFlip = 0;

volatile int magnetState = LOW;

volatile long prevPassing = 0;
volatile int speed = 0;

const float r = 0; // radius in meters

void setup() {
	pinMode(magnetPin, OUTPUT); // the pin connected to the electromagnet
	pinMode(sensePin, INPUT); // the pin connected to the wheel sensor
	
	Serial.begin(9600);
	
	attachInterrupt(sensePin, passed, CHANGE);
}


void loop() {
	
	unsigned long currentMillis = millis();
	
	if (speed > 23 && magnetState == HIGH && currentMillis - prevFlip >= highInterval) {
		magnetState = LOW;
		prevFlip = currentMillis;
	}
	else if (speed > 23 && magnetState == LOW && currentMillis - prevFlip >= lowInterval) {
		magnetState = HIGH;
		prevFlip = currentMillis;
	}
	
	Serial.println(speed);
	
	digitalWrite(magnetPin, magnetState);
}

void passed() {
	long curMillis = millis();
	long timePassed = curMillis - prevPassing;
	if (timePassed > 50) {
		speed = ((3.14 * 2 * r) / (timePassed/(60*60))); // calculate speed
	}
	if (speed < 23) {
		magnetState = !magnetState;
	}
	prevPassing = curMillis;
}

 

 

 

 

Tusen takk for at du gidder! Dette fungerte ikke. Pin7 ble liggende konstant LAV uansett om farten inn var under eller over 23km/t. (Testet også med å trigge Pin2 ned mot GND). Heller ikke ved monitorering av serial-porten fikk jeg ut noe annet enn bare null.

 

Satte inn r=0.33 (33cm).

Lenke til kommentar

 

 

Tusen takk for at du gidder! Dette fungerte ikke. Pin7 ble liggende konstant LAV uansett om farten inn var under eller over 23km/t. (Testet også med å trigge Pin2 ned mot GND). Heller ikke ved monitorering av serial-porten fikk jeg ut noe annet enn bare null.

 

Satte inn r=0.33 (33cm).

 

 

Fant ut at nummreringen av interrupts ikke går på pin-nummer, man må bruke en ekstra funksjon rundt pin-nummeret. Det var derfor det ikke ble noe respons hos deg. Så lærte jeg også nå at man må tvinge frem flyttall-divisjon. Men nå fungerer i hvert fall koden sånn noenlunde på den lille kretsen jeg satt opp selv.

 

 

 

int magnetPin = 7;
int sensePin = 2;

long highInterval = 3;
long lowInterval = 339;
unsigned long prevFlip = 0;

volatile int magnetState = LOW;

volatile long prevPassing = 0;
volatile long timePassed = 0;
volatile float speed = 0;

const float r = 0.33; // radius in meters

void setup() {
  pinMode(magnetPin, OUTPUT); // the pin connected to the electromagnet
  //pinMode(sensePin, INPUT); // the pin connected to the wheel sensor
  
  Serial.begin(9600);
  
  attachInterrupt(digitalPinToInterrupt(sensePin), passed, CHANGE);
}


void loop() {
  
  unsigned long currentMillis = millis();
  
  if (speed > 23 && magnetState == HIGH && currentMillis - prevFlip >= highInterval) {
    magnetState = LOW;
    prevFlip = currentMillis;
  }
  else if (speed > 23 && magnetState == LOW && currentMillis - prevFlip >= lowInterval) {
    magnetState = HIGH;
    prevFlip = currentMillis;
  }
  Serial.println(speed);
  
  digitalWrite(magnetPin, magnetState);
}

void passed() {
  long curMillis = millis();
  timePassed = curMillis - prevPassing;
  if (timePassed >= 100) {
    speed = ((3.14 * 2 * r) / ((float)timePassed/(60.0*60.0))); // calculate speed
  }
  if (speed < 23) {
   magnetState = !magnetState;
  }
  prevPassing = curMillis;
}

 

 

Lenke til kommentar

Hei. Har hatt lite tid til å teste, men en liten test med trykknapp og lysdiode virket lite lovende. Kretsen kunne switche over til 2,9Hz ganske fort (og ganske vilkårlig). Noen gang etter bare en puls. Da fortsatte den også med 2,9Hz en stund før den oppdaget at pulsene inn hadde stoppet opp. Andre gang så ble utgangen liggende konstant høg. 

 

Skal teste på sykkelen, men er ganske skeptisk.

Endret av Professor Balthazar
Lenke til kommentar

Du kan eventuelt prøve å modifisere http://m.instructables.com/id/Arduino-Bike-Speedometer/Slik at en arduino kan sende farten til en annen arduino. Den andre kan så styre et rele for å sende signalet fra sensoren på hjulet eller generere en fast puls (2,9Hz) til elektromagneten.

Jeg tror problemet med sketchen min er bouncing, og at den derfor kan oppføre seg rart, i alle fall med en trykknapp.

 

Edit:

Har eksperimentert litt med sketchen nå, og den fungerer tålig bra med en knapp på breadboard tror jeg. Men det er vanskelig å si om den fungerer ordentlig når jeg ikke har en sykkel å teste med. Den ligger her

Endret av eiik
Lenke til kommentar
  • 2 uker senere...

Hei. Beklager at det har tatt så lang tid for meg å få testet dette. Det skyldes at jeg nå har flyttet hele riggen over til sykkelen og da trengte jeg noen flere deler som måtte bestilles.

 

Jeg har testet ditt sketch fra 22.oktober og det fra 20.oktober, men ingen av dem gir noe som helst ut på utgangen (magneten). Jeg klarer ikke å forstå disse sketchene, men har en mistanke om at det kan være noe med lesingen av inngangen å gjøre. Kan du bekrefte at programmet er tilpasset en NO (normalt åpen) speedsensor som henger mellom pinne 2 og 5Volt (uten 10KOhm pull-down ned mot GND)?

 

Nå som alt er flyttet over til sykkelen så blir det litt mer pæs med å gjøre omkoblinger av selve kretsen, men dersom jeg må bygge om på inngangstrinnet så gjør jeg selvfølgelig det.

 

Dette har jeg også fått testet:

1) Jeg har testet selve speedsensoren med å henge et Ohm-meter rett på sensoren samtidig som jeg snurrer hjulet. I tillegg til utslag på instrumentet, så hører jeg faktisk at sensoren legger sammen kontaktsettet når magneten passerer.

 

2) Jeg har fått testet driverkretsen og magnetutgangen på pinne 7 (med et annet sketsh som gir ut 2,9Hz pulser / 23km/t simulering). Denne testen var ekstremt fornøyelig å gjennomføre. Jeg tipper sykkelen kom opp i ca. 35km/t uten nevneverdige anstrengelser. Motoren ga meg akkurat passe mye hjelp og det hele virket veldig stabilt. Forsøkte å slå av elektronikken under fart, og da ble det merkbart mye tyngre å klare å holde samme fart.

 

Håper du orker å hjelpe meg litt til, slik vi kommer i mål med dette prosjektet :-)

Lenke til kommentar

Hei. Beklager at det har tatt så lang tid for meg å få testet dette. Det skyldes at jeg nå har flyttet hele riggen over til sykkelen og da trengte jeg noen flere deler som måtte bestilles.

 

Jeg har testet ditt sketch fra 22.oktober og det fra 20.oktober, men ingen av dem gir noe som helst ut på utgangen (magneten). Jeg klarer ikke å forstå disse sketchene, men har en mistanke om at det kan være noe med lesingen av inngangen å gjøre. Kan du bekrefte at programmet er tilpasset en NO (normalt åpen) speedsensor som henger mellom pinne 2 og 5Volt (uten 10KOhm pull-down ned mot GND)?

 

Nå som alt er flyttet over til sykkelen så blir det litt mer pæs med å gjøre omkoblinger av selve kretsen, men dersom jeg må bygge om på inngangstrinnet så gjør jeg selvfølgelig det.

 

Dette har jeg også fått testet:

1) Jeg har testet selve speedsensoren med å henge et Ohm-meter rett på sensoren samtidig som jeg snurrer hjulet. I tillegg til utslag på instrumentet, så hører jeg faktisk at sensoren legger sammen kontaktsettet når magneten passerer.

 

2) Jeg har fått testet driverkretsen og magnetutgangen på pinne 7 (med et annet sketsh som gir ut 2,9Hz pulser / 23km/t simulering). Denne testen var ekstremt fornøyelig å gjennomføre. Jeg tipper sykkelen kom opp i ca. 35km/t uten nevneverdige anstrengelser. Motoren ga meg akkurat passe mye hjelp og det hele virket veldig stabilt. Forsøkte å slå av elektronikken under fart, og da ble det merkbart mye tyngre å klare å holde samme fart.

 

Håper du orker å hjelpe meg litt til, slik vi kommer i mål med dette prosjektet :-)

 

Når jeg har testet har jeg brukt en NO trykknapp, med en pull-down resistor på 30 kOhm. Da får jeg ut 5 V på in 7. Dette er sketchen fra 22. oktober. Jeg prøvde nå å lage kretsen i et simuleringsprogram, og den ser ut til å fungere der (med trykknapp). Se https://123d.circuits.io/circuits/1178488-the-unnamed-circuit/edit

Lenke til kommentar

Hei igjen. Nå er jeg hoppende glad, det fungerte! En liten 22K pull-down resistor på Pin2 var alt som manglet :-)

 

Det regner smådjevler så jeg hærtes bare å sykle en kort testtur på 3km.

 

Fra 0 - 23 km/t oppførte sykkelen seg helt normalt. Dersom jeg akselrerte maks så klarte jeg å se 27-28km/t på speedometeret før Arduinoen grep inn og klokket ned vist fart til 23km/t (trur ikke sykkelen rakk å koble ut motorhjelpen på dette lille sekundet). Sykkelen bare økte på. Helt hærlig. Tipper jeg var oppe i rundt 35km/t på slett vei og motoren hjalp meg litt hele tiden.

 

Dersom jeg bremset opp ganske brått så viste speedometeret fortsatt 23km/t i rundt 3-4 sekund før jeg fikk opp reell fart på speedometeret igjen. Det gjør ikke noe.

 

Tusen takk for hjelpen!!!

Lenke til kommentar

Hei igjen. Nå er jeg hoppende glad, det fungerte! En liten 22K pull-down resistor på Pin2 var alt som manglet :-)

 

Det regner smådjevler så jeg hærtes bare å sykle en kort testtur på 3km.

 

Fra 0 - 23 km/t oppførte sykkelen seg helt normalt. Dersom jeg akselrerte maks så klarte jeg å se 27-28km/t på speedometeret før Arduinoen grep inn og klokket ned vist fart til 23km/t (trur ikke sykkelen rakk å koble ut motorhjelpen på dette lille sekundet). Sykkelen bare økte på. Helt hærlig. Tipper jeg var oppe i rundt 35km/t på slett vei og motoren hjalp meg litt hele tiden.

 

Dersom jeg bremset opp ganske brått så viste speedometeret fortsatt 23km/t i rundt 3-4 sekund før jeg fikk opp reell fart på speedometeret igjen. Det gjør ikke noe.

 

Tusen takk for hjelpen!!!

 

Så bra. Bare hyggelig å kunne hjelpe.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...