Professor Balthazar Skrevet 17. oktober 2015 Del Skrevet 17. oktober 2015 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
andershf Skrevet 17. oktober 2015 Del Skrevet 17. oktober 2015 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
Professor Balthazar Skrevet 17. oktober 2015 Del Skrevet 17. oktober 2015 (endret) 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 17. oktober 2015 av Professor Balthazar Lenke til kommentar
andershf Skrevet 17. oktober 2015 Del Skrevet 17. oktober 2015 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
Professor Balthazar Skrevet 17. oktober 2015 Del Skrevet 17. oktober 2015 (endret) 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 storeunsigned 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 17. oktober 2015 av Professor Balthazar Lenke til kommentar
eiik Skrevet 18. oktober 2015 Del Skrevet 18. oktober 2015 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
Professor Balthazar Skrevet 18. oktober 2015 Del Skrevet 18. oktober 2015 (endret) 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 18. oktober 2015 av Professor Balthazar Lenke til kommentar
eiik Skrevet 18. oktober 2015 Del Skrevet 18. oktober 2015 (endret) 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 18. oktober 2015 av eiik Lenke til kommentar
Professor Balthazar Skrevet 18. oktober 2015 Del Skrevet 18. oktober 2015 (endret) Æ 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 20. oktober 2015 av Professor Balthazar Lenke til kommentar
eiik Skrevet 19. oktober 2015 Del Skrevet 19. oktober 2015 Æ 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
Professor Balthazar Skrevet 19. oktober 2015 Del Skrevet 19. oktober 2015 (endret) 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 20. oktober 2015 av Professor Balthazar Lenke til kommentar
eiik Skrevet 20. oktober 2015 Del Skrevet 20. oktober 2015 (endret) 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 20. oktober 2015 av eiik Lenke til kommentar
Professor Balthazar Skrevet 20. oktober 2015 Del Skrevet 20. oktober 2015 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
eiik Skrevet 20. oktober 2015 Del Skrevet 20. oktober 2015 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
Professor Balthazar Skrevet 21. oktober 2015 Del Skrevet 21. oktober 2015 (endret) 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 21. oktober 2015 av Professor Balthazar Lenke til kommentar
eiik Skrevet 22. oktober 2015 Del Skrevet 22. oktober 2015 (endret) 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 22. oktober 2015 av eiik Lenke til kommentar
Professor Balthazar Skrevet 31. oktober 2015 Del Skrevet 31. oktober 2015 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
eiik Skrevet 31. oktober 2015 Del Skrevet 31. oktober 2015 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
Professor Balthazar Skrevet 1. november 2015 Del Skrevet 1. november 2015 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
eiik Skrevet 2. november 2015 Del Skrevet 2. november 2015 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå