reedsensor op rpm laten schakelen

Arduino specifieke Software
Berichten: 24
Geregistreerd: 07 Apr 2013, 17:57

reedsensor op rpm laten schakelen

Berichtdoor moegibike » 04 Mei 2013, 16:27

kheb met een reedsensor en met onderstaande prog een rpm pulse gecreeerd voor het automatisch schakelen van mijn ebike project .deze leest hem nu uit op een lcd scherm . wat ik nu wil .....
complete lcd reading weglaten , alleen seriale monitor van arduino ide laten lezen .
kheb in mijn sketch voor het schakelen , max eind positie , max begin positie , en bij pushbutton up ore down telkens elke keer een waarde laten schakelen [ 10 ] .
dit noem ik de handbediening , nu wil ik via de reedsensor en rpm de schakeling van de servo automatisch laten gaan op waardes van de rpm . dus automatisch schakelen op rpm via de sensor .en met een eindwaarde en ingestelde tijd de schakeling terug laten zetten in de gewenste positie . dus bij stilstand [ingestelde waarde 4 sec ] terug laten schakelen [naar ingestelde positie bv versnelling 2-waarde 100 bv ? ]
aangezien ik net begin met arduino en programeren ben ik tot nu toe al aardig ver gekomen mede dankzij hulp van forumleden [ dank u hiervoor ] maar zit nu even te kijken hoe dit moet en heel eerlijk gezegd niet veel gevonden op forums om dit te doen , weet iemand hier iets van ? kan iemand mij verder helpen ? wil er ook nog een functie bij met een pushbutton om te selecteren van hand of auto schakelen . kheb van een gerenomeerd fiets fabrikant al interesse voor productie , speciaal voor gehandicapte mensen willen we dit eigenlijk ontwikkelen die moeite hebben met gripshift draaien of schakelhevels bedienen. wat begon als een leuk project voor een gehandicapte kennis word nu opeens in de versnelling gezet , om toch eens echt te kijken voor productie . maar zit steeds nog met dat ik te weinig kennis van programeren heb . weet precies hoe en wat maar programeren kom ik nog niet uit vanwege te weinig ervaring en kennis . zoek iemand die bereid is met dit project even te willen meewerken met programeren en mij een volledige skecth kan maken voor het geheel . tegen eventueel het eerste prototype?
de sketch
#include <Servo.h>
#include <EEPROM.h>
#include <util/delay.h>

Servo myservo;

/* CHANGE ME */
// Servo limit - These number will change depending on how you installed your servo
// Set MANUAL_MODE = 1, connect a potentiometer to pin 3 and open the serial monitor
// Move to the lowest and highest gear to set these variables
int SERVO_STOP_LOW = 200;
int SERVO_STOP_HIGH = 50;

#define MANUAL_MODE 1

// variable to read the value from the analog pin
int val;
int potpin = 3;
int servo_power_pin = 6;
int led_pin = 10;

// Current servo position
int currentPos = 100;
int currentPosAddr = 0;

// Number of positions to move when a button is pused
int servo_step_size = 10;

// Flag set in the interrupt to signal a gear change
bool pendingShift = true;

void setup()
{
pinMode(servo_power_pin, OUTPUT);
pinMode(led_pin, OUTPUT);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);

digitalWrite(servo_power_pin, LOW);

attachInterrupt(0, shiftUp, FALLING);
attachInterrupt(1, shiftDown, FALLING);

// Remember last position
currentPos = EEPROM.read(currentPosAddr);
}

void shiftUp()
{
if ( pendingShift == true ) return;

// wait for button to stop bouncing
delay(150);

currentPos -= servo_step_size;
if ( currentPos < SERVO_STOP_HIGH)
currentPos = SERVO_STOP_HIGH;

pendingShift = true;

//Serial.println("Shift up ");
//Serial.println(currentPos);
}

void shiftDown()
{
if ( pendingShift == true ) return;

// wait for button to stop bouncing
delay(150);

currentPos += servo_step_size;
if ( currentPos > SERVO_STOP_LOW)
currentPos = SERVO_STOP_LOW;

pendingShift = true;

//Serial.println("Shift down ");
//Serial.println(currentPos);
}

void loop()
{
#if MANUAL_MODE

if ( pendingShift )
{
//Serial.println("ON");
digitalWrite(led_pin, HIGH);
digitalWrite(servo_power_pin, HIGH);
//_delay_ms(15);

myservo.write(currentPos);

// Save last know position
EEPROM.write(currentPosAddr, currentPos);

// wait for servo to finish
_delay_ms(200);

Serial.println(currentPos);
digitalWrite(led_pin, LOW);
digitalWrite(servo_power_pin, LOW);

pendingShift = false;
}
#else

// This code controls the servo with a POT
// To use it change MANUAL_MODE 1

digitalWrite(servo_power_pin, HIGH);
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
Serial.println(val);
delay(15); // waits for the servo to get there
#endif

}



de sketch voor reedsensor , rpm and lcd;


//arduino bike speedometer w serial.print()


//calculations
//tire radius ~ 13.5 inches
//circumference = pi*2*r =~85 inches
//max speed of 35mph =~ 616inches/second
//max rps =~7.25

#define reed A0//pin connected to read switch

//storage variables
int reedVal;
long timer;// time between one full rotation (in ms)
float mph;
float radius = 13.5;// tire radius (in inches)
float circumference;

int maxReedCounter = 100;//min time (in ms) of one rotation (for debouncing)
int reedCounter;


void setup(){

reedCounter = maxReedCounter;
circumference = 2*3.14*radius;
pinMode(reed, INPUT);

// TIMER SETUP- the timer interrupt allows precise timed measurements of the reed switch

cli();//stop interrupts

//set timer1 interrupt at 1kHz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;
// set timer count for 1khz increments
OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8) - 1
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);

sei();//allow interrupts
//END TIMER SETUP

Serial.begin(9600);
}


ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz to measure reed switch
reedVal = digitalRead(reed);//get val of A0
if (reedVal){//if reed switch is closed
if (reedCounter == 0){//min time between pulses has passed
mph = (56.8*float(circumference))/float(timer);//calculate miles per hour
timer = 0;//reset timer
reedCounter = maxReedCounter;//reset reedCounter
}
else{
if (reedCounter > 0){//don't let reedCounter go negative
reedCounter -= 1;//decrement reedCounter
}
}
}
else{//if reed switch is open
if (reedCounter > 0){//don't let reedCounter go negative
reedCounter -= 1;//decrement reedCounter
}
}
if (timer > 2000){
mph = 0;//if no new pulses from reed switch- tire is still, set mph to 0
}
else{
timer += 1;//increment timer
}
}

void displayMPH(){
Serial.println(mph);
}

void loop(){
//print mph once a second
displayMPH();
delay(1000);
}


Advertisement

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: reedsensor op rpm laten schakelen

Berichtdoor walker » 05 Mei 2013, 09:15

Ik wil je wel helpen om het programma te schrijven.

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: reedsensor op rpm laten schakelen

Berichtdoor astrofrostbyte » 05 Mei 2013, 09:59

Als het OpenSource is ;) zal ik ook wel helpen.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 24
Geregistreerd: 07 Apr 2013, 17:57

Re: reedsensor op rpm laten schakelen

Berichtdoor moegibike » 05 Mei 2013, 11:12

dank u alvast voor uw bereidheid, ik zal even al mijn sketch,es bij elkaar zoeken voor de eshift en pb doormailen en text en uitleg van wat de de bedoeling is .

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Bing [Bot] en 25 gasten