e-bike auto shifting

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

e-bike auto shifting

Berichtdoor moegibike » 15 Apr 2013, 14:11

ben met arduino bezig om voor m,n 2 kw e-bike autoshifting systeem te maken . ben al zo ver dat shifting al lukt met 2 buttons up- down shifting ,en met een potmeter kan ik de minimaal en maximale uitslagen instellen .dit gebeurd met een servo .
probleem 1 - wil een instelling maken voor auto off na .... sec. om de batterij te sparen .[slaapmodus ]
probleem 2 - wil graag een sensor toevoegen aan het geheel die rpm/ magneet sensor meet en met diverse gewenste rpm meetinstellingen automatisch dan schakeld .
dus een manuel stand voor handmatig up and down schakelen en een auto stand , zodat die op rpm/magneetsensor zelf schakeld .
welke sensor kan ik hiervoor het beste gebruiken voor arduino ?
hoe deze extra toe te voegen in mijn sketch ? [ zoek dus een voorbeeld sketch omdat ikzelf er eerlijk gezegd net mee bezig ben en nog niet volledig hiermee overweg kan ]

de bike heeft al een interne sensor [ pedelec ] kan ik die hiervoor ook gebruiken ?
het is een 2 kw e-bike met metalen versnellingsbak [mini ] gates snaar aandrijving.
mijn sketch tot nu toe.[internet ]
#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 = 179;
int SERVO_STOP_HIGH = 90;

#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(50);

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(50);

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

}


voor de toekomst wil ik het geheel nog meer uitbreiden [ display ,lichtsensor , tiltsensor ,speaker , gyro sensor ] maar kan niet alles tegelijk , kom net kijken met arduino , eerder wel veel macros gemaakt voor cnc machines ,en veel hobby cnc machines gebouwd .

Advertisement

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

Re: e-bike auto shifting

Berichtdoor astrofrostbyte » 16 Apr 2013, 19:52

Vraag 1: Sleep mode is geen probleem
Vraag 2: Arduino kan best veel soorten sensoren uitlezen, dus ik denk dat je eerst een sensor moet kiezen die goed bij je fiets past, robuust/weerbestendig enzo.

basis blokken voor sleep functionaliteit
Code: Alles selecteren
#include <avr/sleep.h>

void GoToSleep()
{ set_sleep_mode(SLEEP_MODE_PWR_DOWN);   //
  sleep_enable();
  attachInterrupt(0,wakeUpNow, CHANGE);
  sleep_mode();                                        // uC actually put to sleep!!
  sleep_disable();                                     // 1st thing after wakeup from sleep
  detachInterrupt(0);
}//GoToSleep

void wakeUpNow()                             // here the interrupt is handled after wakeup
{ }


void loop()
{

  if ( OneSecondCountDown() == false )                   // nothing's happening , go to sleep.
  { digitalWrite(LED, LOW);
    GoToSleep();
    digitalWrite(LED, HIGH);   
    timeout = 30;
  }

}
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

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

Re: e-bike auto shifting

Berichtdoor moegibike » 17 Apr 2013, 17:09

bedankt alvast voor je replay en natuurlijk de sketch , weer een stap verder , nog een hele weg te gaan maar langzamerhand komt het wel . mn vorige servo was voor derailleur besturing , aangekoppeld aan de derailleur kabel en bevestigd in/aan het orginele kabeldoorlaatoog van de fiets , handig en snelle montage . servohuis 3D geprint met de overbrenging er al in geprint en kabel bevesteging , alleen servo erin monteren en klaar .de nieuwe gearbox met 2kw motor word 1 geheel .
is het mogelijk de pedelec sensor te gebruiken [ magneetsensor ]voor auto shifting op rpm . magneet pulsen tellen , deze verdelen in 6 selecties met aangegeven pulseenheid ?

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

Re: e-bike auto shifting

Berichtdoor astrofrostbyte » 17 Apr 2013, 19:06

De pedelec sensor ken ik niet , je zal even naar een datasheet moeten verwijzen.
Als er pulsen uit komen zal dat geen probleem zijn voor de arduino, op de 'achtergrond' kan de software deze uitlezen en vertalen naar iets bruikbaars zoals bv rpm's , je kan nog een lopend gemiddelde toevoegen om het geheel wat rustiger te laten reageren.
En met een state-machine kan je het gedrag goed beschrijven en coderen.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

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

Re: e-bike auto shifting

Berichtdoor moegibike » 17 Apr 2013, 21:13

pedelec is een puls sensor , meestal 3 draden aansluiting , rood, zwart ,groen rood is 5v, zwart is ground en groen is pulse , het is een bipolaire hal sensor . de puls word veroorzaakt door een shijf met magneten die meedraaid met je pedalen .

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

Re: e-bike auto shifting

Berichtdoor astrofrostbyte » 20 Apr 2013, 10:03

En zo te lezen kan je aan de periode hoog/laag zien wat de traprichting is. dus je zal dan freq of periode en duty-cycle moeten meten.

void setup()
{
attachInterrupt(0 ,Int_PedelecPulse, CHANGE ); // call Int_PedelecPulse() on any edge on pin
}

ff proberen voor een interrupt opzetje:
Code: Alles selecteren
void Int_PedelecPulse()
{ Pedelec.EventMillis = millis();                 // time stamp opslaan
  if ( digitalRead(PedelecPin) )                  // had a rising edge
  {  Pedelec.Lowtime  =  Pedelec.EventMillis - Pedelec.PreviousMillis;
  }
  else                                              // had a falling edge
  {  Pedelec.Hightime =  Pedelec.EventMillis - Pedelec.PreviousMillis;
  }
  Pedelec.PreviousMillis = Pedelec.EventMillis;
  Pedelec.Period = Pedelec.Hightime + Pedelec.Lowtime;
  if ( Pedelec.Hightime > Pedelec.Lowtime )
      Pedelec.Direction = forward;
  else
      Pedelec.Direction = backward;
}


Variabelen ff in een datastructuurtje
Code: Alles selecteren
 struct Pedelec_type {
  unsigned long EventMillis ;
  unsigned long PreviousMillis ;
  unsigned long Hightime ;
  unsigned long Lowtime ;
  unsigned long Period ;
  byte Direction;                        // forward, backward , stop,
};
Pedelec_type Pedelec;
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

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

Re: e-bike auto shifting

Berichtdoor moegibike » 20 Apr 2013, 12:31

alvast weer bedankt voor je replay en sketch , jammer genoeg kom ik net kijken met arduino en zijn we hier met een project bezig en dus eerlijk gezegd te weinig tijd om arduino programeren even snel te leren . probeer alles zelf te doen , maar dat lukt nog niet helemaal , dank zij jou/U komen we steeds een stukje verder .zo heel langzamerhand snap ik wat er gebeurd als ik de sketch lees, tis wat anders programeren dan ik gewend was voor mijn macros schrijfen. binnenkort gaan we beginnen aan het frame, eerst in 3D gevreesd van mdf voor alle passingen, later in een soort hybride materiaal gemaakt ,vezel en kunstof dat gebakken word in een oven.[ nieuw materiaal zeer stevig en licht ] zogauw er wat vorderingen zijn zal ik wel even een foto plaatsen , weet je ook waar je arduino progs voor gebruikt worden . nogmaals bedankt voor je hulp , word hier zeer op prijs gesteld .

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

Re: e-bike auto shifting

Berichtdoor astrofrostbyte » 20 Apr 2013, 19:06

ik zat laatst nog met iemand tijdens een biertje te bedenken hoe je makkelijk kon meten hoeveel kracht een persoon op de pedalen/krank zet.
En toen kwamen we uit om de spanning/kracht op/in de ketting te meten, door de ketting met een sterke veer en wieltje iets naar beneden te drukken, dan zal bij een grote kracht de veer verder ingedrukt worden , en een uitslag/beweging is goed te meten.
Het is natuurlijk een pulserende kracht die de gebruiker levert , maar met een uController kan je een hoop 'recht' rekenen.

Qua programeren voor de Arduino, De programmeer taal is gewoon C(++) , de meest gebruikte/populaire programeertaal op aarde , dus zeker de moeite waard om te leren.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

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

Re: e-bike auto shifting

Berichtdoor moegibike » 20 Apr 2013, 19:45

zo,n soort krachtsensor bestaat al in de fiets wereld , het hele idee wat jij voorsteld zou kunnen , maar zowiezo bij mijn opzet niet omdat ik een gates snaar aandrijving erop maak [ soort vertande riem ] onderhoudsvrij en 5 x langer mee als een tandwiel / ketting .
ik heb nu vb script een beetje geleerd voor mijn cnc prog , c zou ook kunnen , alles is wel te kunnen complimeren naar msil ,
zogauw mijn 3D printer klaar is word de servobox geprint en meerdere delen voor prototyping en passen .kleine bijzonderheid , 3D machine word 10mtr lang , 2.5 mtr breed en 2.5 mtr hoog !!! frame en assen en 3assige kop is al in aanbouw ,

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 16 gasten